commit de134d75933d4dec16b4725eb82ec2093ffc8061
parent 6b3438005e42431c664c9c1012c71e4c2ebdaa90
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 25 Apr 2017 15:45:40 +0200
Merge branch 'feature_spectral' into develop
Diffstat:
27 files changed, 1126 insertions(+), 98 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -93,11 +93,14 @@ set(SOLSTICE_FILES_SRC
solstice_node.c
solstice_object.c
solstice_solve.c
- solstice_sun.c)
+ solstice_spectrum.c
+ solstice_sun.c
+ solstice_sun_spectrum.c)
set(SOLSTICE_FILES_INC
solstice.h
solstice_args.h.in
- solstice_c.h)
+ solstice_c.h
+ solstice_sun_spectrum.h)
set(SOLSTICE_FILES_DOC COPYING README.md)
# Prepend each file in the `SOLSTICE_FILES_<SRC|INC>' list by `SOLSTICE_SOURCE_DIR'
@@ -143,7 +146,7 @@ if(NOT NO_TEST)
build_test(test_solstice_simulation)
function(add_test_simulation _name)
add_test(NAME test_solstice_simulation_${_name}
- COMMAND test_solstice_simulation
+ COMMAND test_solstice_simulation
$<TARGET_FILE:solstice>
${SOLSTICE_SOURCE_DIR}/../yaml/
${_name})
diff --git a/cmake/parser/CMakeLists.txt b/cmake/parser/CMakeLists.txt
@@ -36,6 +36,7 @@ set(SOLPARSER_FILES_SRC
solparser_geometry.c
solparser_material.c
solparser_medium.c
+ solparser_mtl_data.c
solparser_pivot.c
solparser_sun.c
solparser_spectrum.c)
@@ -47,6 +48,7 @@ set(SOLPARSER_FILES_INC
solparser_image.h
solparser_material.h
solparser_medium.h
+ solparser_mtl_data.h
solparser_pivot.h
solparser_shape.h
solparser_sun.h
diff --git a/doc/input b/doc/input
@@ -255,13 +255,13 @@
<matte> ::=
matte:
- reflectivity: REAL # in [0, 1]
+ reflectivity: <mtl-data> # in [0, 1]
[ <normal-map> ]
<mirror> ::=
mirror:
- reflectivity: REAL # in [0, 1]
- roughness: REAL # in [0, 1]
+ reflectivity: <mtl-data> # in [0, 1]
+ roughness: <mtl-data> # in [0, 1]
[ <normal-map> ]
<virtual> ::=
@@ -282,8 +282,8 @@
medium: <medium-descriptor>
<medium-descriptor> ::=
- refractive_index: REAL # in ]0, INF)
- absorptivity: REAL # in [0, INF)
+ refractive_index: <mtl-data> # value in ]0, INF)
+ absorptivity: <mtl-data> # value in [0, INF)
#----------------------------------------
<entity> ::=
@@ -333,7 +333,7 @@
<sun> ::=
sun:
dni: REAL # Direct Normal Irradiance in ]0, INF)
-[ <spectrum> ]
+[ <spectrum> ] # If not defined use the smarts295 spectrum
[ <radial-angular-distribution> ]
<radial-angular-distribution> ::=
@@ -348,6 +348,9 @@
aperture: REAL # in ]0, 90]
#----------------------------------------
+<mtl-data> ::=
+ REAL | <spectrum-data-list>
+
<transform> ::=
transform:
translation: <real3>
@@ -368,7 +371,9 @@
- REAL # in ]0, inf)
<spectrum> ::=
- spectrum:
+ spectrum: <spectrum-data-list>
+
+<spectrum-data-list> ::=
- <spectrum-data>
[ - <spectrum-data> ... ]
diff --git a/src/parser/solparser.c b/src/parser/solparser.c
@@ -1121,6 +1121,13 @@ solparser_get_spectrum
return darray_spectrum_cdata_get(&parser->spectra) + spectrum.i;
}
+int
+solparser_has_spectrum(const struct solparser* parser)
+{
+ ASSERT(parser);
+ return darray_spectrum_size_get(&parser->spectra) != 0;
+}
+
const struct solparser_sun*
solparser_get_sun(const struct solparser* parser)
{
diff --git a/src/parser/solparser.h b/src/parser/solparser.h
@@ -215,6 +215,10 @@ solparser_get_spectrum
(const struct solparser* parser,
const struct solparser_spectrum_id spectrum);
+extern LOCAL_SYM int
+solparser_has_spectrum
+ (const struct solparser* parser);
+
/*******************************************************************************
* Entity interator
******************************************************************************/
diff --git a/src/parser/solparser_c.h b/src/parser/solparser_c.h
@@ -21,6 +21,7 @@
#include "solparser_image.h"
#include "solparser_material.h"
#include "solparser_medium.h"
+#include "solparser_mtl_data.h"
#include "solparser_pivot.h"
#include "solparser_shape.h"
#include "solparser_spectrum.h"
@@ -412,10 +413,21 @@ parse_medium
struct solparser_medium_id* out_imedium);
extern LOCAL_SYM res_T
+parse_mtl_data
+ (struct solparser* parser,
+ yaml_document_t* doc,
+ yaml_node_t* mtl_data,
+ const double lower_bound,
+ const double upper_bound,
+ struct solparser_mtl_data* data);
+
+extern LOCAL_SYM res_T
parse_spectrum
(struct solparser* parser,
yaml_document_t* doc,
const yaml_node_t* spectrum,
+ const double lower_bound,
+ const double upper_bound,
struct solparser_spectrum_id* out_ispectrum);
extern LOCAL_SYM res_T
diff --git a/src/parser/solparser_material.c b/src/parser/solparser_material.c
@@ -175,7 +175,7 @@ parse_material_matte
res = parse_image(parser, doc, val, &mtl->normal_map);
} else if(!strcmp((char*)key->data.scalar.value, "reflectivity")) {
SETUP_MASK(REFLECTIVITY, "reflectivity");
- res = parse_real(parser, val, 0, 1, &mtl->reflectivity);
+ res = parse_mtl_data(parser, doc, val, 0, 1, &mtl->reflectivity);
} else {
log_err(parser, key, "unknown matte parameter `%s'.\n",
key->data.scalar.value);
@@ -264,10 +264,10 @@ parse_material_mirror
res = parse_image(parser, doc, val, &mtl->normal_map);
} else if(!strcmp((char*)key->data.scalar.value, "reflectivity")) {
SETUP_MASK(REFLECTIVITY, "reflectivity");
- res = parse_real(parser, val, 0, 1, &mtl->reflectivity);
+ res = parse_mtl_data(parser, doc, val, 0, 1, &mtl->reflectivity);
} else if(!strcmp((char*)key->data.scalar.value, "roughness")) {
SETUP_MASK(ROUGHNESS, "roughness");
- res = parse_real(parser, val, 0, 1, &mtl->roughness);
+ res = parse_mtl_data(parser, doc, val, 0, 1, &mtl->roughness);
} else {
log_err(parser, key, "unknown mirror attribute `%s'.\n",
key->data.scalar.value);
diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h
@@ -47,7 +47,7 @@ solparser_material_dielectric_init
}
struct solparser_material_matte {
- double reflectivity; /* In [0, 1] */
+ struct solparser_mtl_data reflectivity; /* In [0, 1] */
struct solparser_image_id normal_map;
};
@@ -64,8 +64,8 @@ solparser_material_matte_init
}
struct solparser_material_mirror {
- double roughness; /* In [0, 1] */
- double reflectivity; /* In [0, 1] */
+ struct solparser_mtl_data roughness; /* In [0, 1] */
+ struct solparser_mtl_data reflectivity; /* In [0, 1] */
struct solparser_image_id normal_map;
};
diff --git a/src/parser/solparser_medium.c b/src/parser/solparser_medium.c
@@ -83,11 +83,11 @@ parse_medium
} (void)0
if(!strcmp((char*)key->data.scalar.value, "absorptivity")) {
SETUP_MASK(ABSORPTIVITY, "absorptivity");
- res = parse_real(parser, val, 0, DBL_MAX, &mdm->absorptivity);
+ res = parse_mtl_data(parser, doc, val, 0, DBL_MAX, &mdm->absorptivity);
} 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, &mdm->refractive_index);
+ res = parse_mtl_data
+ (parser, doc, val, nextafter(0, 1), DBL_MAX, &mdm->refractive_index);
} else {
log_err(parser, key, "unknown medium parameter `%s'.\n",
key->data.scalar.value);
diff --git a/src/parser/solparser_medium.h b/src/parser/solparser_medium.h
@@ -16,11 +16,12 @@
#ifndef SOLPARSER_MEDIUM_H
#define SOLPARSER_MEDIUM_H
+#include "solparser_mtl_data.h"
#include <stddef.h>
struct solparser_medium {
- double refractive_index;
- double absorptivity;
+ struct solparser_mtl_data refractive_index;
+ struct solparser_mtl_data absorptivity;
};
struct solparser_medium_id { size_t i; };
diff --git a/src/parser/solparser_mtl_data.c b/src/parser/solparser_mtl_data.c
@@ -0,0 +1,56 @@
+/* Copyright (C) CNRS 2016-2017
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "solparser_c.h"
+
+/*******************************************************************************
+ * Local function
+ ******************************************************************************/
+res_T
+parse_mtl_data
+ (struct solparser* parser,
+ yaml_document_t* doc,
+ yaml_node_t* mtl_data,
+ const double lower_bound,
+ const double upper_bound,
+ struct solparser_mtl_data* data)
+{
+ res_T res = RES_OK;
+ ASSERT(doc && mtl_data && data);
+
+ if(mtl_data->type == YAML_SCALAR_NODE) {
+ data->type = SOLPARSER_MTL_DATA_REAL;
+ res = parse_real
+ (parser, mtl_data, lower_bound, upper_bound, &data->value.real);
+ } else if(mtl_data->type == YAML_SEQUENCE_NODE) {
+ data->type = SOLPARSER_MTL_DATA_SPECTRUM;
+ res = parse_spectrum
+ (parser, doc, mtl_data, lower_bound, upper_bound, &data->value.spectrum);
+ } else {
+ log_err(parser, mtl_data, "expect a real or a spectrum definition.\n");
+ res = RES_BAD_ARG;
+ goto error;
+ }
+ if(res != RES_OK) {
+ log_node(parser, mtl_data);
+ goto error;
+ }
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+
diff --git a/src/parser/solparser_mtl_data.h b/src/parser/solparser_mtl_data.h
@@ -0,0 +1,35 @@
+/* Copyright (C) CNRS 2016-2017
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SOLPARSER_MTL_DATA_H
+#define SOLPARSER_MTL_DATA_H
+
+#include "solparser_spectrum.h"
+
+enum solparser_mtl_data_type {
+ SOLPARSER_MTL_DATA_REAL,
+ SOLPARSER_MTL_DATA_SPECTRUM
+};
+
+struct solparser_mtl_data {
+ enum solparser_mtl_data_type type;
+ union {
+ double real;
+ struct solparser_spectrum_id spectrum;
+ } value;
+};
+
+#endif /* SOLPARSER_MTL_DATA_H */
+
diff --git a/src/parser/solparser_spectrum.c b/src/parser/solparser_spectrum.c
@@ -36,6 +36,8 @@ parse_spectrum_data
(struct solparser* parser,
yaml_document_t* doc,
const yaml_node_t* sdata,
+ const double lower_bound,
+ const double upper_bound,
struct solparser_spectrum_data* spectrum_data)
{
enum { DATA, WAVELENGTH };
@@ -43,6 +45,7 @@ parse_spectrum_data
int mask = 0; /* Register the parsed attributes */
res_T res = RES_OK;
ASSERT(doc && sdata && spectrum_data);
+ ASSERT(lower_bound <= upper_bound);
if(sdata->type != YAML_MAPPING_NODE) {
log_err(parser, sdata, "expect the definition of a spectrum data.\n");
@@ -74,7 +77,8 @@ parse_spectrum_data
} (void)0
if(!strcmp((char*)key->data.scalar.value, "data")) {
SETUP_MASK(DATA, "data");
- res = parse_real(parser, val, 0, DBL_MAX, &spectrum_data->data);
+ res = parse_real
+ (parser, val, lower_bound, upper_bound, &spectrum_data->data);
} else if(!strcmp((char*)key->data.scalar.value, "wavelength")) {
SETUP_MASK(WAVELENGTH, "wavelength");
res = parse_real(parser, val, nextafter(0, DBL_MAX), DBL_MAX,
@@ -116,6 +120,8 @@ parse_spectrum
(struct solparser* parser,
yaml_document_t* doc,
const yaml_node_t* spectrum,
+ const double lower_bound,
+ const double upper_bound,
struct solparser_spectrum_id* out_ispectrum)
{
struct solparser_spectrum* spec = NULL;
@@ -123,6 +129,7 @@ parse_spectrum
intptr_t i, n;
res_T res = RES_OK;
ASSERT(doc && spectrum && out_ispectrum);
+ ASSERT(lower_bound <= upper_bound);
if(spectrum->type != YAML_SEQUENCE_NODE) {
log_err(parser, spectrum, "expect a list of spectrum data.\n");
@@ -152,7 +159,8 @@ parse_spectrum
sdata = yaml_document_get_node(doc, spectrum->data.sequence.items.start[i]);
spectrum_data = darray_spectrum_data_data_get(&spec->data) + i;
- res = parse_spectrum_data(parser, doc, sdata, spectrum_data);
+ res = parse_spectrum_data
+ (parser, doc, sdata, lower_bound, upper_bound, spectrum_data);
if(res != RES_OK) goto error;
}
diff --git a/src/parser/solparser_sun.c b/src/parser/solparser_sun.c
@@ -222,7 +222,7 @@ parse_sun
res = parse_pillbox(parser, doc, val, &solsun->radang_distrib.pillbox);
} else if(!strcmp((char*)key->data.scalar.value, "spectrum")) {
SETUP_MASK(SPECTRUM, "spectrum");
- res = parse_spectrum(parser, doc, val, &solsun->spectrum);
+ res = parse_spectrum(parser, doc, val, 0, DBL_MAX, &solsun->spectrum);
} else {
log_err(parser, key, "unknown sun parameter `%s'.\n",
key->data.scalar.value);
diff --git a/src/parser/test_solparser2.c b/src/parser/test_solparser2.c
@@ -137,7 +137,8 @@ main(int argc, char** argv)
CHECK(mtl == mtls[0] || mtl == mtls[1], 1);
CHECK(mtl->type, SOLPARSER_MATERIAL_MATTE);
matte = solparser_get_material_matte(parser, mtl->data.matte);
- CHECK(matte->reflectivity, 1);
+ CHECK(matte->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(matte->reflectivity.value.real, 1);
entity_id = solparser_entity_get_child(entity, 0);
entity1a = solparser_get_entity(parser, entity_id);
@@ -165,8 +166,10 @@ main(int argc, char** argv)
CHECK(mtl == mtls[0] || mtl == mtls[1], 1);
CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
- CHECK(mirror->reflectivity, 0.9);
- CHECK(mirror->roughness, 0.1);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->reflectivity.value.real, 0.9);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->roughness.value.real, 0.1);
entity_id = solparser_entity_get_child(entity, 1);
entity1b = solparser_get_entity(parser, entity_id);
diff --git a/src/parser/test_solparser3.c b/src/parser/test_solparser3.c
@@ -145,7 +145,8 @@ check_entity0
CHECK(mtl->type, SOLPARSER_MATERIAL_MATTE);
matte = solparser_get_material_matte(parser, mtl->data.matte);
- CHECK(matte->reflectivity, 0.5);
+ CHECK(matte->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(matte->reflectivity.value.real, 0.5);
CHECK(solparser_entity_get_children_count(entity0), 4);
CHECK(solparser_entity_get_anchors_count(entity0), 3);
diff --git a/src/parser/test_solparser4.c b/src/parser/test_solparser4.c
@@ -159,8 +159,10 @@ main(int argc, char** argv)
mtl = solparser_get_material(parser, mtl2->front);
CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
- CHECK(mirror->reflectivity, 0.2);
- CHECK(mirror->roughness, 0.1);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->reflectivity.value.real, 0.2);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->roughness.value.real, 0.1);
shape = solparser_get_shape(parser, obj->shape);
CHECK(shape->type, SOLPARSER_SHAPE_CUBOID);
diff --git a/src/parser/test_solparser7.c b/src/parser/test_solparser7.c
@@ -33,6 +33,7 @@ main(int argc, char** argv)
const struct solparser_medium* medium;
const struct solparser_object* obj;
const struct solparser_shape* shape;
+ const struct solparser_spectrum* spectrum;
FILE* stream;
(void)argc, (void)argv;
@@ -55,8 +56,16 @@ main(int argc, char** argv)
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");
+ fprintf(stream, " refractive_index: \n");
+ fprintf(stream, " - {wavelength: 1.2, data: 2.3}\n");
+ fprintf(stream, " - {wavelength: 4.5, data: 6.7}\n");
+ fprintf(stream, " - {wavelength: 0.5, data: 0.25}\n");
+ fprintf(stream, " absorptivity:\n");
+ fprintf(stream, " - {wavelength: 3, data: 3}\n");
+ fprintf(stream, " - {wavelength: 1, data: 1}\n");
+ fprintf(stream, " - {wavelength: 5, data: 5}\n");
+ fprintf(stream, " - {wavelength: 4, data: 4}\n");
+ fprintf(stream, " - {wavelength: 2, data: 2}\n");
rewind(stream);
CHECK(solparser_setup(parser, NULL, stream), RES_OK);
@@ -87,11 +96,35 @@ main(int argc, char** argv)
CHECK(thin->thickness, 0.123);
medium = solparser_get_medium(parser, thin->medium_i);
- CHECK(medium->refractive_index, 1);
- CHECK(medium->absorptivity, 0);
+ CHECK(medium->refractive_index.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(medium->refractive_index.value.real, 1);
+ CHECK(medium->absorptivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(medium->absorptivity.value.real, 0);
medium = solparser_get_medium(parser, thin->medium_t);
- CHECK(medium->refractive_index, 1.5);
- CHECK(medium->absorptivity, 20);
+
+ CHECK(medium->refractive_index.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ spectrum = solparser_get_spectrum(parser, medium->refractive_index.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 0.5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 1.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 4.5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.25);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 2.3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 6.7);
+
+ CHECK(medium->absorptivity.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ spectrum = solparser_get_spectrum(parser, medium->absorptivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[3].wavelength, 4);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[4].wavelength, 5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[3].data, 4);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[4].data, 5);
CHECK(solparser_load(parser), RES_BAD_OP);
solparser_ref_put(parser);
diff --git a/src/parser/test_solparser8.c b/src/parser/test_solparser8.c
@@ -27,12 +27,14 @@ main(int argc, char** argv)
struct solparser_object_id obj_id;
const struct solparser_entity* entity;
const struct solparser_geometry* geom;
- const struct solparser_medium* medium;
+ const struct solparser_medium* vacuum;
+ const struct solparser_medium* glass;
const struct solparser_material_double_sided* mtl2;
const struct solparser_material* mtl;
const struct solparser_material_dielectric* dielec;
const struct solparser_object* obj;
const struct solparser_shape* shape;
+ const struct solparser_spectrum* spectrum;
FILE* stream;
(void)argc, (void)argv;
@@ -44,7 +46,15 @@ main(int argc, char** argv)
fprintf(stream, "- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1 }] }\n");
fprintf(stream, "- medium: &vacuum {refractive_index: 1, absorptivity: 0}\n");
- fprintf(stream, "- medium: &glass {refractive_index: 1.5, absorptivity: 20}\n");
+ fprintf(stream, "- medium: &glass \n");
+ fprintf(stream, " refractive_index: 1.5\n");
+ fprintf(stream, " absorptivity: \n");
+ fprintf(stream, " - {wavelength: 1, data: 21}\n");
+ fprintf(stream, " - {wavelength: 2, data: 22}\n");
+ fprintf(stream, " - {wavelength: 3, data: 23}\n");
+ fprintf(stream, " - {wavelength: 4, data: 24}\n");
+ fprintf(stream, " - {wavelength: 5, data: 25}\n");
+ fprintf(stream, " - {wavelength: 6, data: 26}\n");
fprintf(stream, "- entity:\n");
fprintf(stream, " name: test\n");
fprintf(stream, " primary: 0\n");
@@ -86,22 +96,36 @@ main(int argc, char** argv)
mtl = solparser_get_material(parser, mtl2->front);
CHECK(mtl->type, SOLPARSER_MATERIAL_DIELECTRIC);
dielec = solparser_get_material_dielectric(parser, mtl->data.dielectric);
- medium = solparser_get_medium(parser, dielec->medium_i);
- CHECK(medium->refractive_index, 1);
- CHECK(medium->absorptivity, 0);
- medium = solparser_get_medium(parser, dielec->medium_t);
- CHECK(medium->refractive_index, 1.5);
- CHECK(medium->absorptivity, 20);
+ vacuum = solparser_get_medium(parser, dielec->medium_i);
+ CHECK(vacuum->refractive_index.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(vacuum->refractive_index.value.real, 1);
+ CHECK(vacuum->absorptivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(vacuum->absorptivity.value.real, 0);
+
+ glass = solparser_get_medium(parser, dielec->medium_t);
+ CHECK(glass->refractive_index.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(glass->refractive_index.value.real, 1.5);
+ CHECK(glass->absorptivity.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ spectrum = solparser_get_spectrum(parser, glass->absorptivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 6);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[3].wavelength, 4);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[4].wavelength, 5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[5].wavelength, 6);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 21);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 22);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 23);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[3].data, 24);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[4].data, 25);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[5].data, 26);
mtl = solparser_get_material(parser, mtl2->back);
CHECK(mtl->type, SOLPARSER_MATERIAL_DIELECTRIC);
dielec = solparser_get_material_dielectric(parser, mtl->data.dielectric);
- medium = solparser_get_medium(parser, dielec->medium_i);
- CHECK(medium->refractive_index, 1.5);
- CHECK(medium->absorptivity, 20);
- medium = solparser_get_medium(parser, dielec->medium_t);
- CHECK(medium->refractive_index, 1);
- CHECK(medium->absorptivity, 0);
+ CHECK(solparser_get_medium(parser, dielec->medium_i), glass);
+ CHECK(solparser_get_medium(parser, dielec->medium_t), vacuum);
CHECK(solparser_load(parser), RES_BAD_OP);
solparser_ref_put(parser);
diff --git a/src/parser/test_solparser_normal_map.c b/src/parser/test_solparser_normal_map.c
@@ -152,7 +152,8 @@ test_matte(struct solparser* parser)
mtl = solparser_get_material(parser, mtl2->front);
CHECK(mtl->type, SOLPARSER_MATERIAL_MATTE);
matte = solparser_get_material_matte(parser, mtl->data.matte);
- CHECK(matte->reflectivity, 0.123);
+ CHECK(matte->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(matte->reflectivity.value.real, 0.123);
CHECK(SOLPARSER_ID_IS_VALID(matte->normal_map), 1);
img = solparser_get_image(parser, matte->normal_map);
CHECK(strcmp(str_cget(&img->filename), "path to normal map"), 0);
@@ -222,8 +223,10 @@ test_mirror(struct solparser* parser)
mtl = solparser_get_material(parser, mtl2->front);
CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
- CHECK(mirror->reflectivity, 1);
- CHECK(mirror->roughness, 0.1);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->reflectivity.value.real, 1);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->roughness.value.real, 0.1);
CHECK(SOLPARSER_ID_IS_VALID(mirror->normal_map), 1);
img = solparser_get_image(parser, mirror->normal_map);
CHECK(strcmp(str_cget(&img->filename), "Normal map"), 0);
diff --git a/src/parser/test_solparser_spectrum.c b/src/parser/test_solparser_spectrum.c
@@ -79,6 +79,256 @@ test_sun(struct solparser* parser)
fclose(stream);
}
+static void
+test_matte(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_matte* matte;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " matte:\n");
+ fprintf(stream, " reflectivity:\n");
+ fprintf(stream, " - { wavelength: 3.4, data: 0.5 }\n");
+ fprintf(stream, " - { wavelength: 1.2, data: 0.25 }\n");
+ fprintf(stream, " - { wavelength: 6.7, data: 0.125 }\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_MATTE);
+ matte = solparser_get_material_matte(parser, mtl->data.matte);
+ CHECK(matte->reflectivity.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ CHECK(SOLPARSER_ID_IS_VALID(matte->normal_map), 0);
+ spectrum = solparser_get_spectrum(parser, matte->reflectivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 1.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 3.4);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 6.7);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.25);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 0.125);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
+static void
+test_mirror(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_mirror* mirror;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " mirror:\n");
+ fprintf(stream, " reflectivity:\n");
+ fprintf(stream, " - { wavelength: 3.4, data: 0.5 }\n");
+ fprintf(stream, " - { wavelength: 1.2, data: 0.25 }\n");
+ fprintf(stream, " - { wavelength: 6.7, data: 0.125 }\n");
+ fprintf(stream, " roughness:\n");
+ fprintf(stream, " - { wavelength: 123, data: 0 }\n");
+ fprintf(stream, " - { wavelength: 456, data: 1 }\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
+ mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ CHECK(SOLPARSER_ID_IS_VALID(mirror->normal_map), 0);
+
+ spectrum = solparser_get_spectrum(parser, mirror->reflectivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 1.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 3.4);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 6.7);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.25);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.5);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 0.125);
+
+ spectrum = solparser_get_spectrum(parser, mirror->roughness.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 1);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
+static void
+test_thin_dielectric(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_thin_dielectric* thin;
+ const struct solparser_medium* mdm;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- spectrum: &refractive_index\n");
+ fprintf(stream, " - { wavelength: 123, data: 1.1 }\n");
+ fprintf(stream, " - { wavelength: 456, data: 2.2 }\n");
+ fprintf(stream, " - { wavelength: 789, data: 3.3 }\n");
+ fprintf(stream, "- spectrum: &absorptivity\n");
+ fprintf(stream, " - { wavelength: 0.456, data: 0.2 }\n");
+ fprintf(stream, " - { wavelength: 0.123, data: 0.1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " thin_dielectric:\n");
+ fprintf(stream, " thickness: 1\n");
+ fprintf(stream, " medium_i: { refractive_index: 1, absorptivity: 0 }\n");
+ fprintf(stream, " medium_t: \n");
+ fprintf(stream, " refractive_index: *refractive_index\n");
+ fprintf(stream, " absorptivity: *absorptivity\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_THIN_DIELECTRIC);
+ thin = solparser_get_material_thin_dielectric(parser, mtl->data.thin_dielectric);
+ CHECK(thin->thickness, 1);
+ CHECK(SOLPARSER_ID_IS_VALID(thin->normal_map), 0);
+
+ mdm = solparser_get_medium(parser, thin->medium_i);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->refractive_index.value.real, 1);
+ CHECK(mdm->absorptivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->absorptivity.value.real, 0);
+
+ mdm = solparser_get_medium(parser, thin->medium_t);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 789);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 1.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 2.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 3.3);
+ spectrum = solparser_get_spectrum(parser, mdm->absorptivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 0.123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 0.456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.2);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
+static void
+test_dielectric(struct solparser* parser)
+{
+ struct solparser_material_iterator mtl_it, mtl_it_end;
+ const struct solparser_material* mtl;
+ const struct solparser_material_dielectric* dielec;
+ const struct solparser_medium* mdm;
+ const struct solparser_spectrum* spectrum;
+ FILE* stream;
+
+ NCHECK(stream = tmpfile(), NULL);
+
+ fprintf(stream, "- sun: { dni: 1 }\n");
+ fprintf(stream, "- spectrum: &refractive_index\n");
+ fprintf(stream, " - { wavelength: 123, data: 1.1 }\n");
+ fprintf(stream, " - { wavelength: 456, data: 2.2 }\n");
+ fprintf(stream, " - { wavelength: 789, data: 3.3 }\n");
+ fprintf(stream, "- spectrum: &absorptivity\n");
+ fprintf(stream, " - { wavelength: 0.456, data: 0.2 }\n");
+ fprintf(stream, " - { wavelength: 0.123, data: 0.1 }\n");
+ fprintf(stream, "- material:\n");
+ fprintf(stream, " dielectric:\n");
+ fprintf(stream, " medium_i: { refractive_index: 1, absorptivity: 0 }\n");
+ fprintf(stream, " medium_t: \n");
+ fprintf(stream, " refractive_index: *refractive_index\n");
+ fprintf(stream, " absorptivity: *absorptivity\n");
+ rewind(stream);
+
+ CHECK(solparser_setup(parser, NULL, stream), RES_OK);
+ CHECK(solparser_load(parser), RES_OK);
+
+ solparser_material_iterator_begin(parser, &mtl_it);
+ solparser_material_iterator_end(parser, &mtl_it_end);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 0);
+
+ mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
+ CHECK(mtl->type, SOLPARSER_MATERIAL_DIELECTRIC);
+ dielec = solparser_get_material_dielectric(parser, mtl->data.dielectric);
+ CHECK(SOLPARSER_ID_IS_VALID(dielec->normal_map), 0);
+
+ mdm = solparser_get_medium(parser, dielec->medium_i);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->refractive_index.value.real, 1);
+ CHECK(mdm->absorptivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mdm->absorptivity.value.real, 0);
+
+ mdm = solparser_get_medium(parser, dielec->medium_t);
+ CHECK(mdm->refractive_index.type, SOLPARSER_MTL_DATA_SPECTRUM);
+ spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 3);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength, 789);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 1.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 2.2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data, 3.3);
+ spectrum = solparser_get_spectrum(parser, mdm->absorptivity.value.spectrum);
+ CHECK(darray_spectrum_data_size_get(&spectrum->data), 2);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength, 0.123);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength, 0.456);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data, 0.1);
+ CHECK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data, 0.2);
+
+ solparser_material_iterator_next(&mtl_it);
+ CHECK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end), 1);
+
+ CHECK(solparser_load(parser), RES_BAD_OP);
+ fclose(stream);
+}
+
int
main(int argc, char** argv)
{
@@ -90,6 +340,10 @@ main(int argc, char** argv)
CHECK(solparser_create(&allocator, &parser), RES_OK);
test_sun(parser);
+ test_matte(parser);
+ test_mirror(parser);
+ test_thin_dielectric(parser);
+ test_dielectric(parser);
solparser_ref_put(parser);
diff --git a/src/solstice_c.h b/src/solstice_c.h
@@ -70,6 +70,12 @@ solstice_update_entities
const double sun_dir[3]);
extern LOCAL_SYM res_T
+solstice_create_ssol_spectrum
+ (struct solstice* solstice,
+ const struct solparser_spectrum_id spectrum_id,
+ struct ssol_spectrum** spectrum);
+
+extern LOCAL_SYM res_T
solstice_create_ssol_material
(struct solstice* solstice,
const struct solparser_material_id mtl_id,
diff --git a/src/solstice_material.c b/src/solstice_material.c
@@ -25,13 +25,13 @@ struct dielectric_param {
};
struct matte_param {
- double reflectivity;
+ struct ssol_data reflectivity;
struct ssol_image* normal_map;
};
struct mirror_param {
- double reflectivity;
- double roughness;
+ struct ssol_data reflectivity;
+ struct ssol_data roughness;
struct ssol_image* normal_map;
};
@@ -109,7 +109,7 @@ matte_get_reflectivity
{
const struct matte_param* param = ssol_param_buffer_get(buf);
(void)dev, (void)wavelength, (void)frag;
- *val = param->reflectivity;
+ *val = ssol_data_get_value(¶m->reflectivity, wavelength);
}
static void
@@ -131,6 +131,7 @@ matte_param_release(void* mem)
struct matte_param* param = mem;
ASSERT(param);
if(param->normal_map) SSOL(image_ref_put(param->normal_map));
+ ssol_data_clear(¶m->reflectivity);
}
static void
@@ -143,7 +144,7 @@ mirror_get_reflectivity
{
const struct mirror_param* param = ssol_param_buffer_get(buf);
(void)dev, (void)wavelength, (void)frag;
- *val = param->reflectivity;
+ *val = ssol_data_get_value(¶m->reflectivity, wavelength);
}
static void
@@ -156,7 +157,7 @@ mirror_get_roughness
{
const struct mirror_param* param = ssol_param_buffer_get(buf);
(void)dev, (void)wavelength, (void)frag;
- *val = param->roughness;
+ *val = ssol_data_get_value(¶m->roughness, wavelength);
}
static void
@@ -178,6 +179,8 @@ mirror_param_release(void* mem)
struct mirror_param* param = mem;
ASSERT(param);
if(param->normal_map) SSOL(image_ref_put(param->normal_map));
+ ssol_data_clear(¶m->reflectivity);
+ ssol_data_clear(¶m->roughness);
}
static void
@@ -202,6 +205,38 @@ thin_dielectric_param_release(void* mem)
}
static res_T
+mtl_to_ssol_data
+ (struct solstice* solstice,
+ const struct solparser_mtl_data* mtl_data,
+ struct ssol_data* data)
+{
+ struct ssol_spectrum* spectrum = NULL;
+ res_T res = RES_OK;
+ ASSERT(mtl_data && data);
+
+ ssol_data_clear(data);
+ switch(mtl_data->type) {
+ case SOLPARSER_MTL_DATA_REAL:
+ ssol_data_set_real(data, mtl_data->value.real);
+ break;
+ case SOLPARSER_MTL_DATA_SPECTRUM:
+ res = solstice_create_ssol_spectrum
+ (solstice, mtl_data->value.spectrum, &spectrum);
+ if(res != RES_OK) goto error;
+ ssol_data_set_spectrum(data, spectrum);
+ break;
+ default: FATAL("Unreachable code.\n"); break;
+ }
+
+exit:
+ if(spectrum) SSOL(spectrum_ref_put(spectrum));
+ return res;
+error:
+ ssol_data_clear(data);
+ goto exit;
+}
+
+static res_T
load_image
(struct solstice* solstice,
const char* filename,
@@ -278,8 +313,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_medium ssol_medium_i = SSOL_MEDIUM_VACUUM;
+ struct ssol_medium ssol_medium_t = SSOL_MEDIUM_VACUUM;
struct ssol_dielectric_shader shader = SSOL_DIELECTRIC_SHADER_NULL;
struct ssol_image* img = NULL;
struct ssol_material* mtl = NULL;
@@ -326,13 +361,20 @@ create_material_dielectric
SSOL(material_set_param_buffer(mtl, pbuf));
}
- 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;
+ #define SET_SSOL_DATA(Medium, Name) { \
+ res = mtl_to_ssol_data(solstice, &Medium->Name, &ssol_## Medium.Name); \
+ if(res != RES_OK) goto error; \
+ } (void)0
+ SET_SSOL_DATA(medium_i, refractive_index);
+ SET_SSOL_DATA(medium_t, refractive_index);
+ SET_SSOL_DATA(medium_i, absorptivity);
+ SET_SSOL_DATA(medium_t, absorptivity);
+ #undef SET_SSOL_DATA
SSOL(dielectric_setup(mtl, &shader, &ssol_medium_i, &ssol_medium_t));
exit:
+ ssol_medium_clear(&ssol_medium_i);
+ ssol_medium_clear(&ssol_medium_t);
if(pbuf) SSOL(param_buffer_ref_put(pbuf));
*out_mtl = mtl;
return res;
@@ -378,7 +420,9 @@ create_material_matte
}
memset(param, 0, sizeof(struct matte_param));
- param->reflectivity = matte->reflectivity;
+ res = mtl_to_ssol_data(solstice, &matte->reflectivity, ¶m->reflectivity);
+ if(res != RES_OK) goto error;
+
if(!SOLPARSER_ID_IS_VALID(matte->normal_map)) {
shader.normal = mtl_get_normal;
} else {
@@ -439,8 +483,11 @@ create_material_mirror
goto error;
}
memset(param, 0, sizeof(struct mirror_param));
- param->reflectivity = mirror->reflectivity;
- param->roughness = mirror->roughness;
+
+ res = mtl_to_ssol_data(solstice, &mirror->reflectivity, ¶m->reflectivity);
+ if(res != RES_OK) goto error;
+ res = mtl_to_ssol_data(solstice, &mirror->roughness, ¶m->roughness);
+ if(res != RES_OK) goto error;
if(!SOLPARSER_ID_IS_VALID(mirror->normal_map)) {
shader.normal = mtl_get_normal;
@@ -476,10 +523,10 @@ create_material_thin_dielectric
{
struct ssol_image* img = NULL;
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;
+ const struct solparser_medium* medium_i = NULL;
+ const struct solparser_medium* medium_t = NULL;
+ struct ssol_medium ssol_medium_i = SSOL_MEDIUM_VACUUM;
+ struct ssol_medium ssol_medium_t = SSOL_MEDIUM_VACUUM;
struct ssol_material* mtl = NULL;
struct ssol_param_buffer* pbuf = NULL;
res_T res = RES_OK;
@@ -526,14 +573,21 @@ create_material_thin_dielectric
SSOL(material_set_param_buffer(mtl, pbuf));
}
- 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;
+ #define SET_SSOL_DATA(Medium, Name) { \
+ res = mtl_to_ssol_data(solstice, &Medium->Name, &ssol_## Medium.Name); \
+ if(res != RES_OK) goto error; \
+ } (void)0
+ SET_SSOL_DATA(medium_i, refractive_index);
+ SET_SSOL_DATA(medium_t, refractive_index);
+ SET_SSOL_DATA(medium_i, absorptivity);
+ SET_SSOL_DATA(medium_t, absorptivity);
+ #undef SET_SSOL_DATA
SSOL(thin_dielectric_setup
(mtl, &shader, &ssol_medium_i, &ssol_medium_t, thin->thickness));
exit:
+ ssol_medium_clear(&ssol_medium_i);
+ ssol_medium_clear(&ssol_medium_t);
if(pbuf) SSOL(param_buffer_ref_put(pbuf));
*out_mtl = mtl;
return res;
@@ -543,7 +597,6 @@ error:
goto exit;
}
-
/*******************************************************************************
* Local functions
******************************************************************************/
diff --git a/src/solstice_spectrum.c b/src/solstice_spectrum.c
@@ -0,0 +1,71 @@
+/* Copyright (C) CNRS 2016-2017
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "solstice_c.h"
+
+/*******************************************************************************
+ * Helper function
+ ******************************************************************************/
+static void
+get_wavelength(const size_t i, double* wlen, double* data, void* ctx)
+{
+ const struct solparser_spectrum_data* specdata = ctx;
+ ASSERT(wlen && data && ctx);
+ *wlen = specdata[i].wavelength;
+ *data = specdata[i].data;
+}
+
+/*******************************************************************************
+ * Local functions
+ ******************************************************************************/
+res_T
+solstice_create_ssol_spectrum
+ (struct solstice* solstice,
+ const struct solparser_spectrum_id spectrum_id,
+ struct ssol_spectrum** out_spectrum)
+{
+ struct ssol_spectrum* spectrum = NULL;
+ const struct solparser_spectrum_data* data;
+ const struct solparser_spectrum* spec;
+ size_t nwlens;
+ res_T res = RES_OK;
+ ASSERT(solstice && SOLPARSER_ID_IS_VALID(spectrum_id) && out_spectrum);
+
+ res = ssol_spectrum_create(solstice->ssol, &spectrum);
+ if(res != RES_OK) {
+ fprintf(stderr, "Could not create the Solstice Solver spectrum.\n");
+ goto error;
+ }
+
+ spec = solparser_get_spectrum(solstice->parser, spectrum_id);
+ nwlens = darray_spectrum_data_size_get(&spec->data);
+ data = darray_spectrum_data_cdata_get(&spec->data);
+ res = ssol_spectrum_setup(spectrum, get_wavelength, nwlens, (void*)data);
+ if(res != RES_OK) {
+ fprintf(stderr, "Could not setup the Solstice Solver spectrum.\n");
+ goto error;
+ }
+
+exit:
+ *out_spectrum = spectrum;
+ return res;
+error:
+ if(spectrum) {
+ SSOL(spectrum_ref_put(spectrum));
+ spectrum = NULL;
+ }
+ goto exit;
+}
+
diff --git a/src/solstice_sun.c b/src/solstice_sun.c
@@ -14,6 +14,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "solstice_c.h"
+#include "solstice_sun_spectrum.h"
#include "parser/solparser.h"
#include "parser/solparser_sun.h"
@@ -125,24 +126,26 @@ error:
static void
get_wavelength(const size_t i, double* wlen, double* data, void* ctx)
{
- const struct solparser_spectrum_data* specdata = ctx;
+ const double* spectrum = ctx;
ASSERT(wlen && data && ctx);
- *wlen = specdata[i].wavelength;
- *data = specdata[i].data;
+ *wlen = spectrum[i*2+0];
+ *data = spectrum[i*2+1];
}
static res_T
-create_sun_spectrum
+create_default_sun_spectrum
(struct solstice* solstice,
const struct solparser_sun* solparser_sun,
struct ssol_spectrum** out_spectrum)
{
struct ssol_spectrum* spectrum = NULL;
- const struct solparser_spectrum_data* data;
- const struct solparser_spectrum* spec;
- size_t nwlens;
+ const double* data;
+ size_t size;
res_T res = RES_OK;
- ASSERT(solstice && solparser_sun && out_spectrum);
+
+ /* The solparser_sun may be used if the defautl spectrum is defined wrt the
+ * sun type */
+ (void)solparser_sun;
res = ssol_spectrum_create(solstice->ssol, &spectrum);
if(res != RES_OK) {
@@ -150,12 +153,17 @@ create_sun_spectrum
goto error;
}
- spec = solparser_get_spectrum(solstice->parser, solparser_sun->spectrum);
- nwlens = darray_spectrum_data_size_get(&spec->data);
- data = darray_spectrum_data_cdata_get(&spec->data);
- res = ssol_spectrum_setup(spectrum, get_wavelength, nwlens, (void*)data);
+ if(solparser_has_spectrum(solstice->parser)) {
+ data = solstice_sun_spectrum_smarts295;
+ size = solstice_sun_spectrum_smarts295_size;
+ } else {
+ data = solstice_sun_spectrum_dummy;
+ size = solstice_sun_spectrum_dummy_size;
+ }
+
+ res = ssol_spectrum_setup(spectrum, get_wavelength, size, (void*)data);
if(res != RES_OK) {
- fprintf(stderr, "Could not setup the spectrum of the solver sun.\n");
+ fprintf(stderr, "Coul not setup the default spectrum of the solver sun.\n");
goto error;
}
@@ -197,15 +205,19 @@ solstice_create_sun(struct solstice* solstice)
}
if(res != RES_OK) goto error;
- if(SOLPARSER_ID_IS_VALID(solparser_sun->spectrum)) {
- res = create_sun_spectrum(solstice, solparser_sun, &spectrum);
- if (res != RES_OK) goto error;
+ if(!SOLPARSER_ID_IS_VALID(solparser_sun->spectrum)) {
+ res = create_default_sun_spectrum(solstice, solparser_sun, &spectrum);
+ if(res != RES_OK) goto error;
+ } else {
+ res = solstice_create_ssol_spectrum
+ (solstice, solparser_sun->spectrum, &spectrum);
+ if(res != RES_OK) goto error;
+ }
- res = ssol_sun_set_spectrum(sun, spectrum);
- if(res != RES_OK) {
- fprintf(stderr, "Could not attach the spectrum to the sun.\n");
- goto error;
- }
+ res = ssol_sun_set_spectrum(sun, spectrum);
+ if(res != RES_OK) {
+ fprintf(stderr, "Could not attach the spectrum to the sun.\n");
+ goto error;
}
res = ssol_sun_set_dni(sun, solparser_sun->dni);
diff --git a/src/solstice_sun_spectrum.c b/src/solstice_sun_spectrum.c
@@ -0,0 +1,400 @@
+/* Copyright (C) CNRS 2016-2017
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "solstice_sun_spectrum.h"
+
+const double solstice_sun_spectrum_dummy[] = { 1, 1 };
+const size_t solstice_sun_spectrum_dummy_size = 1;
+
+const double solstice_sun_spectrum_smarts295[] = {
+ 0.2800e+03, 0.3230e-25,
+ 0.2900e+03, 0.9925e-09,
+ 0.3000e+03, 0.6135e-03,
+ 0.3100e+03, 0.2614e-01,
+ 0.3200e+03, 0.1525e+00,
+ 0.3300e+03, 0.3587e+00,
+ 0.3400e+03, 0.4319e+00,
+ 0.3500e+03, 0.3749e+00,
+ 0.3600e+03, 0.5612e+00,
+ 0.3700e+03, 0.6070e+00,
+ 0.3800e+03, 0.4707e+00,
+ 0.3900e+03, 0.7168e+00,
+ 0.4000e+03, 0.8937e+00,
+ 0.4100e+03, 0.8838e+00,
+ 0.4200e+03, 0.8786e+00,
+ 0.4300e+03, 0.7032e+00,
+ 0.4400e+03, 0.1130e+01,
+ 0.4500e+03, 0.1341e+01,
+ 0.4600e+03, 0.1355e+01,
+ 0.4700e+03, 0.1414e+01,
+ 0.4800e+03, 0.1458e+01,
+ 0.4900e+03, 0.1502e+01,
+ 0.5000e+03, 0.1381e+01,
+ 0.5100e+03, 0.1422e+01,
+ 0.5200e+03, 0.1364e+01,
+ 0.5300e+03, 0.1386e+01,
+ 0.5400e+03, 0.1397e+01,
+ 0.5500e+03, 0.1408e+01,
+ 0.5600e+03, 0.1362e+01,
+ 0.5700e+03, 0.1384e+01,
+ 0.5800e+03, 0.1416e+01,
+ 0.5900e+03, 0.1287e+01,
+ 0.6000e+03, 0.1376e+01,
+ 0.6100e+03, 0.1357e+01,
+ 0.6200e+03, 0.1364e+01,
+ 0.6300e+03, 0.1281e+01,
+ 0.6400e+03, 0.1316e+01,
+ 0.6500e+03, 0.1240e+01,
+ 0.6600e+03, 0.1293e+01,
+ 0.6700e+03, 0.1312e+01,
+ 0.6800e+03, 0.1291e+01,
+ 0.6900e+03, 0.1127e+01,
+ 0.7000e+03, 0.1214e+01,
+ 0.7100e+03, 0.1230e+01,
+ 0.7200e+03, 0.9898e+00,
+ 0.7300e+03, 0.1089e+01,
+ 0.7400e+03, 0.1143e+01,
+ 0.7500e+03, 0.1133e+01,
+ 0.7600e+03, 0.3196e+00,
+ 0.7700e+03, 0.1081e+01,
+ 0.7800e+03, 0.1083e+01,
+ 0.7900e+03, 0.1034e+01,
+ 0.8000e+03, 0.1009e+01,
+ 0.8100e+03, 0.9829e+00,
+ 0.8200e+03, 0.8306e+00,
+ 0.8300e+03, 0.8917e+00,
+ 0.8400e+03, 0.9480e+00,
+ 0.8500e+03, 0.8229e+00,
+ 0.8600e+03, 0.9096e+00,
+ 0.8700e+03, 0.8980e+00,
+ 0.8800e+03, 0.8812e+00,
+ 0.8900e+03, 0.8665e+00,
+ 0.9000e+03, 0.7211e+00,
+ 0.9100e+03, 0.6374e+00,
+ 0.9200e+03, 0.7189e+00,
+ 0.9300e+03, 0.4862e+00,
+ 0.9400e+03, 0.5180e+00,
+ 0.9500e+03, 0.2243e+00,
+ 0.9600e+03, 0.4673e+00,
+ 0.9700e+03, 0.6353e+00,
+ 0.9800e+03, 0.6048e+00,
+ 0.9900e+03, 0.6883e+00,
+ 0.1000e+04, 0.6908e+00,
+ 0.1010e+04, 0.6779e+00,
+ 0.1020e+04, 0.6610e+00,
+ 0.1030e+04, 0.6559e+00,
+ 0.1040e+04, 0.6359e+00,
+ 0.1050e+04, 0.6251e+00,
+ 0.1060e+04, 0.6070e+00,
+ 0.1070e+04, 0.5804e+00,
+ 0.1080e+04, 0.5766e+00,
+ 0.1090e+04, 0.5442e+00,
+ 0.1100e+04, 0.4877e+00,
+ 0.1110e+04, 0.4891e+00,
+ 0.1120e+04, 0.2037e+00,
+ 0.1130e+04, 0.1307e+00,
+ 0.1140e+04, 0.2996e+00,
+ 0.1150e+04, 0.1741e+00,
+ 0.1160e+04, 0.3212e+00,
+ 0.1170e+04, 0.4473e+00,
+ 0.1180e+04, 0.4358e+00,
+ 0.1190e+04, 0.4467e+00,
+ 0.1200e+04, 0.4311e+00,
+ 0.1210e+04, 0.4322e+00,
+ 0.1220e+04, 0.4389e+00,
+ 0.1230e+04, 0.4385e+00,
+ 0.1240e+04, 0.4370e+00,
+ 0.1250e+04, 0.4323e+00,
+ 0.1260e+04, 0.4106e+00,
+ 0.1270e+04, 0.3752e+00,
+ 0.1280e+04, 0.3960e+00,
+ 0.1290e+04, 0.3951e+00,
+ 0.1300e+04, 0.3522e+00,
+ 0.1310e+04, 0.3159e+00,
+ 0.1320e+04, 0.2767e+00,
+ 0.1330e+04, 0.2623e+00,
+ 0.1340e+04, 0.1978e+00,
+ 0.1350e+04, 0.4197e-01,
+ 0.1360e+04, 0.1392e-03,
+ 0.1370e+04, 0.4692e-04,
+ 0.1380e+04, 0.1344e-02,
+ 0.1390e+04, 0.5292e-02,
+ 0.1400e+04, 0.2461e-05,
+ 0.1410e+04, 0.4293e-02,
+ 0.1420e+04, 0.2556e-01,
+ 0.1430e+04, 0.9898e-01,
+ 0.1440e+04, 0.6925e-01,
+ 0.1450e+04, 0.5774e-01,
+ 0.1460e+04, 0.1172e+00,
+ 0.1470e+04, 0.9169e-01,
+ 0.1480e+04, 0.9248e-01,
+ 0.1490e+04, 0.1937e+00,
+ 0.1500e+04, 0.2546e+00,
+ 0.1510e+04, 0.2677e+00,
+ 0.1520e+04, 0.2616e+00,
+ 0.1530e+04, 0.2574e+00,
+ 0.1540e+04, 0.2609e+00,
+ 0.1550e+04, 0.2627e+00,
+ 0.1560e+04, 0.2593e+00,
+ 0.1570e+04, 0.2379e+00,
+ 0.1580e+04, 0.2372e+00,
+ 0.1590e+04, 0.2287e+00,
+ 0.1600e+04, 0.2302e+00,
+ 0.1610e+04, 0.2170e+00,
+ 0.1620e+04, 0.2292e+00,
+ 0.1630e+04, 0.2322e+00,
+ 0.1640e+04, 0.2095e+00,
+ 0.1650e+04, 0.2183e+00,
+ 0.1660e+04, 0.2189e+00,
+ 0.1670e+04, 0.2154e+00,
+ 0.1680e+04, 0.1991e+00,
+ 0.1690e+04, 0.2022e+00,
+ 0.1700e+04, 0.1975e+00,
+ 0.1710e+04, 0.1864e+00,
+ 0.1720e+04, 0.1854e+00,
+ 0.1730e+04, 0.1752e+00,
+ 0.1740e+04, 0.1665e+00,
+ 0.1750e+04, 0.1670e+00,
+ 0.1760e+04, 0.1622e+00,
+ 0.1770e+04, 0.1504e+00,
+ 0.1780e+04, 0.1161e+00,
+ 0.1790e+04, 0.1068e+00,
+ 0.1800e+04, 0.4541e-01,
+ 0.1810e+04, 0.2518e-01,
+ 0.1820e+04, 0.5525e-02,
+ 0.1830e+04, 0.1963e-03,
+ 0.1840e+04, 0.9461e-05,
+ 0.1850e+04, 0.1700e-03,
+ 0.1860e+04, 0.2765e-03,
+ 0.1870e+04, 0.2355e-06,
+ 0.1880e+04, 0.1055e-02,
+ 0.1890e+04, 0.2512e-02,
+ 0.1900e+04, 0.4552e-04,
+ 0.1910e+04, 0.5519e-03,
+ 0.1920e+04, 0.3288e-02,
+ 0.1930e+04, 0.3281e-02,
+ 0.1940e+04, 0.1028e-01,
+ 0.1950e+04, 0.2698e-01,
+ 0.1960e+04, 0.3215e-01,
+ 0.1970e+04, 0.5907e-01,
+ 0.1980e+04, 0.8290e-01,
+ 0.1990e+04, 0.9252e-01,
+ 0.2000e+04, 0.4630e-01,
+ 0.2010e+04, 0.4664e-01,
+ 0.2020e+04, 0.5210e-01,
+ 0.2030e+04, 0.8816e-01,
+ 0.2040e+04, 0.9206e-01,
+ 0.2050e+04, 0.7283e-01,
+ 0.2060e+04, 0.7413e-01,
+ 0.2070e+04, 0.7092e-01,
+ 0.2080e+04, 0.8925e-01,
+ 0.2090e+04, 0.9080e-01,
+ 0.2100e+04, 0.8882e-01,
+ 0.2110e+04, 0.9074e-01,
+ 0.2120e+04, 0.8870e-01,
+ 0.2130e+04, 0.8978e-01,
+ 0.2140e+04, 0.9009e-01,
+ 0.2150e+04, 0.8515e-01,
+ 0.2160e+04, 0.8391e-01,
+ 0.2170e+04, 0.8109e-01,
+ 0.2180e+04, 0.8133e-01,
+ 0.2190e+04, 0.7937e-01,
+ 0.2200e+04, 0.7252e-01,
+ 0.2210e+04, 0.7862e-01,
+ 0.2220e+04, 0.7717e-01,
+ 0.2230e+04, 0.7534e-01,
+ 0.2240e+04, 0.7312e-01,
+ 0.2250e+04, 0.7211e-01,
+ 0.2260e+04, 0.6775e-01,
+ 0.2270e+04, 0.6582e-01,
+ 0.2280e+04, 0.6686e-01,
+ 0.2290e+04, 0.6381e-01,
+ 0.2300e+04, 0.5990e-01,
+ 0.2310e+04, 0.6448e-01,
+ 0.2320e+04, 0.5400e-01,
+ 0.2330e+04, 0.5834e-01,
+ 0.2340e+04, 0.4959e-01,
+ 0.2350e+04, 0.4533e-01,
+ 0.2360e+04, 0.5260e-01,
+ 0.2370e+04, 0.3567e-01,
+ 0.2380e+04, 0.4674e-01,
+ 0.2390e+04, 0.4126e-01,
+ 0.2400e+04, 0.4726e-01,
+ 0.2410e+04, 0.3924e-01,
+ 0.2420e+04, 0.3166e-01,
+ 0.2430e+04, 0.4852e-01,
+ 0.2440e+04, 0.4739e-01,
+ 0.2450e+04, 0.1931e-01,
+ 0.2460e+04, 0.3885e-01,
+ 0.2470e+04, 0.2266e-01,
+ 0.2480e+04, 0.1475e-01,
+ 0.2490e+04, 0.8442e-02,
+ 0.2500e+04, 0.1466e-01,
+ 0.2510e+04, 0.6496e-02,
+ 0.2520e+04, 0.2256e-02,
+ 0.2530e+04, 0.3021e-04,
+ 0.2540e+04, 0.2730e-04,
+ 0.2550e+04, 0.2779e-07,
+ 0.2560e+04, 0.4655e-06,
+ 0.2570e+04, 0.9511e-12,
+ 0.2580e+04, 0.5296e-13,
+ 0.2590e+04, 0.4757e-18,
+ 0.2600e+04, 0.1390e-16,
+ 0.2610e+04, 0.8284e-20,
+ 0.2620e+04, 0.1685e-15,
+ 0.2630e+04, 0.3664e-26,
+ 0.2640e+04, 0.4018e-10,
+ 0.2650e+04, 0.1219e-11,
+ 0.2660e+04, 0.2993e-14,
+ 0.2670e+04, 0.2406e-36,
+ 0.2680e+04, 0.0000e+00,
+ 0.2690e+04, 0.1286e-20,
+ 0.2700e+04, 0.2953e-41,
+ 0.2710e+04, 0.1743e-22,
+ 0.2720e+04, 0.4345e-27,
+ 0.2730e+04, 0.7687e-13,
+ 0.2740e+04, 0.5702e-15,
+ 0.2750e+04, 0.2985e-19,
+ 0.2760e+04, 0.1944e-35,
+ 0.2770e+04, 0.9937e-16,
+ 0.2780e+04, 0.3978e-25,
+ 0.2790e+04, 0.1796e-11,
+ 0.2800e+04, 0.1818e-08,
+ 0.2810e+04, 0.1790e-06,
+ 0.2820e+04, 0.1349e-07,
+ 0.2830e+04, 0.8420e-04,
+ 0.2840e+04, 0.9419e-05,
+ 0.2850e+04, 0.3244e-04,
+ 0.2860e+04, 0.2736e-03,
+ 0.2870e+04, 0.1159e-03,
+ 0.2880e+04, 0.1253e-02,
+ 0.2890e+04, 0.8788e-03,
+ 0.2900e+04, 0.2641e-02,
+ 0.2910e+04, 0.3721e-02,
+ 0.2920e+04, 0.6130e-02,
+ 0.2930e+04, 0.1064e-01,
+ 0.2940e+04, 0.3998e-02,
+ 0.2950e+04, 0.9301e-02,
+ 0.2960e+04, 0.8467e-02,
+ 0.2970e+04, 0.1220e-02,
+ 0.2980e+04, 0.3444e-02,
+ 0.2990e+04, 0.1462e-01,
+ 0.3000e+04, 0.1173e-01,
+ 0.3010e+04, 0.1033e-01,
+ 0.3020e+04, 0.2158e-02,
+ 0.3030e+04, 0.9299e-02,
+ 0.3040e+04, 0.4684e-02,
+ 0.3050e+04, 0.3120e-02,
+ 0.3060e+04, 0.9647e-02,
+ 0.3070e+04, 0.4417e-02,
+ 0.3080e+04, 0.6574e-02,
+ 0.3090e+04, 0.5481e-02,
+ 0.3100e+04, 0.7460e-02,
+ 0.3110e+04, 0.2883e-02,
+ 0.3120e+04, 0.1381e-01,
+ 0.3130e+04, 0.8512e-02,
+ 0.3140e+04, 0.5643e-02,
+ 0.3150e+04, 0.1019e-01,
+ 0.3160e+04, 0.1242e-01,
+ 0.3170e+04, 0.1546e-01,
+ 0.3180e+04, 0.1328e-01,
+ 0.3190e+04, 0.6653e-02,
+ 0.3200e+04, 0.1455e-02,
+ 0.3210e+04, 0.7609e-03,
+ 0.3220e+04, 0.3527e-02,
+ 0.3230e+04, 0.1212e-02,
+ 0.3240e+04, 0.5960e-02,
+ 0.3250e+04, 0.4193e-02,
+ 0.3260e+04, 0.2581e-02,
+ 0.3270e+04, 0.2590e-02,
+ 0.3280e+04, 0.4574e-02,
+ 0.3290e+04, 0.1112e-01,
+ 0.3300e+04, 0.3168e-02,
+ 0.3310e+04, 0.5679e-02,
+ 0.3320e+04, 0.2343e-03,
+ 0.3330e+04, 0.6243e-02,
+ 0.3340e+04, 0.5467e-02,
+ 0.3350e+04, 0.1045e-01,
+ 0.3360e+04, 0.7264e-02,
+ 0.3370e+04, 0.5567e-02,
+ 0.3380e+04, 0.6825e-02,
+ 0.3390e+04, 0.1132e-01,
+ 0.3400e+04, 0.1382e-01,
+ 0.3410e+04, 0.8955e-02,
+ 0.3420e+04, 0.1426e-01,
+ 0.3430e+04, 0.9903e-02,
+ 0.3440e+04, 0.9415e-02,
+ 0.3450e+04, 0.1221e-01,
+ 0.3460e+04, 0.1359e-01,
+ 0.3470e+04, 0.1326e-01,
+ 0.3480e+04, 0.1223e-01,
+ 0.3490e+04, 0.1153e-01,
+ 0.3500e+04, 0.1288e-01,
+ 0.3510e+04, 0.1292e-01,
+ 0.3520e+04, 0.1303e-01,
+ 0.3530e+04, 0.1211e-01,
+ 0.3540e+04, 0.1022e-01,
+ 0.3550e+04, 0.1153e-01,
+ 0.3560e+04, 0.1179e-01,
+ 0.3570e+04, 0.9701e-02,
+ 0.3580e+04, 0.1103e-01,
+ 0.3590e+04, 0.1057e-01,
+ 0.3600e+04, 0.1116e-01,
+ 0.3610e+04, 0.1051e-01,
+ 0.3620e+04, 0.1209e-01,
+ 0.3630e+04, 0.1081e-01,
+ 0.3640e+04, 0.1190e-01,
+ 0.3650e+04, 0.1077e-01,
+ 0.3660e+04, 0.1142e-01,
+ 0.3670e+04, 0.9043e-02,
+ 0.3680e+04, 0.9377e-02,
+ 0.3690e+04, 0.1037e-01,
+ 0.3700e+04, 0.1114e-01,
+ 0.3710e+04, 0.9977e-02,
+ 0.3720e+04, 0.1080e-01,
+ 0.3730e+04, 0.9894e-02,
+ 0.3740e+04, 0.9411e-02,
+ 0.3750e+04, 0.9769e-02,
+ 0.3760e+04, 0.9590e-02,
+ 0.3770e+04, 0.9703e-02,
+ 0.3780e+04, 0.9985e-02,
+ 0.3790e+04, 0.8581e-02,
+ 0.3800e+04, 0.1012e-01,
+ 0.3810e+04, 0.8925e-02,
+ 0.3820e+04, 0.9938e-02,
+ 0.3830e+04, 0.9884e-02,
+ 0.3840e+04, 0.9376e-02,
+ 0.3850e+04, 0.9185e-02,
+ 0.3860e+04, 0.8506e-02,
+ 0.3870e+04, 0.7832e-02,
+ 0.3880e+04, 0.7082e-02,
+ 0.3890e+04, 0.7347e-02,
+ 0.3900e+04, 0.8324e-02,
+ 0.3910e+04, 0.7550e-02,
+ 0.3920e+04, 0.7389e-02,
+ 0.3930e+04, 0.7457e-02,
+ 0.3940e+04, 0.7786e-02,
+ 0.3950e+04, 0.7975e-02,
+ 0.3960e+04, 0.8089e-02,
+ 0.3970e+04, 0.8058e-02,
+ 0.3980e+04, 0.7779e-02,
+ 0.3990e+04, 0.7693e-02,
+ 0.4000e+04, 0.7504e-02
+};
+
+const size_t solstice_sun_spectrum_smarts295_size =
+ sizeof(solstice_sun_spectrum_smarts295) / sizeof(double[2]);
+
+
diff --git a/src/solstice_sun_spectrum.h b/src/solstice_sun_spectrum.h
@@ -0,0 +1,33 @@
+/* Copyright (C) CNRS 2016-2017
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SOLSTICE_SUN_SPECTRUM_H
+#define SOLSTICE_SUN_SPECTRUM_H
+
+#include <rsys/rsys.h>
+
+/*
+ * Each built-in spectrum is a list of double2: [Wavelength in nano-meter,
+ * DNI]. Its associated size is the number of double[2] into the spectrum
+ */
+
+extern LOCAL_SYM const double solstice_sun_spectrum_dummy[];
+extern LOCAL_SYM const size_t solstice_sun_spectrum_dummy_size;
+
+extern LOCAL_SYM const double solstice_sun_spectrum_smarts295[];
+extern LOCAL_SYM const size_t solstice_sun_spectrum_smarts295_size;
+
+#endif /* SOLSTICE_SUN_SPECTRUM_H */
+