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 fa02cd51b86c1c6e1e70c962d680562b163ba416
parent dab7791ef56fe6a64556f32e5175c7704cb09ea9
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  8 Feb 2017 10:28:56 +0100

Fix the setup of the receivers

A receiver name referenced several entities.

Diffstat:
Msrc/solstice.c | 16+++++++++++-----
Msrc/solstice.h | 52+++++++---------------------------------------------
Msrc/solstice_entity.c | 38+++++++++++++++++++++++++++++++++-----
Msrc/solstice_solve.c | 3++-
4 files changed, 53 insertions(+), 56 deletions(-)

diff --git a/src/solstice.c b/src/solstice.c @@ -190,7 +190,7 @@ setup_sun_dirs(struct solstice* solstice, const struct solstice_args* args) res = darray_double_resize(&solstice->sun_dirs, args->nsun_dirs*3/*#dims*/); if(res != RES_OK) { fprintf(stderr, - "Could not reserve the list of %lu sun directions.\n", + "Could not reserve the list of %lu sun directions.\n", (unsigned long)args->nsun_dirs); goto error; @@ -251,11 +251,12 @@ static res_T setup_receivers(struct solstice* solstice, struct srcvl* srcvl) { struct solstice_receiver receiver; + struct str name; size_t i, n; res_T res = RES_OK; ASSERT(solstice && srcvl); - solstice_receiver_init(solstice->allocator, &receiver); + str_init(solstice->allocator, &name); n = srcvl_count(srcvl); FOR_EACH(i, 0, n) { @@ -278,11 +279,16 @@ setup_receivers(struct solstice* solstice, struct srcvl* srcvl) goto error; } + res = str_set(&name, rcv.name); + if(res != RES_OK) { + fprintf(stderr, "Could not copy the receiver name.\n"); + goto error; + } + receiver.node = NULL; receiver.side = rcv.side; - str_set(&receiver.name, rcv.name); - res = htable_receiver_set(&solstice->receivers, &entity, &receiver); + res = htable_receiver_set(&solstice->receivers, &name, &receiver); if(res != RES_OK) { fprintf(stderr, "Could not register the receiver `%s' against Solstice.\n", @@ -292,7 +298,7 @@ setup_receivers(struct solstice* solstice, struct srcvl* srcvl) } exit: - solstice_receiver_release(&receiver); + str_release(&name); return res; error: htable_receiver_clear(&solstice->receivers); diff --git a/src/solstice.h b/src/solstice.h @@ -34,49 +34,9 @@ struct sanim_node; struct solstice_receiver { struct solstice_node* node; - struct str name; /* Absolute entity name */ enum srcvl_side side; }; -static void -solstice_receiver_init - (struct mem_allocator* allocator, - struct solstice_receiver* receiver) -{ - ASSERT(allocator && receiver); - receiver->node = NULL; - receiver->side = SRCVL_FRONT_AND_BACK; - str_init(allocator, &receiver->name); -} - -static void -solstice_receiver_release(struct solstice_receiver* receiver) -{ - ASSERT(receiver); - str_release(&receiver->name); -} - -static res_T -solstice_receiver_copy - (struct solstice_receiver* dst, - const struct solstice_receiver* src) -{ - ASSERT(dst && src); - dst->node = src->node; - dst->side = src->side; - return str_copy(&dst->name, &src->name); -} - -static res_T -solstice_receiver_copy_and_release - (struct solstice_receiver* dst, struct solstice_receiver* src) -{ - ASSERT(dst && src); - dst->node = src->node; - dst->side = src->side; - return str_copy_and_release(&dst->name, &src->name); -} - #define DARRAY_NAME nodes #define DARRAY_DATA struct solstice_node* #include <rsys/dynamic_array.h> @@ -98,12 +58,14 @@ solstice_receiver_copy_and_release #include <rsys/hash_table.h> #define HTABLE_NAME receiver -#define HTABLE_KEY const struct solparser_entity* +#define HTABLE_KEY struct str +#define HTABLE_KEY_FUNCTOR_INIT str_init +#define HTABLE_KEY_FUNCTOR_RELEASE str_release +#define HTABLE_KEY_FUNCTOR_COPY str_copy +#define HTABLE_KEY_FUNCTOR_COPY_AND_RELEASE str_copy_and_release +#define HTABLE_KEY_FUNCTOR_EQ str_eq +#define HTABLE_KEY_FUNCTOR_HASH str_hash #define HTABLE_DATA struct solstice_receiver -#define HTABLE_DATA_FUNCTOR_INIT solstice_receiver_init -#define HTABLE_DATA_FUNCTOR_RELEASE solstice_receiver_release -#define HTABLE_DATA_FUNCTOR_COPY solstice_receiver_copy -#define HTABLE_DATA_FUNCTOR_COPY_AND_RELEASE solstice_receiver_copy_and_release #include <rsys/hash_table.h> struct solstice { diff --git a/src/solstice_entity.c b/src/solstice_entity.c @@ -217,16 +217,22 @@ error: } static struct solstice_node* -create_node(struct solstice* solstice, const struct solparser_entity* entity) +create_node + (struct solstice* solstice, + const struct solparser_entity* entity, + const struct str* name) { struct solstice_node* node = NULL; struct solstice_node* tgt = NULL; struct solstice_node* child = NULL; struct solstice_receiver* rcv = NULL; + struct str child_name; double rotation[3]; size_t i; res_T res = RES_OK; - ASSERT(solstice && entity); + ASSERT(solstice && entity && name); + + str_init(solstice->allocator, &child_name); /* Create the entity node */ switch(entity->type) { @@ -261,7 +267,7 @@ create_node(struct solstice* solstice, const struct solparser_entity* entity) } /* Setup the entity receiver flags */ - rcv = htable_receiver_find(&solstice->receivers, &entity); + rcv = htable_receiver_find(&solstice->receivers, name); if(rcv) { const int mask = srcvl_side_to_ssol_mask(rcv->side); ASSERT(rcv->node == NULL); /* Receiver is not attached to a node */ @@ -313,7 +319,17 @@ create_node(struct solstice* solstice, const struct solparser_entity* entity) id = solparser_entity_get_child(entity, i); child_entity = solparser_get_entity(solstice->parser, id); - child = create_node(solstice, child_entity); + #define CALL(Func) \ + if(RES_OK != (res = Func)) { \ + fprintf(stderr, "Could not build the absolute entity name.\n"); \ + goto error; \ + } (void)0 + CALL(str_copy(&child_name, name)); + CALL(str_append_char(&child_name, '.')); + CALL(str_append(&child_name, str_cget(&child_entity->name))); + #undef CALL + + child = create_node(solstice, child_entity, &child_name); if(!child) goto error; res = solstice_node_add_child(node, child); @@ -324,6 +340,7 @@ create_node(struct solstice* solstice, const struct solparser_entity* entity) } exit: + str_release(&child_name); return node; error: if(tgt) solstice_node_ref_put(tgt); @@ -341,10 +358,13 @@ solstice_setup_entities(struct solstice* solstice) { struct solparser_entity_iterator it, it_end; struct solstice_node* root = NULL; + struct str name; const double dummy_sun_dir[3] = {0, 0, -1}; res_T res = RES_OK; ASSERT(solstice); + str_init(solstice->allocator, &name); + /* (re) create the list of roots from entities */ solparser_entity_iterator_begin(solstice->parser, &it); solparser_entity_iterator_end(solstice->parser, &it_end); @@ -352,10 +372,17 @@ solstice_setup_entities(struct solstice* solstice) struct solparser_entity_id entity_id; const struct solparser_entity* entity; + str_clear(&name); entity_id = solparser_entity_iterator_get(&it); entity = solparser_get_entity(solstice->parser, entity_id); - root = create_node(solstice, entity); + res = str_copy(&name, &entity->name); + if(res != RES_OK) { + fprintf(stderr, "Could not initialise the absolute entity name.\n"); + goto error; + } + + root = create_node(solstice, entity, &name); if(!root) { res = RES_BAD_ARG; goto error; @@ -381,6 +408,7 @@ solstice_setup_entities(struct solstice* solstice) } exit: + str_release(&name); return res; error: if(root) solstice_node_ref_put(root); diff --git a/src/solstice_solve.c b/src/solstice_solve.c @@ -34,6 +34,7 @@ write_global_mc(struct solstice* solstice, struct ssol_estimator* estimator) htable_receiver_begin(&solstice->receivers, &it); htable_receiver_end(&solstice->receivers, &end); while(!htable_receiver_iterator_eq(&it, &end)) { + const struct str* name = htable_receiver_iterator_key_get(&it); struct solstice_receiver* rcv = htable_receiver_iterator_data_get(&it); struct ssol_instance* inst = rcv->node->instance; struct ssol_estimator_status front; @@ -58,7 +59,7 @@ write_global_mc(struct solstice* solstice, struct ssol_estimator* estimator) } SSOL(instance_get_id(inst, &id)); fprintf(solstice->output, "%s %u %g %g %g %g\n", - str_cget(&rcv->name), (unsigned)id, + str_cget(name), (unsigned)id, front.E, front.SE, back.E, back.SE); }