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