solstice-solver

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

commit e363a05b4cc53ce8aa6d8967068c70036727824e
parent 6b340d7505ad24867c52b1ca3af63b7503f34781
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 10 Mar 2017 18:06:48 +0100

Change global cos_loss for global cos computation.

The difference is that we only estimate the local cos.

Diffstat:
Msrc/ssol.h | 3+--
Msrc/ssol_estimator.c | 2+-
Msrc/ssol_estimator_c.h | 2+-
Msrc/ssol_solver.c | 14+++++++++-----
Msrc/test_ssol_solver1.c | 18+++++++++---------
Msrc/test_ssol_solver2.c | 7+++++--
Msrc/test_ssol_solver2b.c | 5++++-
Msrc/test_ssol_solver3.c | 5++++-
Msrc/test_ssol_solver4.c | 5++++-
Msrc/test_ssol_solver5.c | 5++++-
Msrc/test_ssol_solver6.c | 1+
Msrc/test_ssol_solver7.c | 10+++++-----
12 files changed, 48 insertions(+), 29 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -300,7 +300,7 @@ struct ssol_mc_result { }; struct ssol_mc_global { - struct ssol_mc_result cos_loss; /* In W */ + struct ssol_mc_result cos_factor; struct ssol_mc_result shadowed; /* In W */ struct ssol_mc_result missing; /* In W */ }; @@ -321,7 +321,6 @@ struct ssol_mc_primitive { struct ssol_mc_result integrated_absorbed_irradiance; /* In W */ struct ssol_mc_result absorptivity_loss; /* In W */ struct ssol_mc_result reflectivity_loss; /* In W */ - struct ssol_mc_result cos_loss; /* In W TODO remove this */ size_t index; /* Index of the primitive */ }; diff --git a/src/ssol_estimator.c b/src/ssol_estimator.c @@ -116,7 +116,7 @@ ssol_estimator_get_mc_global global->Name.V = data->sqr_weight / N - global->Name.E*global->Name.E; \ global->Name.SE = global->Name.V > 0 ? sqrt(global->Name.V / N) : 0; \ } (void)0 - SETUP_MC_RESULT(cos_loss); + SETUP_MC_RESULT(cos_factor); SETUP_MC_RESULT(shadowed); SETUP_MC_RESULT(missing); #undef SETUP_MC_RESULT diff --git a/src/ssol_estimator_c.h b/src/ssol_estimator_c.h @@ -336,7 +336,7 @@ struct ssol_estimator { /* Implicit MC computations */ struct mc_data shadowed; struct mc_data missing; - struct mc_data cos_loss; + struct mc_data cos_factor; struct htable_receiver mc_receivers; /* Per receiver MC */ struct htable_sampled mc_sampled; /* Per sampled instance MC */ diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -52,7 +52,7 @@ struct thread_context { struct ssf_bsdf* bsdf; struct mc_data shadowed; struct mc_data missing; - struct mc_data cos_loss; + struct mc_data cos_factor; struct htable_receiver mc_rcvs; struct htable_sampled mc_samps; }; @@ -99,7 +99,7 @@ thread_context_copy dst->bsdf = src->bsdf; dst->shadowed = src->shadowed; dst->missing = src->missing; - dst->cos_loss = src->cos_loss; + dst->cos_factor = src->cos_factor; 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); @@ -157,7 +157,7 @@ struct point { double wl; /* Sampled wavelength */ /* MC weights, before and after hit */ double incoming_weight, weight; - double cos_loss; /* loss at the starting point */ + double cos_factor; /* local cos at the starting point */ double absorbed_irradiance; /* current hit only */ double absorptivity_loss_before, absorptivity_loss; double reflectivity_loss_before, reflectivity_loss; @@ -244,6 +244,10 @@ point_init if(pt->sshape->shape->type == SHAPE_PUNCHED) { punched_shape_project_point (pt->sshape->shape, pt->inst->transform, pt->pos, pt->pos, pt->N); + /* Local cos */ + pt->cos_factor = fabs(d3_dot(pt->N, pt->dir)); + } else { + pt->cos_factor = cos_sun; } /* use local cos to compute cos_loss */ cos_sun = fabs(d3_dot(pt->N, pt->dir)); @@ -651,7 +655,7 @@ trace_radiative_path Res.weight += (W); \ Res.sqr_weight += (W)*(W); \ } (void)0 - ACCUM_WEIGHT(thread_ctx->cos_loss, pt.cos_loss); + ACCUM_WEIGHT(thread_ctx->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); @@ -843,7 +847,7 @@ ssol_solve } (void)0 ACCUM_WEIGHT(shadowed); ACCUM_WEIGHT(missing); - ACCUM_WEIGHT(cos_loss); + ACCUM_WEIGHT(cos_factor); #undef ACCUM_WEIGHT } diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -309,10 +309,10 @@ 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_loss.E, mc_global.cos_loss.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.cos_loss.E, (1 - COS)*(4 * DNI), 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", mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); @@ -345,10 +345,10 @@ 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_loss.E, mc_global.cos_loss.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.cos_loss.E, (1 - COS)*(4 * DNI), 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", mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); @@ -395,10 +395,10 @@ 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\n", mc_global.cos_loss.E, mc_global.cos_loss.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.cos_loss.E, (1 - COS)*(4 * DNI), 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 ("\tIr(target) = %g +/- %g (%.2g %%)\n", @@ -425,7 +425,7 @@ main(int argc, char** argv) ( mc_rcv.integrated_irradiance.E + mc_rcv.absorptivity_loss.E + mc_rcv.reflectivity_loss.E - + mc_global.cos_loss.E, 4 * DNI, 1e-8), 1); + + (1 - mc_global.cos_factor.E) * 4 * DNI, 4 * DNI, 1e-8), 1); CHECK(ssol_mc_receiver_get_mc_primitives_count(NULL, NULL), RES_BAD_ARG); CHECK(ssol_mc_receiver_get_mc_primitives_count(&mc_rcv, NULL), RES_BAD_ARG); CHECK(ssol_mc_receiver_get_mc_primitives_count(NULL, &count), RES_BAD_ARG); @@ -480,10 +480,10 @@ 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_loss.E, mc_global.cos_loss.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.cos_loss.E, (1 - COS)*(4 * DNI), 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", mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c @@ -187,15 +187,18 @@ main(int argc, char** argv) CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); printf("Ir = %g +/- %g\n", m, std); -#define DNI_cos (1000 * cos(PI / 4)) +#define COS cos(PI / 4) +#define DNI_cos (1000 * COS) CHECK(eq_eps(m, 4 * DNI_cos, 4 * DNI_cos * 1e-4), 1); #define SQR(x) ((x)*(x)) CHECK(eq_eps(std, 0, 1e-4), 1); CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE); - printf("Missing = %g +/- %g", mc_global.missing.E, mc_global.missing.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); 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.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); printf("Ir(secondary) = %g +/- %g\n", diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c @@ -190,7 +190,8 @@ main(int argc, char** argv) CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); printf("Ir = %g +/- %g\n", m, std); -#define DNI_cos (1000 * cos(PI / 4)) +#define COS cos(PI / 4) +#define DNI_cos (1000 * COS) CHECK(eq_eps(m, 2 * DNI_cos, MMAX(2 * DNI_cos * 1e-2, std)), 1); #define SQR(x) ((x)*(x)) CHECK(eq_eps(std, @@ -198,8 +199,10 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); 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); 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.cos_factor.E, COS, 1e-4), 1); 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_solver3.c b/src/test_ssol_solver3.c @@ -144,7 +144,8 @@ main(int argc, char** argv) CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); printf("Ir = %g +/- %g\n", m, std); -#define DNI_cos (1000 * cos(PI / 4)) +#define COS cos(PI / 4) +#define DNI_cos (1000 * COS) CHECK(eq_eps(m, 4 * DNI_cos, 4 * DNI_cos * 2e-1), 1); #define SQR(x) ((x)*(x)) CHECK(eq_eps(std, @@ -152,8 +153,10 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); 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); 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.cos_factor.E, COS, 1e-4), 1); 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_solver4.c b/src/test_ssol_solver4.c @@ -155,7 +155,8 @@ main(int argc, char** argv) CHECK(pp_sum(tmp, (int32_t)r_id2, count, &m2, &std2), RES_OK); CHECK(fclose(tmp), 0); printf("Ir = %g +/- %g\n", m1, std1); -#define DNI_cos (1000 * cos(0)) +#define COS cos(0) +#define DNI_cos (1000 * COS) CHECK(eq_eps(m1, 400 * DNI_cos, 400 * DNI_cos * 1e-4), 1); CHECK(eq_eps(std1, 0, 1), 1); CHECK(m1, m2); @@ -163,8 +164,10 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); 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); CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + /* Cannot assert anything about mean local cos */ 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); diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c @@ -145,14 +145,17 @@ main(int argc, char** argv) CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); printf("Ir = %g +/- %g\n", m, std); -#define DNI_cos (1000 * cos(0)) +#define COS cos(0) +#define DNI_cos (1000 * COS) CHECK(eq_eps(m, 400 * DNI_cos, 20), 1); CHECK(eq_eps(std, 0, 1), 1); CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); 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); CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + /* Cannot assert anything about mean local cos */ 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 @@ -183,6 +183,7 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); 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); CHECK(eq_eps(mc_global.shadowed.E, 100000, 2 * 100000/sqrt(N__)), 1); CHECK(eq_eps(mc_global.missing.E, 0, 0), 1); diff --git a/src/test_ssol_solver7.c b/src/test_ssol_solver7.c @@ -203,16 +203,16 @@ main(int argc, char** argv) printf("Total = %g\n", TOTAL); CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); - printf("Shadows = %g +/- %g\n", - mc_global.shadowed.E, mc_global.shadowed.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("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", - mc_rcv.integrated_absorbed_irradiance.E, mc_rcv.integrated_absorbed_irradiance.SE); + mc_rcv.integrated_absorbed_irradiance.E, + mc_rcv.integrated_absorbed_irradiance.SE); printf("Ir(target1) = %g +/- %g\n", mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); CHECK(eq_eps(mc_rcv.integrated_irradiance.E, TOTAL, TOTAL * 1e-4), 1);