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 341777e3f2309ac592115ac5aac2e76bd09d1394
parent 65324e2f8a5da6fba9c3ea84fcf400e15e43d91f
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  1 Mar 2017 16:20:31 +0100

Parse and load the new thin_dielectric material descriptor

Diffstat:
Mdoc/input | 10+++++++---
Msrc/parser/solparser.c | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/parser/solparser.h | 5+++++
Msrc/parser/solparser_material.h | 9+++++++++
Msrc/solstice_args.c | 4+++-
5 files changed, 147 insertions(+), 7 deletions(-)

diff --git a/doc/input b/doc/input @@ -195,7 +195,7 @@ # back: <material-descriptor> # # <material-descriptor> ::= -# <mirror> | <matte> | <virtual> +# <mirror> | <matte> | <thin-dielectric> | <virtual> # # <mirror> ::= # mirror: @@ -208,6 +208,11 @@ # # <virtual> ::= # virtual: EMPTY-STRING +# +# <thin-dielectric> ::= +# thin_dielectric: +# thickness: REAL +# refractive_index: REAL # # ---------------------------------------- # <entity> ::= @@ -296,4 +301,4 @@ # <spectrum-data> ::= # wavelength: REAL # in [0, INF) # data: REAL # in [0, INF) -# -\ No newline at end of file +# diff --git a/src/parser/solparser.c b/src/parser/solparser.c @@ -54,6 +54,11 @@ struct target_alias { #define DARRAY_DATA struct solparser_material_mirror #include <rsys/dynamic_array.h> +/* Declare the array of thin_dielectric materials */ +#define DARRAY_NAME thin_dielectric +#define DARRAY_DATA struct solparser_material_thin_dielectric +#include <rsys/dynamic_array.h> + /* Declare the array of materials */ #define DARRAY_NAME material #define DARRAY_DATA struct solparser_material @@ -175,6 +180,7 @@ struct solparser { struct darray_material2 mtls2; /* Double sided materials */ struct darray_matte mattes; struct darray_mirror mirrors; + struct darray_thin_dielectric thin_dielectrics; /* Use to deferred the setup of the anchor targeted by a pivot */ struct darray_tgtalias tgtaliases; @@ -372,6 +378,7 @@ parser_clear(struct solparser* parser) darray_material2_clear(&parser->mtls2); darray_matte_clear(&parser->mattes); darray_mirror_clear(&parser->mirrors); + darray_thin_dielectric_clear(&parser->thin_dielectrics); /* Deferred targeted anchors */ darray_tgtalias_clear(&parser->tgtaliases); @@ -423,6 +430,7 @@ parser_release(ref_T* ref) darray_material2_release(&parser->mtls2); darray_matte_release(&parser->mattes); darray_mirror_release(&parser->mirrors); + darray_thin_dielectric_release(&parser->thin_dielectrics); /* Deferred targeted anchors */ darray_tgtalias_release(&parser->tgtaliases); @@ -1014,6 +1022,102 @@ error: } static res_T +parse_material_thin_dielectric + (struct solparser* parser, + yaml_document_t* doc, + yaml_node_t* thin, + struct solparser_material_thin_dielectric_id* out_imtl) +{ + enum { REFRACTIVE_INDEX, THICKNESS }; + struct solparser_material_thin_dielectric* mtl = NULL; + size_t imtl = SIZE_MAX; + int mask = 0; /* Register the parsed attributes */ + intptr_t i, n; + res_T res = RES_OK; + ASSERT(doc && thin && out_imtl); + + if(thin->type != YAML_MAPPING_NODE) { + log_err(parser, thin, + "expect a mapping of thin material attributes.\n"); + res = RES_BAD_ARG; + goto error; + } + + /* Allocate the thin dielectric material */ + imtl = darray_thin_dielectric_size_get(&parser->thin_dielectrics); + res = darray_thin_dielectric_resize(&parser->thin_dielectrics, imtl + 1); + if(res != RES_OK) { + log_err(parser, thin, + "could not allocate the thin dielectric material.\n"); + goto error; + } + mtl = darray_thin_dielectric_data_get(&parser->thin_dielectrics) + imtl; + + n = thin->data.mapping.pairs.top - thin->data.mapping.pairs.start; + FOR_EACH(i, 0, n) { + yaml_node_t* key; + yaml_node_t* val; + + key = yaml_document_get_node(doc, thin->data.mapping.pairs.start[i].key); + val = yaml_document_get_node(doc, thin->data.mapping.pairs.start[i].value); + if(key->type != YAML_SCALAR_NODE) { + log_err(parser, key, "expect a thin dielectric material parameter.\n"); + res = RES_BAD_ARG; + goto error; + } + + #define SETUP_MASK(Flag, Name) { \ + if(mask & BIT(Flag)) { \ + log_err(parser, key, \ + "the "Name" of the thin dielectric material is already defined.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } \ + mask |= BIT(Flag); \ + } (void)0 + if(!strcmp((char*)key->data.scalar.value, "refractive_index")) { + SETUP_MASK(REFRACTIVE_INDEX, "refractive_index"); + res = parse_real + (parser, val, nextafter(0, 1), DBL_MAX, &mtl->refractive_index); + } else if(!strcmp((char*)key->data.scalar.value, "thickness")) { + SETUP_MASK(THICKNESS, "thickness"); + res = parse_real(parser, val, 0, DBL_MAX, &mtl->thickness); + } else { + log_err(parser, key, "unknown thin dielectric parameter `%s'.\n", + key->data.scalar.value); + res = RES_BAD_ARG; + goto error; + } + if(res != RES_OK) { + log_node(parser, key); + goto error; + } + #undef SETUP_MASK + } + + #define CHECK_PARAM(Flag, Name) \ + if(!(mask & BIT(Flag))) { \ + log_err(parser, thin, \ + "the "Name" of the thin dielectric material is missing.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } (void)0 + CHECK_PARAM(REFRACTIVE_INDEX, "refractive_index"); + CHECK_PARAM(THICKNESS, "thickness"); + #undef CHECK_PARAM + +exit: + out_imtl->i = imtl; + return res; +error: + if(mtl) { + darray_thin_dielectric_pop_back(&parser->thin_dielectrics); + imtl = SIZE_MAX; + } + goto exit; +} + +static res_T parse_material_virtual(struct solparser* parser, yaml_node_t* virtual) { res_T res = RES_OK; @@ -1101,8 +1205,13 @@ 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, "thin_dielectric")) { + SETUP_MASK(DESCRIPTOR, "descriptor"); + mtl->type = SOLPARSER_MATERIAL_THIN_DIELECTRIC; + res = parse_material_thin_dielectric + (parser, doc, val, &mtl->data.thin_dielectric); } else if(!strcmp((char*)key->data.scalar.value, "virtual")) { - SETUP_MASK(DESCRIPTOR, "virtual"); + SETUP_MASK(DESCRIPTOR, "descriptor"); mtl->type = SOLPARSER_MATERIAL_VIRTUAL; res = parse_material_virtual(parser, val); } else { @@ -1607,7 +1716,7 @@ parse_cylinder *(Ptr) = Value; \ } (void)0 DEFAULT_PARAM(SLICES, &shape->nslices, 16); - #undef DEFAULT_PARAM + #undef DEFAULT_PARAM exit: out_ishape->i = ishape; @@ -2948,7 +3057,7 @@ parse_zx_pivot parser, doc, val, -DBL_MAX, DBL_MAX, solxzpivot->ref_point); } else if(!strcmp((char*) key->data.scalar.value, "target")) { struct solparser_pivot_id pivot_id; - pivot_id.i = + pivot_id.i = (size_t) (solxzpivot - darray_zx_pivot_cdata_get(&parser->zx_pivots)); SETUP_MASK(TARGET, "target"); res = parse_target(parser, doc, val, &solxzpivot->target, pivot_id); @@ -3335,6 +3444,7 @@ solparser_create darray_material2_init(mem_allocator, &parser->mtls2); darray_matte_init(mem_allocator, &parser->mattes); darray_mirror_init(mem_allocator, &parser->mirrors); + darray_thin_dielectric_init(mem_allocator, &parser->thin_dielectrics); /* Deferred targeted anchors */ darray_tgtalias_init(mem_allocator, &parser->tgtaliases); @@ -3687,6 +3797,16 @@ solparser_get_material_mirror return darray_mirror_cdata_get(&parser->mirrors) + mirror.i; } +const struct solparser_material_thin_dielectric* +solparser_get_material_thin_dielectric + (const struct solparser* parser, + const struct solparser_material_thin_dielectric_id thin) +{ + ASSERT(parser); + ASSERT(thin.i < darray_thin_dielectric_size_get(&parser->thin_dielectrics)); + return darray_thin_dielectric_cdata_get(&parser->thin_dielectrics) + thin.i; +} + const struct solparser_object* solparser_get_object (const struct solparser* parser, diff --git a/src/parser/solparser.h b/src/parser/solparser.h @@ -112,6 +112,11 @@ solparser_get_material_mirror (const struct solparser* parser, const struct solparser_material_mirror_id mirror); +extern LOCAL_SYM const struct solparser_material_thin_dielectric* +solparser_get_material_thin_dielectric + (const struct solparser* parser, + const struct solparser_material_thin_dielectric_id thin_dielectric); + extern LOCAL_SYM const struct solparser_object* solparser_get_object (const struct solparser* parser, diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h @@ -21,6 +21,7 @@ enum solparser_material_type { SOLPARSER_MATERIAL_MATTE, SOLPARSER_MATERIAL_MIRROR, + SOLPARSER_MATERIAL_THIN_DIELECTRIC, SOLPARSER_MATERIAL_VIRTUAL }; @@ -37,11 +38,19 @@ struct solparser_material_mirror { struct solparser_material_mirror_id { size_t i; }; +struct solparser_material_thin_dielectric { + double refractive_index; + double thickness; +}; + +struct solparser_material_thin_dielectric_id { size_t i; }; + struct solparser_material { enum solparser_material_type type; union { struct solparser_material_matte_id matte; struct solparser_material_mirror_id mirror; + struct solparser_material_thin_dielectric_id thin_dielectric; } data; }; diff --git a/src/solstice_args.c b/src/solstice_args.c @@ -254,7 +254,9 @@ parse_rendering_option(const char* str, struct solstice_args* args) } } else { fprintf(stderr, "Invalid rendering option `%s'.\n", val); - fprintf(stderr, "Valid options are: fov=FOV:img=WIDTHxHEIGHT:pos=X,Y,Z:tgt=X,Y,Z:up=X,Y,Z\n"); + /* TODO remove this. The man page will be sufficient */ + fprintf(stderr, +"Valid options are: fov=FOV:img=WIDTHxHEIGHT:pos=X,Y,Z:tgt=X,Y,Z:up=X,Y,Z\n"); res = RES_BAD_ARG; goto error; }