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 491e8ffbfec89d039acaaf8a38fdee407b246cfc
parent 5adce6172f84fad272b8d70252af2857862d03cd
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 26 Jan 2017 16:02:17 +0100

Merge remote-tracking branch 'origin/master'

Diffstat:
Mdoc/input | 12++++++++++--
Msrc/parser/solparser.c | 24++++++++++++++++++++++--
Msrc/parser/solparser_entity.h | 6++++++
Msrc/parser/test_solparser2.c | 6++++++
Msrc/parser/test_solparser3.c | 3+++
Msrc/parser/test_solparser4.c | 1+
Msrc/parser/test_solparser5.c | 1+
Msrc/parser/yaml/test_ko_0.yaml | 82++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Msrc/parser/yaml/test_ok_0.yaml | 7++++++-
Msrc/parser/yaml/test_ok_1.yaml | 4++++
Msrc/parser/yaml/test_ok_2.yaml | 5+++++
Msrc/parser/yaml/test_ok_3.yaml | 2++
Msrc/solstice_c.h | 5+++++
Msrc/solstice_entity.c | 2++
Msrc/solstice_node.c | 9+++++++++
15 files changed, 161 insertions(+), 8 deletions(-)

diff --git a/doc/input b/doc/input @@ -27,6 +27,7 @@ # Create the solar factory - entity: name: "entity0" + primary: 0 transform: { rotation: [0, 90, 0] } anchors: - name: "anchor0" @@ -42,6 +43,7 @@ - template: &composition name: "composition" + primary: 1 transform: { translation: [1, 2, 3 ] } geometry: - cylinder: { height: 5, radius: 0.5 } @@ -60,16 +62,19 @@ - entity: name: "entity2" + primary: 0 transform: { translation: [4, 5, 6] } children: [ *composition ] - entity: name: "entity3" + primary: 0 transform: { translation: [7, 8, 9] } children: [ *composition ] - entity: name: "entity4" + primary: 1 transform: { translation: [10, 11, 12] } children: [ *composition ] @@ -114,7 +119,6 @@ | position: <real3> | <sun> - ---------------------------------------- <shape> ::= <cuboid> @@ -212,11 +216,15 @@ <entity-data> ::= name: STRING -[ <geometry> | <pivot> ] +[ <geometry-data> | <pivot> ] [ <anchors> ] [ <transform> ] [ <children> ] +<geometry-data> ::= + primary: INTEGER # in [0, 1] + <geometry> + <children> ::= children: - <entity-data> diff --git a/src/parser/solparser.c b/src/parser/solparser.c @@ -2450,7 +2450,7 @@ parse_entity struct htable_str2sols* htable, struct solparser_entity_id* out_isolent) { - enum { ANCHORS, CHILDREN, DATA, NAME, TRANSFORM }; + enum { ANCHORS, CHILDREN, DATA, NAME, TRANSFORM, PRIMARY }; struct solparser_entity solent; struct solparser_entity* psolent; const size_t *pisolent; @@ -2531,7 +2531,13 @@ parse_entity SETUP_MASK(TRANSFORM, "transform"); res = parse_transform (parser, doc, val, solent.translation, solent.rotation); - } else { + } else if (!strcmp((char*) key->data.scalar.value, "primary")) { + long tmp; + SETUP_MASK(PRIMARY, "primary"); + res = parse_integer(parser, val, 0, 1, &tmp); + solent.primary = (int)tmp; + } + else { log_err(parser, key, "unknown entity parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; @@ -2554,8 +2560,22 @@ parse_entity res = RES_BAD_ARG; \ goto error; \ } (void)0 + #define CHECK_NOPARAM(Flag, Name) \ + if(mask & BIT(Flag)) { \ + log_err(parser, entity, \ + "the entity "Name" is invalid in this context.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } (void) 0 CHECK_PARAM(NAME, "name"); + if (solent.type == SOLPARSER_ENTITY_GEOMETRY) { + CHECK_PARAM(PRIMARY, "primary"); + } + else { + CHECK_NOPARAM(PRIMARY, "primary"); + } #undef CHECK_PARAM + #undef CHECK_NOPARAM psolent = darray_entity_data_get(&parser->entities) + isolent; res = solparser_entity_copy_and_clear(psolent, &solent); diff --git a/src/parser/solparser_entity.h b/src/parser/solparser_entity.h @@ -61,6 +61,8 @@ struct solparser_entity { struct str name; + int primary; + enum solparser_entity_type type; union { struct solparser_geometry_id geometry; @@ -84,6 +86,7 @@ solparser_entity_init entity->type = SOLPARSER_ENTITY_GEOMETRY; entity->data.geometry.i = SIZE_MAX; str_init(allocator, &entity->name); + entity->primary = 2; htable_str2sols_init(allocator, &entity->str2anchors); htable_str2sols_init(allocator, &entity->str2children); darray_anchor_id_init(allocator, &entity->anchors); @@ -112,6 +115,7 @@ solparser_entity_copy dst->type = src->type; dst->data = src->data; res = str_copy(&dst->name, &src->name); + dst->primary = src->primary; if(res != RES_OK) return res; res = htable_str2sols_copy(&dst->str2anchors, &src->str2anchors); if(res != RES_OK) return res; @@ -135,6 +139,7 @@ solparser_entity_copy_and_release dst->type = src->type; dst->data = src->data; res = str_copy_and_release(&dst->name, &src->name); + dst->primary = src->primary; if(res != RES_OK) return res; res = htable_str2sols_copy_and_release(&dst->str2anchors, &src->str2anchors); if(res != RES_OK) return res; @@ -158,6 +163,7 @@ solparser_entity_copy_and_clear dst->type = src->type; dst->data = src->data; res = str_copy_and_clear(&dst->name, &src->name); + dst->primary = src->primary; if(res != RES_OK) return res; res = htable_str2sols_copy_and_clear(&dst->str2anchors, &src->str2anchors); if(res != RES_OK) return res; diff --git a/src/parser/test_solparser2.c b/src/parser/test_solparser2.c @@ -57,19 +57,23 @@ main(int argc, char** argv) fprintf(stream, " material: { matte: { reflectivity: 1 } }\n"); fprintf(stream, "- entity:\n"); fprintf(stream, " name: lvl 0\n"); + fprintf(stream, " primary: 0\n"); fprintf(stream, " geometry: *sphere\n"); fprintf(stream, " transform: { translation: [1,2,3], rotation: [4,5,6]}\n"); fprintf(stream, " children:\n"); fprintf(stream, " - name: lvl1a\n"); + fprintf(stream, " primary: 1\n"); fprintf(stream, " geometry: \n"); fprintf(stream, " - sphere: {radius: 2}\n"); fprintf(stream, " material:\n"); fprintf(stream, " mirror: { reflectivity: 0.9, roughness: 0.1 }\n"); fprintf(stream, " - name: lvl1b\n"); + fprintf(stream, " primary: 0\n"); fprintf(stream, " geometry: *sphere\n"); fprintf(stream, " transform: { rotation: [3.14, 0, -1] }\n"); fprintf(stream, " children:\n"); fprintf(stream, " - name: lvl2\n"); + fprintf(stream, " primary: 0\n"); fprintf(stream, " geometry: *sphere\n"); fprintf(stream, "- sun:\n"); fprintf(stream, " dni: 1\n"); @@ -142,6 +146,7 @@ main(int argc, char** argv) CHECK(strcmp("lvl1a", str_cget(&entity1a->name)), 0); CHECK(solparser_entity_get_children_count(entity1a), 0); CHECK(entity1a->type, SOLPARSER_ENTITY_GEOMETRY); + CHECK(entity1a->primary, 1); NCHECK(entity1a->data.geometry.i, geom_id.i); geom = solparser_get_geometry(parser, entity1a->data.geometry); CHECK(geom == geoms[0] || geom == geoms[1], 1); @@ -170,6 +175,7 @@ main(int argc, char** argv) CHECK(strcmp("lvl1b", str_cget(&entity1b->name)), 0); CHECK(solparser_entity_get_children_count(entity1b), 1); CHECK(entity1b->type, SOLPARSER_ENTITY_GEOMETRY); + CHECK(entity1b->primary, 0); CHECK(entity1b->data.geometry.i, geom_id.i); entity_id = solparser_entity_get_child(entity1b, 0); diff --git a/src/parser/test_solparser3.c b/src/parser/test_solparser3.c @@ -27,6 +27,7 @@ static const char* input[] = { " spectrum: [{wavelength: 1, data: 1}]\n", "- entity:\n", " name: entity0\n", + " primary: 0\n", " geometry: *cylinder\n", " anchors:\n", " - name: anchor0\n", @@ -35,8 +36,10 @@ static const char* input[] = { " position: [4, 5, 6]\n", " children:\n", " - name: entity0a\n", + " primary: 1\n", " geometry: *cylinder\n", " - name: entity0b\n", + " primary: 1\n", " geometry: *cylinder\n", " anchors:\n\n", " - name: anchor0\n", diff --git a/src/parser/test_solparser4.c b/src/parser/test_solparser4.c @@ -29,6 +29,7 @@ static const char* input[] = { " material: *lambertian\n", "- template: &template\n", " name: template0\n", + " primary: 1\n", " geometry: *cuboid\n", "- entity:\n", " name: entity0\n", diff --git a/src/parser/test_solparser5.c b/src/parser/test_solparser5.c @@ -26,6 +26,7 @@ static const char* input[] = { " material: { matte: { reflectivity: 1 } }\n", "- template: &template\n", " name: lvl1\n", + " primary: 1\n", " geometry: *cuboid\n", " anchors:\n", " - name: anchor0\n", diff --git a/src/parser/yaml/test_ko_0.yaml b/src/parser/yaml/test_ko_0.yaml @@ -898,13 +898,18 @@ # <entity> ::= # entity: # <entity-data> -## +# # <entity-data> ::= # name: STRING -# [ <geometry> | <pivot> ] +# [ <geometry-data> | <pivot> ] # [ <anchors> ] # [ <transform> ] # [ <children> ] +# +# <geometry-data> ::= +# primary: INTEGER # in [0, 1] +# <geometry> +# # missing entity definition - entity: @@ -915,6 +920,9 @@ # missing name value - entity: { name: } --- +# missing primary value +- entity: { primary: } +--- # missing geometry value - entity: { geometry: } --- @@ -930,15 +938,40 @@ # missing children value - entity: { children: } --- +# primary should be a number +- entity: { primary: "dummy" } +--- +# -1 invalid +- entity: { primary: -1 } +--- +# 2 invalid +- entity: { primary: 2 } +--- # missing entity name - entity: + primary: 1 geometry: - stl: { path: "file" } material: { matte: { reflectivity: 1 } } --- +# missing entity primary +- entity: + name: "entity" + geometry: + - stl: { path: "file" } + material: { matte: { reflectivity: 1 } } +--- +# primary invalid in this context +- entity: + name: "entity" + primary: 1 +--- # 2x name - entity: { name: "ent", name: "ent" } --- +# 2x primary +- entity: { primary: 1, primary: 1 } +--- # cannot define both geometry and pivot - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: @@ -972,11 +1005,13 @@ # 2 entities with the same name - entity: name: "foo" + primary: 1 geometry: - stl: { path: "file" } material: { matte: { reflectivity: 1 } } - entity: name: "foo" + primary: 1 geometry: - stl: { path: "file" } material: { matte: { reflectivity: 1 } } @@ -988,10 +1023,15 @@ # # <entity-data> ::= # name: STRING -# [ <geometry> | <pivot> ] +# [ <geometry-data> | <pivot> ] # [ <anchors> ] # [ <transform> ] # [ <children> ] +# +# <geometry-data> ::= +# primary: INTEGER # in [0, 1] +# <geometry> +# # missing template definition - template: &temp @@ -1005,6 +1045,10 @@ - template: &temp { name: } - entity: *temp --- +# missing primary value +- template: &temp { primary: } +- entity: *temp +--- # missing geometry value - template: &temp { geometry: } - entity: *temp @@ -1025,6 +1069,17 @@ - template: &temp { children: } - entity: *temp --- +# primary should be a number +- template: &temp { primary: "dummy" } +--- +# -1 invalid +- template: &temp { primary: -1 } +- entity: *temp +--- +# 2 invalid +- template: &temp { primary: 2 } +- entity: *temp +--- # missing template name - template: &temp geometry: @@ -1032,10 +1087,28 @@ material: { matte: { reflectivity: 1 } } - entity: *temp --- +# missing template primary +- template: &temp + name: "entity" + geometry: + - stl: { path: "file" } + material: { matte: { reflectivity: 1 } } +- entity: *temp +--- +# primary invalid in this context +- template: &temp + name: "entity" + primary: 1 +- entity: *temp +--- # 2x name - template: &temp { name: "ent", name: "ent" } - entity: *temp --- +# 2x primary +- template: &temp { primary: 1, primary: 1 } +- entity: *temp +--- # cannot define both geometry and pivot - sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - template: &temp @@ -1073,11 +1146,13 @@ # 2 templates with the same name - template: &temp1 name: "foo" + primary: 1 geometry: - stl: { path: "file" } material: { matte: { reflectivity: 1 } } - template: &temp2 name: "foo" + primary: 1 geometry: - stl: { path: "file" } material: { matte: { reflectivity: 1 } } @@ -1188,6 +1263,7 @@ # missing sun in document - entity: name: foo + primary: 1 geometry: - cuboid: { size: [1, 2, 3] } material: { matte: { reflectivity: 1 } } diff --git a/src/parser/yaml/test_ok_0.yaml b/src/parser/yaml/test_ok_0.yaml @@ -1,6 +1,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: "entity" + primary: 0 transform: rotation: [ 0, 1, 2 ] translation: [ -4, 5.2, -6.5 ] @@ -12,6 +13,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: "entity" + primary: 0 transform: { translation: [ 1, 2, 0 ] } geometry: - transform: @@ -23,6 +25,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: "entity" + primary: 0 geometry: - material: { matte: { reflectivity: 1 } } cuboid: { size: [1, 2, 3] } @@ -33,6 +36,7 @@ - entity: name: "entity" + primary: 0 geometry: - material: *lambertian cuboid: { size: [1, 2, 3] } @@ -43,13 +47,14 @@ - geometry: &cuboid - cuboid: { size: [1, 2, 3] } material: { front: *front, back: *back } -- entity: { name: "hop", geometry: *cuboid } +- entity: { name: "hop", primary: 1, geometry: *cuboid } - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } --- - material: &lambertian { matte: { reflectivity: 1 } } - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: hop + primary: 0 geometry: &cuboid - cuboid: { size: [1, 2, 3] } material: diff --git a/src/parser/yaml/test_ok_1.yaml b/src/parser/yaml/test_ok_1.yaml @@ -14,6 +14,7 @@ - entity: name: "hop" + primary: 0 geometry: *cylinder transform: translation: [0, 1, 2] @@ -34,11 +35,13 @@ - entity: name: "entity" + primary: 0 geometry: *cylinder --- - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: entity + primary: 1 geometry: - material: { mirror: { reflectivity: 0.314, roughness: 0.5 } } cylinder: { height: 10.12, radius: 0.32 } @@ -46,6 +49,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: entity + primary: 1 geometry: - material: { mirror: { reflectivity: 0, roughness: 0.5 } } cylinder: { height: 1, radius: 1 } diff --git a/src/parser/yaml/test_ok_2.yaml b/src/parser/yaml/test_ok_2.yaml @@ -1,6 +1,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: 1 + primary: 0 geometry: - material: { matte: { reflectivity: 1 } } stl: { path: path toward } @@ -8,6 +9,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: 1a + primary: 1 geometry: - material: { matte: { reflectivity: 1 } } obj: { path: "my_path" } @@ -15,6 +17,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: test + primary: 0 geometry: - material: { matte: { reflectivity: 1 } } obj: { path: "path/path/path" } @@ -23,6 +26,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: test + primary: 0 geometry: - material: { matte: { reflectivity: 1 } } obj: { path: "path/path/path" } @@ -31,6 +35,7 @@ - sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } - entity: name: hop + primary: 1 geometry: - material: { matte: { reflectivity: 1 } } stl: { path: "path/path/path" } diff --git a/src/parser/yaml/test_ok_3.yaml b/src/parser/yaml/test_ok_3.yaml @@ -13,9 +13,11 @@ - template: &template name: "template" + primary: 0 geometry: *geom children: - name: "child0" + primary: 0 geometry: *geom transform: { rotation: [1, 2, 3] } diff --git a/src/solstice_c.h b/src/solstice_c.h @@ -106,6 +106,11 @@ solstice_node_ref_put (struct solstice_node* node); extern LOCAL_SYM res_T +solstice_node_geometry_set_primary + (struct solstice_node* node, + const int is_primary); + +extern LOCAL_SYM res_T solstice_node_geometry_set_receiver (struct solstice_node* node, const int mask); /* Combination of ssol_side_flag */ diff --git a/src/solstice_entity.c b/src/solstice_entity.c @@ -176,6 +176,8 @@ create_node(struct solstice* solstice, const struct solparser_entity* entity) break; case SOLPARSER_ENTITY_GEOMETRY: node = create_geometry_node(solstice, entity); + res = solstice_node_geometry_set_primary(node, entity->primary); + if (res != RES_OK) goto error; break; case SOLPARSER_ENTITY_PIVOT: node = create_pivot_node(solstice, entity); diff --git a/src/solstice_node.c b/src/solstice_node.c @@ -222,6 +222,15 @@ solstice_node_ref_put(struct solstice_node* node) } res_T +solstice_node_geometry_set_primary + (struct solstice_node* node, + const int is_primary) +{ + ASSERT(node && (!is_primary || node->type == SOLSTICE_NODE_GEOMETRY)); + return ssol_instance_sample(node->instance, is_primary); +} + +res_T solstice_node_geometry_set_receiver(struct solstice_node* node, const int mask) { ASSERT(node && node->type == SOLSTICE_NODE_GEOMETRY);