solstice-solver

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

commit a63ea663394e80a710c0dd9f612489e97f85f9ee
parent ac724f5af1e1a3720a370c2a6ab86d96f7f7abf4
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon,  3 Apr 2017 14:45:40 +0200

Allow suns with no spectrum and adapt tests.

Add some missing code and test to check for spectrum validity.

Diffstat:
Msrc/ssol_ranst_sun_wl.c | 4++--
Msrc/ssol_solver.c | 5-----
Msrc/ssol_spectrum.c | 10+++++++++-
Msrc/ssol_sun.c | 13+++++++++----
Msrc/test_ssol_solver1.c | 3++-
Msrc/test_ssol_spectrum.c | 8++++++++
6 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/src/ssol_ranst_sun_wl.c b/src/ssol_ranst_sun_wl.c @@ -158,7 +158,7 @@ ranst_sun_wl_setup const size_t sz) { res_T res = RES_OK; - if (!ran || !wavelengths || !intensities || !sz) + if (sz && (!ran || !wavelengths || !intensities)) return RES_BAD_ARG; if (sz > 1) { ran->type = WL_PIECEWISE; @@ -172,7 +172,7 @@ ranst_sun_wl_setup } else { ran->type = WL_DIRAC; ran->get = &ran_dirac_get; - ran->state.dirac.wavelength = wavelengths[0]; + ran->state.dirac.wavelength = sz ? wavelengths[0] : -1; } exit: return res; diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -469,11 +469,6 @@ check_scene(const struct ssol_scene* scene, const char* caller) return RES_BAD_ARG; } - if(!scene->sun->spectrum) { - log_error(scene->dev, "%s: sun's spectrum undefined.\n", caller); - return RES_BAD_ARG; - } - if(scene->sun->dni <= 0) { log_error(scene->dev, "%s: sun's DNI undefined.\n", caller); return RES_BAD_ARG; diff --git a/src/ssol_spectrum.c b/src/ssol_spectrum.c @@ -175,6 +175,7 @@ ssol_spectrum_setup { double* wavelengths; double* intensities; + double current_wl = 0; size_t i; res_T res = RES_OK; @@ -190,7 +191,14 @@ ssol_spectrum_setup wavelengths = darray_double_data_get(&spectrum->wavelengths); intensities = darray_double_data_get(&spectrum->intensities); - FOR_EACH(i, 0, nwlens) get(i, wavelengths+i, intensities+i, ctx); + FOR_EACH(i, 0, nwlens) { + get(i, wavelengths + i, intensities + i, ctx); + if(*(wavelengths + i) <= current_wl || *(intensities + i) < 0) { + res = RES_BAD_ARG; + goto error; + } + current_wl = *(wavelengths + i); + } exit: return res; diff --git a/src/ssol_sun.c b/src/ssol_sun.c @@ -214,10 +214,15 @@ sun_create_distributions /* Create and setup the spectrum distribution */ res = ranst_sun_wl_create(sun->dev->allocator, &ran_wl); if(res != RES_OK) goto error; - res = ranst_sun_wl_setup(ran_wl, - darray_double_cdata_get(&sun->spectrum->wavelengths), - darray_double_cdata_get(&sun->spectrum->intensities), - darray_double_size_get(&sun->spectrum->wavelengths)); + if(!sun->spectrum) { + res = ranst_sun_wl_setup(ran_wl, NULL, NULL, 0); + } + else { + res = ranst_sun_wl_setup(ran_wl, + darray_double_cdata_get(&sun->spectrum->wavelengths), + darray_double_cdata_get(&sun->spectrum->intensities), + darray_double_size_get(&sun->spectrum->wavelengths)); + } if(res != RES_OK) goto error; /* Create and setup the the direction distribution */ diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -260,9 +260,10 @@ main(int argc, char** argv) CHECK(ssol_sun_set_direction(sun, d3(dir, 1, 0, -1)), RES_OK); CHECK(ssol_sun_set_dni(sun, 1000), RES_OK); CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); - CHECK(ssol_solve(scene, rng, 10, 0, NULL, &estimator), RES_BAD_ARG); + CHECK(ssol_solve(scene, rng, 10, 0, NULL, &estimator), RES_OK); CHECK(ssol_scene_detach_sun(scene, sun), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); + CHECK(ssol_estimator_ref_put(estimator), RES_OK); /* Sun with undefined DNI */ CHECK(ssol_sun_create_directional(dev, &sun), RES_OK); diff --git a/src/test_ssol_spectrum.c b/src/test_ssol_spectrum.c @@ -77,6 +77,14 @@ main(int argc, char** argv) CHECK(wlens_count, 0); CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, &desc), RES_OK); CHECK(wlens_count, 3); + CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, &desc), RES_OK); + + desc.wavelengths[1] = 30; + CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, &desc), RES_BAD_ARG); + + desc.wavelengths[1] = 20; + desc.data[1] = -2.1; + CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, &desc), RES_BAD_ARG); CHECK(ssol_spectrum_ref_put(spectrum), RES_OK);