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 e0f2982a05d66f5da1842fa6e7f65cbdc73dac7d
parent 969b4eab6f6174fcc569a8bbd73b6493d333b5da
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 24 Mar 2017 17:12:08 +0100

Update the definition of thin_dielectric materials

A thin dielectric material is defined as a common dielectric material
with an additional thickness parameter.

Handle the solstice solver material API updates. Add a test on the
parsing of dielectric materials.

Diffstat:
Mcmake/parser/CMakeLists.txt | 2++
Mdoc/input | 10+++++-----
Msrc/parser/solparser.c | 19+++++++++----------
Msrc/parser/solparser_material.h | 4++--
Msrc/parser/test_solparser7.c | 18++++++++++++++----
Msrc/parser/yaml/test_ko_0.yaml | 28+++++++++++++++++++---------
Msrc/parser/yaml/test_ok_5.yaml | 14+++++++-------
Asrc/parser/yaml/test_ok_7.yaml | 40++++++++++++++++++++++++++++++++++++++++
Msrc/solstice_material.c | 112+++++++++++++++----------------------------------------------------------------
9 files changed, 119 insertions(+), 128 deletions(-)

diff --git a/cmake/parser/CMakeLists.txt b/cmake/parser/CMakeLists.txt @@ -82,6 +82,8 @@ if(NOT NO_TEST) ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_5.yaml) add_test(test_solparser_ok_6 test_solparser ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_6.yaml) + add_test(test_solparser_ok_7 test_solparser + ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_7.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 @@ -226,10 +226,6 @@ medium_i: <dielectric-medium> medium_t: <dielectric-medium> -<dielectric-medium> ::= - refractive_index: REAL # in ]0, INF) - absorptivity: REAL # in [0, INF) - <matte> ::= matte: reflectivity: REAL # in [0, 1] @@ -244,9 +240,13 @@ <thin-dielectric> ::= thin_dielectric: - absorption: REAL # in [0, INF) thickness: REAL # in [0, INF) + medium_i: <dielectric-medium> + medium_t: <dielectric-medium> + +<dielectric-medium> ::= refractive_index: REAL # in ]0, INF) + absorptivity: REAL # in [0, INF) #---------------------------------------- <entity> ::= diff --git a/src/parser/solparser.c b/src/parser/solparser.c @@ -1240,7 +1240,7 @@ parse_material_thin_dielectric yaml_node_t* thin, struct solparser_material_thin_dielectric_id* out_imtl) { - enum { ABSORPTION, REFRACTIVE_INDEX, THICKNESS }; + enum { MEDIUM_I, MEDIUM_T, THICKNESS }; struct solparser_material_thin_dielectric* mtl = NULL; size_t imtl = SIZE_MAX; int mask = 0; /* Register the parsed attributes */ @@ -1287,13 +1287,12 @@ parse_material_thin_dielectric } \ mask |= BIT(Flag); \ } (void)0 - if(!strcmp((char*)key->data.scalar.value, "absorption")) { - SETUP_MASK(ABSORPTION, "absorption"); - res = parse_real(parser, val, 0, DBL_MAX, &mtl->absorption); - } else 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); + if(!strcmp((char*)key->data.scalar.value, "medium_i")) { + SETUP_MASK(MEDIUM_I, "medium_i"); + res = parse_medium(parser, doc, val, &mtl->medium_i); + } else if(!strcmp((char*)key->data.scalar.value, "medium_t")) { + SETUP_MASK(MEDIUM_T, "medium_t"); + res = parse_medium(parser, doc, val, &mtl->medium_t); } else if(!strcmp((char*)key->data.scalar.value, "thickness")) { SETUP_MASK(THICKNESS, "thickness"); res = parse_real(parser, val, 0, DBL_MAX, &mtl->thickness); @@ -1317,8 +1316,8 @@ parse_material_thin_dielectric res = RES_BAD_ARG; \ goto error; \ } (void)0 - CHECK_PARAM(ABSORPTION, "absorption"); - CHECK_PARAM(REFRACTIVE_INDEX, "refractive_index"); + CHECK_PARAM(MEDIUM_I, "medium_i"); + CHECK_PARAM(MEDIUM_T, "medium_t"); CHECK_PARAM(THICKNESS, "thickness"); #undef CHECK_PARAM diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h @@ -54,8 +54,8 @@ struct solparser_material_mirror { struct solparser_material_mirror_id { size_t i; }; struct solparser_material_thin_dielectric { - double absorption; - double refractive_index; + struct solparser_medium_id medium_i; /* Outside medium */ + struct solparser_medium_id medium_t; /* Medium of the slab */ double thickness; }; diff --git a/src/parser/test_solparser7.c b/src/parser/test_solparser7.c @@ -30,6 +30,7 @@ main(int argc, char** argv) const struct solparser_material_double_sided* mtl2; const struct solparser_material* mtl; const struct solparser_material_thin_dielectric* thin; + const struct solparser_medium* medium; const struct solparser_object* obj; const struct solparser_shape* shape; FILE* stream; @@ -49,9 +50,13 @@ main(int argc, char** argv) fprintf(stream, " - sphere: { radius: 1 }\n"); fprintf(stream, " material:\n"); fprintf(stream, " thin_dielectric:\n"); - fprintf(stream, " absorption: 0.5\n"); fprintf(stream, " thickness: 0.123\n"); - fprintf(stream, " refractive_index: 1.5\n"); + fprintf(stream, " medium_i: &outside\n"); + fprintf(stream, " refractive_index: 1\n"); + fprintf(stream, " absorptivity: 0\n"); + fprintf(stream, " medium_t: &inside\n"); + fprintf(stream, " refractive_index: 1.5\n"); + fprintf(stream, " absorptivity: 20\n"); rewind(stream); CHECK(solparser_setup(parser, NULL, stream), RES_OK); @@ -79,9 +84,14 @@ main(int argc, char** argv) CHECK(mtl->type, SOLPARSER_MATERIAL_THIN_DIELECTRIC); thin = solparser_get_material_thin_dielectric (parser, mtl->data.thin_dielectric); - CHECK(thin->absorption, 0.5); CHECK(thin->thickness, 0.123); - CHECK(thin->refractive_index, 1.5); + + medium = solparser_get_medium(parser, thin->medium_i); + CHECK(medium->refractive_index, 1); + CHECK(medium->absorptivity, 0); + medium = solparser_get_medium(parser, thin->medium_t); + CHECK(medium->refractive_index, 1.5); + CHECK(medium->absorptivity, 20); CHECK(solparser_load(parser), RES_BAD_OP); solparser_ref_put(parser); diff --git a/src/parser/yaml/test_ko_0.yaml b/src/parser/yaml/test_ko_0.yaml @@ -225,27 +225,37 @@ # # <thin-dielectric> ::= # thin_dielectric: -# absorption: REAL # in [0, 1] # thickness: REAL # in [0, INF) -# refractive_index: REAL # in ]0, INF) +# medium_i: <dielectric-medium> +# medium_t: <dielectric-medium> # -# invalid absorption +# invalid absorptivity - material: - thin_dielectric: { absorption: -1, thickness: 0, refractive_index: 1 } + thin_dielectric: + thickness: 0 + medium_i: &m { refractive_index: 1, absorptivity: -1 } + medium_t: *m --- # invalid thickness - material: - thin_dielectric: { absorption: 0, thickness: -0.01, refractive_index: 1 } + thin_dielectric: + thickness: -0.01 + medium_i: &m { refractive_index: 1, absorptivity: 0 } + medium_t: *m --- # invalid refractive index - material: - thin_dielectric: { absorption: 0, thickness: 0, refractive_index: 0 } + thin_dielectric: + thickness: 0 + medium_i: &m { refractive_index: 0, absorptivity: 0 } + medium_t: *m --- -# invalid refractive index +# missing thickness - material: - thin_dielectric: { absorption: 0, thickness: 0, refractive_index: -0.0001 } - + thin_dielectric: + medium_i: &m { refractive_index: 1, absorptivity: 0 } + medium_t: *m --- # diff --git a/src/parser/yaml/test_ok_5.yaml b/src/parser/yaml/test_ok_5.yaml @@ -2,9 +2,9 @@ - material: &thin_dielectric thin_dielectric: - absorption: 0.1 - thickness: 0.2 - refractive_index: 1.00027 + thickness: 1 + medium_i: { absorptivity: 0, refractive_index: 1.00027 } + medium_t: { absorptivity: 0.1, refractive_index: 1.5 } - entity: name: "entity" @@ -17,9 +17,9 @@ - material: &thin_dielectric thin_dielectric: - absorption: 0 thickness: 0 - refractive_index: 0.0001 + medium_i: { absorptivity: 0, refractive_index: 0.00027 } + medium_t: { absorptivity: 0.1, refractive_index: 1.5 } - entity: name: "entity" @@ -37,7 +37,7 @@ - cylinder: { height: 1, radius: 1 } material: thin_dielectric: - absorption: 40 thickness: 10 - refractive_index: 0.0001 + medium_i: { absorptivity: 0, refractive_index: 1 } + medium_t: { absorptivity: 20, refractive_index: 1.5 } diff --git a/src/parser/yaml/test_ok_7.yaml b/src/parser/yaml/test_ok_7.yaml @@ -0,0 +1,40 @@ +- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } + +- material: &dielectric + dielectric: + medium_i: { absorptivity: 0, refractive_index: 1.00027 } + medium_t: { absorptivity: 0.1, refractive_index: 1.5 } + +- entity: + name: "entity" + primary: 0 + geometry: + - material: *dielectric + cylinder: { height: 1, radius: 1 } +--- +- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } + +- material: &dielectric + dielectric: + medium_i: { absorptivity: 0, refractive_index: 0.00027 } + medium_t: { absorptivity: 0.1, refractive_index: 1.5 } + +- entity: + name: "entity" + primary: 0 + geometry: + - material: *dielectric + cylinder: { height: 1, radius: 1 } + +--- +- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } +- entity: + name: "entity" + primary: 0 + geometry: + - cylinder: { height: 1, radius: 1 } + material: + dielectric: + medium_i: { absorptivity: 0, refractive_index: 1 } + medium_t: { absorptivity: 20, refractive_index: 1.5 } + diff --git a/src/solstice_material.c b/src/solstice_material.c @@ -27,12 +27,6 @@ struct mirror_param { double roughness; }; -struct thin_dielectric_param { - double absorption; - double thickness; - double refractive_index; -}; - /******************************************************************************* * Helper functions ******************************************************************************/ @@ -105,57 +99,6 @@ mirror_get_roughness *val = param->roughness; } -static void -thin_dielectric_get_absorption - (struct ssol_device* dev, - struct ssol_param_buffer* buf, - const double wavelength, - const double P[3], - const double Ng[3], - const double Ns[3], - const double uv[2], - const double w[3], - double* val) -{ - const struct thin_dielectric_param* param = ssol_param_buffer_get(buf); - (void)dev, (void)wavelength, (void)P, (void)Ng, (void)Ns, (void)uv, (void)w; - *val = param->absorption; -} - -static void -thin_dielectric_get_thickness - (struct ssol_device* dev, - struct ssol_param_buffer* buf, - const double wavelength, - const double P[3], - const double Ng[3], - const double Ns[3], - const double uv[2], - const double w[3], - double* val) -{ - const struct thin_dielectric_param* param = ssol_param_buffer_get(buf); - (void)dev, (void)wavelength, (void)P, (void)Ng, (void)Ns, (void)uv, (void)w; - *val = param->thickness; -} - -static void -thin_dielectric_get_refractive_index - (struct ssol_device* dev, - struct ssol_param_buffer* buf, - const double wavelength, - const double P[3], - const double Ng[3], - const double Ns[3], - const double uv[2], - const double w[3], - double* val) -{ - const struct thin_dielectric_param* param = ssol_param_buffer_get(buf); - (void)dev, (void)wavelength, (void)P, (void)Ng, (void)Ns, (void)uv, (void)w; - *val = param->refractive_index; -} - static res_T create_material_dielectric (struct solstice* solstice, @@ -164,6 +107,8 @@ create_material_dielectric { const struct solparser_medium* medium_i; const struct solparser_medium* medium_t; + struct ssol_medium ssol_medium_i; + struct ssol_medium ssol_medium_t; struct ssol_dielectric_shader shader = SSOL_DIELECTRIC_SHADER_NULL; struct ssol_material* mtl = NULL; res_T res = RES_OK; @@ -179,11 +124,11 @@ create_material_dielectric medium_i = solparser_get_medium(solstice->parser, dielectric->medium_i); medium_t = solparser_get_medium(solstice->parser, dielectric->medium_t); shader.normal = mtl_get_normal; - SSOL(dielectric_setup(mtl, &shader, - medium_i->refractive_index, - medium_t->refractive_index, - medium_i->absorptivity, - medium_t->absorptivity)); + ssol_medium_i.refractive_index = medium_i->refractive_index; + ssol_medium_i.absorptivity = medium_i->absorptivity; + ssol_medium_t.refractive_index = medium_t->refractive_index; + ssol_medium_t.absorptivity = medium_t->absorptivity; + SSOL(dielectric_setup(mtl, &shader, &ssol_medium_i, &ssol_medium_t)); exit: *out_mtl = mtl; @@ -230,7 +175,7 @@ create_material_matte shader.normal = mtl_get_normal; shader.reflectivity = matte_get_reflectivity; - SSOL(matte_set_shader(mtl, &shader)); + SSOL(matte_setup(mtl, &shader)); SSOL(material_set_param_buffer(mtl, pbuf)); exit: @@ -281,7 +226,7 @@ create_material_mirror shader.normal = mtl_get_normal; shader.reflectivity = mirror_get_reflectivity; shader.roughness = mirror_get_roughness; - SSOL(mirror_set_shader(mtl, &shader)); + SSOL(mirror_setup(mtl, &shader)); SSOL(material_set_param_buffer(mtl, pbuf)); exit: @@ -300,9 +245,11 @@ create_material_thin_dielectric struct ssol_material** out_mtl) { struct ssol_thin_dielectric_shader shader = SSOL_THIN_DIELECTRIC_SHADER_NULL; + const struct solparser_medium* medium_i; + const struct solparser_medium* medium_t; + struct ssol_medium ssol_medium_i; + struct ssol_medium ssol_medium_t; struct ssol_material* mtl = NULL; - struct ssol_param_buffer* pbuf = NULL; - struct thin_dielectric_param* param; res_T res = RES_OK; ASSERT(solstice && thin && out_mtl); @@ -313,34 +260,17 @@ create_material_thin_dielectric goto error; } - res = ssol_param_buffer_create - (solstice->ssol, sizeof(struct thin_dielectric_param), &pbuf); - if(res != RES_OK) { - fprintf(stderr, "Could not create the Solstice Solver parameter buffer.\n"); - goto error; - } - - param = ssol_param_buffer_allocate(pbuf, - sizeof(struct thin_dielectric_param), ALIGNOF(struct thin_dielectric_param)); - if(!param) { - fprintf(stderr, "Could not allocate the thin dielectric parameters.\n"); - res = RES_MEM_ERR; - goto error; - } - - param->thickness = thin->thickness; - param->absorption = thin->absorption; - param->refractive_index = thin->refractive_index; - shader.normal = mtl_get_normal; - shader.absorption = thin_dielectric_get_absorption; - shader.thickness = thin_dielectric_get_thickness; - shader.refractive_index = thin_dielectric_get_refractive_index; - SSOL(thin_dielectric_set_shader(mtl, &shader)); - SSOL(material_set_param_buffer(mtl, pbuf)); + medium_i = solparser_get_medium(solstice->parser, thin->medium_i); + medium_t = solparser_get_medium(solstice->parser, thin->medium_t); + ssol_medium_i.refractive_index = medium_i->refractive_index; + ssol_medium_t.refractive_index = medium_t->refractive_index; + ssol_medium_i.absorptivity = medium_i->absorptivity; + ssol_medium_t.absorptivity = medium_t->absorptivity; + SSOL(thin_dielectric_setup + (mtl, &shader, &ssol_medium_i, &ssol_medium_t, thin->thickness)); exit: - if(pbuf) SSOL(param_buffer_ref_put(pbuf)); *out_mtl = mtl; return res; error: