rnatm

Load and structure data describing an atmosphere
git clone git://git.meso-star.fr/rnatm.git
Log | Files | Refs | README | LICENSE

commit 668c253f552fed1165dd95ee51ddcf1ecb55839c
parent c329a88d5ad9d982d50de47a914fea2423e3fe65
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Sat,  1 Oct 2022 13:23:58 +0200

Discrete phase function support

Diffstat:
Msrc/rnatm_properties.c | 51+++++++++++++++++++++++++++++++++------------------
1 file changed, 33 insertions(+), 18 deletions(-)

diff --git a/src/rnatm_properties.c b/src/rnatm_properties.c @@ -310,47 +310,62 @@ static INLINE res_T create_phase_fn_hg (struct rnatm* atm, const struct rnsf_phase_fn_hg* hg, - struct ssf_phase** phase_fn) + struct ssf_phase** out_ssf_phase) { + struct ssf_phase* ssf_phase = NULL; res_T res = RES_OK; - ASSERT(atm && hg && phase_fn); + ASSERT(atm && hg && out_ssf_phase); - res = ssf_phase_create(atm->allocator, &ssf_phase_hg, phase_fn); + res = ssf_phase_create(atm->allocator, &ssf_phase_hg, &ssf_phase); if(res != RES_OK) goto error; - res = ssf_phase_hg_setup(*phase_fn, hg->g); + res = ssf_phase_hg_setup(ssf_phase, hg->g); if(res != RES_OK) goto error; exit: + *out_ssf_phase = ssf_phase; return res; error: - if(*phase_fn) { SSF(phase_ref_put(*phase_fn)); *phase_fn = NULL; } + if(ssf_phase) { SSF(phase_ref_put(ssf_phase)); ssf_phase = NULL; } goto exit; } +static void +phase_fn_discrete_get_item + (const size_t iitem, + struct ssf_discrete_item* item, + void* context) +{ + const struct rnsf_phase_fn_discrete* discrete = context; + ASSERT(item && context && iitem < discrete->nitems); + item->theta = discrete->items[iitem].theta; + item->value = discrete->items[iitem].value; +} + static INLINE res_T create_phase_fn_discrete (struct rnatm* atm, - const struct rnsf_phase_fn_discrete* discrete, - struct ssf_phase** phase_fn) + struct rnsf_phase_fn_discrete* discrete, + struct ssf_phase** out_ssf_phase) { - struct mem_allocator* allocator = NULL; + struct ssf_discrete_setup_args args = SSF_DISCRETE_SETUP_ARGS_NULL; + struct ssf_phase* ssf_phase = NULL; res_T res = RES_OK; - ASSERT(atm && discrete && phase_fn); + ASSERT(atm && discrete && out_ssf_phase); - /* TODO speed up allocation by using a [per thread] fifo allocator */ - allocator = atm->allocator; + res = ssf_phase_create(atm->allocator, &ssf_phase_discrete, &ssf_phase); + if(res != RES_OK) goto error; - VFATAL("%s: function not implemented\n", ARG1(FUNC_NAME)); - (void)allocator; - (void)atm; - (void)discrete; - (void)phase_fn; - goto error; + args.get_item = phase_fn_discrete_get_item; + args.context = discrete; + args.nitems = discrete->nitems; + res = ssf_phase_discrete_setup(ssf_phase, &args); + if(res != RES_OK) goto error; exit: + *out_ssf_phase = ssf_phase; return res; error: - if(*phase_fn) { SSF(phase_ref_put(*phase_fn)); *phase_fn = NULL; } + if(ssf_phase) { SSF(phase_ref_put(ssf_phase)); ssf_phase = NULL; } goto exit; }