htgop

Optical properties of a gas mixture
git clone git://git.meso-star.fr/htgop.git
Log | Files | Refs | README | LICENSE

commit 7cf3fb9c94f52f07efed7808b0b4c12c3fd827ad
parent a7f9f37139b5de9d495aaf28e5fd0aefa305cc3d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 14 Apr 2020 16:58:21 +0200

Add and test the htgop_find_<lw|sw>_spectral_interval_id functions_

Diffstat:
Msrc/htgop.c | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/htgop.h | 14++++++++++++++
Msrc/test_htgop_load.c | 34++++++++++++++++++++++++++++++++++
3 files changed, 115 insertions(+), 2 deletions(-)

diff --git a/src/htgop.c b/src/htgop.c @@ -719,6 +719,71 @@ htgop_get_sw_spectral_interval } res_T +htgop_find_lw_spectral_interval_id + (const struct htgop* htgop, + const double wnum, + size_t* ispecint) +{ + const double* find = NULL; + const double* wnums = NULL; + size_t nwnums = 0; + if(!htgop || !ispecint) return RES_BAD_ARG; + + wnums = darray_double_cdata_get(&htgop->lw_specints.wave_numbers); + nwnums = darray_double_size_get(&htgop->lw_specints.wave_numbers); + + find = search_lower_bound(&wnum, wnums, nwnums, sizeof(*wnums), cmp_dbl); + if(!find || find == wnums) { + log_warn(htgop, "%s: the wavenumber `%g' is not included in any band.\n", + FUNC_NAME, wnum); + *ispecint = SIZE_MAX; + } else { + *ispecint = (size_t)(find - wnums - 1); +#ifndef NDEBUG + { + size_t n; + HTGOP(get_lw_spectral_intervals_count(htgop, &n)); + ASSERT(*ispecint < n); + } +#endif + } + return RES_OK; +} + +res_T +htgop_find_sw_spectral_interval_id + (const struct htgop* htgop, + const double wnum, + size_t* ispecint) +{ + const double* find = NULL; + const double* wnums = NULL; + size_t nwnums = 0; + if(!htgop || !ispecint) return RES_BAD_ARG; + + wnums = darray_double_cdata_get(&htgop->sw_specints.wave_numbers); + nwnums = darray_double_size_get(&htgop->sw_specints.wave_numbers); + + find = search_lower_bound(&wnum, wnums, nwnums, sizeof(*wnums), cmp_dbl); + if(!find || find == wnums) { + log_warn(htgop, "%s: the wavenumber `%g' is not included in any band.\n", + FUNC_NAME, wnum); + *ispecint = SIZE_MAX; + } else { + *ispecint = (size_t)(find - wnums - 1); +#ifndef NDEBUG + { + size_t n; + HTGOP(get_sw_spectral_intervals_count(htgop, &n)); + ASSERT(*ispecint < n); + } +#endif + + } + return RES_OK; +} + +res_T htgop_spectral_interval_sample_quadrature (const struct htgop_spectral_interval* specint, const double r, /* Canonical number in [0, 1[ */ @@ -933,9 +998,9 @@ get_spectral_intervals ASSERT(wnums[specint_range[0]+1] > wnum_range[0]); ASSERT(wnums[specint_range[1]+0] < wnum_range[1]); - ASSERT(wnums[specint_range[0]+0] <= wnum_range[0] + ASSERT(wnums[specint_range[0]+0] <= wnum_range[0] || specint_range[0]==0); /* The data do not include `wnum_range' */ - ASSERT(wnums[specint_range[1]+1] >= wnum_range[1] + ASSERT(wnums[specint_range[1]+1] >= wnum_range[1] || specint_range[1] + 1 == nwnums-1);/* The data do not include `wnum_range' */ exit: diff --git a/src/htgop.h b/src/htgop.h @@ -202,6 +202,20 @@ htgop_get_sw_spectral_interval const size_t ispectral_interval, struct htgop_spectral_interval* interval); +/* Find the id of the long wave interval that includes `wave_number'. */ +HTGOP_API res_T +htgop_find_lw_spectral_interval_id + (const struct htgop* htgop, + const double wave_number, /* In cm^-1 */ + size_t* ispectral_interval); /* SIZE_MAX <=> not found */ + +/* Find the id of the short wave interval that includes `wave_number' */ +HTGOP_API res_T +htgop_find_sw_spectral_interval_id + (const struct htgop* htgop, + const double wave_number, /* In cm^-1 */ + size_t* ispectral_interval); /* SIZE_MAX <=> not found */ + HTGOP_API res_T htgop_layer_get_lw_spectral_interval (const struct htgop_layer* layer, diff --git a/src/test_htgop_load.c b/src/test_htgop_load.c @@ -331,6 +331,18 @@ main(int argc, char** argv) CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); CHK(ul == nspecints_sw); + /* Search for a LW spectral interval */ + CHK(htgop_find_lw_spectral_interval_id(NULL, 0, &ispecint) == RES_BAD_ARG); + CHK(htgop_find_lw_spectral_interval_id(htgop, 0, NULL) == RES_BAD_ARG); + CHK(htgop_find_lw_spectral_interval_id(htgop, 0, &ispecint) == RES_OK); + CHK(ispecint == SIZE_MAX); + + /* Search for a SW spectral interval */ + CHK(htgop_find_sw_spectral_interval_id(NULL, 0, &ispecint) == RES_BAD_ARG); + CHK(htgop_find_sw_spectral_interval_id(htgop, 0, NULL) == RES_BAD_ARG); + CHK(htgop_find_sw_spectral_interval_id(htgop, 0, &ispecint) == RES_OK); + CHK(ispecint == SIZE_MAX); + /* Per LW spectral interval data */ CHK(htgop_get_lw_spectral_intervals_wave_numbers(NULL, NULL) == RES_BAD_ARG); CHK(htgop_get_lw_spectral_intervals_wave_numbers(htgop, NULL) == RES_BAD_ARG); @@ -344,10 +356,21 @@ main(int argc, char** argv) CHK(htgop_get_lw_spectral_interval(htgop, nspecints_lw, &specint) == RES_BAD_ARG); CHK(htgop_get_lw_spectral_interval(NULL, 0, &specint) == RES_BAD_ARG); FOR_EACH(ispecint, 0, nspecints_lw) { + size_t i; CHK(htgop_get_lw_spectral_interval(htgop, ispecint, &specint) == RES_OK); CHK(specint.wave_numbers[0] == wnums[ispecint+0]); CHK(specint.wave_numbers[1] == wnums[ispecint+1]); + /* Check the finding of a LW spectral interval */ + FOR_EACH(i, 0, 10) { + double wnum; + size_t id; + wnum = wnums[ispecint+0] + + rand_canonic() * (wnums[ispecint+1] - wnums[ispecint+0]); + CHK(htgop_find_lw_spectral_interval_id(htgop, wnum, &id) == RES_OK); + CHK(id == ispecint); + } + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); CHK(specint.wave_numbers[0] == dbl); CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); @@ -382,10 +405,21 @@ main(int argc, char** argv) CHK(htgop_get_sw_spectral_interval(htgop, nspecints_sw, &specint) == RES_BAD_ARG); CHK(htgop_get_sw_spectral_interval(NULL, 0, &specint) == RES_BAD_ARG); FOR_EACH(ispecint, 0, nspecints_sw) { + int i; CHK(htgop_get_sw_spectral_interval(htgop, ispecint, &specint) == RES_OK); CHK(specint.wave_numbers[0] == wnums[ispecint+0]); CHK(specint.wave_numbers[1] == wnums[ispecint+1]); + /* Check the finding of a SW spectral interval */ + FOR_EACH(i, 0, 10) { + double wnum; + size_t id; + wnum = wnums[ispecint+0] + + rand_canonic() * (wnums[ispecint+1] - wnums[ispecint+0]); + CHK(htgop_find_sw_spectral_interval_id(htgop, wnum, &id) == RES_OK); + CHK(id == ispecint); + } + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); CHK(specint.wave_numbers[0] == dbl); CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK);