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 ab92ef6795915fde9aa882d116078642922b7425
parent c2a24f515e1b0a3b6e068927956f28d72fc141c2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 26 Jan 2017 14:31:33 +0100

Add the virtual material descriptor to the input fileformat

Add the virtual specification and parse it.

Diffstat:
Mcmake/parser/CMakeLists.txt | 4+++-
Mdoc/input | 6++++--
Msrc/parser/solparser.c | 26+++++++++++++++++++++++++-
Msrc/parser/solparser_material.h | 3++-
Asrc/parser/yaml/test_ok_4.yaml | 32++++++++++++++++++++++++++++++++
5 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/cmake/parser/CMakeLists.txt b/cmake/parser/CMakeLists.txt @@ -74,8 +74,10 @@ if(NOT NO_TEST) ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_1.yaml) add_test(test_solparser_ok_2 test_solparser ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_2.yaml) - add_test(test_solparser_ok_2 test_solparser + add_test(test_solparser_ok_3 test_solparser ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_3.yaml) + add_test(test_solparser_ok_4 test_solparser + ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_4.yaml) add_test(test_solparser_ko test_solparser -e ${SOLPARSER_SOURCE_DIR}/yaml/test_ko_0.yaml) diff --git a/doc/input b/doc/input @@ -187,7 +187,7 @@ back: <material-descriptor> <material-descriptor> ::= - <mirror> | <matte> + <mirror> | <matte> | <virtual> <mirror> ::= mirror: @@ -198,6 +198,9 @@ matte: reflectivity: REAL # in [0, 1] +<virtual> ::= + virtual: EMPTY-STRING + ---------------------------------------- <entity> ::= entity: @@ -282,4 +285,3 @@ wavelength: REAL # in [0, INF) data: REAL # in [0, INF) - diff --git a/src/parser/solparser.c b/src/parser/solparser.c @@ -921,7 +921,7 @@ parse_material_mirror if(mirror->type != YAML_MAPPING_NODE) { log_err(parser, mirror, - "expect a mapping of mirror material attributes .\n"); + "expect a mapping of mirror material attributes.\n"); res = RES_BAD_ARG; goto error; } @@ -998,6 +998,26 @@ error: } static res_T +parse_material_virtual(struct solparser* parser, yaml_node_t* virtual) +{ + res_T res = RES_OK; + ASSERT(virtual); + + if(virtual->type != YAML_SCALAR_NODE + || ((char*)virtual->data.scalar.value)[0] != '\0') { + log_err(parser, virtual, + "virtual materials can have a null scalar value only.\n"); + res = RES_BAD_ARG; + goto error; + } + +exit: + return res; +error: + goto exit; +} + +static res_T parse_material_descriptor (struct solparser* parser, yaml_document_t* doc, @@ -1065,6 +1085,10 @@ parse_material_descriptor SETUP_MASK(DESCRIPTOR, "descriptor"); mtl->type = SOLPARSER_MATERIAL_MIRROR; res = parse_material_mirror(parser, doc, val, &mtl->data.mirror); + } else if(!strcmp((char*)key->data.scalar.value, "virtual")) { + SETUP_MASK(DESCRIPTOR, "virtual"); + mtl->type = SOLPARSER_MATERIAL_VIRTUAL; + res = parse_material_virtual(parser, val); } else { log_err(parser, key, "unknown material descriptor `%s'.\n", key->data.scalar.value); diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h @@ -20,7 +20,8 @@ enum solparser_material_type { SOLPARSER_MATERIAL_MATTE, - SOLPARSER_MATERIAL_MIRROR + SOLPARSER_MATERIAL_MIRROR, + SOLPARSER_MATERIAL_VIRTUAL }; struct solparser_material_matte { diff --git a/src/parser/yaml/test_ok_4.yaml b/src/parser/yaml/test_ok_4.yaml @@ -0,0 +1,32 @@ +- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } + +- material: &virtual + ? virtual + +- entity: + name: "entity" + geometry: + - material: *virtual + sphere: { radius: 1 } +--- +- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } +- entity: + name: "entity" + geometry: + - material: { virtual: "" } + sphere: { radius: 1 } +--- +- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } +- entity: + name: "entity" + geometry: + - material: { virtual: } + sphere: { radius: 1 } +--- +- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } +- entity: + name: "entity" + geometry: + - material: { ?virtual } + sphere: { radius: 1 } +