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 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:
Mcmake/CMakeLists.txt | 9++++++---
Mcmake/parser/CMakeLists.txt | 2++
Mdoc/input | 19++++++++++++-------
Msrc/parser/solparser.c | 7+++++++
Msrc/parser/solparser.h | 4++++
Msrc/parser/solparser_c.h | 12++++++++++++
Msrc/parser/solparser_material.c | 6+++---
Msrc/parser/solparser_material.h | 6+++---
Msrc/parser/solparser_medium.c | 6+++---
Msrc/parser/solparser_medium.h | 5+++--
Asrc/parser/solparser_mtl_data.c | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/parser/solparser_mtl_data.h | 35+++++++++++++++++++++++++++++++++++
Msrc/parser/solparser_spectrum.c | 12++++++++++--
Msrc/parser/solparser_sun.c | 2+-
Msrc/parser/test_solparser2.c | 9++++++---
Msrc/parser/test_solparser3.c | 3++-
Msrc/parser/test_solparser4.c | 6++++--
Msrc/parser/test_solparser7.c | 45+++++++++++++++++++++++++++++++++++++++------
Msrc/parser/test_solparser8.c | 52++++++++++++++++++++++++++++++++++++++--------------
Msrc/parser/test_solparser_normal_map.c | 9++++++---
Msrc/parser/test_solparser_spectrum.c | 254+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/solstice_c.h | 6++++++
Msrc/solstice_material.c | 101++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Asrc/solstice_spectrum.c | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/solstice_sun.c | 54+++++++++++++++++++++++++++++++++---------------------
Asrc/solstice_sun_spectrum.c | 400+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/solstice_sun_spectrum.h | 33+++++++++++++++++++++++++++++++++
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(&param->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(&param->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(&param->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(&param->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(&param->reflectivity); + ssol_data_clear(&param->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, &param->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, &param->reflectivity); + if(res != RES_OK) goto error; + res = mtl_to_ssol_data(solstice, &mirror->roughness, &param->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 */ +