commit 1881e07a15eb07300f51cdaffd55c47d439c1b56
parent c6c4d0529c617d7c136e084879edde1a68aba176
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 22 Jun 2022 09:04:37 +0200
Test the loading of the phase functions per wavelength
Diffstat:
2 files changed, 204 insertions(+), 0 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -93,6 +93,7 @@ if(NOT NO_TEST)
new_test(test_rnsf)
new_test(test_rnsf_bands)
+ new_test(test_rnsf_wlens)
endif()
################################################################################
diff --git a/src/test_rnsf_wlens.c b/src/test_rnsf_wlens.c
@@ -0,0 +1,203 @@
+/* Copyright (C) 2022 GSMA - Université de Reims Champgne-Ardenne, CNRS
+ * Copyright (C) 2022 IPGP, Université Paris Cité, CNRS
+ * Copyright (C) 2022 LAPLACE - Université de Toulouse, CNRS, INPT, UPS
+ * Copyright (C) 2022 LATMOS/IPSL - UVSQ, Université Paris-Saclay,
+ * Sorbonne Université, CNRS
+ * Copyright (C) 2022 LESIA - Observatoire de Paris, Université PSL,
+ * Sorbonne Université, Université Paris Cité
+ * Copyright (C) 2022 LMD/IPSL - Sorbonne Université, Université PSL,
+ * Ecole Polytechnique, Institut Polytechnique de Paris,
+ * CNRS
+ * Copyright (C) 2022 |Meso|Star> (contact@meso-star.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "rnsf.h"
+
+#include <rsys/math.h>
+#include <rsys/mem_allocator.h>
+
+static void
+test_load(struct rnsf* rnsf)
+{
+ struct rnsf_phase_fn_discrete discrete = RNSF_PHASE_FN_DISCRETE_NULL;
+ struct rnsf_phase_fn_hg hg = RNSF_PHASE_FN_HG_NULL;
+ const struct rnsf_phase_fn* phase = NULL;
+ FILE* fp = NULL;
+
+ CHK(fp = tmpfile());
+ fprintf(fp, "# Comment\n");
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "\n");
+ fprintf(fp, "200.1 hg 0\n");
+ rewind(fp);
+
+ CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_OK);
+
+ CHK(rnsf_get_phase_fn_count(rnsf) == 1);
+ CHK(phase = rnsf_get_phase_fn(rnsf, 0));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 200.1);
+ CHK(hg.wavelengths[1] == 200.1);
+ CHK(hg.g == 0);
+ CHK(fclose(fp) == 0);
+
+ CHK(fp = tmpfile());
+ fprintf(fp, "wavelengths 10\n");
+ fprintf(fp, "\n");
+ fprintf(fp, "# Short waves\n");
+ fprintf(fp, "430 discrete 8\n");
+ fprintf(fp, " 0 0.02\n");
+ fprintf(fp, " 0.23 0.04\n");
+ fprintf(fp, " 0.5 0.07\n");
+ fprintf(fp, " 0.7 0.15\n");
+ fprintf(fp, " 1.54 1.23\n");
+ fprintf(fp, " 1.8 0.02\n");
+ fprintf(fp, " 2 1.23\n");
+ fprintf(fp, " PI 0.79\n");
+ fprintf(fp, "450 discrete 2\n");
+ fprintf(fp, " 0 0.5\n");
+ fprintf(fp, " PI 0.796\n");
+ fprintf(fp, "750 discrete 5\n");
+ fprintf(fp, " 0 %.9g\n", 1.0/(4.0*PI));
+ fprintf(fp, " %.9g %.9g\n", PI/4.0, 1.0/(4.0*PI));
+ fprintf(fp, " %.9g %.9g\n", PI/2.0, 1.0/(4.0*PI));
+ fprintf(fp, " %.9g %.9g\n", 3*PI/4.0, 1.0/(4.0*PI));
+ fprintf(fp, " PI %.9g\n", 1.0/(4.0*PI));
+ fprintf(fp, "\n");
+ fprintf(fp, "# Long waves\n");
+ fprintf(fp, "1100 hg -0.1\n");
+ fprintf(fp, "1300 hg 0.57\n");
+ fprintf(fp, "1400 hg 0.4\n");
+ fprintf(fp, "2100 hg 0.3\n");
+ fprintf(fp, "2500 hg -0.9\n");
+ fprintf(fp, "2900 hg -0.4\n");
+ fprintf(fp, "100000 hg 0.0\n");
+ rewind(fp);
+
+ CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_OK);
+ CHK(rnsf_get_phase_fn_count(rnsf) == 10);
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 0));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_DISCRETE);
+ CHK(rnsf_phase_fn_get_discrete(phase, &discrete) == RES_OK);
+ CHK(discrete.wavelengths[0] == 430);
+ CHK(discrete.wavelengths[1] == 430);
+ CHK(discrete.nitems == 8);
+ CHK(discrete.items[0].theta == 0);
+ CHK(discrete.items[1].theta == 0.23);
+ CHK(discrete.items[2].theta == 0.5);
+ CHK(discrete.items[3].theta == 0.7);
+ CHK(discrete.items[4].theta == 1.54);
+ CHK(discrete.items[5].theta == 1.8);
+ CHK(discrete.items[6].theta == 2);
+ CHK(eq_eps(discrete.items[7].theta, PI, 1.e-6));
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 1));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_DISCRETE);
+ CHK(rnsf_phase_fn_get_discrete(phase, &discrete) == RES_OK);
+ CHK(discrete.wavelengths[0] == 450);
+ CHK(discrete.wavelengths[1] == 450);
+ CHK(discrete.nitems == 2);
+ CHK(discrete.items[0].theta == 0);
+ CHK(eq_eps(discrete.items[1].theta, PI, 1.e-6));
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 2));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_DISCRETE);
+ CHK(rnsf_phase_fn_get_discrete(phase, &discrete) == RES_OK);
+ CHK(discrete.wavelengths[0] == 750);
+ CHK(discrete.wavelengths[1] == 750);
+ CHK(discrete.nitems == 5);
+ CHK(discrete.items[0].theta == 0);
+ CHK(eq_eps(discrete.items[1].theta, PI/4.0, 1.e-6));
+ CHK(eq_eps(discrete.items[2].theta, PI/2.0, 1.e-6));
+ CHK(eq_eps(discrete.items[3].theta, 3*PI/4.0, 1.e-6));
+ CHK(eq_eps(discrete.items[4].theta, PI, 1.e-6));
+ CHK(eq_eps(discrete.items[0].value, 1/(4.0*PI), 1.e-6));
+ CHK(eq_eps(discrete.items[1].value, 1/(4.0*PI), 1.e-6));
+ CHK(eq_eps(discrete.items[2].value, 1/(4.0*PI), 1.e-6));
+ CHK(eq_eps(discrete.items[3].value, 1/(4.0*PI), 1.e-6));
+ CHK(eq_eps(discrete.items[4].value, 1/(4.0*PI), 1.e-6));
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 3));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 1100);
+ CHK(hg.wavelengths[1] == 1100);
+ CHK(hg.g == -0.1);
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 4));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 1300);
+ CHK(hg.wavelengths[1] == 1300);
+ CHK(hg.g == 0.57);
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 5));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 1400);
+ CHK(hg.wavelengths[1] == 1400);
+ CHK(hg.g == 0.4);
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 6));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 2100);
+ CHK(hg.wavelengths[1] == 2100);
+ CHK(hg.g == 0.3);
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 7));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 2500);
+ CHK(hg.wavelengths[1] == 2500);
+ CHK(hg.g == -0.9);
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 8));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 2900);
+ CHK(hg.wavelengths[1] == 2900);
+ CHK(hg.g == -0.4);
+
+ CHK(phase = rnsf_get_phase_fn(rnsf, 9));
+ CHK(rnsf_phase_fn_get_type(phase) == RNSF_PHASE_FN_HG);
+ CHK(rnsf_phase_fn_get_hg(phase, &hg) == RES_OK);
+ CHK(hg.wavelengths[0] == 100000);
+ CHK(hg.wavelengths[1] == 100000);
+ CHK(hg.g == 0);
+
+ CHK(fclose(fp) == 0);
+}
+
+int
+main(int argc, char** argv)
+{
+ struct rnsf_create_args args = RNSF_CREATE_ARGS_DEFAULT;
+ struct rnsf* rnsf = NULL;
+ (void)argc, (void)argv;
+
+ args.verbose = 1;
+ CHK(rnsf_create(&args, &rnsf) == RES_OK);
+ CHK(rnsf_get_phase_fn_count(rnsf) == 0);
+
+ test_load(rnsf);
+
+ CHK(rnsf_ref_put(rnsf) == RES_OK);
+ CHK(mem_allocated_size() == 0);
+ return 0;
+}