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:
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