htrdr

Solving radiative transfer in heterogeneous media
git clone git://git.meso-star.fr/htrdr.git
Log | Files | Refs | README | LICENSE

commit e001c31f7742f770086fb018210cddaaabec4cdd
parent 34b22b666290127b9dc6745360c822678a97f2a2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri,  9 Dec 2022 14:19:07 +0100

planeto: check the source wavelength radiance

Check the layout of the data and that the radiances are sorted in
ascending order of wavelengths.

Diffstat:
Msrc/planeto/htrdr_planeto_source.c | 40++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+), 0 deletions(-)

diff --git a/src/planeto/htrdr_planeto_source.c b/src/planeto/htrdr_planeto_source.c @@ -45,12 +45,48 @@ struct htrdr_planeto_source { /******************************************************************************* * Helper functions ******************************************************************************/ +static INLINE res_T +check_per_wlen_radiance_sbuf_desc + (const struct htrdr_planeto_source* src, + const struct sbuf_desc* desc) +{ + const source_radiance_T* spectrum = NULL; + size_t i; + ASSERT(src && desc); + + /* Invalid size */ + if(desc->size == 0) { + htrdr_log_err(src->htrdr, "invalid empty source spectrum\n"); + return RES_BAD_ARG; + } + + /* Invalid memory layout */ + if(desc->szitem != 16 || desc->alitem != 16 || desc->pitch != 16) { + htrdr_log_err(src->htrdr, "unexpected layout of source spectrum\n"); + return RES_BAD_ARG; + } + + /* Data must be sorted */ + spectrum = desc->buffer; + FOR_EACH(i, 1, desc->size) { + if(spectrum[i-1].wavelength >= spectrum[i].wavelength) { + htrdr_log_err(src->htrdr, + "the source spectrum is not sorted in ascending order " + "with respect to wavelengths\n"); + return RES_BAD_ARG; + } + } + + return RES_OK; +} + static res_T setup_per_wavelength_radiances (struct htrdr_planeto_source* src, const struct htrdr_planeto_source_args* args) { struct sbuf_create_args sbuf_args; + struct sbuf_desc desc; res_T res = RES_OK; ASSERT(src && args && args->rnrl_filename && args->temperature < 0); @@ -62,6 +98,10 @@ setup_per_wavelength_radiances res = sbuf_load(src->per_wlen_radiances, args->rnrl_filename); if(res != RES_OK) goto error; + res = sbuf_get_desc(src->per_wlen_radiances, &desc); + if(res != RES_OK) goto error; + res = check_per_wlen_radiance_sbuf_desc(src, &desc); + if(res != RES_OK) goto error; exit: return res;