solstice-solver

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

commit e4f68d2113fed14e012d2936ddb8047e41376e86
parent f63ed8d3cd5319492a3b9aeb5ddb0169b133a7a1
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 15 Feb 2017 14:50:15 +0100

Integrate all receiver data per receiver primitive

Diffstat:
Msrc/ssol.h | 2+-
Msrc/ssol_estimator.c | 5+++--
Msrc/ssol_estimator_c.h | 41++++++++++++++++++++---------------------
Msrc/ssol_solver.c | 50+++++++++++++++++++++++++++++++++-----------------
4 files changed, 57 insertions(+), 41 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -263,7 +263,7 @@ struct ssol_mc_receiver { struct ssol_mc_result integrated_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 */ + struct ssol_mc_result cos_loss; /* In W TODO remove this */ }; typedef res_T diff --git a/src/ssol_estimator.c b/src/ssol_estimator.c @@ -133,8 +133,9 @@ ssol_estimator_get_mc_receiver #define SETUP_MC_RESULT(Name) { \ const double N = (double)estimator->realisation_count; \ - rcv->Name.E = mc_rcv1->Name.weight / N; \ - rcv->Name.V = mc_rcv1->Name.sqr_weight/N - rcv->Name.E*rcv->Name.E; \ + const struct mc_data* data = &mc_rcv1->data.Name; \ + rcv->Name.E = data->weight / N; \ + rcv->Name.V = data->sqr_weight/N - rcv->Name.E*rcv->Name.E; \ rcv->Name.SE = rcv->Name.V > 0 ? sqrt(rcv->Name.V / N) : 0; \ } (void)0 SETUP_MC_RESULT(integrated_irradiance); diff --git a/src/ssol_estimator_c.h b/src/ssol_estimator_c.h @@ -34,17 +34,25 @@ static const struct mc_data MC_DATA_NULL = MC_DATA_NULL__; /******************************************************************************* * One sided Per receiver MC data ******************************************************************************/ +struct mc_receiver_data { + struct mc_data integrated_irradiance; /* In W */ + struct mc_data absorptivity_loss; /* In W */ + struct mc_data reflectivity_loss; /* In W */ + struct mc_data cos_loss; /* In W */ +}; +#define MC_RECEIVER_DATA_NULL__ \ + { MC_DATA_NULL__, MC_DATA_NULL__, MC_DATA_NULL__, MC_DATA_NULL__ } +static const struct mc_receiver_data MC_RECEIVER_DATA_NULL = + MC_RECEIVER_DATA_NULL__; + /* Declare the Per primitive receiver hash table */ #define HTABLE_NAME rcvprim #define HTABLE_KEY unsigned -#define HTABLE_DATA struct mc_data +#define HTABLE_DATA struct mc_receiver_data #include <rsys/hash_table.h> struct mc_receiver_1side { - struct mc_data integrated_irradiance; /* In W */ - struct mc_data absorptivity_loss; /* In W */ - struct mc_data reflectivity_loss; /* In W */ - struct mc_data cos_loss; /* In W */ + struct mc_receiver_data data; struct htable_rcvprim prims; /* Per primitive MC */ }; @@ -53,10 +61,7 @@ mc_receiver_1side_init (struct mem_allocator* allocator, struct mc_receiver_1side* mc) { ASSERT(mc); - mc->integrated_irradiance = MC_DATA_NULL; - mc->absorptivity_loss = MC_DATA_NULL; - mc->reflectivity_loss = MC_DATA_NULL; - mc->cos_loss = MC_DATA_NULL; + mc->data = MC_RECEIVER_DATA_NULL; htable_rcvprim_init(allocator, &mc->prims); } @@ -72,10 +77,7 @@ mc_receiver_1side_copy (struct mc_receiver_1side* dst, const struct mc_receiver_1side* src) { ASSERT(dst && src); - dst->integrated_irradiance = src->integrated_irradiance; - dst->absorptivity_loss = src->absorptivity_loss; - dst->reflectivity_loss = src->reflectivity_loss; - dst->cos_loss = src->cos_loss; + dst->data = src->data; return htable_rcvprim_copy(&dst->prims, &src->prims); } @@ -84,24 +86,21 @@ mc_receiver_1side_copy_and_release (struct mc_receiver_1side* dst, struct mc_receiver_1side* src) { ASSERT(dst && src); - dst->integrated_irradiance = src->integrated_irradiance; - dst->absorptivity_loss = src->absorptivity_loss; - dst->reflectivity_loss = src->reflectivity_loss; - dst->cos_loss = src->cos_loss; + dst->data = src->data; return htable_rcvprim_copy_and_release(&dst->prims, &src->prims); } -static INLINE struct mc_data* +static INLINE struct mc_receiver_data* mc_receiver_1side_get_mc_primitive (struct mc_receiver_1side* mc_rcv, const unsigned iprim) { - struct mc_data* pmc = NULL; + struct mc_receiver_data* pmc = NULL; ASSERT(mc_rcv); pmc = htable_rcvprim_find(&mc_rcv->prims, &iprim); if(!pmc) { - struct mc_data mc_prim = MC_DATA_NULL; - const res_T res = htable_rcvprim_set(&mc_rcv->prims, &iprim, &mc_prim); + const res_T res = htable_rcvprim_set + (&mc_rcv->prims, &iprim, &MC_RECEIVER_DATA_NULL); if(res != RES_OK) goto error; pmc = htable_rcvprim_find(&mc_rcv->prims, &iprim); } diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -334,14 +334,14 @@ accum_mc_receivers_1side struct mc_receiver_1side* src) { struct htable_rcvprim_iterator it, end; - const struct mc_data* mc_src; - struct mc_data* mc_dst; + const struct mc_receiver_data* mc_src; + struct mc_receiver_data* mc_dst; unsigned iprim; ASSERT(dst && src); #define ACCUM_WEIGHT(Name) { \ - dst->Name.weight += src->Name.weight; \ - dst->Name.sqr_weight += src->Name.sqr_weight; \ + dst->data.Name.weight += src->data.Name.weight; \ + dst->data.Name.sqr_weight += src->data.Name.sqr_weight; \ } (void)0 ACCUM_WEIGHT(integrated_irradiance); ACCUM_WEIGHT(absorptivity_loss); @@ -356,8 +356,16 @@ accum_mc_receivers_1side iprim = *htable_rcvprim_iterator_key_get(&it); mc_src = htable_rcvprim_iterator_data_get(&it); mc_dst = mc_receiver_1side_get_mc_primitive(dst, iprim); - mc_dst->weight += mc_src->weight; - mc_dst->sqr_weight += mc_src->sqr_weight; + + #define ACCUM_WEIGHT(Name) { \ + mc_dst->Name.weight += mc_src->Name.weight; \ + mc_dst->Name.sqr_weight += mc_src->Name.sqr_weight; \ + } (void)0 + ACCUM_WEIGHT(integrated_irradiance); + ACCUM_WEIGHT(absorptivity_loss); + ACCUM_WEIGHT(reflectivity_loss); + ACCUM_WEIGHT(cos_loss); + #undef ACCUM_WEIGHT htable_rcvprim_iterator_next(&it); } } @@ -513,25 +521,33 @@ ssol_solve break; } mc_rcv1 = estimator_get_mc_receiver(receiver, pt.inst, pt.side); - mc_rcv1->integrated_irradiance.weight += pt.weight; - mc_rcv1->integrated_irradiance.sqr_weight += pt.weight*pt.weight; - mc_rcv1->absorptivity_loss.weight += pt.absorptivity_loss; - mc_rcv1->absorptivity_loss.sqr_weight += pt.absorptivity_loss * pt.absorptivity_loss; - mc_rcv1->reflectivity_loss.weight += pt.reflectivity_loss; - mc_rcv1->reflectivity_loss.sqr_weight += pt.reflectivity_loss * pt.reflectivity_loss; - mc_rcv1->cos_loss.weight += pt.cos_loss; - mc_rcv1->cos_loss.sqr_weight += pt.cos_loss * pt.cos_loss; + #define ACCUM_WEIGHT(Name, W) { \ + mc_rcv1->data.Name.weight += (W); \ + mc_rcv1->data.Name.sqr_weight += (W)*(W); \ + } (void)0 + ACCUM_WEIGHT(integrated_irradiance, pt.weight); + ACCUM_WEIGHT(absorptivity_loss, pt.absorptivity_loss); + ACCUM_WEIGHT(reflectivity_loss, pt.reflectivity_loss); + ACCUM_WEIGHT(cos_loss, pt.cos_loss); + #undef ACCUM_WEIGHT hit_a_receiver = 1; if(pt.inst->receiver_per_primitive) { - struct mc_data* mc_prim; + struct mc_receiver_data* mc_prim; mc_prim = mc_receiver_1side_get_mc_primitive(mc_rcv1, pt.prim.prim_id); if(!mc_prim) { ATOMIC_SET(&res, RES_MEM_ERR); break; } - mc_prim->weight += pt.weight; - mc_prim->sqr_weight += pt.weight*pt.weight; + #define ACCUM_WEIGHT(Name, W) { \ + mc_prim->Name.weight += (W); \ + mc_prim->Name.sqr_weight += (W)*(W); \ + } (void)0 + ACCUM_WEIGHT(integrated_irradiance, pt.weight); + ACCUM_WEIGHT(absorptivity_loss, pt.absorptivity_loss); + ACCUM_WEIGHT(reflectivity_loss, pt.reflectivity_loss); + ACCUM_WEIGHT(cos_loss, pt.cos_loss); + #undef ACCUM_WEIGHT } }