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 e0327dccacb1bf2d71e704d56151134c2f9ceefa
parent 9f0380b99c4c0b3e58c369b89ff1dd5444d17648
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 24 Apr 2017 15:25:38 +0200

Test the parsing of the spectral materials

Diffstat:
Msrc/parser/test_solparser_spectrum.c | 254+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 254 insertions(+), 0 deletions(-)

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);