solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit 5ff64b96d08d358bbcd03a3c95cad9b1cd21d851
parent c85dbd31863334f945faeeeb536fe5f0fbb62ced
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 14 Feb 2017 11:58:31 +0100

Add per receiver primitive integration

Diffstat:
Msrc/ssol.h | 3++-
Msrc/ssol_estimator.c | 5++++-
Msrc/ssol_estimator_c.h | 149++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
Msrc/ssol_instance.c | 6+++++-
Msrc/ssol_instance_c.h | 3++-
Msrc/ssol_solver.c | 19+++++++++++--------
Msrc/test_ssol_by_receiver_integration.c | 4++--
Msrc/test_ssol_instance.c | 6++----
Msrc/test_ssol_solver1.c | 20++++++++++----------
Msrc/test_ssol_solver2.c | 8++++----
Msrc/test_ssol_solver2b.c | 8++++----
Msrc/test_ssol_solver3.c | 4++--
Msrc/test_ssol_solver3N.c | 11+++++++----
Msrc/test_ssol_solver4.c | 4++--
Msrc/test_ssol_solver5.c | 11+++++++----
15 files changed, 190 insertions(+), 71 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -592,7 +592,8 @@ ssol_instance_set_transform SSOL_API res_T ssol_instance_set_receiver (struct ssol_instance* instance, - const int mask); /* Combination of ssol_side_flag */ + const int mask, /* Combination of ssol_side_flag */ + const int per_primitive); /* Enable the per primitive integration */ /* Define whether or not the instance is sampled or not. By default an instance * is sampled. */ diff --git a/src/ssol_estimator.c b/src/ssol_estimator.c @@ -35,12 +35,15 @@ create_per_receiver_mc_data struct ssol_scene* scene) { struct htable_instance_iterator it, end; + struct mc_per_receiver_data mc_rcv_data_null; res_T res = RES_OK; ASSERT(scene && estimator); htable_instance_begin(&scene->instances_rt, &it); htable_instance_end(&scene->instances_rt, &end); + mc_per_receiver_data_init(estimator->dev->allocator, &mc_rcv_data_null); + while(!htable_instance_iterator_eq(&it, &end)) { const struct ssol_instance* inst = *htable_instance_iterator_data_get(&it); htable_instance_iterator_next(&it); @@ -48,7 +51,7 @@ create_per_receiver_mc_data if(!inst->receiver_mask) continue; res = htable_receiver_set - (&estimator->global_receivers, &inst, &MC_RECV_DATA_NULL); + (&estimator->global_receivers, &inst, &mc_rcv_data_null); if(res != RES_OK) goto error; } exit: diff --git a/src/ssol_estimator_c.h b/src/ssol_estimator_c.h @@ -19,65 +19,168 @@ #include <rsys/ref_count.h> #include <rsys/hash_table.h> +/* Forward declaration */ struct mem_allocator; - -static FINLINE int -side_idx(const enum ssol_side_flag side) -{ - ASSERT(side == SSOL_FRONT || side == SSOL_BACK); - return side == SSOL_FRONT ? 0 : 1; -} +struct ssol_instance; /* Monte carlo data */ struct mc_data { double weight; double sqr_weight; }; - #define MC_DATA_NULL__ { 0, 0 } static const struct mc_data MC_DATA_NULL = MC_DATA_NULL__; +/******************************************************************************* + * One sided Per receiver MC data + ******************************************************************************/ +/* Declare the Per primitive receiver hash table */ +#define HTABLE_NAME rcvprim +#define HTABLE_KEY unsigned +#define HTABLE_DATA struct mc_data +#include <rsys/hash_table.h> + struct mc_per_receiver_1side_data { struct mc_data irradiance; struct mc_data absorptivity_loss; struct mc_data reflectivity_loss; struct mc_data cos_loss; + struct htable_rcvprim prims; /* Per primitive MC */ }; -#define MC_RECV_1SIDE_DATA_NULL__ {\ - MC_DATA_NULL__, MC_DATA_NULL__, MC_DATA_NULL__, MC_DATA_NULL__ } +static INLINE void +mc_per_receiver_1side_data_init + (struct mem_allocator* allocator, struct mc_per_receiver_1side_data* data) +{ + ASSERT(data); + data->irradiance = MC_DATA_NULL; + data->absorptivity_loss = MC_DATA_NULL; + data->reflectivity_loss = MC_DATA_NULL; + data->cos_loss = MC_DATA_NULL; + htable_rcvprim_init(allocator, &data->prims); +} + +static INLINE void +mc_per_receiver_1side_data_release(struct mc_per_receiver_1side_data* data) +{ + ASSERT(data); + htable_rcvprim_release(&data->prims); +} + +static INLINE res_T +mc_per_receiver_1side_data_copy + (struct mc_per_receiver_1side_data* dst, + const struct mc_per_receiver_1side_data* src) +{ + ASSERT(dst && src); + dst->irradiance = src->irradiance; + dst->absorptivity_loss = src->absorptivity_loss; + dst->reflectivity_loss = src->reflectivity_loss; + dst->cos_loss = src->cos_loss; + return htable_rcvprim_copy(&dst->prims, &src->prims); +} + +static INLINE res_T +mc_per_receiver_1side_data_copy_and_release + (struct mc_per_receiver_1side_data* dst, + struct mc_per_receiver_1side_data* src) +{ + ASSERT(dst && src); + dst->irradiance = src->irradiance; + dst->absorptivity_loss = src->absorptivity_loss; + dst->reflectivity_loss = src->reflectivity_loss; + dst->cos_loss = src->cos_loss; + return htable_rcvprim_copy_and_release(&dst->prims, &src->prims); +} + +static INLINE struct mc_data* +mc_per_receiver_1side_data_get_primitive_data + (struct mc_per_receiver_1side_data* data, const unsigned iprim) +{ + struct mc_data* pmc = NULL; + ASSERT(data); -static const struct mc_per_receiver_1side_data -MC_RECV_1SIDE_DATA_NULL = MC_RECV_1SIDE_DATA_NULL__; + pmc = htable_rcvprim_find(&data->prims, &iprim); + if(!pmc) { + struct mc_data mc = MC_DATA_NULL; + const res_T res = htable_rcvprim_set(&data->prims, &iprim, &mc); + if(res != RES_OK) goto error; + pmc = htable_rcvprim_find(&data->prims, &iprim); + } + +exit: + return pmc; +error: + pmc = NULL; + goto exit; +} +/******************************************************************************* + * Double sided per receiver MC data + ******************************************************************************/ struct mc_per_receiver_data { struct mc_per_receiver_1side_data front; struct mc_per_receiver_1side_data back; }; -#define MC_RECV_DATA_NULL__ { MC_RECV_1SIDE_DATA_NULL__, MC_RECV_1SIDE_DATA_NULL__ } - -static const struct mc_per_receiver_data -MC_RECV_DATA_NULL = MC_RECV_DATA_NULL__; +static INLINE void +mc_per_receiver_data_init + (struct mem_allocator* allocator, struct mc_per_receiver_data* data) +{ + ASSERT(data); + mc_per_receiver_1side_data_init(allocator, &data->front); + mc_per_receiver_1side_data_init(allocator, &data->back); +} static INLINE void -init_mc_per_recv_data - (struct mem_allocator* alloc, - struct mc_per_receiver_data* data) +mc_per_receiver_data_release(struct mc_per_receiver_data* data) { - (void)alloc; ASSERT(data); - *data = MC_RECV_DATA_NULL; + mc_per_receiver_1side_data_release(&data->front); + mc_per_receiver_1side_data_release(&data->back); +} + +static INLINE res_T +mc_per_receiver_data_copy + (struct mc_per_receiver_data* dst, + const struct mc_per_receiver_data* src) +{ + res_T res = RES_OK; + ASSERT(dst && src); + res = mc_per_receiver_1side_data_copy(&dst->front, &src->front); + if(res != RES_OK) return res; + res = mc_per_receiver_1side_data_copy(&dst->back, &src->back); + if(res != RES_OK) return res; + return RES_OK; +} + +static INLINE res_T +mc_per_receiver_data_copy_and_release + (struct mc_per_receiver_data* dst, + struct mc_per_receiver_data* src) +{ + res_T res = RES_OK; + ASSERT(dst && src); + res = mc_per_receiver_1side_data_copy_and_release(&dst->front, &src->front); + if(res != RES_OK) return res; + res = mc_per_receiver_1side_data_copy_and_release(&dst->back, &src->back); + if(res != RES_OK) return res; + return RES_OK; } /* Define the htable_receiver data structure */ -struct ssol_instance; #define HTABLE_NAME receiver #define HTABLE_KEY const struct ssol_instance* #define HTABLE_DATA struct mc_per_receiver_data -#define HTABLE_FUNCTOR_INIT init_mc_per_recv_data +#define HTABLE_DATA_FUNCTOR_INIT mc_per_receiver_data_init +#define HTABLE_DATA_FUNCTOR_RELEASE mc_per_receiver_data_release +#define HTABLE_DATA_FUNCTOR_COPY mc_per_receiver_data_copy +#define HTABLE_DATA_FUNCTOR_COPY_AND_RELEASE mc_per_receiver_data_copy_and_release #include <rsys/hash_table.h> +/******************************************************************************* + * Estimator data structure + ******************************************************************************/ struct ssol_estimator { size_t realisation_count; size_t failed_count; diff --git a/src/ssol_instance.c b/src/ssol_instance.c @@ -152,10 +152,14 @@ error: } res_T -ssol_instance_set_receiver(struct ssol_instance* instance, const int mask) +ssol_instance_set_receiver + (struct ssol_instance* instance, + const int mask, + const int per_primitive) { if(!instance) return RES_BAD_ARG; instance->receiver_mask = mask; + instance->receiver_per_primitive = per_primitive; return RES_OK; } diff --git a/src/ssol_instance_c.h b/src/ssol_instance_c.h @@ -25,7 +25,8 @@ struct ssol_instance { struct s3d_shape* shape_rt; /* Instantiated Star-3D shape to ray-trace */ struct s3d_shape* shape_samp; /* Instantiated Star-3D shape to sample */ double transform[12]; /* Column major 4x3 affine transformation */ - int receiver_mask; /* Combination of ssol_face_flag */ + int receiver_mask; /* Combination of ssol_side_flag */ + int receiver_per_primitive; /* Enable the per primitive receiver */ int sample; /* Define whether or not the instance should be sampled */ struct fid id; /* Unique identifier */ diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -421,14 +421,6 @@ ssol_solve htable_receiver_init(scn->dev->allocator, mc_rcvs + i); res = htable_receiver_copy(mc_rcvs + i, &estimator->global_receivers); if(res != RES_OK) goto error; - htable_receiver_begin(mc_rcvs + i, &it); - htable_receiver_end(mc_rcvs + i, &end); - while (!htable_receiver_iterator_eq(&it, &end)) { - struct mc_per_receiver_data* estimator_data = - htable_receiver_iterator_data_get(&it); - *estimator_data = MC_RECV_DATA_NULL; - htable_receiver_iterator_next(&it); - } } #pragma omp parallel for schedule(static) @@ -493,6 +485,17 @@ ssol_solve data->cos_loss.weight += pt.cos_loss; data->cos_loss.sqr_weight += pt.cos_loss * pt.cos_loss; hit_a_receiver = 1; + + if(pt.inst->receiver_per_primitive) { + struct mc_data* prim = mc_per_receiver_1side_data_get_primitive_data + (data, pt.prim.prim_id); + if(!prim) { + ATOMIC_SET(&res, RES_MEM_ERR); + break; + } + prim->weight += pt.weight; + prim->sqr_weight += pt.weight*pt.weight; + } } mtl = point_get_material(&pt); diff --git a/src/test_ssol_by_receiver_integration.c b/src/test_ssol_by_receiver_integration.c @@ -133,7 +133,7 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target), RES_OK); CHECK(ssol_instance_set_transform(target, transform), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -144,7 +144,7 @@ main(int argc, char** argv) CHECK(GET_RCV_STATUS(estimator1, target, SSOL_FRONT, &status), RES_OK); logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT, 0), RES_OK); CHECK(eq_eps(status.irradiance.E, S_DNI_cos, S_DNI_cos * 2e-1), 1); CHECK(ssol_solve(scene, rng, 8 * N__, NULL, &estimator2), RES_OK); CHECK(GET_RCV_STATUS(estimator2, target, SSOL_FRONT, &status), RES_OK); diff --git a/src/test_ssol_instance.c b/src/test_ssol_instance.c @@ -71,10 +71,8 @@ main(int argc, char** argv) CHECK(ssol_instance_set_transform(instance, transform), RES_OK); CHECK(ssol_instance_set_transform(instance, transform), RES_OK); - #define SET_RECEIVER ssol_instance_set_receiver - CHECK(ssol_instance_set_receiver(NULL, 0), RES_BAD_ARG); - CHECK(ssol_instance_set_receiver(instance, 0), RES_OK); - #undef SET_RECEIVER + CHECK(ssol_instance_set_receiver(NULL, 0, 0), RES_BAD_ARG); + CHECK(ssol_instance_set_receiver(instance, 0, 0), RES_OK); CHECK(ssol_instance_sample(NULL, 0), RES_BAD_ARG); CHECK(ssol_instance_sample(instance, 0), RES_OK); CHECK(ssol_instance_sample(instance, 1), RES_OK); diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -148,11 +148,11 @@ main(int argc, char** argv) CHECK(ssol_object_create(dev, &m_object), RES_OK); CHECK(ssol_object_add_shaded_shape(m_object, square, m_mtl, m_mtl), RES_OK); CHECK(ssol_object_instantiate(m_object, &heliostat), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, heliostat), RES_OK); CHECK(ssol_object_instantiate(m_object, &secondary), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_set_transform(secondary, transform1), RES_OK); CHECK(ssol_scene_attach_instance(scene, secondary), RES_OK); @@ -160,7 +160,7 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target), RES_OK); CHECK(ssol_instance_set_transform(target, transform2), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); CHECK(ssol_solve(scene, rng, 1, NULL, &estimator), RES_OK); @@ -223,13 +223,13 @@ main(int argc, char** argv) CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); /* No receiver in scene */ - CHECK(ssol_instance_set_receiver(heliostat, 0), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, 0), RES_OK); - CHECK(ssol_instance_set_receiver(target, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, 0, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, 0, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, 0, 0), RES_OK); CHECK(ssol_solve(scene, rng, 10, NULL, &estimator), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT, 0), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT, 0), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_estimator_ref_put(estimator), RES_OK); /* Spectra mismatch */ @@ -379,7 +379,7 @@ main(int argc, char** argv) CHECK(ssol_object_create(dev, &m_object2), RES_OK); CHECK(ssol_object_add_shaded_shape(m_object2, square, m_mtl2, m_mtl2), RES_OK); CHECK(ssol_object_instantiate(m_object2, &heliostat2), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, heliostat2), RES_OK); #define KA 0.03 diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c @@ -158,8 +158,8 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(m_object, rect, m_mtl, m_mtl), RES_OK); CHECK(ssol_object_instantiate(m_object, &heliostat1), RES_OK); CHECK(ssol_object_instantiate(m_object, &heliostat2), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat1, SSOL_FRONT), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat1, SSOL_FRONT, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT, 0), RES_OK); transform3[9] = -0.5; /* -0.5 offset along X axis */ CHECK(ssol_instance_set_transform(heliostat1, transform3), RES_OK); transform3[9] = +0.5; /* +0.5 offset along X axis */ @@ -170,7 +170,7 @@ main(int argc, char** argv) CHECK(ssol_object_create(dev, &s_object), RES_OK); CHECK(ssol_object_add_shaded_shape(s_object, quad_square, m_mtl, m_mtl), RES_OK); CHECK(ssol_object_instantiate(s_object, &secondary), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_set_transform(secondary, transform1), RES_OK); CHECK(ssol_instance_sample(secondary, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, secondary), RES_OK); @@ -179,7 +179,7 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target), RES_OK); CHECK(ssol_instance_set_transform(target, transform2), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c @@ -163,8 +163,8 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(m_object, quad_rect, m_mtl, m_mtl), RES_OK); CHECK(ssol_object_instantiate(m_object, &heliostat1), RES_OK); CHECK(ssol_object_instantiate(m_object, &heliostat2), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat1, SSOL_FRONT), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat1, SSOL_FRONT, 0), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat2, SSOL_FRONT, 0), RES_OK); transform3[9] = -0.5; /* -0.5 offset along X axis */ CHECK(ssol_instance_set_transform(heliostat1, transform3), RES_OK); transform3[9] = +0.5; /* +0.5 offset along X axis */ @@ -175,7 +175,7 @@ main(int argc, char** argv) CHECK(ssol_object_create(dev, &s_object), RES_OK); CHECK(ssol_object_add_shaded_shape(s_object, quad_square, m_mtl, m_mtl), RES_OK); CHECK(ssol_object_instantiate(s_object, &secondary), RES_OK); - CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(secondary, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_set_transform(secondary, transform1), RES_OK); CHECK(ssol_instance_sample(secondary, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, secondary), RES_OK); @@ -184,7 +184,7 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(t_object, rect, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target), RES_OK); CHECK(ssol_instance_set_transform(target, transform2), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c @@ -131,14 +131,14 @@ main(int argc, char** argv) CHECK(ssol_object_create(dev, &m_object), RES_OK); CHECK(ssol_object_add_shaded_shape(m_object, quad_square, m_mtl, m_mtl), RES_OK); CHECK(ssol_object_instantiate(m_object, &heliostat), RES_OK); - CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, heliostat), RES_OK); CHECK(ssol_object_create(dev, &t_object), RES_OK); CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target), RES_OK); CHECK(ssol_instance_set_transform(target, transform), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); diff --git a/src/test_ssol_solver3N.c b/src/test_ssol_solver3N.c @@ -205,7 +205,7 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target), RES_OK); CHECK(ssol_instance_set_transform(target, transform), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -223,14 +223,17 @@ main(int argc, char** argv) #define DNI_cos (1000 * cos(PI / 8)) CHECK(eq_eps(m, 4 * NX * NY * NZ * DNI_cos, 4 * NX * NY * NZ * DNI_cos * 2e-1), 1); CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.irradiance.E, status.irradiance.SE); + logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", + status.irradiance.E, status.irradiance.SE); CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.irradiance.E, status.irradiance.SE); + logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", + status.irradiance.E, status.irradiance.SE); CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); CHECK(status.Nf, 0); CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", status.irradiance.E, status.irradiance.SE); + logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", + status.irradiance.E, status.irradiance.SE); CHECK(eq_eps(status.irradiance.E, m, 1e-6), 1); CHECK(eq_eps(status.irradiance.SE, std, 1e-3), 1); #undef GET_STATUS diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c @@ -139,13 +139,13 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(t_object, square, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target1), RES_OK); CHECK(ssol_instance_set_transform(target1, transform), RES_OK); - CHECK(ssol_instance_set_receiver(target1, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target1, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target1, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target1), RES_OK); CHECK(ssol_object_instantiate(t_object, &target2), RES_OK); transform[11] += 1.e-4; CHECK(ssol_instance_set_transform(target2, transform), RES_OK); - CHECK(ssol_instance_set_receiver(target2, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target2, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target2, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target2), RES_OK); diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c @@ -138,7 +138,7 @@ main(int argc, char** argv) CHECK(ssol_object_add_shaded_shape(t_object, rect, v_mtl, v_mtl), RES_OK); CHECK(ssol_object_instantiate(t_object, &target), RES_OK); CHECK(ssol_instance_set_transform(target, transform), RES_OK); - CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK); + CHECK(ssol_instance_set_receiver(target, SSOL_FRONT, 0), RES_OK); CHECK(ssol_instance_sample(target, 0), RES_OK); CHECK(ssol_scene_attach_instance(scene, target), RES_OK); @@ -157,14 +157,17 @@ main(int argc, char** argv) CHECK(eq_eps(m, 400 * DNI_cos, 20), 1); CHECK(eq_eps(std, 0, 1), 1); CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.irradiance.E, status.irradiance.SE); + logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", + status.irradiance.E, status.irradiance.SE); CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.irradiance.E, status.irradiance.SE); + logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", + status.irradiance.E, status.irradiance.SE); CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); CHECK(status.Nf, 0); CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", status.irradiance.E, status.irradiance.SE); + logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", + status.irradiance.E, status.irradiance.SE); CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); #undef GET_STATUS