rnsf

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

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:
Msrc/rnsf.c | 62+++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Msrc/rnsf.h | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/rnsf_log.h | 6+++---
Msrc/rnsf_phase_fn.h | 7+------
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 {