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