solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

test_ssol_sun.c (13593B)


      1 /* Copyright (C) 2018-2026 |Méso|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 #define _XOPEN_SOURCE /* strptime support */
     18 
     19 #include "ssol.h"
     20 #include "test_ssol_utils.h"
     21 
     22 #include <rsys/double3.h>
     23 
     24 #include <time.h>
     25 
     26 int
     27 main(int argc, char** argv)
     28 {
     29   struct mem_allocator allocator;
     30   struct ssol_device* dev;
     31   struct ssol_spectrum* spectrum;
     32   struct ssol_spectrum* spectrum2;
     33   struct ssol_sun* sun;
     34   const double dir0[3] = { 0, 0, 0 };
     35   double dir[3] = { 1, 0, 0 };
     36   double tmp[3], res[3];
     37   double dni;
     38   struct tm date;
     39   enum ssol_sun_direction_algorithm algo;
     40   struct ssol_location loc;
     41   (void) argc, (void) argv;
     42 
     43   mem_init_proxy_allocator(&allocator, &mem_default_allocator);
     44 
     45   CHK(ssol_device_create
     46     (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev) == RES_OK);
     47 
     48   CHK(ssol_spectrum_create(dev, &spectrum) == RES_OK);
     49   CHK(ssol_spectrum_create(dev, &spectrum2) == RES_OK);
     50 
     51   CHK(ssol_sun_create_directional(NULL, &sun) == RES_BAD_ARG);
     52   CHK(ssol_sun_create_directional(dev, NULL) == RES_BAD_ARG);
     53   CHK(ssol_sun_create_directional(dev, &sun) == RES_OK);
     54 
     55   CHK(ssol_sun_ref_get(NULL) == RES_BAD_ARG);
     56   CHK(ssol_sun_ref_get(sun) == RES_OK);
     57 
     58   CHK(ssol_sun_ref_put(NULL) == RES_BAD_ARG);
     59   CHK(ssol_sun_ref_put(sun) == RES_OK);
     60 
     61   CHK(ssol_sun_set_spectrum(NULL, spectrum) == RES_BAD_ARG);
     62   CHK(ssol_sun_set_spectrum(sun, NULL) == RES_BAD_ARG);
     63   CHK(ssol_sun_set_spectrum(sun, spectrum) == RES_OK);
     64   CHK(ssol_sun_set_spectrum(sun, spectrum) == RES_OK);
     65 
     66   CHK(ssol_sun_set_direction(NULL, dir) == RES_BAD_ARG);
     67   CHK(ssol_sun_set_direction(sun, NULL) == RES_BAD_ARG);
     68   CHK(ssol_sun_set_direction(sun, dir0) == RES_BAD_ARG);
     69   CHK(ssol_sun_set_direction(sun, dir) == RES_OK);
     70 
     71   CHK(ssol_sun_get_direction(NULL, tmp) == RES_BAD_ARG);
     72   CHK(ssol_sun_get_direction(sun, NULL) == RES_BAD_ARG);
     73   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
     74   CHK(d3_eq(dir, tmp) == 1);
     75 
     76   CHK(ssol_sun_set_algorithm(NULL, 999) == RES_BAD_ARG);
     77   CHK(ssol_sun_set_algorithm(NULL, SSOL_SUN_DIRECTION_ALGORITHM_MEEUS) == RES_BAD_ARG);
     78   CHK(ssol_sun_set_algorithm(sun, 999) == RES_BAD_ARG);
     79   CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_PSA) == RES_OK);
     80 
     81   CHK(ssol_sun_get_algorithm(NULL, NULL) == RES_BAD_ARG);
     82   CHK(ssol_sun_get_algorithm(NULL, &algo) == RES_BAD_ARG);
     83   CHK(ssol_sun_get_algorithm(sun, NULL) == RES_BAD_ARG);
     84   CHK(ssol_sun_get_algorithm(sun, &algo) == RES_OK);
     85   CHK(algo == SSOL_SUN_DIRECTION_ALGORITHM_PSA);
     86 
     87   CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_MEEUS) == RES_OK);
     88   strptime("2026-6-21T12:4:0", "%Y-%m-%dT%H:%M:%S", &date);
     89   loc.latitude = 0; loc.longitude = 0;
     90   CHK(ssol_sun_set_location_and_date(NULL, NULL, NULL) == RES_BAD_ARG);
     91   CHK(ssol_sun_set_location_and_date(NULL, NULL, &date) == RES_BAD_ARG);
     92   CHK(ssol_sun_set_location_and_date(NULL, &loc, NULL) == RES_BAD_ARG);
     93   CHK(ssol_sun_set_location_and_date(sun, NULL, NULL) == RES_BAD_ARG);
     94   CHK(ssol_sun_set_location_and_date(NULL, &loc, &date) == RES_BAD_ARG);
     95   CHK(ssol_sun_set_location_and_date(sun, &loc, NULL) == RES_BAD_ARG);
     96   CHK(ssol_sun_set_location_and_date(sun, NULL, &date) == RES_BAD_ARG);
     97   loc.latitude = 100; loc.longitude = 0;
     98   CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_BAD_ARG);
     99   loc.latitude = 0; loc.longitude = 200;
    100   CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_BAD_ARG);
    101   loc.latitude = 100; loc.longitude = 200;
    102   CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_BAD_ARG);
    103   loc.latitude = 23.436; loc.longitude = 0;
    104   CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK);
    105 
    106   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
    107   d3(res, 0,0,-1);
    108   CHK(d3_eq_eps(res, tmp, 1e-4) == 1);
    109 
    110   CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_PSA) == RES_OK);
    111   loc.latitude = 23.436; loc.longitude = 0;
    112   strptime("2026-6-21T12:1:49", "%Y-%m-%dT%H:%M:%S", &date);
    113   CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK);
    114 
    115   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
    116   d3(res, 0,0,-1);
    117   CHK(d3_eq_eps(res, tmp, 1e-4) == 1);
    118 
    119   CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_MEEUS) == RES_OK);
    120   loc.latitude = 0; loc.longitude = 0;
    121   strptime("2026-6-21T10:0:0", "%Y-%m-%dT%H:%M:%S", &date);
    122   CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK);
    123 
    124   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
    125   d3(res, -0.47252,-0.397792,-0.78643);
    126   CHK(d3_eq_eps(res, tmp, 1e-4) == 1);
    127 
    128   CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_PSA) == RES_OK);
    129   loc.latitude = 0; loc.longitude = 0;
    130   strptime("2026-6-21T10:0:0", "%Y-%m-%dT%H:%M:%S", &date);
    131   CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK);
    132 
    133   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
    134   d3(res, -0.465014,-0.397733,-0.79093);
    135   CHK(d3_eq_eps(res, tmp, 1e-4) == 1);
    136 
    137   CHK(ssol_sun_set_dni(NULL, 1000) == RES_BAD_ARG);
    138   CHK(ssol_sun_set_dni(sun, 0) == RES_BAD_ARG);
    139   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    140   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    141 
    142   CHK(ssol_sun_get_dni(NULL, &dni) == RES_BAD_ARG);
    143   CHK(ssol_sun_get_dni(sun, NULL) == RES_BAD_ARG);
    144   CHK(ssol_sun_get_dni(sun, &dni) == RES_OK);
    145   CHK(dni == 1000);
    146 
    147   CHK(ssol_sun_pillbox_set_half_angle(NULL, 0.1) == RES_BAD_ARG);
    148   CHK(ssol_sun_pillbox_set_half_angle(sun, -0.1) == RES_BAD_ARG);
    149   CHK(ssol_sun_pillbox_set_half_angle(sun, 999) == RES_BAD_ARG);
    150   CHK(ssol_sun_pillbox_set_half_angle(sun, 0.1) == RES_BAD_ARG);
    151 
    152   CHK(ssol_sun_gaussian_set_std_dev(NULL, 0.1) == RES_BAD_ARG);
    153   CHK(ssol_sun_gaussian_set_std_dev(sun, -0.1) == RES_BAD_ARG);
    154   CHK(ssol_sun_gaussian_set_std_dev(sun, 0.1) == RES_BAD_ARG);
    155 
    156   CHK(ssol_sun_set_buie_param(NULL, 0.1) == RES_BAD_ARG);
    157   CHK(ssol_sun_set_buie_param(sun, -0.1) == RES_BAD_ARG);
    158   CHK(ssol_sun_set_buie_param(sun, 999) == RES_BAD_ARG);
    159   CHK(ssol_sun_set_buie_param(sun, 0.1) == RES_BAD_ARG);
    160 
    161   CHK(ssol_sun_ref_put(sun) == RES_OK);
    162 
    163   CHK(ssol_sun_create_pillbox(NULL, &sun) == RES_BAD_ARG);
    164   CHK(ssol_sun_create_pillbox(dev, NULL) == RES_BAD_ARG);
    165   CHK(ssol_sun_create_pillbox(dev, &sun) == RES_OK);
    166 
    167   CHK(ssol_sun_ref_get(NULL) == RES_BAD_ARG);
    168   CHK(ssol_sun_ref_get(sun) == RES_OK);
    169 
    170   CHK(ssol_sun_ref_put(NULL) == RES_BAD_ARG);
    171   CHK(ssol_sun_ref_put(sun) == RES_OK);
    172 
    173   CHK(ssol_sun_set_spectrum(NULL, spectrum) == RES_BAD_ARG);
    174   CHK(ssol_sun_set_spectrum(sun, NULL) == RES_BAD_ARG);
    175   CHK(ssol_sun_set_spectrum(sun, spectrum) == RES_OK);
    176   CHK(ssol_sun_set_spectrum(sun, spectrum2) == RES_OK);
    177   CHK(ssol_sun_set_spectrum(sun, spectrum2) == RES_OK);
    178 
    179   CHK(ssol_sun_set_direction(NULL, dir) == RES_BAD_ARG);
    180   CHK(ssol_sun_set_direction(sun, NULL) == RES_BAD_ARG);
    181   CHK(ssol_sun_set_direction(sun, dir0) == RES_BAD_ARG);
    182   CHK(ssol_sun_set_direction(sun, dir) == RES_OK);
    183   CHK(ssol_sun_set_direction(sun, dir) == RES_OK);
    184 
    185   CHK(ssol_sun_get_direction(NULL, tmp) == RES_BAD_ARG);
    186   CHK(ssol_sun_get_direction(sun, NULL) == RES_BAD_ARG);
    187   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
    188   CHK(d3_eq(dir, tmp) == 1);
    189 
    190   CHK(ssol_sun_set_dni(NULL, 1000) == RES_BAD_ARG);
    191   CHK(ssol_sun_set_dni(sun, 0) == RES_BAD_ARG);
    192   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    193   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    194 
    195   CHK(ssol_sun_get_dni(NULL, &dni) == RES_BAD_ARG);
    196   CHK(ssol_sun_get_dni(sun, NULL) == RES_BAD_ARG);
    197   CHK(ssol_sun_get_dni(sun, &dni) == RES_OK);
    198   CHK(dni == 1000);
    199 
    200   CHK(ssol_sun_pillbox_set_half_angle(NULL, 0.1) == RES_BAD_ARG);
    201   CHK(ssol_sun_pillbox_set_half_angle(sun, -0.1) == RES_BAD_ARG);
    202   CHK(ssol_sun_pillbox_set_half_angle(sun, 999) == RES_BAD_ARG);
    203   CHK(ssol_sun_pillbox_set_half_angle(sun, 0.1) == RES_OK);
    204   CHK(ssol_sun_pillbox_set_half_angle(sun, 0.1) == RES_OK);
    205 
    206   CHK(ssol_sun_gaussian_set_std_dev(NULL, 0.1) == RES_BAD_ARG);
    207   CHK(ssol_sun_gaussian_set_std_dev(sun, -0.1) == RES_BAD_ARG);
    208   CHK(ssol_sun_gaussian_set_std_dev(sun, 0.1) == RES_BAD_ARG);
    209 
    210   CHK(ssol_sun_set_buie_param(NULL, 0.1) == RES_BAD_ARG);
    211   CHK(ssol_sun_set_buie_param(sun, -0.1) == RES_BAD_ARG);
    212   CHK(ssol_sun_set_buie_param(sun, 999) == RES_BAD_ARG);
    213   CHK(ssol_sun_set_buie_param(sun, 0.1) == RES_BAD_ARG);
    214 
    215   CHK(ssol_sun_ref_put(sun) == RES_OK);
    216 
    217   CHK(ssol_sun_create_gaussian(NULL, &sun) == RES_BAD_ARG);
    218   CHK(ssol_sun_create_gaussian(dev, NULL) == RES_BAD_ARG);
    219   CHK(ssol_sun_create_gaussian(dev, &sun) == RES_OK);
    220 
    221   CHK(ssol_sun_ref_get(NULL) == RES_BAD_ARG);
    222   CHK(ssol_sun_ref_get(sun) == RES_OK);
    223 
    224   CHK(ssol_sun_ref_put(NULL) == RES_BAD_ARG);
    225   CHK(ssol_sun_ref_put(sun) == RES_OK);
    226 
    227   CHK(ssol_sun_set_spectrum(NULL, spectrum) == RES_BAD_ARG);
    228   CHK(ssol_sun_set_spectrum(sun, NULL) == RES_BAD_ARG);
    229   CHK(ssol_sun_set_spectrum(sun, spectrum) == RES_OK);
    230   CHK(ssol_sun_set_spectrum(sun, spectrum2) == RES_OK);
    231   CHK(ssol_sun_set_spectrum(sun, spectrum2) == RES_OK);
    232 
    233   CHK(ssol_sun_set_direction(NULL, dir) == RES_BAD_ARG);
    234   CHK(ssol_sun_set_direction(sun, NULL) == RES_BAD_ARG);
    235   CHK(ssol_sun_set_direction(sun, dir0) == RES_BAD_ARG);
    236   CHK(ssol_sun_set_direction(sun, dir) == RES_OK);
    237   CHK(ssol_sun_set_direction(sun, dir) == RES_OK);
    238 
    239   CHK(ssol_sun_get_direction(NULL, tmp) == RES_BAD_ARG);
    240   CHK(ssol_sun_get_direction(sun, NULL) == RES_BAD_ARG);
    241   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
    242   CHK(d3_eq(dir, tmp) == 1);
    243 
    244   CHK(ssol_sun_set_dni(NULL, 1000) == RES_BAD_ARG);
    245   CHK(ssol_sun_set_dni(sun, 0) == RES_BAD_ARG);
    246   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    247   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    248 
    249   CHK(ssol_sun_get_dni(NULL, &dni) == RES_BAD_ARG);
    250   CHK(ssol_sun_get_dni(sun, NULL) == RES_BAD_ARG);
    251   CHK(ssol_sun_get_dni(sun, &dni) == RES_OK);
    252   CHK(dni == 1000);
    253 
    254   CHK(ssol_sun_pillbox_set_half_angle(NULL, 0.1) == RES_BAD_ARG);
    255   CHK(ssol_sun_pillbox_set_half_angle(sun, -0.1) == RES_BAD_ARG);
    256   CHK(ssol_sun_pillbox_set_half_angle(sun, 999) == RES_BAD_ARG);
    257   CHK(ssol_sun_pillbox_set_half_angle(sun, 0.1) == RES_BAD_ARG);
    258   CHK(ssol_sun_pillbox_set_half_angle(sun, 0.1) == RES_BAD_ARG);
    259 
    260   CHK(ssol_sun_gaussian_set_std_dev(NULL, 0.1) == RES_BAD_ARG);
    261   CHK(ssol_sun_gaussian_set_std_dev(sun, -0.1) == RES_BAD_ARG);
    262   CHK(ssol_sun_gaussian_set_std_dev(sun, 0.1) == RES_OK);
    263   CHK(ssol_sun_gaussian_set_std_dev(sun, 0.1) == RES_OK);
    264 
    265   CHK(ssol_sun_set_buie_param(NULL, 0.1) == RES_BAD_ARG);
    266   CHK(ssol_sun_set_buie_param(sun, -0.1) == RES_BAD_ARG);
    267   CHK(ssol_sun_set_buie_param(sun, 999) == RES_BAD_ARG);
    268   CHK(ssol_sun_set_buie_param(sun, 0.1) == RES_BAD_ARG);
    269 
    270   CHK(ssol_sun_ref_put(sun) == RES_OK);
    271 
    272   CHK(ssol_sun_create_buie(NULL, &sun) == RES_BAD_ARG);
    273   CHK(ssol_sun_create_buie(dev, NULL) == RES_BAD_ARG);
    274   CHK(ssol_sun_create_buie(dev, &sun) == RES_OK);
    275 
    276   CHK(ssol_sun_ref_get(NULL) == RES_BAD_ARG);
    277   CHK(ssol_sun_ref_get(sun) == RES_OK);
    278 
    279   CHK(ssol_sun_ref_put(NULL) == RES_BAD_ARG);
    280   CHK(ssol_sun_ref_put(sun) == RES_OK);
    281 
    282   CHK(ssol_sun_set_spectrum(NULL, spectrum) == RES_BAD_ARG);
    283   CHK(ssol_sun_set_spectrum(sun, NULL) == RES_BAD_ARG);
    284   CHK(ssol_sun_set_spectrum(sun, spectrum) == RES_OK);
    285   CHK(ssol_sun_set_spectrum(sun, spectrum) == RES_OK);
    286 
    287   CHK(ssol_sun_set_direction(NULL, dir) == RES_BAD_ARG);
    288   CHK(ssol_sun_set_direction(sun, NULL) == RES_BAD_ARG);
    289   CHK(ssol_sun_set_direction(sun, dir0) == RES_BAD_ARG);
    290   CHK(ssol_sun_set_direction(sun, dir) == RES_OK);
    291   CHK(ssol_sun_set_direction(sun, dir) == RES_OK);
    292 
    293   CHK(ssol_sun_get_direction(NULL, tmp) == RES_BAD_ARG);
    294   CHK(ssol_sun_get_direction(sun, NULL) == RES_BAD_ARG);
    295   CHK(ssol_sun_get_direction(sun, tmp) == RES_OK);
    296   CHK(d3_eq(dir, tmp) == 1);
    297 
    298   CHK(ssol_sun_set_dni(NULL, 1000) == RES_BAD_ARG);
    299   CHK(ssol_sun_set_dni(sun, 0) == RES_BAD_ARG);
    300   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    301   CHK(ssol_sun_set_dni(sun, 1000) == RES_OK);
    302 
    303   CHK(ssol_sun_get_dni(NULL, &dni) == RES_BAD_ARG);
    304   CHK(ssol_sun_get_dni(sun, NULL) == RES_BAD_ARG);
    305   CHK(ssol_sun_get_dni(sun, &dni) == RES_OK);
    306   CHK(dni == 1000);
    307 
    308   CHK(ssol_sun_pillbox_set_half_angle(NULL, 0.1) == RES_BAD_ARG);
    309   CHK(ssol_sun_pillbox_set_half_angle(sun, -0.1) == RES_BAD_ARG);
    310   CHK(ssol_sun_pillbox_set_half_angle(sun, 999) == RES_BAD_ARG);
    311   CHK(ssol_sun_pillbox_set_half_angle(sun, 0.1) == RES_BAD_ARG);
    312 
    313   CHK(ssol_sun_gaussian_set_std_dev(NULL, 0.1) == RES_BAD_ARG);
    314   CHK(ssol_sun_gaussian_set_std_dev(sun, -0.1) == RES_BAD_ARG);
    315   CHK(ssol_sun_gaussian_set_std_dev(sun, 0.1) == RES_BAD_ARG);
    316 
    317   CHK(ssol_sun_set_buie_param(NULL, 0.1) == RES_BAD_ARG);
    318   CHK(ssol_sun_set_buie_param(sun, -0.1) == RES_BAD_ARG);
    319   CHK(ssol_sun_set_buie_param(sun, 999) == RES_BAD_ARG);
    320   CHK(ssol_sun_set_buie_param(sun, 0.1) == RES_OK);
    321   CHK(ssol_sun_set_buie_param(sun, 0.1) == RES_OK);
    322 
    323   CHK(ssol_sun_ref_put(sun) == RES_OK);
    324 
    325   CHK(ssol_spectrum_ref_put(spectrum) == RES_OK);
    326   CHK(ssol_spectrum_ref_put(spectrum2) == RES_OK);
    327   CHK(ssol_device_ref_put(dev) == RES_OK);
    328 
    329   check_memory_allocator(&allocator);
    330   mem_shutdown_proxy_allocator(&allocator);
    331   CHK(mem_allocated_size() == 0);
    332 
    333   return 0;
    334 }