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