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