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 7f41df40d3a22b1b71f69692801f31ae61d91294
parent eed5ad079a3d8853ca1998588f4ed77d0f810d37
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon,  3 Apr 2017 15:54:44 +0200

Change spectrum parsing to detect some additional invalid data.

Detect 0 wavelenght and non-increasing wavelenghts as invalid.

Diffstat:
Msrc/parser/solparser_c.h | 2--
Msrc/parser/solparser_spectrum.c | 26++++++++++++++++----------
Msrc/parser/solparser_sun.c | 2+-
Msrc/parser/yaml/test_ko_0.yaml | 6++++++
4 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/src/parser/solparser_c.h b/src/parser/solparser_c.h @@ -381,8 +381,6 @@ extern LOCAL_SYM res_T parse_spectrum (struct solparser* parser, yaml_document_t* doc, - const double lower_bound, - const double upper_bound, const yaml_node_t* spectrum, struct darray_spectrum_data* data); diff --git a/src/parser/solparser_spectrum.c b/src/parser/solparser_spectrum.c @@ -22,16 +22,15 @@ static res_T parse_spectrum_data (struct solparser* parser, yaml_document_t* doc, - const double lower_bound, - const double upper_bound, const yaml_node_t* sdata, + double* last_wl, struct solparser_spectrum_data* spectrum_data) { enum { DATA, WAVELENGTH }; intptr_t i, n; int mask = 0; /* Register the parsed attributes */ res_T res = RES_OK; - ASSERT(doc && sdata && lower_bound < upper_bound && spectrum_data); + ASSERT(doc && sdata && spectrum_data); if(sdata->type != YAML_MAPPING_NODE) { log_err(parser, sdata, "expect the definition of a spectrum data.\n"); @@ -63,10 +62,19 @@ parse_spectrum_data } (void)0 if(!strcmp((char*)key->data.scalar.value, "data")) { SETUP_MASK(DATA, "data"); - res = parse_real(parser, val, lower_bound, upper_bound, &spectrum_data->data); + res = parse_real(parser, val, 0, DBL_MAX, &spectrum_data->data); } else if(!strcmp((char*)key->data.scalar.value, "wavelength")) { SETUP_MASK(WAVELENGTH, "wavelength"); - res = parse_real(parser, val, 0, DBL_MAX, &spectrum_data->wavelength); + res = parse_real(parser, val, nextafter(*last_wl, DBL_MAX), DBL_MAX, + &spectrum_data->wavelength); + if(*last_wl >= spectrum_data->wavelength) { + ASSERT(res != RES_OK); + log_err(parser, key, + "spectrum with non-increasing wavelengths (%g after %g).\n", + spectrum_data->wavelength, + *last_wl); + } + *last_wl = spectrum_data->wavelength; } else { log_err(parser, key, "unknown spectrum data parameter `%s'.\n", key->data.scalar.value); @@ -103,14 +111,13 @@ res_T parse_spectrum (struct solparser* parser, yaml_document_t* doc, - const double lower_bound, - const double upper_bound, const yaml_node_t* spectrum, struct darray_spectrum_data* data) { intptr_t i, n; res_T res = RES_OK; - ASSERT(doc && spectrum && lower_bound < upper_bound && data); + double last_wl = 0; + ASSERT(doc && spectrum && data); if(spectrum->type != YAML_SEQUENCE_NODE) { log_err(parser, spectrum, "expect a list of spectrum data.\n"); @@ -131,8 +138,7 @@ parse_spectrum sdata = yaml_document_get_node(doc, spectrum->data.sequence.items.start[i]); spectrum_data = darray_spectrum_data_data_get(data) + i; - res = parse_spectrum_data - (parser, doc, lower_bound, upper_bound, sdata, spectrum_data); + res = parse_spectrum_data(parser, doc, sdata, &last_wl, spectrum_data); if(res != RES_OK) goto error; } diff --git a/src/parser/solparser_sun.c b/src/parser/solparser_sun.c @@ -222,7 +222,7 @@ parse_sun res = parse_pillbox(parser, doc, val, &solsun->radang_distrib.pillbox); } else if(!strcmp((char*)key->data.scalar.value, "spectrum")) { SETUP_MASK(SPECTRUM, "spectrum"); - res = parse_spectrum(parser, doc, 0, DBL_MAX, val, &solsun->spectrum); + res = parse_spectrum(parser, doc, val, &solsun->spectrum); } else { log_err(parser, key, "unknown sun parameter `%s'.\n", key->data.scalar.value); diff --git a/src/parser/yaml/test_ko_0.yaml b/src/parser/yaml/test_ko_0.yaml @@ -39,12 +39,18 @@ # data should be a number - sun: { spectrum: [{wavelength: 1, data: "dummy"}] } --- +# 0 invalid +- sun: { spectrum: [{wavelength: 0, data: 1}] } +--- # -1 invalid - sun: { spectrum: [{wavelength: -1, data: 1}] } --- # -1 invalid - sun: { spectrum: [{wavelength: 1, data: -1}] } --- +# invalid non-increasing wavelengths +- sun: { spectrum: [{wavelength: 1, data: 1}, {wavelength: 1, data: 2}] } +--- # # dni: REAL # Direct Normal Irradiance in ]0, INF)