rnsf

Define and load a phase function data format
git clone git://git.meso-star.fr/rnsf.git
Log | Files | Refs | README | LICENSE

commit 465076211109f09834cadb69dff03a8e525ed397
parent bebc45e8175e3498c840d877b57abdb2f3d6b9e6
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 22 Jun 2022 12:11:05 +0200

Update the file format

Replace the PI literal by the value of the constant.

Diffstat:
Mdoc/rnsf.5.scd | 38+++++++++++++++++++-------------------
Msrc/rnsf.c | 41+++++++++++++++++++++++------------------
Msrc/test_rnsf_bands.c | 10+++++-----
Msrc/test_rnsf_wlens.c | 24++++++++++++------------
4 files changed, 59 insertions(+), 54 deletions(-)

diff --git a/doc/rnsf.5.scd b/doc/rnsf.5.scd @@ -78,7 +78,7 @@ only of spaces and tabs. <phase-func-discrete> ::= discrete <angles-count> 0 <value> [ <per-angle-value> ... ] # In ascending order wrt the angle - PI <value> + 3.14159 <value> <per-angle-value> ::= <theta> <value> <theta> ::= REAL # In radian <value> ::= REAL # Not necessarily normalized @@ -99,10 +99,10 @@ bands 2 # Inrared 1000 100000 discrete 4 - 0 0.079577 - 0.78 0.079577 - 2.35 0.079577 - PI 0.079577 + 0 0.079577 + 0.78 0.079577 + 2.35 0.079577 + 3.14159 0.079577 ``` Setup a phase function for a set of 10 wavelengths. Use a discrete phase @@ -113,22 +113,22 @@ wavelengths 10 # Short waves 430 discrete 8 - 0 0.02 - 0.23 0.04 - 0.5 0.07 - 0.7 0.15 - 1.54 1.23 - 1.8 0.02 - 2 1.23 - PI 0.79 + 0 0.02 + 0.23 0.04 + 0.5 0.07 + 0.7 0.15 + 1.54 1.23 + 1.8 0.02 + 2 1.23 + 3.14159 0.79 450 discrete 2 - 0 0.5 - PI 0.796 + 0 0.5 + 3.14159 0.796 750 discrete 4 - 0 0.079577 - 0.78 0.079577 - 2.35 0.079577 - PI 0.079577 + 0 0.079577 + 0.78 0.079577 + 2.35 0.079577 + 3.14159 0.079577 # Long waves 1100 hg -0.1 diff --git a/src/rnsf.c b/src/rnsf.c @@ -25,6 +25,8 @@ #define _POSIX_C_SOURCE 200112L /* strtok_r */ +#define PI_EPSILON 1.0e-4 + #include "rnsf.h" #include "rnsf_c.h" #include "rnsf_log.h" @@ -146,16 +148,16 @@ parse_discrete_item tk = strtok_r(txtrdr_get_line(txtrdr), " \t", &tk_ctx); ASSERT(tk); - if(!strcmp(tk, "PI")) { - item->theta = PI; - } else { - res = cstr_to_double(tk, &item->theta); - if(res == RES_OK && (item->theta < 0 || item->theta > PI)) res = RES_BAD_ARG; - if(res != RES_OK) { - log_err(rnsf, "%s:%lu: invalid phase function angle `%s'.\n", - txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), tk); - goto error; - } + res = cstr_to_double(tk, &item->theta); + if(res == RES_OK + && ( item->theta < 0 + || (!eq_eps(item->theta, PI, PI_EPSILON) && item->theta > PI))) { + res = RES_BAD_ARG; + } + if(res != RES_OK) { + log_err(rnsf, "%s:%lu: invalid phase function angle `%s'.\n", + txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), tk); + goto error; } tk = strtok_r(NULL, " \t", &tk_ctx); @@ -250,14 +252,17 @@ parse_phase_fn_discrete goto error; } - if(i == nangles - 1 && item->theta != PI) { - log_err(rnsf, - "%s:%lu: invalid angle value `%g'. The last angle must be the " - "litteral PI.\n", - txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), - item->theta); - res = RES_BAD_ARG; - goto error; + if(i == nangles - 1) { + if(eq_eps(item->theta, PI, PI_EPSILON)) { + item->theta = PI; + } else { + log_err(rnsf, + "%s:%lu: invalid angle value `%g'. The last angle must be 3.14159.\n", + txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), + item->theta); + res = RES_BAD_ARG; + goto error; + } } if(i > 0 && item[0].theta <= item[-1].theta) { diff --git a/src/test_rnsf_bands.c b/src/test_rnsf_bands.c @@ -93,7 +93,7 @@ test_load2(struct rnsf* rnsf) fprintf(fp, " %.9g 0.3\n", PI/4.0); fprintf(fp, " %.9g 0.3\n", PI/2.0); fprintf(fp, " %.9g 0.3\n", 3*PI/4.0); - fprintf(fp, " PI 0.3\n"); + fprintf(fp, " 3.14159 0.3\n"); fprintf(fp, "900 900 hg -0.1\n"); rewind(fp); CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_OK); @@ -194,7 +194,7 @@ test_fetch(struct rnsf* rnsf) fprintf(fp, " 0 1\n"); fprintf(fp, " 0.5 1\n"); fprintf(fp, " 1.57 1\n"); - fprintf(fp, " PI 1\n"); + fprintf(fp, " 3.14159 1\n"); rewind(fp); CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_OK); CHK(fclose(fp) == 0); @@ -344,7 +344,7 @@ test_load_fail(struct rnsf* rnsf) fprintf(fp, "bands 1\n"); fprintf(fp, "380 780 discrete 3\n"); fprintf(fp, " 0 1\n"); - fprintf(fp, " PI 1\n"); + fprintf(fp, " 3.14159 1\n"); fprintf(fp, " 4 1\n"); rewind(fp); CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_BAD_ARG); @@ -358,7 +358,7 @@ test_load_fail(struct rnsf* rnsf) fprintf(fp, " 0.1 1\n"); fprintf(fp, " 0.2 1\n"); fprintf(fp, " 0.15 1\n"); - fprintf(fp, " PI 1\n"); + fprintf(fp, " 3.14159 1\n"); rewind(fp); CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_BAD_ARG); CHK(fclose(fp) == 0); @@ -370,7 +370,7 @@ test_load_fail(struct rnsf* rnsf) fprintf(fp, " 0 1\n"); fprintf(fp, " 0.1 1\n"); fprintf(fp, " 0.15 1 additional_text\n"); - fprintf(fp, " PI 1\n"); + fprintf(fp, " 3.1416 1\n"); rewind(fp); CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_OK); CHK(fclose(fp) == 0); diff --git a/src/test_rnsf_wlens.c b/src/test_rnsf_wlens.c @@ -67,23 +67,23 @@ test_load(struct rnsf* rnsf) 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, " 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, " 3.14159 0.79\n"); fprintf(fp, "450 discrete 2\n"); - fprintf(fp, " 0 0.5\n"); - fprintf(fp, " PI 0.796\n"); + fprintf(fp, " 0 0.5\n"); + fprintf(fp, " 3.14159 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, " %g %.9g\n", PI, 1.0/(4.0*PI)); fprintf(fp, "\n"); fprintf(fp, "# Long waves\n"); fprintf(fp, "1100 hg -0.1\n"); @@ -237,7 +237,7 @@ test_fetch(struct rnsf* rnsf) fprintf(fp, " 0 1\n"); fprintf(fp, " 0.5 1\n"); fprintf(fp, " 1.57 1\n"); - fprintf(fp, " PI 1\n"); + fprintf(fp, " 3.1416 1\n"); rewind(fp); CHK(rnsf_load_stream(rnsf, fp, NULL) == RES_OK); CHK(fclose(fp) == 0);