solstice-solver

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

commit 98df8a91e0ab3ff0d68d2e8349b47c7b101b743c
parent ab1ff4822efbe0a0b26d56d44ea5c537148a6392
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 14 Mar 2017 11:13:51 +0100

Add access to estimator's primary entities data.

Diffstat:
Msrc/ssol.h | 18++++++++++++++++++
Msrc/ssol_estimator.c | 35++++++++++++++++++++++++++++++++++-
Msrc/test_ssol_solver1.c | 20+++++++++++++++++++-
3 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -316,6 +316,13 @@ struct ssol_mc_receiver { const void* mc__; }; +struct ssol_mc_sampled { + struct ssol_mc_result shadowed; + double area; + double sun_cos; + size_t nb_samples; +}; + struct ssol_mc_primitive { struct ssol_mc_result integrated_irradiance; /* In W */ struct ssol_mc_result integrated_absorbed_irradiance; /* In W */ @@ -929,6 +936,17 @@ ssol_estimator_get_sampled_area (const struct ssol_estimator* estimator, double* area); +SSOL_API res_T +ssol_estimator_get_sampled_count + (const struct ssol_estimator* estimator, + size_t* count); + +SSOL_API res_T +ssol_estimator_get_mc_sampled + (struct ssol_estimator* estimator, + const struct ssol_instance* samp_instance, + struct ssol_mc_sampled* sampled); + /******************************************************************************* * Per receiver MC estimations ******************************************************************************/ diff --git a/src/ssol_estimator.c b/src/ssol_estimator.c @@ -143,7 +143,6 @@ ssol_estimator_get_mc_sampled_x_receiver memset(rcv, 0, sizeof(rcv[0])); - mc_samp = htable_sampled_find(&estimator->mc_sampled, &samp_instance); if(!mc_samp || !mc_samp->nb_samples) { /* The sampled instance has no MC estimation */ @@ -202,6 +201,40 @@ ssol_estimator_get_sampled_area return RES_OK; } +res_T +ssol_estimator_get_sampled_count + (const struct ssol_estimator* estimator, size_t* count) +{ + if (!estimator || !count) return RES_BAD_ARG; + *count = htable_sampled_size_get(&estimator->mc_sampled); + return RES_OK; +} + +res_T +ssol_estimator_get_mc_sampled + (struct ssol_estimator* estimator, + const struct ssol_instance* samp_instance, + struct ssol_mc_sampled* sampled) +{ + struct mc_sampled* mc = NULL; + if (!estimator || !samp_instance || !sampled) return RES_BAD_ARG; + mc = htable_sampled_find(&estimator->mc_sampled, &samp_instance); + if(!mc) return RES_BAD_ARG; + sampled->area = samp_instance->shape_rt_area; + sampled->nb_samples = mc->nb_samples; + sampled->sun_cos = mc->sun_cos; + #define SETUP_MC_RESULT(Name) { \ + const double N = (double)estimator->realisation_count; \ + const struct mc_data* data = &mc->Name; \ + sampled->Name.E = data->weight / N; \ + 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(shadowed); + #undef SETUP_MC_RESULT + return RES_OK; +} + /******************************************************************************* * Local function ******************************************************************************/ diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -68,6 +68,7 @@ main(int argc, char** argv) struct ssol_spectrum* abs; struct ssol_atmosphere* atm; struct ssol_estimator* estimator; + struct ssol_mc_sampled sampled; struct ssol_mc_global mc_global; struct ssol_mc_receiver mc_rcv; struct ssol_mc_primitive mc_prim; @@ -80,7 +81,7 @@ main(int argc, char** argv) double transform1[12]; /* 3x4 column major matrix */ double transform2[12]; /* 3x4 column major matrix */ double dbl; - size_t i, count, fcount; + size_t i, count, fcount, scount; FILE* tmp = NULL; double m, std; double a_m, a_std; @@ -178,6 +179,17 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_failed_count(estimator, &fcount), RES_OK); CHECK(fcount, 0); + CHECK(ssol_estimator_get_sampled_count(NULL, NULL), RES_BAD_ARG); + CHECK(ssol_estimator_get_sampled_count(estimator, NULL), RES_BAD_ARG); + CHECK(ssol_estimator_get_sampled_count(NULL, &scount), RES_BAD_ARG); + CHECK(ssol_estimator_get_sampled_count(estimator, &scount), RES_OK); + CHECK(scount, 3); + + CHECK(ssol_estimator_get_mc_sampled(NULL, heliostat, &sampled), RES_BAD_ARG); + CHECK(ssol_estimator_get_mc_sampled(estimator, NULL, &sampled), RES_BAD_ARG); + CHECK(ssol_estimator_get_mc_sampled(estimator, heliostat, NULL), RES_BAD_ARG); + CHECK(ssol_estimator_get_mc_sampled(estimator, heliostat, &sampled), RES_OK); + CHECK(ssol_estimator_get_mc_global(NULL, &mc_global), RES_BAD_ARG); CHECK(ssol_estimator_get_mc_global(estimator, NULL), RES_BAD_ARG); CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); @@ -193,6 +205,7 @@ main(int argc, char** argv) CHECK(ssol_instance_sample(secondary, 0), RES_OK); CHECK(ssol_instance_sample(heliostat, 0), RES_OK); CHECK(ssol_solve(scene, rng, 10, NULL, &estimator), RES_BAD_ARG); + CHECK(ssol_estimator_get_mc_sampled(estimator, heliostat, &sampled), RES_BAD_ARG); CHECK(ssol_instance_sample(target, 1), RES_OK); CHECK(ssol_instance_sample(secondary, 1), RES_OK); @@ -415,6 +428,11 @@ main(int argc, char** argv) mc_rcv.reflectivity_loss.E, mc_rcv.reflectivity_loss.SE, 100 * mc_rcv.reflectivity_loss.E / m); + + CHECK(ssol_estimator_get_sampled_count(estimator, &scount), RES_OK); + CHECK(ssol_estimator_get_mc_sampled(estimator, heliostat, &sampled), RES_BAD_ARG); + CHECK(ssol_estimator_get_mc_sampled(estimator, heliostat2, &sampled), RES_OK); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, a_m, 1e-8), 1); CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, a_std, 1e-4), 1); CHECK(eq_eps