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