commit c15774ccdb473d30b51fdfdfa5ae12706c352286
parent cef3a9f18d00951cf86c132b8ab03535923d996f
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 21 Jun 2022 16:15:47 +0200
Add and implemente several accessors
Diffstat:
4 files changed, 110 insertions(+), 16 deletions(-)
diff --git a/src/rnsf.c b/src/rnsf.c
@@ -121,7 +121,7 @@ static res_T
parse_discrete_item
(struct rnsf* rnsf,
struct txtrdr* txtrdr,
- struct discrete_item* item)
+ struct rnsf_discrete_item* item)
{
char* tk = NULL;
char* tk_ctx = NULL;
@@ -235,7 +235,7 @@ parse_phase_fn_discrete
}
FOR_EACH(i, 0, nangles) {
- struct discrete_item* item = NULL;
+ struct rnsf_discrete_item* item = NULL;
item = darray_discrete_item_data_get(&phase->items) + i;
res = parse_discrete_item(rnsf, txtrdr, item);
@@ -454,7 +454,7 @@ error:
}
static res_T
-parse_band_brdf
+parse_band_phase
(struct rnsf* rnsf,
struct txtrdr* txtrdr,
struct rnsf_phase_fn* phase)
@@ -478,7 +478,7 @@ parse_band_brdf
(phase - darray_phase_fn_cdata_get(&rnsf->phases));
log_err(rnsf,
"%s:%lu: missing phase function. "
- "Expecting %lu functions%swhile %lu %s parsed.\n",
+ "Expecting %lu function%swhile %lu %s parsed.\n",
txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr),
(unsigned long)nexpect, nexpect == 1 ? " " : "s ",
(unsigned long)nparsed, nparsed > 1 ? "were" : "was");
@@ -578,15 +578,15 @@ parse_per_band_phase_fn
phase = darray_phase_fn_data_get(&rnsf->phases) + i;
- res = parse_band_brdf(rnsf, txtrdr, phase);
+ res = parse_band_phase(rnsf, txtrdr, phase);
if(res != RES_OK) goto error;
if(i > 0) {
if(phase[0].wlen[0] < phase[-1].wlen[1]
- || phase[0].wlen[0] == phase[-1].wlen[1]) {
+ || phase[0].wlen[0] == phase[-1].wlen[0]) {
log_err(rnsf,
"%s:%lu: the phase function must be sorted in ascending order of "
- "wavelength.\n",
+ "wavelength and must not overlap.\n",
txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr));
res = RES_BAD_ARG;
goto error;
@@ -783,3 +783,51 @@ exit:
error:
goto exit;
}
+
+size_t
+rnsf_get_phase_fn_count(const struct rnsf* rnsf)
+{
+ ASSERT(rnsf);
+ return darray_phase_fn_size_get(&rnsf->phases);
+}
+
+const struct rnsf_phase_fn*
+rnsf_get_phase_fn(const struct rnsf* rnsf, const size_t iphase_fn)
+{
+ ASSERT(rnsf && iphase_fn < rnsf_get_phase_fn_count(rnsf));
+ return darray_phase_fn_cdata_get(&rnsf->phases) + iphase_fn;
+}
+
+enum rnsf_phase_fn_type
+rnsf_phase_fn_get_type(const struct rnsf_phase_fn* phase)
+{
+ ASSERT(phase);
+ return phase->type;
+}
+
+res_T
+rnsf_phase_fn_get_hg
+ (const struct rnsf_phase_fn* phase,
+ struct rnsf_phase_fn_hg* hg)
+{
+ if(!phase || !hg) return RES_BAD_ARG;
+ if(phase->type != RNSF_PHASE_FN_HG) return RES_BAD_ARG;
+ hg->wavelengths[0] = phase->wlen[0];
+ hg->wavelengths[1] = phase->wlen[1];
+ hg->g = phase->param.hg.g;
+ return RES_OK;
+}
+
+res_T
+rnsf_phase_fn_get_discrete
+ (const struct rnsf_phase_fn* phase,
+ struct rnsf_phase_fn_discrete* discrete)
+{
+ if(!phase || !discrete) return RES_BAD_ARG;
+ if(phase->type != RNSF_PHASE_FN_DISCRETE) return RES_BAD_ARG;
+ discrete->wavelengths[0] = phase->wlen[0];
+ discrete->wavelengths[1] = phase->wlen[1];
+ discrete->items = darray_discrete_item_cdata_get(&phase->param.discrete.items);
+ discrete->nitems = darray_discrete_item_size_get(&phase->param.discrete.items);
+ return RES_OK;
+}
diff --git a/src/rnsf.h b/src/rnsf.h
@@ -65,8 +65,36 @@ struct rnsf_create_args {
static const struct rnsf_create_args RNSF_CREATE_ARGS_DEFAULT =
RNSF_CREATE_ARGS_DEFAULT__;
+/* Henyey & Greestein phase function */
+struct rnsf_phase_fn_hg {
+ double wavelengths[2]; /* Inclusive wavelength range in nanometers */
+ double g; /* Asymmetric parameter in [-1, 1] */
+};
+#define RNSF_PHASE_FN_HG_NULL__ {{0,0}, 0}
+static const struct rnsf_phase_fn_hg RNSF_PHASE_FN_HG_NULL =
+ RNSF_PHASE_FN_HG_NULL__;
+
+struct rnsf_discrete_item {
+ double theta; /* In radian */
+ double value;
+};
+#define RNSF_DISCRETE_ITEM_NULL__ {0,0}
+static const struct rnsf_discrete_item RNSF_DISCRETE_ITEM_NULL =
+ RNSF_DISCRETE_ITEM_NULL__;
+
+/* Discrete phase function */
+struct rnsf_phase_fn_discrete {
+ double wavelengths[2]; /* Inclusive wavelength range in nanometers */
+ size_t nitems;
+ const struct rnsf_discrete_item* items;
+};
+#define RNSF_PHASE_FN_DISCRETE_NULL__ {{0,0}, 0, NULL}
+static const struct rnsf_phase_fn_discrete RNSF_PHASE_FN_DISCRETE_NULL =
+ RNSF_PHASE_FN_DISCRETE_NULL__;
+
/* Opaque data types */
struct rnsf;
+struct rnsf_phase_fn;
BEGIN_DECLS
@@ -97,6 +125,29 @@ rnsf_load_stream
FILE* stream,
const char* stream_name); /* May be NULL */
+RNSF_API size_t
+rnsf_get_phase_fn_count
+ (const struct rnsf* rnsf);
+
+RNSF_API const struct rnsf_phase_fn*
+rnsf_get_phase_fn
+ (const struct rnsf* rnsf,
+ const size_t iphase_fn);
+
+RNSF_API enum rnsf_phase_fn_type
+rnsf_phase_fn_get_type
+ (const struct rnsf_phase_fn* phase_fn);
+
+RNSF_API res_T
+rnsf_phase_fn_get_hg
+ (const struct rnsf_phase_fn* phase_fn,
+ struct rnsf_phase_fn_hg* hg);
+
+RNSF_API res_T
+rnsf_phase_fn_get_discrete
+ (const struct rnsf_phase_fn* phase_fn,
+ struct rnsf_phase_fn_discrete* discrete);
+
END_DECLS
#endif /* RNSF_H */
diff --git a/src/rnsf_log.h b/src/rnsf_log.h
@@ -28,9 +28,9 @@
#include <rsys/rsys.h>
-#define MSG_INFO_PREFIX "Rad-Net Scatt Func:\x1b[1m\x1b[32minfo\x1b[0m: "
-#define MSG_ERROR_PREFIX "Rad-Net Scatt Func:\x1b[1m\x1b[31merror\x1b[0m: "
-#define MSG_WARNING_PREFIX "Rad-Net Scat Func:\x1b[1m\x1b[33mwarning\x1b[0m: "
+#define MSG_INFO_PREFIX "RNSF:\x1b[1m\x1b[32minfo\x1b[0m: "
+#define MSG_ERROR_PREFIX "RNSF:\x1b[1m\x1b[31merror\x1b[0m: "
+#define MSG_WARNING_PREFIX "RNSF:\x1b[1m\x1b[33mwarning\x1b[0m: "
struct rnsf;
struct logger;
diff --git a/src/rnsf_phase_fn.h b/src/rnsf_phase_fn.h
@@ -33,14 +33,9 @@ struct phase_fn_hg {
double g; /* Asymmetric parameter in [-1, 1] */
};
-struct discrete_item {
- double theta; /* In radian */
- double value;
-};
-
/* Generate the dynamic array of discrete items */
#define DARRAY_NAME discrete_item
-#define DARRAY_DATA struct discrete_item
+#define DARRAY_DATA struct rnsf_discrete_item
#include <rsys/dynamic_array.h>
struct phase_fn_discrete {