commit 01c724ebf0020983e1244d7cf3c379fdd7d50768
parent 3177f7db1a97690b506d07d781e6aabd0dcdffea
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 24 Mar 2017 16:56:43 +0100
Add global outputs.
Remove useless code.
Diffstat:
18 files changed, 100 insertions(+), 101 deletions(-)
diff --git a/src/ssol.h b/src/ssol.h
@@ -335,12 +335,18 @@ static const struct ssol_mc_result SSOL_MC_RESULT_NULL = SSOL_MC_RESULT_NULL__;
struct ssol_mc_global {
struct ssol_mc_result cos_factor; /* [0 1] */
+ struct ssol_mc_result absorbed; /* In W */
struct ssol_mc_result shadowed; /* In W */
struct ssol_mc_result missing; /* In W */
+ struct ssol_mc_result atmosphere; /* In W */
+ struct ssol_mc_result reflectivity; /* In W */
};
#define SSOL_MC_GLOBAL_NULL__ { \
SSOL_MC_RESULT_NULL__, \
SSOL_MC_RESULT_NULL__, \
+ SSOL_MC_RESULT_NULL__, \
+ SSOL_MC_RESULT_NULL__, \
+ SSOL_MC_RESULT_NULL__, \
SSOL_MC_RESULT_NULL__ \
}
static const struct ssol_mc_global SSOL_MC_GLOBAL_NULL = SSOL_MC_GLOBAL_NULL__;
@@ -376,8 +382,8 @@ struct ssol_mc_shape {
static const struct ssol_mc_shape SSOL_MC_SHAPE_NULL = SSOL_MC_SHAPE_NULL__;
struct ssol_mc_sampled {
+ struct ssol_mc_result cos_factor; /* [0 1] */
struct ssol_mc_result shadowed;
- double n[3]; /* normals */
size_t nb_samples;
};
@@ -746,12 +752,6 @@ ssol_object_get_area
(const struct ssol_object* object,
double* area);
-/* Retrieve the normal of the object */
-SSOL_API res_T
-ssol_object_get_normal
- (const struct ssol_object* object,
- double normal[3]);
-
/*******************************************************************************
* Object Instance API - Clone of an object with a set of per instance data as
* world transformation, material parameters, etc. Note that the object
@@ -802,12 +802,6 @@ ssol_instance_get_area
(const struct ssol_instance* instance,
double* area);
-/* Retrieve the normal of the instance */
-SSOL_API res_T
-ssol_instance_get_normal
- (const struct ssol_instance* instance,
- double normal[3]);
-
SSOL_API res_T
ssol_instance_get_shaded_shapes_count
(const struct ssol_instance* instance,
diff --git a/src/ssol_estimator.c b/src/ssol_estimator.c
@@ -119,8 +119,11 @@ ssol_estimator_get_mc_global
global->Name.SE = global->Name.V > 0 ? sqrt(global->Name.V / N) : 0; \
} (void)0
SETUP_MC_RESULT(cos_factor);
+ SETUP_MC_RESULT(absorbed);
SETUP_MC_RESULT(shadowed);
SETUP_MC_RESULT(missing);
+ SETUP_MC_RESULT(atmosphere);
+ SETUP_MC_RESULT(reflectivity);
#undef SETUP_MC_RESULT
return RES_OK;
}
@@ -230,6 +233,7 @@ ssol_estimator_get_mc_sampled
sampled->Name.V = data->sqr_weight/N - sampled->Name.E*sampled->Name.E; \
sampled->Name.SE = sampled->Name.V > 0 ? sqrt(sampled->Name.V / N) : 0; \
} (void)0
+ SETUP_MC_RESULT(cos_factor);
SETUP_MC_RESULT(shadowed);
#undef SETUP_MC_RESULT
return RES_OK;
diff --git a/src/ssol_estimator_c.h b/src/ssol_estimator_c.h
@@ -278,6 +278,7 @@ mc_receiver_copy_and_release
******************************************************************************/
struct mc_sampled {
/* Global data for this entity */
+ struct mc_data cos_factor;
struct mc_data shadowed;
size_t nb_samples;
@@ -291,6 +292,7 @@ mc_sampled_init
struct mc_sampled* samp)
{
ASSERT(samp);
+ samp->cos_factor = MC_DATA_NULL;
samp->shadowed = MC_DATA_NULL;
samp->nb_samples = 0;
htable_receiver_init(allocator, &samp->mc_rcvs);
@@ -307,6 +309,7 @@ static INLINE res_T
mc_sampled_copy(struct mc_sampled* dst, const struct mc_sampled* src)
{
ASSERT(dst && src);
+ dst->cos_factor = src->cos_factor;
dst->shadowed = src->shadowed;
dst->nb_samples = src->nb_samples;
return htable_receiver_copy(&dst->mc_rcvs, &src->mc_rcvs);
@@ -316,6 +319,7 @@ static INLINE res_T
mc_sampled_copy_and_release(struct mc_sampled* dst, struct mc_sampled* src)
{
ASSERT(dst && src);
+ dst->cos_factor = src->cos_factor;
dst->shadowed = src->shadowed;
dst->nb_samples = src->nb_samples;
return htable_receiver_copy_and_release(&dst->mc_rcvs, &src->mc_rcvs);
@@ -443,9 +447,12 @@ struct ssol_estimator {
size_t failed_count;
/* Implicit MC computations */
+ struct mc_data cos_factor;
+ struct mc_data absorbed;
struct mc_data shadowed;
struct mc_data missing;
- struct mc_data cos_factor;
+ struct mc_data atmosphere;
+ struct mc_data reflectivity;
struct htable_receiver mc_receivers; /* Per receiver MC */
struct htable_sampled mc_sampled; /* Per sampled instance MC */
diff --git a/src/ssol_instance.c b/src/ssol_instance.c
@@ -200,17 +200,6 @@ ssol_instance_get_area
}
res_T
-ssol_instance_get_normal
- (const struct ssol_instance* instance,
- double normal[3])
-{
- if (!instance || !normal) return RES_BAD_ARG;
- SSOL(object_get_normal(instance->object, normal));
- d33_muld3(normal, instance->transform, normal);
- return RES_OK;
-}
-
-res_T
ssol_instance_get_shaded_shapes_count
(const struct ssol_instance* instance, size_t* count)
{
diff --git a/src/ssol_object.c b/src/ssol_object.c
@@ -233,17 +233,6 @@ ssol_object_get_area(const struct ssol_object* object, double* area)
return RES_OK;
}
-res_T
-ssol_object_get_normal
- (const struct ssol_object* object,
- double normal[3])
-{
- if (!object || !normal) return RES_BAD_ARG;;
- /* the area of the 3D surface */
- d3_set(normal, object->n);
- return RES_OK;
-}
-
/*******************************************************************************
* Local function
******************************************************************************/
diff --git a/src/ssol_solver.c b/src/ssol_solver.c
@@ -50,9 +50,12 @@
struct thread_context {
struct ssp_rng* rng;
struct ssf_bsdf* bsdf;
+ struct mc_data cos_factor;
+ struct mc_data absorbed;
struct mc_data shadowed;
struct mc_data missing;
- struct mc_data cos_factor;
+ struct mc_data atmosphere;
+ struct mc_data reflectivity;
struct htable_receiver mc_rcvs;
struct htable_sampled mc_samps;
struct darray_path paths; /* paths */
@@ -100,9 +103,12 @@ thread_context_copy
ASSERT(dst && src);
dst->rng = src->rng;
dst->bsdf = src->bsdf;
+ dst->cos_factor = src->cos_factor;
+ dst->absorbed = src->absorbed;
dst->shadowed = src->shadowed;
dst->missing = src->missing;
- dst->cos_factor = src->cos_factor;
+ dst->atmosphere = src->atmosphere;
+ dst->reflectivity = src->reflectivity;
res = htable_receiver_copy(&dst->mc_rcvs, &src->mc_rcvs);
if(res != RES_OK) return res;
res = htable_sampled_copy(&dst->mc_samps, &src->mc_samps);
@@ -236,7 +242,6 @@ point_init
/* Initialise the Monte Carlo weight */
if(pt->sshape->shape->type == SHAPE_PUNCHED) {
- double proxy_sun_cos = fabs(d3_dot(pt->N, pt->dir));
double cos_ratio, surface_proxy_cos, surface_sun_cos, tmp_n[3];
/* For punched surface, retrieve the sampled position and normal onto the
* quadric surface */
@@ -625,19 +630,27 @@ update_mc
(const struct point* pt,
const size_t irealisation,
const size_t ibounce,
- struct htable_receiver* mc_rcvs,
+ struct thread_context* thread_ctx,
FILE* output)
{
struct mc_receiver_1side* mc_rcv1 = NULL;
struct mc_receiver_1side* mc_samp_x_rcv1 = NULL;
res_T res = RES_OK;
- ASSERT(pt && mc_rcvs && point_is_receiver(pt));
-
+ ASSERT(pt && thread_ctx && point_is_receiver(pt));
+
res = point_dump(pt, irealisation, ibounce, output);
if(res != RES_OK) goto error;
+ /* Global MC accumulation */
+ #define ACCUM_WEIGHT(Res, W) { \
+ Res.weight += (W); \
+ Res.sqr_weight += (W)*(W); \
+ } (void)0
+ ACCUM_WEIGHT(thread_ctx->absorbed, pt->absorbed_irradiance);
+ #undef ACCUM_WEIGHT
+
/* Per receiver MC accumulation */
- res = get_mc_receiver_1side(mc_rcvs, pt->inst, pt->side, &mc_rcv1);
+ res = get_mc_receiver_1side(&thread_ctx->mc_rcvs, pt->inst, pt->side, &mc_rcv1);
if(res != RES_OK) goto error;
#define ACCUM_WEIGHT(Name, W) { \
@@ -654,6 +667,7 @@ update_mc
res = mc_sampled_get_mc_receiver_1side
(pt->mc_samp, pt->inst, pt->side, &mc_samp_x_rcv1);
if(res != RES_OK) goto error;
+
#define ACCUM_WEIGHT(Name, W) { \
mc_samp_x_rcv1->Name.weight += (W); \
mc_samp_x_rcv1->Name.sqr_weight += (W)*(W); \
@@ -675,9 +689,9 @@ update_mc
res = mc_shape_1side_get_mc_primitive(mc_shape1, pt->prim.prim_id, &mc_prim1);
if(res != RES_OK) goto error;
- #define ACCUM_WEIGHT(Name, W) { \
- mc_prim1->Name.weight += (W); \
- mc_prim1->Name.sqr_weight += (W)*(W); \
+ #define ACCUM_WEIGHT(Name, W) { \
+ mc_prim1->Name.weight += (W); \
+ mc_prim1->Name.sqr_weight += (W)*(W); \
} (void)0
ACCUM_WEIGHT(integrated_irradiance, pt->incoming_weight);
ACCUM_WEIGHT(integrated_absorbed_irradiance, pt->absorbed_irradiance);
@@ -742,15 +756,13 @@ trace_radiative_path
Res.sqr_weight += (W)*(W); \
} (void)0
ACCUM_WEIGHT(thread_ctx->cos_factor, pt.cos_factor);
+ ACCUM_WEIGHT(pt.mc_samp->cos_factor, pt.cos_factor);
if(!is_lit) { /* The starting point is not lit */
ACCUM_WEIGHT(pt.mc_samp->shadowed, pt.weight);
ACCUM_WEIGHT(thread_ctx->shadowed, pt.weight);
- #undef ACCUM_WEIGHT
if(tracker) path.type = SSOL_PATH_SHADOW;
} else {
- int hit_a_receiver = 0;
-
/* Setup the ray as if it starts from the current point position in order
* to handle the points that start from a virtual material */
f3_set_d3(org, pt.pos);
@@ -765,8 +777,7 @@ trace_radiative_path
mtl = point_get_material(&pt);
if(mtl->type == SSOL_MATERIAL_VIRTUAL) {
point_hit_virtual(&pt);
- }
- else {
+ } else {
/* Modulate the point weight wrt to its scattering functions and
* generate an outgoing direction */
res = point_shade(&pt, thread_ctx->bsdf, thread_ctx->rng, pt.dir);
@@ -774,8 +785,7 @@ trace_radiative_path
}
if(point_is_receiver(&pt)) {
- hit_a_receiver = 1;
- res = update_mc(&pt, path_id, depth, &thread_ctx->mc_rcvs, output);
+ res = update_mc(&pt, path_id, depth, thread_ctx, output);
if(res != RES_OK) goto error;
}
@@ -807,12 +817,12 @@ trace_radiative_path
S3D(scene_view_trace_ray(view_rt, org, dir, range, &ray_data, &hit));
if(S3D_HIT_NONE(&hit)) {
/* Add the point of the last path segment going to the infinite */
- if(tracker && tracker->infinite_ray_length > 0) {
+ if (tracker && tracker->infinite_ray_length > 0) {
double pos[3], wi[3];
d3_set_f3(wi, dir);
d3_add(pos, pt.pos, d3_muld(wi, wi, tracker->infinite_ray_length));
res = path_add_vertex(&path, pos, pt.weight);
- if(res != RES_OK) goto error;
+ if (res != RES_OK) goto error;
}
break;
}
@@ -833,15 +843,16 @@ trace_radiative_path
if(tracker) {
res = path_add_vertex(&path, pt.pos, pt.weight);
- if(res != RES_OK) goto error;
+ if (res != RES_OK) goto error;
}
}
- if(!hit_a_receiver) {
- thread_ctx->missing.weight += pt.weight;
- thread_ctx->missing.sqr_weight += pt.weight*pt.weight;
- }
+ ACCUM_WEIGHT(thread_ctx->atmosphere, pt.absorptivity_loss);
+ /* all the remaining weight is lost */
+ ACCUM_WEIGHT(thread_ctx->missing, pt.weight);
+ #undef ACCUM_WEIGHT
+
if(tracker) {
- path.type = hit_a_receiver ? SSOL_PATH_SUCCESS : SSOL_PATH_MISSING;
+ path.type = pt.absorbed_irradiance ? SSOL_PATH_SUCCESS : SSOL_PATH_MISSING;
}
}
@@ -849,7 +860,6 @@ trace_radiative_path
res = path_register_and_clear(&thread_ctx->paths, &path);
if(res != RES_OK) goto error;
}
-
exit:
if(tracker) path_release(&path);
return res;
@@ -970,9 +980,12 @@ ssol_solve
estimator->Name.weight += thread_ctx->Name.weight; \
estimator->Name.sqr_weight += thread_ctx->Name.sqr_weight; \
} (void)0
+ ACCUM_WEIGHT(cos_factor);
+ ACCUM_WEIGHT(absorbed);
ACCUM_WEIGHT(shadowed);
ACCUM_WEIGHT(missing);
- ACCUM_WEIGHT(cos_factor);
+ ACCUM_WEIGHT(atmosphere);
+ ACCUM_WEIGHT(reflectivity);
#undef ACCUM_WEIGHT
}
diff --git a/src/test_ssol_instance.c b/src/test_ssol_instance.c
@@ -35,7 +35,7 @@ main(int argc, char** argv)
struct ssol_vertex_data attrib = SSOL_VERTEX_DATA_NULL;
struct ssol_instantiated_shaded_shape sshape;
double transform[12] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 0};
- double val[3];
+ double val[3], area;
size_t n;
unsigned i, count;
uint32_t id, id1;
@@ -78,9 +78,9 @@ main(int argc, char** argv)
CHECK(ssol_instance_set_transform(instance, transform), RES_OK);
CHECK(ssol_instance_set_transform(instance, transform), RES_OK);
- CHECK(ssol_instance_get_normal(instance, NULL), RES_BAD_ARG);
- CHECK(ssol_instance_get_normal(NULL, val), RES_BAD_ARG);
- CHECK(ssol_instance_get_normal(instance, val), RES_OK);
+ CHECK(ssol_instance_get_area(instance, NULL), RES_BAD_ARG);
+ CHECK(ssol_instance_get_area(NULL, &area), RES_BAD_ARG);
+ CHECK(ssol_instance_get_area(instance, &area), RES_OK);
CHECK(ssol_instance_set_receiver(NULL, 0, 0), RES_BAD_ARG);
CHECK(ssol_instance_set_receiver(instance, 0, 0), RES_OK);
diff --git a/src/test_ssol_object.c b/src/test_ssol_object.c
@@ -26,7 +26,7 @@ main(int argc, char** argv)
struct ssol_material* mtl;
struct ssol_material* mtl2;
struct ssol_object* object;
- double a, n[3];
+ double a;
(void) argc, (void) argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
@@ -78,10 +78,6 @@ main(int argc, char** argv)
CHECK(ssol_object_get_area(NULL, &a), RES_BAD_ARG);
CHECK(ssol_object_get_area(object, &a), RES_OK);
- CHECK(ssol_object_get_normal(object, NULL), RES_BAD_ARG);
- CHECK(ssol_object_get_normal(NULL, n), RES_BAD_ARG);
- CHECK(ssol_object_get_normal(object, n), RES_OK);
-
CHECK(ssol_object_ref_put(object), RES_OK);
CHECK(ssol_shape_ref_put(shape), RES_OK);
CHECK(ssol_shape_ref_put(shape2), RES_OK);
diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c
@@ -204,7 +204,7 @@ main(int argc, char** argv)
CHECK(ssol_estimator_get_sampled_area(estimator, NULL), RES_BAD_ARG);
CHECK(ssol_estimator_get_sampled_area(NULL, &dbl), RES_BAD_ARG);
CHECK(ssol_estimator_get_sampled_area(estimator, &dbl), RES_OK);
- CHECK(eq_eps(dbl, 12, 1.e-6), 1);
+ CHECK(eq_eps(dbl, 12, DBL_EPSILON), 1);
CHECK(ssol_estimator_get_realisation_count(NULL, NULL), RES_BAD_ARG);
CHECK(ssol_estimator_get_realisation_count(estimator, NULL), RES_BAD_ARG);
@@ -321,8 +321,9 @@ main(int argc, char** argv)
CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK);
printf("Shadows = %g +/- %g; ", mc_global.shadowed.E, mc_global.shadowed.SE);
printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE);
+ printf("Cos = %g +/- %g; ", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, m, 2 * dbl), 1);
- CHECK(eq_eps(mc_global.missing.E, m, 2*mc_global.missing.SE), 1);
+ CHECK(eq_eps(mc_global.missing.E, 2*m, 2*mc_global.missing.SE), 1);
CHECK(GET_MC_RCV(NULL, NULL, SSOL_BACK, NULL), RES_BAD_ARG);
CHECK(GET_MC_RCV(estimator, NULL, SSOL_BACK, NULL), RES_BAD_ARG);
CHECK(GET_MC_RCV(NULL, target, SSOL_BACK, NULL), RES_BAD_ARG);
@@ -363,7 +364,7 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g; ", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, m, 1e-4), 1);
CHECK(eq_eps(mc_global.cos_factor.E, COS, 1e-4), 1);
CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target) = %g +/- %g\n",
@@ -399,7 +400,7 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g; ", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, m, 1e-4), 1);
CHECK(eq_eps(mc_global.cos_factor.E, COS, 1e-4), 1);
CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target) = %g +/- %g\n",
@@ -447,9 +448,11 @@ main(int argc, char** argv)
CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK);
printf("Shadows = %g +/- %g; ", mc_global.shadowed.E, mc_global.shadowed.SE);
printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE);
+ printf("Atmosphere = %g +/- %g; ", mc_global.atmosphere.E, mc_global.atmosphere.SE);
printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E + mc_global.atmosphere.E + mc_global.absorbed.E,
+ m, 1e-4), 1);
CHECK(eq_eps(mc_global.cos_factor.E, COS, 1e-4), 1);
CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf
@@ -548,7 +551,7 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g; ", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, m, 1e-4), 1);
CHECK(eq_eps(mc_global.cos_factor.E, COS, 1e-4), 1);
CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target) = %g +/- %g\n",
diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c
@@ -197,7 +197,7 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, 4 * DNI_cos, 1e-4), 1); /* nothing absorbed */
CHECK(eq_eps(mc_global.cos_factor.E, COS, 1e-4), 1);
CHECK(GET_MC_RCV(estimator, heliostat1, SSOL_BACK, &mc_rcv), RES_BAD_ARG);
CHECK(GET_MC_RCV(estimator, secondary, SSOL_FRONT, &mc_rcv), RES_OK);
diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c
@@ -201,7 +201,7 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, 4 * DNI_cos, 1e-4), 1); /* nothing absorbed */
CHECK(eq_eps(mc_global.cos_factor.E, COS, 1e-4), 1);
CHECK(ssol_estimator_get_mc_receiver
(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c
@@ -70,6 +70,7 @@ main(int argc, char** argv)
struct ssol_mc_receiver mc_rcv;
double dir[3];
double transform[12]; /* 3x4 column major matrix */
+ double area;
size_t count;
FILE* tmp;
double m, std;
@@ -155,7 +156,7 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, 400 * DNI_cos, 1e-4), 1); /* nothing absorbed */
CHECK(eq_eps(mc_global.cos_factor.E, COS, 1e-4), 1);
CHECK(ssol_estimator_get_mc_receiver
(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
@@ -165,6 +166,8 @@ main(int argc, char** argv)
CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1);
CHECK(ssol_estimator_get_failed_count(estimator, &count), RES_OK);
CHECK(count, 0);
+ CHECK(ssol_instance_get_area(heliostat, &area), RES_OK);
+ CHECK(eq_eps(area, 400, DBL_EPSILON), 1);
/* Free data */
CHECK(ssol_instance_ref_put(heliostat), RES_OK);
diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c
@@ -112,6 +112,7 @@ main(int argc, char** argv)
carving.context = &POLY_EDGES__;
quadric.type = SSOL_QUADRIC_PARABOL;
quadric.data.parabol.focal = FOCAL;
+ quadric.slices_count_hint = 100;
punched.nb_carvings = 1;
punched.quadric = &quadric;
punched.carvings = &carving;
@@ -144,7 +145,7 @@ main(int argc, char** argv)
CHECK(ssol_scene_attach_instance(scene, target2), RES_OK);
NCHECK(tmp = tmpfile(), 0);
-#define N__ 10000
+#define N__ 100000
#define GET_MC_RCV ssol_estimator_get_mc_receiver
CHECK(ssol_solve(scene, rng, N__, 0, tmp, &estimator), RES_OK);
CHECK(ssol_instance_get_id(target1, &r_id1), RES_OK);
@@ -166,17 +167,17 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, 400 * DNI_cos, 1e-2), 1); /* nothing absorbed */
CHECK(GET_MC_RCV(estimator, target1, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target1) = %g +/- %g\n",
mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE);
- CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m1, 1e-8), 1);
- CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std1, 1e-4), 1);
+ CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m1, 1e-2), 1);
+ CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std1, 1e-2), 1);
CHECK(GET_MC_RCV(estimator, target2, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target2) = %g +/- %g\n",
mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE);
- CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m2, 1e-8), 1);
- CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std2, 1e-4), 1);
+ CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m2, 1e-2), 1);
+ CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std2, 1e-2), 1);
CHECK(ssol_estimator_get_failed_count(estimator, &count), RES_OK);
CHECK(count, 0);
diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c
@@ -154,7 +154,7 @@ main(int argc, char** argv)
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, 400 * DNI_cos, 1e-4), 1); /* nothing absorbed */
CHECK(ssol_estimator_get_mc_receiver
(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target) = %g +/- %g\n",
diff --git a/src/test_ssol_solver6.c b/src/test_ssol_solver6.c
@@ -181,6 +181,7 @@ main(int argc, char** argv)
CHECK(ssol_solve(scene, rng, N__, 0, tmp, &estimator), RES_OK);
CHECK(fclose(tmp), 0);
CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK);
+ printf("Absorbed = %g +/- %g\n", mc_global.absorbed.E, mc_global.absorbed.SE);
printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE);
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
@@ -191,11 +192,13 @@ main(int argc, char** argv)
printf("Ir(target1) = %g +/- %g\n",
mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE);
CHECK(eq_eps(mc_rcv.integrated_irradiance.E, 100000, 2*100000/sqrt(N__)), 1);
+ CHECK(mc_rcv.integrated_irradiance.E, mc_rcv.integrated_absorbed_irradiance.E);
CHECK(GET_MC_RCV(estimator, target2, SSOL_BACK, &mc_rcv), RES_OK);
printf("Ir(target2) = %g +/- %g\n",
mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE);
CHECK(eq_eps(mc_rcv.integrated_irradiance.E, 0, 1), 1);
+ CHECK(mc_rcv.integrated_irradiance.E, mc_rcv.integrated_absorbed_irradiance.E);
/* Free data */
CHECK(ssol_instance_ref_put(heliostat1), RES_OK);
diff --git a/src/test_ssol_solver7.c b/src/test_ssol_solver7.c
@@ -19,11 +19,6 @@
#include <rsys/mem_allocator.h>
#include <rsys/image.h>
-#define SCREEN_GAMMA 2.2
-#define WIDTH 640
-#define HEIGHT 480
-#define PROJ_RATIO (double)WIDTH/(double)HEIGHT
-
#define REFLECTIVITY 0.1
#include "test_ssol_materials.h"
@@ -85,7 +80,7 @@ main(int argc, char** argv)
struct ssol_estimator* estimator;
struct ssol_mc_global mc_global;
struct ssol_mc_receiver mc_rcv;
- double dir[3];
+ double dir[3], area;
double transform[12]; /* 3x4 column major matrix */
FILE* tmp;
/* primary is a parabol */
@@ -201,13 +196,15 @@ main(int argc, char** argv)
CHECK(ssol_solve(scene, rng, N__, 0, tmp, &estimator), RES_OK);
CHECK(fclose(tmp), 0);
- printf("Total = %g\n", TOTAL);
CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK);
+ CHECK(ssol_estimator_get_sampled_area(estimator, &area), RES_OK);
+ printf("Total = %g\n", area * DNI_cos);
+ CHECK(eq_eps(area * DNI_cos, TOTAL, TOTAL * 1e-4), 1);
+ printf("Absorbed = %g +/- %g\n", mc_global.absorbed.E, mc_global.absorbed.SE);
+ printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
- printf("Cos = %g +/- %g\n", mc_global.cos_factor.E, mc_global.cos_factor.SE);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Abs(target1) = %g +/- %g\n",
@@ -218,7 +215,7 @@ main(int argc, char** argv)
CHECK(eq_eps(mc_rcv.integrated_irradiance.E, TOTAL, TOTAL * 1e-4), 1);
CHECK(eq_eps(mc_rcv.integrated_absorbed_irradiance.E,
(1 - REFLECTIVITY) * TOTAL, (1 - REFLECTIVITY) *TOTAL * 1e-4), 1);
- CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, 0, 1e-2), 1);
/* Free data */
CHECK(ssol_instance_ref_put(heliostat), RES_OK);
diff --git a/src/test_ssol_solver8.c b/src/test_ssol_solver8.c
@@ -155,7 +155,8 @@ main(int argc, char** argv)
printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE);
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1);
- CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1);
+ CHECK(eq_eps(mc_global.missing.E, S * DNI,
+ 3 * mc_global.missing.SE), 1); /* nothing absorbed */
CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target1) = %g +/- %g\n",
mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE);
diff --git a/src/test_ssol_solver9.c b/src/test_ssol_solver9.c
@@ -150,8 +150,7 @@ main(int argc, char** argv)
printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE);
printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE);
CHECK(eq_eps(mc_global.shadowed.E, DNI_S, 3 * mc_global.shadowed.SE), 1);
- CHECK(eq_eps(mc_global.missing.E,
- MMAX(DNI_S, DNI_TGT_S) - MMIN(DNI_S, DNI_TGT_S),
+ CHECK(eq_eps(mc_global.missing.E, MMAX(DNI_S, DNI_TGT_S),
3 * mc_global.missing.SE), 1);
CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK);
printf("Ir(target1) = %g +/- %g\n",