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