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