solstice

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

commit bc7aa8a1fe3f7d8c593e6b3d6e3477ca10516415
parent 638f759b9cf717f826b80291c60f330ad3eae652
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 16 Jan 2017 09:30:04 +0100

Merge remote-tracking branch 'origin/master' into receiver

Diffstat:
Mdoc/input | 2+-
Msrc/parser/solparser.c | 7++++---
Msrc/solstice_args.c | 15+++++++++++++++
Msrc/test_solstice_args.c | 21+++++++++++++++++++++
4 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/doc/input b/doc/input @@ -251,7 +251,7 @@ <pillbox> ::= pillbox: - aperture: REAL # in ]0, PI/2] + aperture: REAL # in ]0, 90] ---------------------------------------- <transform> ::= diff --git a/src/parser/solparser.c b/src/parser/solparser.c @@ -1210,7 +1210,7 @@ parse_polyclip #define CHECK_PARAM(Flag, Name) \ if(!(mask & BIT(Flag))) { \ log_err(parser, polyclip, \ - "the clipping polygon parameter `"Name"' is missing"); \ + "the clipping polygon parameter `"Name"' is missing.\n"); \ res = RES_BAD_ARG; \ goto error; \ } (void)0 @@ -1747,7 +1747,7 @@ parse_sphere } (void)0 if(!strcmp((char*)key->data.scalar.value, "radius")) { SETUP_MASK(RADIUS, "radius"); - res = parse_real(parser, val, 0, DBL_MAX, &shape->radius); + res = parse_real(parser, val, nextafter(0, 1), DBL_MAX, &shape->radius); } else if(!strcmp((char*)key->data.scalar.value, "slices")) { SETUP_MASK(SLICES, "slices"); res = parse_integer(parser, val, 4, 4096, &shape->nslices); @@ -2715,7 +2715,8 @@ parse_pillbox goto error; } mask |= BIT(APERTURE); - res = parse_real(parser, val, nextafter(0, 1), PI/2.0, &sun->aperture); + res = parse_real(parser, val, nextafter(0, 1), 90, &sun->aperture); + sun->aperture = MDEG2RAD(sun->aperture); } else { log_err(parser, pillbox, "unknown pillbox parameter `%s'.\n", key->data.scalar.value); diff --git a/src/solstice_args.c b/src/solstice_args.c @@ -119,6 +119,21 @@ parse_sun_dir_list(const char* str, struct solstice_args* args) goto error; } + if(tmp[0] < 0 || tmp[0] >= 360) { + fprintf(stderr, + "Invalid azimuth angle `%g'. Azimuth must be in [0, 360[ degrees.\n", + tmp[0]); + res = RES_BAD_ARG; + goto error; + } + if(tmp[1] < 0 || tmp[1] > 90) { + fprintf(stderr, + "Invalid elevation angle `%g'. Elevation must be in [0, 90] degrees.\n", + tmp[1]); + res = RES_BAD_ARG; + goto error; + } + spherical.azimuth = MDEG2RAD(tmp[0]); spherical.elevation = MDEG2RAD(tmp[1]); sa_push(args->sun_dirs, spherical); diff --git a/src/test_solstice_args.c b/src/test_solstice_args.c @@ -205,6 +205,27 @@ test_sun_dirs(void) cmd = cmd_create(0, "test", "-D", "1.2,3.4:5.2,A", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-D", "-0.1,2", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-D", "360,2", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-D", "0,-1", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-D", "0,91", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-D", "0,90", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); + solstice_args_release(&args); + cmd_delete(cmd); } int