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 c32d4b820c39773314cff2d347fa9d80836b72ed
parent 5765dab7fefe1381761cfbd8f25f285bb84221c0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  1 Feb 2017 16:51:33 +0100

Keep in degrees the parsed fov/sun_dir arguments

Diffstat:
Mcmake/CMakeLists.txt | 2+-
Msrc/solstice.c | 20++++++++++++--------
Msrc/solstice_args.c | 57++++++++++++++++-----------------------------------------
Msrc/test_solstice_args.c | 45+++++++++++++++++++++++++++++++++------------
4 files changed, 62 insertions(+), 62 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -65,7 +65,7 @@ set(SOLSTICE_ARGS_DEFAULT_NREALISATIONS "10000") set(SOLSTICE_ARGS_DEFAULT_CAMERA_POS "0,0,0") set(SOLSTICE_ARGS_DEFAULT_CAMERA_TGT "0,0,-1") set(SOLSTICE_ARGS_DEFAULT_CAMERA_UP "0,1,0") -set(SOLSTICE_ARGS_DEFAULT_CAMERA_FOV "1.22173047639603070383") # In radians +set(SOLSTICE_ARGS_DEFAULT_CAMERA_FOV "70") # In degrees set(SOLSTICE_ARGS_DEFAULT_IMG_WIDTH "800") set(SOLSTICE_ARGS_DEFAULT_IMG_HEIGHT "600") diff --git a/src/solstice.c b/src/solstice.c @@ -88,11 +88,10 @@ setup_camera(struct solstice* solstice, const struct solstice_args* args) goto error; } - res = ssol_camera_set_fov(cam, args->camera.fov_x); + res = ssol_camera_set_fov(cam, MDEG2RAD(args->camera.fov_x)); if(res != RES_OK) { - fprintf(stderr, - "Invalid horizontal field of view '%g degrees' (%g radians).\n", - MRAD2DEG(args->camera.fov_x), args->camera.fov_x); + fprintf(stderr, "Invalid horizontal field of view '%g' degrees.\n", + args->camera.fov_x); goto error; } @@ -163,12 +162,17 @@ spherical_to_cartesian_sun_dir double sin_azimuth; double cos_elevation; double sin_elevation; + double azimuth; + double elevation; ASSERT(spherical && sun_dir); - cos_azimuth = cos(spherical->azimuth); - sin_azimuth = sin(spherical->azimuth); - cos_elevation = cos(spherical->elevation); - sin_elevation = sin(spherical->elevation); + azimuth = MDEG2RAD(spherical->azimuth); + elevation = MDEG2RAD(spherical->elevation); + + cos_azimuth = cos(azimuth); + sin_azimuth = sin(azimuth); + cos_elevation = cos(elevation); + sin_elevation = sin(elevation); sun_dir[0] = -(cos_elevation * cos_azimuth); sun_dir[1] = -(cos_elevation * sin_azimuth); diff --git a/src/solstice_args.c b/src/solstice_args.c @@ -86,43 +86,18 @@ parse_fov(const char* str, double* out_fov) fprintf(stderr, "The field of view %g is not in [30, 120].\n", fov); return RES_BAD_ARG; } - *out_fov = MDEG2RAD(fov); + *out_fov = fov; return RES_OK; } static res_T -parse_doubleN(const char* str, double dbl[], const size_t N) -{ - char buf[64]; - char* tk; - char* ctx; - size_t i; - res_T res = RES_OK; - ASSERT(str && dbl); - - if(strlen(str) >= sizeof(buf) - 1/*NULL char*/) { - fprintf(stderr, - "Could not duplicate the string `%s'.\n", str); - return RES_MEM_ERR; - } - strncpy(buf, str, sizeof(buf)); - - FOR_EACH(i, 0, N) { - tk = strtok_r(i == 0 ? buf : NULL, i == N-1 ? "" : ",", &ctx); - res = cstr_to_double(tk, dbl+i); - if(res != RES_OK) return res; - } - - return RES_OK; -} - -static res_T parse_sun_dir_list(const char* str, struct solstice_args* args) { char buf[512]; char* tk; char* ctx; + size_t len; res_T res = RES_OK; ASSERT(str && args); @@ -139,7 +114,8 @@ parse_sun_dir_list(const char* str, struct solstice_args* args) struct solstice_args_spherical spherical; double tmp[2]; - res = parse_doubleN(tk, tmp, 2); + res = cstr_to_list_double(tk, ',', tmp, &len, 2); + if(res == RES_OK && len != 2) res = RES_BAD_ARG; if(res != RES_OK) { fprintf(stderr, "Invalid sun direction `%s'.\n", tk); goto error; @@ -160,8 +136,8 @@ parse_sun_dir_list(const char* str, struct solstice_args* args) goto error; } - spherical.azimuth = MDEG2RAD(tmp[0]); - spherical.elevation = MDEG2RAD(tmp[1]); + spherical.azimuth = tmp[0]; + spherical.elevation = tmp[1]; sa_push(args->sun_dirs, spherical); tk = strtok_r(NULL, ":", &ctx); @@ -223,6 +199,7 @@ parse_rendering_option(const char* str, struct solstice_args* args) char* key; char* val; char* ctx; + size_t len; res_T res; ASSERT(str && args); @@ -244,19 +221,22 @@ parse_rendering_option(const char* str, struct solstice_args* args) res = parse_image_definition(val, &args->img.width, &args->img.height); if(res != RES_OK) goto error; } else if(!strcmp(key, "pos")) { - res = parse_doubleN(val, args->camera.pos, 3); - if(res != RES_OK) { + res = cstr_to_list_double(val, ',', args->camera.pos, &len, 3); + if(res == RES_OK && len != 3) res = RES_BAD_ARG; + if(res != RES_OK ) { fprintf(stderr, "Invalid camera position `%s'.\n", val); goto error; } } else if(!strcmp(key, "tgt")) { - res = parse_doubleN(val, args->camera.tgt, 3); + res = cstr_to_list_double(val, ',', args->camera.tgt, &len, 3); + if(res == RES_OK && len != 3) res = RES_BAD_ARG; if(res != RES_OK) { fprintf(stderr, "Invalid camera target `%s'.\n", val); goto error; } } else if(!strcmp(key, "up")) { - res = parse_doubleN(val, args->camera.up, 3); + res = cstr_to_list_double(val, ',', args->camera.up, &len, 3); + if(res == RES_OK && len != 3) res = RES_BAD_ARG; if(res != RES_OK) { fprintf(stderr, "Invalid camera up vector `%s'.\n", val); goto error; @@ -316,7 +296,6 @@ error: res_T solstice_args_init(struct solstice_args* args, const int argc, char** argv) { - unsigned long ul = 0; int opt; res_T res = RES_OK; ASSERT(args && argc && argv); @@ -344,12 +323,8 @@ solstice_args_init(struct solstice_args* args, const int argc, char** argv) case 'R': args->receivers_filename = optarg; break; case 'r': res = parse_rendering_options(optarg, args); break; case 't': - res = cstr_to_ulong(optarg, &ul); - if(res == RES_OK && !ul) { - res = RES_BAD_ARG; - } else { - args->nthreads = (unsigned)MMIN(ul, UINT_MAX); - } + res = cstr_to_uint(optarg, &args->nthreads); + if(res == RES_OK && !args->nthreads) res = RES_BAD_ARG; break; default: res = RES_BAD_ARG; break; } diff --git a/src/test_solstice_args.c b/src/test_solstice_args.c @@ -96,7 +96,7 @@ test_rendering(void) CHECK(args.img.width, 640); CHECK(args.img.height, 480); CHECK(args.quiet, 1); - CHECK(eq_eps(args.camera.fov_x, MDEG2RAD(70), 1.e-6), 1); + CHECK(eq_eps(args.camera.fov_x, 70, 1.e-6), 1); CHECK(args.output_filename, NULL); solstice_args_release(&args); cmd_delete(cmd); @@ -169,29 +169,29 @@ test_sun_dirs(void) CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); CHECK(args.nsun_dirs, 1); CHECK(args.sun_dirs[0].azimuth, 0); - CHECK(eq_eps(args.sun_dirs[0].elevation, MDEG2RAD(1), 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[0].elevation, 1, 1.e-6), 1); solstice_args_release(&args); cmd_delete(cmd); cmd = cmd_create(0, "test", "-D", "1.2,3.4:3.14,0.123:", RES_OK); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); CHECK(args.nsun_dirs, 2); - CHECK(eq_eps(args.sun_dirs[0].azimuth, MDEG2RAD(1.2), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[0].elevation, MDEG2RAD(3.4), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[1].azimuth, MDEG2RAD(3.14), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[1].elevation, MDEG2RAD(0.123), 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[0].azimuth, 1.2, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[0].elevation, 3.4, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[1].azimuth, 3.14, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[1].elevation, 0.123, 1.e-6), 1); solstice_args_release(&args); cmd_delete(cmd); cmd = cmd_create(0, "test", "-D", "1.2,3.4:3.14,0.123:2.01,23.1", RES_OK); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); CHECK(args.nsun_dirs, 3); - CHECK(eq_eps(args.sun_dirs[0].azimuth, MDEG2RAD(1.2), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[0].elevation, MDEG2RAD(3.4), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[1].azimuth, MDEG2RAD(3.14), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[1].elevation, MDEG2RAD(0.123), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[2].azimuth, MDEG2RAD(2.01), 1.e-6), 1); - CHECK(eq_eps(args.sun_dirs[2].elevation, MDEG2RAD(23.1), 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[0].azimuth, 1.2, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[0].elevation, 3.4, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[1].azimuth, 3.14, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[1].elevation, 0.123, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[2].azimuth, 2.01, 1.e-6), 1); + CHECK(eq_eps(args.sun_dirs[2].elevation, 23.1, 1.e-6), 1); solstice_args_release(&args); cmd_delete(cmd); @@ -414,6 +414,26 @@ test_receivers(void) cmd_delete(cmd); } +static void +test_input(void) +{ + struct solstice_args args = SOLSTICE_ARGS_NULL; + char** cmd = NULL; + + cmd = cmd_create(0, "test", "-D", "0,90", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); + CHECK(args.input_filename, SOLSTICE_ARGS_DEFAULT.input_filename); + CHECK(args.input_filename, NULL); + solstice_args_release(&args); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-D", "0,90", "my_input", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); + CHECK(strcmp(args.input_filename, "my_input"), 0); + solstice_args_release(&args); + cmd_delete(cmd); +} + int main(int argc, char** argv) { @@ -426,6 +446,7 @@ main(int argc, char** argv) test_output(); test_quiet(); test_receivers(); + test_input(); CHECK(mem_allocated_size(), 0); return 0; }