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