solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit 8919228a6fda9e679b8f284bac0143347fd62d7d
parent 2dada361fec48f15c072702098e6071e15f573b7
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 15 Mar 2017 13:52:37 +0100

Merge remote-tracking branch 'origin/develop' into feature_outputs

Diffstat:
Mdoc/receiver | 1+
Msrc/receivers/srcvl.c | 39+++++++++++++++++++++++++++++++++++++--
Msrc/receivers/srcvl.h | 1+
Msrc/receivers/test_srcvl2.c | 19++++++++++++++++++-
Msrc/receivers/yaml/test_ko.yaml | 8++++++++
Msrc/receivers/yaml/test_ok.yaml | 2++
Msrc/solstice.c | 1+
Msrc/solstice.h | 1+
Msrc/solstice_c.h | 3++-
Msrc/solstice_entity.c | 2+-
Msrc/solstice_node.c | 5+++--
Msrc/solstice_solve.c | 19++++++++++---------
12 files changed, 85 insertions(+), 16 deletions(-)

diff --git a/doc/receiver b/doc/receiver @@ -12,6 +12,7 @@ <receiver> ::= name: <entity-identifier> side: <BACK|FRONT|FRONT_AND_BACK> +[ per_primitive: INTEGER ] # in [0, 1] <entity-identifier> STRING[.STRING ... ] diff --git a/src/receivers/srcvl.c b/src/receivers/srcvl.c @@ -15,6 +15,7 @@ #include "srcvl.h" +#include <rsys/cstr.h> #include <rsys/dynamic_array.h> #include <rsys/mem_allocator.h> #include <rsys/ref_count.h> @@ -27,6 +28,7 @@ struct receiver { struct str name; enum srcvl_side side; + int per_primitive; }; static INLINE void @@ -35,6 +37,7 @@ receiver_init(struct mem_allocator* allocator, struct receiver* receiver) ASSERT(receiver); str_init(allocator, &receiver->name); receiver->side = SRCVL_FRONT_AND_BACK; + receiver->per_primitive = 0; } static INLINE void @@ -49,15 +52,16 @@ receiver_copy(struct receiver* dst, const struct receiver* src) { ASSERT(dst && src); dst->side = src->side; + dst->per_primitive = src->per_primitive; return str_copy(&dst->name, &src->name); } - static INLINE res_T receiver_copy_and_release(struct receiver* dst, struct receiver* src) { ASSERT(dst && src); dst->side = src->side; + dst->per_primitive = src->per_primitive; return str_copy_and_release(&dst->name, &src->name); } @@ -164,12 +168,39 @@ error: } static res_T +parse_integer(struct srcvl* srcvl, yaml_node_t* integer, int* dst) +{ + res_T res = RES_OK; + ASSERT(integer && dst); + + if(integer->type != YAML_SCALAR_NODE + || !strlen((char*)integer->data.scalar.value)) { + log_err(srcvl, integer, "expect an integer.\n"); + res = RES_BAD_ARG; + goto error; + } + + res = cstr_to_int((char*)integer->data.scalar.value, dst); + if(res != RES_OK) { + log_err(srcvl, integer, "invalid integer `%s'.\n", + integer->data.scalar.value); + res = RES_BAD_ARG; + goto error; + } + +exit: + return res; +error: + goto exit; +} + +static res_T parse_receiver (struct srcvl* srcvl, yaml_document_t* doc, const yaml_node_t* receiver) { - enum { NAME, SIDE }; + enum { NAME, PER_PRIMITIVE, SIDE }; struct receiver* solreceiver = NULL; size_t isolreceiver; intptr_t i, n; @@ -218,6 +249,9 @@ parse_receiver } else if(!strcmp((char*)key->data.scalar.value, "side")) { SETUP_MASK(SIDE, "side"); res = parse_side(srcvl, val, &solreceiver->side); + } else if(!strcmp((char*)key->data.scalar.value, "per_primitive")) { + SETUP_MASK(PER_PRIMITIVE, "per_primitive"); + res = parse_integer(srcvl, val, &solreceiver->per_primitive); } else { log_err(srcvl, key, "unknown receiver parameter `%s'.\n", key->data.scalar.value); @@ -427,5 +461,6 @@ srcvl_get r = darray_receiver_cdata_get(&srcvl->receivers) + i; receiver->name = str_cget(&r->name); receiver->side = r->side; + receiver->per_primitive = r->per_primitive; } diff --git a/src/receivers/srcvl.h b/src/receivers/srcvl.h @@ -27,6 +27,7 @@ enum srcvl_side { struct srcvl_receiver { const char* name; enum srcvl_side side; + int per_primitive; /* Define if per primitive receiver is enabled */ }; struct mem_allocator; diff --git a/src/receivers/test_srcvl2.c b/src/receivers/test_srcvl2.c @@ -39,31 +39,48 @@ main(int argc, char** argv) fprintf(stream, "- { name: entity3, side: BACK }\n"); fprintf(stream, "- name: entity4\n"); fprintf(stream, " side: FRONT_AND_BACK\n"); + fprintf(stream, "- { name: entity5, side: BACK, per_primitive: 1 }\n"); + fprintf(stream, "- { name: entity6, per_primitive: 0, side: FRONT }\n"); rewind(stream); CHECK(srcvl_setup_stream(srcvl, NULL, stream), RES_OK); CHECK(srcvl_load(srcvl), RES_OK); - CHECK(srcvl_count(srcvl), 5); + CHECK(srcvl_count(srcvl), 7); srcvl_get(srcvl, 0, &receiver); CHECK(strcmp(receiver.name, "entity0"), 0); CHECK(receiver.side, SRCVL_FRONT_AND_BACK); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 1, &receiver); CHECK(strcmp(receiver.name, "entity1"), 0); CHECK(receiver.side, SRCVL_FRONT_AND_BACK); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 2, &receiver); CHECK(strcmp(receiver.name, "entity2"), 0); CHECK(receiver.side, SRCVL_FRONT); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 3, &receiver); CHECK(strcmp(receiver.name, "entity3"), 0); CHECK(receiver.side, SRCVL_BACK); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 4, &receiver); CHECK(strcmp(receiver.name, "entity4"), 0); CHECK(receiver.side, SRCVL_FRONT_AND_BACK); + CHECK(receiver.per_primitive, 0); + + srcvl_get(srcvl, 5, &receiver); + CHECK(strcmp(receiver.name, "entity5"), 0); + CHECK(receiver.side, SRCVL_BACK); + CHECK(receiver.per_primitive, 1); + + srcvl_get(srcvl, 6, &receiver); + CHECK(strcmp(receiver.name, "entity6"), 0); + CHECK(receiver.side, SRCVL_FRONT); + CHECK(receiver.per_primitive, 0); CHECK(srcvl_load(srcvl), RES_BAD_OP); diff --git a/src/receivers/yaml/test_ko.yaml b/src/receivers/yaml/test_ko.yaml @@ -18,3 +18,11 @@ --- - name: test - +--- +- name: test + per_primitive: hop +--- +- name: test + per_primitive: +--- +- per_primitive: 1 diff --git a/src/receivers/yaml/test_ok.yaml b/src/receivers/yaml/test_ok.yaml @@ -13,4 +13,6 @@ {name: test}, {side: FRONT_AND_BACK, name: "Hello world"}, {name: Hello world, side: BACK} + {name: hop, per_primitive: 1} + {per_primitive: 0, name: test} ] diff --git a/src/solstice.c b/src/solstice.c @@ -417,6 +417,7 @@ setup_receivers(struct solstice* solstice, struct srcvl* srcvl) receiver.node = NULL; receiver.side = rcv.side; + receiver.per_primitive = rcv.per_primitive; res = htable_receiver_set(&solstice->receivers, &name, &receiver); if(res != RES_OK) { diff --git a/src/solstice.h b/src/solstice.h @@ -35,6 +35,7 @@ struct sanim_node; struct solstice_receiver { struct solstice_node* node; enum srcvl_side side; + int per_primitive; }; struct solstice_primary { diff --git a/src/solstice_c.h b/src/solstice_c.h @@ -129,7 +129,8 @@ solstice_node_geometry_set_primary extern LOCAL_SYM res_T solstice_node_geometry_set_receiver (struct solstice_node* node, - const int mask); /* Combination of ssol_side_flag */ + const int mask, /* Combination of ssol_side_flag */ + const int per_primitive); /* Enable the per primitive integration */ extern LOCAL_SYM void solstice_node_target_get_tracking diff --git a/src/solstice_entity.c b/src/solstice_entity.c @@ -361,7 +361,7 @@ create_node const int mask = srcvl_side_to_ssol_mask(rcv->side); ASSERT(rcv->node == NULL); /* Receiver is not attached to a node */ - res = solstice_node_geometry_set_receiver(node, mask); + res = solstice_node_geometry_set_receiver(node, mask, rcv->per_primitive); if(res != RES_OK) { fprintf(stderr, "Could not define the entity `%s' as a receiver.\n", str_cget(&entity->name)); diff --git a/src/solstice_node.c b/src/solstice_node.c @@ -246,10 +246,11 @@ solstice_node_geometry_set_primary } res_T -solstice_node_geometry_set_receiver(struct solstice_node* node, const int mask) +solstice_node_geometry_set_receiver + (struct solstice_node* node, const int mask, const int per_primitive) { ASSERT(node && node->type == SOLSTICE_NODE_GEOMETRY); - return ssol_instance_set_receiver(node->instance, mask, 0); + return ssol_instance_set_receiver(node->instance, mask, per_primitive); } void diff --git a/src/solstice_solve.c b/src/solstice_solve.c @@ -25,13 +25,6 @@ static void write_global_mc(struct solstice* solstice, struct ssol_estimator* estimator) { - #define MC_RECEIVER_NULL { \ - { -1, -1, -1 }, /* integrated_irradiance */ \ - { -1, -1, -1 }, /* absorptivity_loss */ \ - { -1, -1, -1 }, /* reflectivity_loss */ \ - { -1, -1, -1 }, /* coss_loss */ \ - 0, NULL \ - } struct ssol_mc_global mc_global; struct htable_receiver_iterator r_it, r_end; struct htable_primary_iterator p_it, p_end; @@ -40,6 +33,14 @@ write_global_mc(struct solstice* solstice, struct ssol_estimator* estimator) double irradiance_factor; ASSERT(solstice && estimator); + #define MC_RCV_NONE { \ + { -1, -1, -1 }, /* Integrated irradiance */ \ + { -1, -1, -1 }, /* Absorptivity loss */ \ + { -1, -1, -1 }, /* Reflectivity loss */ \ + { -1, -1, -1 }, /* Cos loss */ \ + 0, NULL, NULL \ + } + /* get global information */ SSOL(estimator_get_mc_global(estimator, &mc_global)); SSOL(estimator_get_realisation_count(estimator, &nexperiments)); @@ -72,8 +73,8 @@ write_global_mc(struct solstice* solstice, struct ssol_estimator* estimator) const struct str* name = htable_receiver_iterator_key_get(&r_it); struct solstice_receiver* rcv = htable_receiver_iterator_data_get(&r_it); struct ssol_instance* inst = rcv->node->instance; - struct ssol_mc_receiver front = MC_RECEIVER_NULL; - struct ssol_mc_receiver back = MC_RECEIVER_NULL; + struct ssol_mc_receiver front = MC_RCV_NONE; + struct ssol_mc_receiver back = MC_RCV_NONE; double f_eff_E = -1, f_eff_SE = -1; /* Front efficiency */ double b_eff_E = -1, b_eff_SE = -1; /* Back efficiency */ uint32_t id;