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