solstice-solver

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

commit 15bce572ec4ab60e396d05bb465da1e60aef7b9b
parent 6d506f2cdd00f5148e01a447f0fdfbb3f23b525b
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 19 Jun 2026 12:35:47 +0200

 Add a new ssol_location struct

 Use it as argument to ssol_sun_set_location_and_date instead of 2
 separate double.

Diffstat:
Msrc/ssol.h | 9+++++++--
Msrc/ssol_sun.c | 20+++++++++++---------
Msrc/test_ssol_sun.c | 46+++++++++++++++++++++++++---------------------
3 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -139,6 +139,12 @@ enum ssol_sun_direction_algorithm { SSOL_SUN_DIRECTION_ALGORITHM_PSA }; +/* The longitude must be in [-180, 180] degrees relative to Greenwich. + * The angle is positive towards the east. + * The latitude must be in [-90, 90] degrees relative to the equator. + * It is positive towards the north. */ +struct ssol_location { double latitude; double longitude; }; + /* Describe a vertex data */ struct ssol_vertex_data { enum ssol_attrib_usage usage; /* Semantic of the data */ @@ -1044,8 +1050,7 @@ ssol_sun_set_direction SSOL_API res_T ssol_sun_set_location_and_date (struct ssol_sun* sun, - const double latitude, - const double longitude, + const struct ssol_location* location, const struct tm* date); /* Set the algorithm used to produce sun direction from location and date. diff --git a/src/ssol_sun.c b/src/ssol_sun.c @@ -168,26 +168,28 @@ ssol_sun_set_direction(struct ssol_sun* sun, const double direction[3]) res_T ssol_sun_set_location_and_date (struct ssol_sun* sun, - const double latitude, - const double longitude, + const struct ssol_location* loc, const struct tm* date) { res_T res = RES_OK; struct scem_sun_pos sun_pos; - struct scem_location loc; + struct scem_location scem_loc; enum scem_sun_algo algorithm; - if(!sun || !date) { + if(!sun || !loc|| !date) { res = RES_BAD_ARG; goto error; } - if(latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) { + + if(loc->latitude < -90 || loc->latitude > 90 + || loc->longitude < -180 || loc->longitude > 180) + { res = RES_BAD_ARG; goto error; } - loc.latitude = latitude; - loc.longitude = longitude; + scem_loc.latitude = loc->latitude; + scem_loc.longitude = loc->longitude; switch(sun->algorithm ) { case SSOL_SUN_DIRECTION_ALGORITHM_PSA : @@ -196,9 +198,9 @@ ssol_sun_set_location_and_date case SSOL_SUN_DIRECTION_ALGORITHM_MEEUS : algorithm = SCEM_SUN_MEEUS ; break; - default: FATAL("Unknown enum value."); + default: FATAL("Unknown sun positioning algorithm."); } - res = scem_sun_position_from_earth(date, &loc, algorithm, &sun_pos); + res = scem_sun_position_from_earth(date, &scem_loc, algorithm, &sun_pos); if(res != RES_OK) goto error; scem_to_cartesian_sun_dir(&sun_pos, sun->direction); diff --git a/src/test_ssol_sun.c b/src/test_ssol_sun.c @@ -37,6 +37,7 @@ main(int argc, char** argv) double dni; struct tm date; enum ssol_sun_direction_algorithm algo; + struct ssol_location loc; (void) argc, (void) argv; mem_init_proxy_allocator(&allocator, &mem_default_allocator); @@ -85,49 +86,52 @@ main(int argc, char** argv) CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_MEEUS) == RES_OK); strptime("2026-6-21T12:4:0", "%Y-%m-%dT%H:%M:%S", &date); - CHK(ssol_sun_set_location_and_date(NULL, 100, 200, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(NULL, 100, 200, &date) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(NULL, 100, 0, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(NULL, 100, 0, &date) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(NULL, 0, 200, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(NULL, 0, 200, &date) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(NULL, 0, 0, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(NULL, 0, 0, &date) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 100, 200, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 100, 200, &date) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 100, 0, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 100, 0, &date) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 0, 200, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 0, 200, &date) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 0, 0, NULL) == RES_BAD_ARG); - CHK(ssol_sun_set_location_and_date(sun, 23.436, 0, &date) == RES_OK); + loc.latitude = 0; loc.longitude = 0; + CHK(ssol_sun_set_location_and_date(NULL, NULL, NULL) == RES_BAD_ARG); + CHK(ssol_sun_set_location_and_date(NULL, NULL, &date) == RES_BAD_ARG); + CHK(ssol_sun_set_location_and_date(NULL, &loc, NULL) == RES_BAD_ARG); + CHK(ssol_sun_set_location_and_date(sun, NULL, NULL) == RES_BAD_ARG); + CHK(ssol_sun_set_location_and_date(NULL, &loc, &date) == RES_BAD_ARG); + CHK(ssol_sun_set_location_and_date(sun, &loc, NULL) == RES_BAD_ARG); + CHK(ssol_sun_set_location_and_date(sun, NULL, &date) == RES_BAD_ARG); + loc.latitude = 100; loc.longitude = 0; + CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_BAD_ARG); + loc.latitude = 0; loc.longitude = 200; + CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_BAD_ARG); + loc.latitude = 100; loc.longitude = 200; + CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_BAD_ARG); + loc.latitude = 23.436; loc.longitude = 0; + CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK); CHK(ssol_sun_get_direction(sun, tmp) == RES_OK); d3(res, 0,0,-1); CHK(d3_eq_eps(res, tmp, 1e-4) == 1); CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_PSA) == RES_OK); + loc.latitude = 23.436; loc.longitude = 0; strptime("2026-6-21T12:1:49", "%Y-%m-%dT%H:%M:%S", &date); - CHK(ssol_sun_set_location_and_date(sun, 23.436, 0, &date) == RES_OK); + CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK); CHK(ssol_sun_get_direction(sun, tmp) == RES_OK); d3(res, 0,0,-1); CHK(d3_eq_eps(res, tmp, 1e-4) == 1); CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_MEEUS) == RES_OK); + loc.latitude = 0; loc.longitude = 0; strptime("2026-6-21T10:0:0", "%Y-%m-%dT%H:%M:%S", &date); - CHK(ssol_sun_set_location_and_date(sun, 0, 0, &date) == RES_OK); + CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK); CHK(ssol_sun_get_direction(sun, tmp) == RES_OK); - d3(res, -0.397792,-0.47252,-0.78643); + d3(res, -0.47252,-0.397792,-0.78643); CHK(d3_eq_eps(res, tmp, 1e-4) == 1); CHK(ssol_sun_set_algorithm(sun, SSOL_SUN_DIRECTION_ALGORITHM_PSA) == RES_OK); + loc.latitude = 0; loc.longitude = 0; strptime("2026-6-21T10:0:0", "%Y-%m-%dT%H:%M:%S", &date); - CHK(ssol_sun_set_location_and_date(sun, 0, 0, &date) == RES_OK); + CHK(ssol_sun_set_location_and_date(sun, &loc, &date) == RES_OK); CHK(ssol_sun_get_direction(sun, tmp) == RES_OK); - d3(res, -0.397733,-0.465014,-0.79093); + d3(res, -0.465014,-0.397733,-0.79093); CHK(d3_eq_eps(res, tmp, 1e-4) == 1); CHK(ssol_sun_set_dni(NULL, 1000) == RES_BAD_ARG);