solstice-solver

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

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:
Msrc/ssol.h | 20+++++++-------------
Msrc/ssol_estimator.c | 4++++
Msrc/ssol_estimator_c.h | 9++++++++-
Msrc/ssol_instance.c | 11-----------
Msrc/ssol_object.c | 11-----------
Msrc/ssol_solver.c | 67++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/test_ssol_instance.c | 8++++----
Msrc/test_ssol_object.c | 6+-----
Msrc/test_ssol_solver1.c | 15+++++++++------
Msrc/test_ssol_solver2.c | 2+-
Msrc/test_ssol_solver2b.c | 2+-
Msrc/test_ssol_solver3.c | 5++++-
Msrc/test_ssol_solver4.c | 13+++++++------
Msrc/test_ssol_solver5.c | 2+-
Msrc/test_ssol_solver6.c | 3+++
Msrc/test_ssol_solver7.c | 17+++++++----------
Msrc/test_ssol_solver8.c | 3++-
Msrc/test_ssol_solver9.c | 3+--
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",