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 }