solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

test_solparser_spectrum.c (14848B)


      1 /* Copyright (C) 2018-2026 |Meso|Star> (contact@meso-star.com)
      2  * Copyright (C) 2016-2018 CNRS
      3  *
      4  * This program is free software: you can redistribute it and/or modify
      5  * it under the terms of the GNU General Public License as published by
      6  * the Free Software Foundation, either version 3 of the License, or
      7  * (at your option) any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     12  * GNU General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     16 
     17 #include "solparser.h"
     18 #include "solparser_sun.h"
     19 #include "test_solstice_utils.h"
     20 
     21 static void
     22 test_sun(struct solparser* parser)
     23 {
     24   const struct solparser_sun* sun;
     25   const struct solparser_spectrum* spectrum;
     26   FILE* stream;
     27   size_t i;
     28 
     29   CHK((stream = tmpfile()) != NULL);
     30 
     31   fprintf(stream, "- spectrum: &my_spectrum\n");
     32   fprintf(stream, "  - { wavelength: 2, data: 2 }\n");
     33   fprintf(stream, "  - { wavelength: 1, data: 1 }\n");
     34   fprintf(stream, "  - { wavelength: 8, data: 8 }\n");
     35   fprintf(stream, "  - { wavelength: 3, data: 3 }\n");
     36   fprintf(stream, "  - { wavelength: 5, data: 5 }\n");
     37   fprintf(stream, "  - { wavelength: 9, data: 9 }\n");
     38   fprintf(stream, "  - { wavelength: 6, data: 6 }\n");
     39   fprintf(stream, "  - { wavelength: 7, data: 7 }\n");
     40   fprintf(stream, "  - { wavelength: 4, data: 4 }\n");
     41   fprintf(stream, "- sun:\n");
     42   fprintf(stream, "    dni: 123.456\n");
     43   fprintf(stream, "    spectrum: *my_spectrum\n");
     44   fprintf(stream, "- material: &matte { matte: { reflectivity: 1 } }\n");
     45   fprintf(stream, "- entity:\n");
     46   fprintf(stream, "    name: foo-bar\n");
     47   fprintf(stream, "    primary: 0\n");
     48   fprintf(stream, "    geometry: [{sphere: {radius: 1}, material: *matte}]\n");
     49   rewind(stream);
     50 
     51   CHK(solparser_setup(parser, NULL, stream) == RES_OK);
     52   CHK(solparser_load(parser) == RES_OK);
     53 
     54   sun = solparser_get_sun(parser);
     55   CHK(sun->dni == 123.456);
     56   CHK(sun->radang_distrib_type == SOLPARSER_SUN_RADANG_DISTRIB_DIRECTIONAL);
     57   CHK(SOLPARSER_ID_IS_VALID(sun->spectrum) == 1);
     58   spectrum = solparser_get_spectrum(parser, sun->spectrum);
     59 
     60   CHK(darray_spectrum_data_size_get(&spectrum->data) == 9);
     61 
     62   FOR_EACH(i, 0, darray_spectrum_data_size_get(&spectrum->data)) {
     63     CHK(darray_spectrum_data_cdata_get(&spectrum->data)[i].wavelength == i+1);
     64     CHK(darray_spectrum_data_cdata_get(&spectrum->data)[i].wavelength == i+1);
     65   }
     66 
     67   CHK(solparser_load(parser) == RES_BAD_OP);
     68   fclose(stream);
     69 
     70   CHK((stream = tmpfile()) != NULL);
     71   fprintf(stream, "- sun: {dni: 1}\n");
     72   rewind(stream);
     73 
     74   CHK(solparser_setup(parser, NULL, stream) == RES_OK);
     75   CHK(solparser_load(parser) == RES_OK);
     76 
     77   CHK(SOLPARSER_ID_IS_VALID(sun->spectrum) == 0);
     78 
     79   CHK(solparser_load(parser) == RES_BAD_OP);
     80   fclose(stream);
     81 }
     82 
     83 static void
     84 test_matte(struct solparser* parser)
     85 {
     86   struct solparser_material_iterator mtl_it, mtl_it_end;
     87   const struct solparser_material* mtl;
     88   const struct solparser_material_matte* matte;
     89   const struct solparser_spectrum* spectrum;
     90   FILE* stream;
     91 
     92   CHK((stream = tmpfile()) != NULL);
     93 
     94   fprintf(stream, "- sun: { dni: 1 }\n");
     95   fprintf(stream, "- material:\n");
     96   fprintf(stream, "    matte:\n");
     97   fprintf(stream, "      reflectivity:\n");
     98   fprintf(stream, "      - { wavelength: 3.4, data: 0.5 }\n");
     99   fprintf(stream, "      - { wavelength: 1.2, data: 0.25 }\n");
    100   fprintf(stream, "      - { wavelength: 6.7, data: 0.125 }\n");
    101   rewind(stream);
    102 
    103   CHK(solparser_setup(parser, NULL, stream) == RES_OK);
    104   CHK(solparser_load(parser) == RES_OK);
    105 
    106   solparser_material_iterator_begin(parser, &mtl_it);
    107   solparser_material_iterator_end(parser, &mtl_it_end);
    108   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0);
    109 
    110   mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
    111   CHK(mtl->type == SOLPARSER_MATERIAL_MATTE);
    112   matte = solparser_get_material_matte(parser, mtl->data.matte);
    113   CHK(matte->reflectivity.type == SOLPARSER_MTL_DATA_SPECTRUM);
    114   CHK(SOLPARSER_ID_IS_VALID(matte->normal_map) == 0);
    115   spectrum = solparser_get_spectrum(parser, matte->reflectivity.value.spectrum);
    116   CHK(darray_spectrum_data_size_get(&spectrum->data) == 3);
    117   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 1.2);
    118   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 3.4);
    119   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 6.7);
    120   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.25);
    121   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.5);
    122   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 0.125);
    123 
    124   solparser_material_iterator_next(&mtl_it);
    125   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1);
    126 
    127   CHK(solparser_load(parser) == RES_BAD_OP);
    128   fclose(stream);
    129 }
    130 
    131 static void
    132 test_mirror(struct solparser* parser)
    133 {
    134   struct solparser_material_iterator mtl_it, mtl_it_end;
    135   const struct solparser_material* mtl;
    136   const struct solparser_material_mirror* mirror;
    137   const struct solparser_spectrum* spectrum;
    138   FILE* stream;
    139 
    140   CHK((stream = tmpfile()) != NULL);
    141 
    142   fprintf(stream, "- sun: { dni: 1 }\n");
    143   fprintf(stream, "- material:\n");
    144   fprintf(stream, "    mirror:\n");
    145   fprintf(stream, "      reflectivity:\n");
    146   fprintf(stream, "      - { wavelength: 3.4, data: 0.5 }\n");
    147   fprintf(stream, "      - { wavelength: 1.2, data: 0.25 }\n");
    148   fprintf(stream, "      - { wavelength: 6.7, data: 0.125 }\n");
    149   fprintf(stream, "      slope_error:\n");
    150   fprintf(stream, "      - { wavelength: 123, data: 0 }\n");
    151   fprintf(stream, "      - { wavelength: 456, data: 1 }\n");
    152   rewind(stream);
    153 
    154   CHK(solparser_setup(parser, NULL, stream) == RES_OK);
    155   CHK(solparser_load(parser) == RES_OK);
    156 
    157   solparser_material_iterator_begin(parser, &mtl_it);
    158   solparser_material_iterator_end(parser, &mtl_it_end);
    159   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0);
    160 
    161   mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
    162   CHK(mtl->type == SOLPARSER_MATERIAL_MIRROR);
    163   mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
    164   CHK(mirror->reflectivity.type == SOLPARSER_MTL_DATA_SPECTRUM);
    165   CHK(mirror->slope_error.type == SOLPARSER_MTL_DATA_SPECTRUM);
    166   CHK(SOLPARSER_ID_IS_VALID(mirror->normal_map) == 0);
    167 
    168   spectrum = solparser_get_spectrum(parser, mirror->reflectivity.value.spectrum);
    169   CHK(darray_spectrum_data_size_get(&spectrum->data) == 3);
    170   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 1.2);
    171   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 3.4);
    172   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 6.7);
    173   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.25);
    174   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.5);
    175   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 0.125);
    176 
    177   spectrum = solparser_get_spectrum(parser, mirror->slope_error.value.spectrum);
    178   CHK(darray_spectrum_data_size_get(&spectrum->data) == 2);
    179   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 123);
    180   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 456);
    181   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0);
    182   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 1);
    183 
    184   solparser_material_iterator_next(&mtl_it);
    185   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1);
    186 
    187   CHK(solparser_load(parser) == RES_BAD_OP);
    188   fclose(stream);
    189 }
    190 
    191 static void
    192 test_thin_dielectric(struct solparser* parser)
    193 {
    194   struct solparser_material_iterator mtl_it, mtl_it_end;
    195   const struct solparser_material* mtl;
    196   const struct solparser_material_thin_dielectric* thin;
    197   const struct solparser_medium* mdm;
    198   const struct solparser_spectrum* spectrum;
    199   FILE* stream;
    200 
    201   CHK((stream = tmpfile()) != NULL);
    202 
    203   fprintf(stream, "- sun: { dni: 1 }\n");
    204   fprintf(stream, "- spectrum: &refractive_index\n");
    205   fprintf(stream, "  - { wavelength: 123, data: 1.1 }\n");
    206   fprintf(stream, "  - { wavelength: 456, data: 2.2 }\n");
    207   fprintf(stream, "  - { wavelength: 789, data: 3.3 }\n");
    208   fprintf(stream, "- spectrum: &absorption\n");
    209   fprintf(stream, "  - { wavelength: 0.456, data: 0.2 }\n");
    210   fprintf(stream, "  - { wavelength: 0.123, data: 0.1 }\n");
    211   fprintf(stream, "- material:\n");
    212   fprintf(stream, "    thin_dielectric:\n");
    213   fprintf(stream, "      thickness: 1\n");
    214   fprintf(stream, "      medium_i: { refractive_index: 1, extinction: 0 }\n");
    215   fprintf(stream, "      medium_t: \n");
    216   fprintf(stream, "        refractive_index: *refractive_index\n");
    217   fprintf(stream, "        extinction: *absorption\n");
    218   rewind(stream);
    219 
    220   CHK(solparser_setup(parser, NULL, stream) == RES_OK);
    221   CHK(solparser_load(parser) == RES_OK);
    222 
    223   solparser_material_iterator_begin(parser, &mtl_it);
    224   solparser_material_iterator_end(parser, &mtl_it_end);
    225   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0);
    226 
    227   mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
    228   CHK(mtl->type == SOLPARSER_MATERIAL_THIN_DIELECTRIC);
    229   thin = solparser_get_material_thin_dielectric(parser, mtl->data.thin_dielectric);
    230   CHK(thin->thickness == 1);
    231   CHK(SOLPARSER_ID_IS_VALID(thin->normal_map) == 0);
    232 
    233   mdm = solparser_get_medium(parser, thin->medium_i);
    234   CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_REAL);
    235   CHK(mdm->refractive_index.value.real == 1);
    236   CHK(mdm->extinction.type == SOLPARSER_MTL_DATA_REAL);
    237   CHK(mdm->extinction.value.real == 0);
    238 
    239   mdm = solparser_get_medium(parser, thin->medium_t);
    240   CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_SPECTRUM);
    241   spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum);
    242   CHK(darray_spectrum_data_size_get(&spectrum->data) == 3);
    243   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 123);
    244   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 456);
    245   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 789);
    246   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 1.1);
    247   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 2.2);
    248   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 3.3);
    249   spectrum = solparser_get_spectrum(parser, mdm->extinction.value.spectrum);
    250   CHK(darray_spectrum_data_size_get(&spectrum->data) == 2);
    251   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 0.123);
    252   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 0.456);
    253   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.1);
    254   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.2);
    255 
    256   solparser_material_iterator_next(&mtl_it);
    257   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1);
    258 
    259   CHK(solparser_load(parser) == RES_BAD_OP);
    260   fclose(stream);
    261 }
    262 
    263 static void
    264 test_dielectric(struct solparser* parser)
    265 {
    266   struct solparser_material_iterator mtl_it, mtl_it_end;
    267   const struct solparser_material* mtl;
    268   const struct solparser_material_dielectric* dielec;
    269   const struct solparser_medium* mdm;
    270   const struct solparser_spectrum* spectrum;
    271   FILE* stream;
    272 
    273   CHK((stream = tmpfile()) != NULL);
    274 
    275   fprintf(stream, "- sun: { dni: 1 }\n");
    276   fprintf(stream, "- spectrum: &refractive_index\n");
    277   fprintf(stream, "  - { wavelength: 123, data: 1.1 }\n");
    278   fprintf(stream, "  - { wavelength: 456, data: 2.2 }\n");
    279   fprintf(stream, "  - { wavelength: 789, data: 3.3 }\n");
    280   fprintf(stream, "- spectrum: &absorption\n");
    281   fprintf(stream, "  - { wavelength: 0.456, data: 0.2 }\n");
    282   fprintf(stream, "  - { wavelength: 0.123, data: 0.1 }\n");
    283   fprintf(stream, "- material:\n");
    284   fprintf(stream, "    dielectric:\n");
    285   fprintf(stream, "      medium_i: { refractive_index: 1, extinction: 0 }\n");
    286   fprintf(stream, "      medium_t: \n");
    287   fprintf(stream, "        refractive_index: *refractive_index\n");
    288   fprintf(stream, "        extinction: *absorption\n");
    289   rewind(stream);
    290 
    291   CHK(solparser_setup(parser, NULL, stream) == RES_OK);
    292   CHK(solparser_load(parser) == RES_OK);
    293 
    294   solparser_material_iterator_begin(parser, &mtl_it);
    295   solparser_material_iterator_end(parser, &mtl_it_end);
    296   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 0);
    297 
    298   mtl = solparser_get_material(parser, solparser_material_iterator_get(&mtl_it));
    299   CHK(mtl->type == SOLPARSER_MATERIAL_DIELECTRIC);
    300   dielec = solparser_get_material_dielectric(parser, mtl->data.dielectric);
    301   CHK(SOLPARSER_ID_IS_VALID(dielec->normal_map) == 0);
    302 
    303   mdm = solparser_get_medium(parser, dielec->medium_i);
    304   CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_REAL);
    305   CHK(mdm->refractive_index.value.real == 1);
    306   CHK(mdm->extinction.type == SOLPARSER_MTL_DATA_REAL);
    307   CHK(mdm->extinction.value.real == 0);
    308 
    309   mdm = solparser_get_medium(parser, dielec->medium_t);
    310   CHK(mdm->refractive_index.type == SOLPARSER_MTL_DATA_SPECTRUM);
    311   spectrum = solparser_get_spectrum(parser, mdm->refractive_index.value.spectrum);
    312   CHK(darray_spectrum_data_size_get(&spectrum->data) == 3);
    313   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 123);
    314   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 456);
    315   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].wavelength == 789);
    316   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 1.1);
    317   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 2.2);
    318   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[2].data == 3.3);
    319   spectrum = solparser_get_spectrum(parser, mdm->extinction.value.spectrum);
    320   CHK(darray_spectrum_data_size_get(&spectrum->data) == 2);
    321   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].wavelength == 0.123);
    322   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].wavelength == 0.456);
    323   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[0].data == 0.1);
    324   CHK(darray_spectrum_data_cdata_get(&spectrum->data)[1].data == 0.2);
    325 
    326   solparser_material_iterator_next(&mtl_it);
    327   CHK(solparser_material_iterator_eq(&mtl_it, &mtl_it_end) == 1);
    328 
    329   CHK(solparser_load(parser) == RES_BAD_OP);
    330   fclose(stream);
    331 }
    332 
    333 int
    334 main(int argc, char** argv)
    335 {
    336   struct mem_allocator allocator;
    337   struct solparser* parser;
    338   (void)argc, (void)argv;
    339 
    340   CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK);
    341   CHK(solparser_create(&allocator, &parser) == RES_OK);
    342 
    343   test_sun(parser);
    344   test_matte(parser);
    345   test_mirror(parser);
    346   test_thin_dielectric(parser);
    347   test_dielectric(parser);
    348 
    349   solparser_ref_put(parser);
    350 
    351   check_memory_allocator(&allocator);
    352   mem_shutdown_proxy_allocator(&allocator);
    353   CHK(mem_allocated_size() == 0);
    354   return 0;
    355 }
    356