stardis-solver

Solve coupled heat transfers
git clone git://git.meso-star.fr/stardis-solver.git
Log | Files | Refs | README | LICENSE

commit 67d8279567a65f9b094b7d5b21eb61a163e73d56
parent c1c37ce6c0a61cf25c71c6ddd978ce201d618504
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 12 Jan 2022 15:12:06 +0100

Deep refactoring of how medium properties are fetched

Rename the delta_solid property of a solid in delta

Diffstat:
Msrc/sdis.h | 2+-
Msrc/sdis_heat_path_boundary_Xd_c.h | 2+-
Msrc/sdis_heat_path_conductive_Xd.h | 136++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/sdis_heat_path_convective_Xd.h | 78+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Msrc/sdis_medium.c | 2+-
Msrc/sdis_medium_c.h | 252++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Msrc/sdis_misc.h | 8++++----
Msrc/sdis_misc_Xd.h | 22++++++++++------------
Msrc/test_sdis_compute_power.c | 2+-
Msrc/test_sdis_conducto_radiative.c | 4++--
Msrc/test_sdis_conducto_radiative_2d.c | 4++--
Msrc/test_sdis_contact_resistance.c | 2+-
Msrc/test_sdis_contact_resistance_2.c | 2+-
Msrc/test_sdis_flux.c | 2+-
Msrc/test_sdis_medium.c | 6+++---
Msrc/test_sdis_picard.c | 2+-
Msrc/test_sdis_solid_random_walk_robustness.c | 2+-
Msrc/test_sdis_solve_boundary.c | 2+-
Msrc/test_sdis_solve_boundary_flux.c | 2+-
Msrc/test_sdis_solve_camera.c | 2+-
Msrc/test_sdis_solve_medium.c | 2+-
Msrc/test_sdis_solve_medium_2d.c | 2+-
Msrc/test_sdis_solve_probe.c | 2+-
Msrc/test_sdis_solve_probe2.c | 2+-
Msrc/test_sdis_solve_probe2_2d.c | 2+-
Msrc/test_sdis_solve_probe3.c | 2+-
Msrc/test_sdis_solve_probe3_2d.c | 2+-
Msrc/test_sdis_solve_probe_2d.c | 2+-
Msrc/test_sdis_transcient.c | 2+-
Msrc/test_sdis_unstationary_atm.c | 2+-
Msrc/test_sdis_volumic_power.c | 2+-
Msrc/test_sdis_volumic_power2.c | 2+-
Msrc/test_sdis_volumic_power2_2d.c | 2+-
Msrc/test_sdis_volumic_power3_2d.c | 2+-
Msrc/test_sdis_volumic_power4.c | 2+-
35 files changed, 398 insertions(+), 166 deletions(-)

diff --git a/src/sdis.h b/src/sdis.h @@ -184,7 +184,7 @@ struct sdis_solid_shader { sdis_medium_getter_T calorific_capacity; /* In J.K^-1.kg^-1 */ sdis_medium_getter_T thermal_conductivity; /* In W.m^-1.K^-1 */ sdis_medium_getter_T volumic_mass; /* In kg.m^-3 */ - sdis_medium_getter_T delta_solid; + sdis_medium_getter_T delta; /* May be NULL if there is no volumic power. One can also return * SDIS_VOLUMIC_POWER_NONE to define that there is no volumic power at the diff --git a/src/sdis_heat_path_boundary_Xd_c.h b/src/sdis_heat_path_boundary_Xd_c.h @@ -818,7 +818,7 @@ XD(solid_reinjection) if(res != RES_OK) goto error; /* Time rewind */ - res = XD(time_rewind) + res = XD(solid_time_rewind) (solid, args->rng, reinject_dst_m, args->rwalk_ctx, args->rwalk, args->T); if(res != RES_OK) goto error; diff --git a/src/sdis_heat_path_conductive_Xd.h b/src/sdis_heat_path_conductive_Xd.h @@ -25,6 +25,63 @@ #include "sdis_Xd_begin.h" /******************************************************************************* + * Non generic helper function + ******************************************************************************/ +#ifndef SDIS_HEAT_PATH_CONDUCTIVE_XD_H +#define SDIS_HEAT_PATH_CONDUCTIVE_XD_H + +static res_T +check_solid_constant_properties + (struct sdis_device* dev, + const int evaluate_green, + const struct solid_props* props_ref, + const struct solid_props* props) +{ + res_T res = RES_OK; + ASSERT(dev && props_ref && props); + + if(props_ref->lambda != props->lambda) { + log_err(dev, + "%s: invalid thermal conductivity. One assumes a constant conductivity " + "for the whole solid.\n", FUNC_NAME); + res = RES_BAD_ARG; + goto error; + } + + if(props_ref->rho != props->rho) { + log_err(dev, + "%s: invalid volumic mass. One assumes a constant volumic mass for " + "the whole solid.\n", FUNC_NAME); + res = RES_BAD_ARG; + goto error; + } + + if(props_ref->cp != props->cp) { + log_err(dev, + "%s: invalid calorific capacity. One assumes a constant calorific " + "capacity for the whole solid.\n", FUNC_NAME); + res = RES_BAD_ARG; + goto error; + } + + if(evaluate_green && props_ref->power != props->power) { + log_err(dev, + "%s: invalid volumic power. When estimating the green function, a " + "constant volumic power is assumed for the whole solid.\n", + FUNC_NAME); + res = RES_BAD_ARG; + goto error; + } + +exit: + return res; +error: + goto exit; +} + +#endif /* SDIS_HEAT_PATH_CONDUCTIVE_XD_H */ + +/******************************************************************************* * Helper functions ******************************************************************************/ /* Sample the next direction to walk toward and compute the distance to travel. @@ -340,9 +397,8 @@ XD(conductive_path) struct XD(temperature)* T) { double position_start[DIM]; + struct solid_props props_ref = SOLID_PROPS_NULL; double green_power_term = 0; - double power_ref = SDIS_VOLUMIC_POWER_NONE; - double lambda_ref = -1; struct sdis_medium* mdm; size_t istep = 0; /* Help for debug */ res_T res = RES_OK; @@ -361,33 +417,39 @@ XD(conductive_path) /* Save the submitted position */ dX(set)(position_start, rwalk->vtx.P); - /* Fetch the lambda at the current position. Use it to check that the lambda - * remains constant */ - lambda_ref = solid_get_thermal_conductivity(mdm, &rwalk->vtx); - - if(ctx->green_path) { - /* Retrieve the power of the medium. Use it to check that it is effectively - * constant along the random walk */ - power_ref = solid_get_volumic_power(mdm, &rwalk->vtx); - } + /* Retrieve the solid properties at the current position. Use them to verify + * that those that are supposed to be constant by the conductive random walk + * remain the same. Note that we take care of the same constraints on the + * solid reinjection since once reinjected, the position of the random walk + * is that at the beginning of the conductive random walkh. Thus, after a + * reinjection, the next line retrieves the properties of the reinjection + * position. By comparing them to the properties along the random walk, we + * thus verify that the properties are constant throughout the random walk + * with respect to the properties of the reinjected position. */ + solid_get_properties(mdm, &rwalk->vtx, &props_ref); do { /* Solid random walk */ struct XD(handle_volumic_power_args) handle_volpow_args = XD(HANDLE_VOLUMIC_POWER_ARGS_NULL); struct sXd(hit) hit0, hit1; - double lambda; /* Thermal conductivity */ - double tmp; + struct solid_props props = SOLID_PROPS_NULL; double power_term = 0; - double power; - float delta, delta_solid; /* Random walk numerical parameter */ + float delta; /* Random walk numerical parameter */ float dir0[DIM], dir1[DIM]; float org[DIM]; + /* Fetch solid properties */ + res = solid_get_properties(mdm, &rwalk->vtx, &props); + if(res != RES_OK) goto error; + + res = check_solid_constant_properties + (scn->dev, ctx->green_path != NULL, &props_ref, &props); + if(res != RES_OK) goto error; + /* Check the limit condition * REVIEW Rfo: This can be a bug if the random walk comes from a boundary */ - tmp = solid_get_temperature(mdm, &rwalk->vtx); - if(tmp >= 0) { - T->value += tmp; + if(props.temperature >= 0) { + T->value += props.temperature; T->done = 1; if(ctx->green_path) { @@ -403,32 +465,11 @@ XD(conductive_path) break; } - /* Fetch solid properties */ - delta_solid = (float)solid_get_delta(mdm, &rwalk->vtx); - lambda = solid_get_thermal_conductivity(mdm, &rwalk->vtx); - power = solid_get_volumic_power(mdm, &rwalk->vtx); - - if(lambda != lambda_ref) { - log_err(scn->dev, - "%s: invalid thermal conductivity. One assumes a constant conductivity " - "for the whole solid.\n", FUNC_NAME); - res = RES_BAD_ARG; - goto error; - } - - if(ctx->green_path && power != power_ref) { - log_err(scn->dev, - "%s: invalid volumic power. When estimating the green function, a " - "constant volumic power is assumed for the whole solid.\n", FUNC_NAME); - res = RES_BAD_ARG; - goto error; - } - fX_set_dX(org, rwalk->vtx.P); /* Sample the direction to walk toward and compute the distance to travel */ - res = XD(sample_next_step_robust)(scn, mdm, rng, rwalk->vtx.P, delta_solid, - dir0, dir1, &hit0, &hit1, &delta); + res = XD(sample_next_step_robust)(scn, mdm, rng, rwalk->vtx.P, + (float)props.delta, dir0, dir1, &hit0, &hit1, &delta); if(res != RES_OK) goto error; /* Add the volumic power density to the measured temperature */ @@ -436,9 +477,9 @@ XD(conductive_path) handle_volpow_args.dir1 = dir1; handle_volpow_args.hit0 = &hit0; handle_volpow_args.hit1 = &hit1; - handle_volpow_args.power = power; - handle_volpow_args.lambda = lambda; - handle_volpow_args.delta_solid = delta_solid; + handle_volpow_args.power = props.power; + handle_volpow_args.lambda = props.lambda; + handle_volpow_args.delta_solid = (float)props.delta; handle_volpow_args.delta = delta; handle_volpow_args.picard_order = get_picard_order(ctx); res = XD(handle_volumic_power)(scn, &handle_volpow_args, &power_term, T); @@ -446,12 +487,13 @@ XD(conductive_path) /* Register the power term for the green function. Delay its registration * until the end of the conductive path, i.e. the path is valid */ - if(ctx->green_path && power != SDIS_VOLUMIC_POWER_NONE) { + if(ctx->green_path && props.power != SDIS_VOLUMIC_POWER_NONE) { green_power_term += power_term; } /* Rewind the time */ - res = XD(time_rewind)(rwalk->mdm, rng, delta * scn->fp_to_meter, ctx, rwalk, T); + res = XD(solid_time_rewind) + (rwalk->mdm, rng, delta * scn->fp_to_meter, ctx, rwalk, T); if(res != RES_OK) goto error; if(T->done) break; /* Limit condition was reached */ @@ -478,7 +520,7 @@ XD(conductive_path) } while(SXD_HIT_NONE(&rwalk->hit)); /* Register the power term for the green function */ - if(ctx->green_path && power_ref != SDIS_VOLUMIC_POWER_NONE) { + if(ctx->green_path && props_ref.power != SDIS_VOLUMIC_POWER_NONE) { res = green_path_add_power_term (ctx->green_path, rwalk->mdm, &rwalk->vtx, green_power_term); if(res != RES_OK) goto error; diff --git a/src/sdis_heat_path_convective_Xd.h b/src/sdis_heat_path_convective_Xd.h @@ -24,6 +24,45 @@ #include "sdis_Xd_begin.h" /******************************************************************************* + * Non generic helper functions + ******************************************************************************/ +#ifndef SDIS_HEAT_PATH_CONVECTIVE_XD_H +#define SDIS_HEAT_PATH_CONVECTIVE_XD_H + +static res_T +check_fluid_constant_properties + (struct sdis_device* dev, + const struct fluid_props* props_ref, + const struct fluid_props* props) +{ + res_T res = RES_OK; + ASSERT(dev && props_ref && props); + + if(props_ref->rho != props->rho) { + log_err(dev, + "%s: invalid volumic mass. One assumes a constant volumic mass for " + "the whole fluid.\n", FUNC_NAME); + res = RES_BAD_ARG; + goto error; + } + + if(props_ref->cp != props->cp) { + log_err(dev, + "%s: invalid calorific capacity. One assumes a constant calorific " + "capacity for the whole fluid.\n", FUNC_NAME); + res = RES_BAD_ARG; + goto error; + } + +exit: + return res; +error: + goto exit; +} + +#endif /* SDIS_HEAT_PATH_CONVECTIVE_XD_H */ + +/******************************************************************************* * Helper functions ******************************************************************************/ static res_T @@ -76,13 +115,12 @@ XD(convective_path) struct XD(temperature)* T) { struct sXd(attrib) attr_P, attr_N; + struct fluid_props props_ref = FLUID_PROPS_NULL; const struct sdis_interface* interf; const struct enclosure* enc; unsigned enc_ids[2]; unsigned enc_id; - double rho; /* Volumic mass */ - double hc; /* Convection coef */ - double cp; /* Calorific capacity */ + double tmp; double r; int path_started_in_fluid; @@ -113,6 +151,12 @@ XD(convective_path) goto exit; } + /* Retrieve the fluid properties at the current position. Use them to verify + * that those that are supposed to be constant by the convective random walk + * remain the same. */ + res = fluid_get_properties(rwalk->mdm, &rwalk->vtx, &props_ref); + if(res != RES_OK) goto error; + path_started_in_fluid = SXD_HIT_NONE(&rwalk->hit); if(path_started_in_fluid) { /* The path begins in the fluid */ const float range[2] = {FLT_MIN, FLT_MAX}; @@ -171,7 +215,7 @@ XD(convective_path) /* Cannot be in the fluid without starting there. */ ASSERT(path_started_in_fluid); - rwalk->vtx.time = fluid_get_t0(rwalk->mdm); + rwalk->vtx.time = props_ref.t0; tmp = fluid_get_temperature(rwalk->mdm, &rwalk->vtx); if(tmp >= 0) { T->value += tmp; @@ -192,29 +236,33 @@ XD(convective_path) for(;;) { struct sdis_interface_fragment frag; struct sXd(primitive) prim; - double mu, tau, t0; + struct fluid_props props = FLUID_PROPS_NULL; + double hc; + double mu, tau; - /* Fetch other physical properties. */ - cp = fluid_get_calorific_capacity(rwalk->mdm, &rwalk->vtx); - rho = fluid_get_volumic_mass(rwalk->mdm, &rwalk->vtx); - t0 = fluid_get_t0(rwalk->mdm); /* Limit time */ + /* Fetch fluid properties */ + res = fluid_get_properties(rwalk->mdm, &rwalk->vtx, &props); + if(res != RES_OK) goto error; + + res = check_fluid_constant_properties(scn->dev, &props_ref, &props); + if(res != RES_OK) goto error; /* Sample the time using the upper bound. */ - mu = enc->hc_upper_bound / (rho * cp) * enc->S_over_V; + mu = enc->hc_upper_bound / (props.rho * props.cp) * enc->S_over_V; tau = ssp_ran_exp(rng, mu); /* Increment the elapsed time */ - ASSERT(rwalk->vtx.time > t0); - rwalk->elapsed_time += MMIN(tau, rwalk->vtx.time - t0); + ASSERT(rwalk->vtx.time > props.t0); + rwalk->elapsed_time += MMIN(tau, rwalk->vtx.time - props.t0); if(rwalk->vtx.time != INF) { - rwalk->vtx.time = MMAX(rwalk->vtx.time - tau, t0); /* Time rewind */ + rwalk->vtx.time = MMAX(rwalk->vtx.time - tau, props.t0); /* Time rewind */ /* Register the new vertex against the heat path */ res = XD(register_heat_vertex_in_fluid)(scn, ctx, rwalk, T->value); if(res != RES_OK) goto error; - if(rwalk->vtx.time == t0) { + if(rwalk->vtx.time == props.t0) { /* Check the initial condition. */ tmp = fluid_get_temperature(rwalk->mdm, &rwalk->vtx); if(tmp >= 0) { @@ -239,7 +287,7 @@ XD(convective_path) log_err(scn->dev, "%s: undefined initial condition. " "Time is %g but the temperature remains unknown.\n", - FUNC_NAME, t0); + FUNC_NAME, props.t0); res = RES_BAD_OP; goto error; } diff --git a/src/sdis_medium.c b/src/sdis_medium.c @@ -40,7 +40,7 @@ check_solid_shader(const struct sdis_solid_shader* shader) return shader->calorific_capacity && shader->thermal_conductivity && shader->volumic_mass - && shader->delta_solid + && shader->delta && shader->temperature && 0 <= shader->t0 && shader->t0 < INF; } diff --git a/src/sdis_medium_c.h b/src/sdis_medium_c.h @@ -17,6 +17,7 @@ #define SDIS_MEDIUM_C_H #include "sdis.h" +#include "sdis_log.h" #include <rsys/free_list.h> #include <rsys/math.h> @@ -36,6 +37,73 @@ struct sdis_medium { struct sdis_device* dev; }; +struct fluid_props { + double rho; /* Volumic mass */ + double cp; /* Calorific capacity */ + double temperature; + double t0; /* Initial time */ +}; +#define FLUID_PROPS_NULL__ {0,0,0,0} +static const struct fluid_props FLUID_PROPS_NULL = FLUID_PROPS_NULL__; + +struct solid_props { + double lambda; /* Conductivity */ + double rho; /* Volumic mass */ + double cp; /* Calorific capacity */ + double delta; /* Random walk step */ + double power; /* Volumic power */ + double temperature; + double t0; /* Initial time */ +}; +#define SOLID_PROPS_NULL__ {0,0,0,0,0,0,0} +static const struct solid_props SOLID_PROPS_NULL = SOLID_PROPS_NULL__; + +#define MDM_TYPE(Mdm) CONCAT(MDM_TYPE_, Mdm) +#define MDM_TYPE_solid SDIS_SOLID +#define MDM_TYPE_fluid SDIS_FLUID + +#define PROP_STR(Prop) CONCAT(PROP_STR_, Prop) +#define PROP_STR_calorific_capacity "calorific capacity" +#define PROP_STR_conductivity "conductivity" +#define PROP_STR_delta "delta" +#define PROP_STR_temperature "temperature" +#define PROP_STR_thermal_conductivity "thermal conductivity" +#define PROP_STR_volumic_mass "volumic mass" +#define PROP_STR_volumic_power "volumic power" + +#define DEFINE_MDM_GET_PROP_FUNC(Mdm, Prop) \ + static INLINE double \ + Mdm##_get_##Prop \ + (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) \ + { \ + ASSERT(mdm && mdm->type == MDM_TYPE(Mdm)); \ + return mdm->shader.Mdm.Prop(vtx, mdm->data); \ + } + +#define DEFINE_MDM_CHK_PROP_FUNC(Mdm, Prop, Low, Upp, LowIsInc, UppIsInc) \ + static INLINE res_T \ + Mdm##_check_##Prop \ + (struct sdis_device* dev, \ + const double val, /* Value of the property */ \ + const double pos[], /* Position at which the property was queried */ \ + const double time) /* Time at which the property was queried */ \ + { \ + const int low_test = LowIsInc ? Low <= val : Low < val; \ + const int upp_test = UppIsInc ? Upp >= val : Upp > val; \ + const char low_char = LowIsInc ? '[' : ']'; \ + const char upp_char = UppIsInc ? ']' : '['; \ + ASSERT(dev && pos); \ + \ + if(!low_test || !upp_test) { \ + log_err(dev, \ + "invalid "STR(Mdm)" "PROP_STR(Prop)" '%g': it must be in %c%g, %g%c " \ + "-- position=%g, %g, %g; time=%g\n", \ + val, low_char, (double)Low, (double)Upp, upp_char, SPLIT3(pos), time); \ + return RES_BAD_ARG; \ + } \ + return RES_OK; \ + } + static FINLINE unsigned medium_get_id(const struct sdis_medium* mdm) { @@ -46,30 +114,23 @@ medium_get_id(const struct sdis_medium* mdm) /******************************************************************************* * Fluid local functions ******************************************************************************/ -static INLINE double -fluid_get_calorific_capacity - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) -{ - ASSERT(mdm && mdm->type == SDIS_FLUID); - return mdm->shader.fluid.calorific_capacity(vtx, mdm->data); -} +DEFINE_MDM_CHK_PROP_FUNC(fluid, calorific_capacity, 0, INF, 0, 1) +DEFINE_MDM_CHK_PROP_FUNC(fluid, volumic_mass, 0, INF, 0, 1) +DEFINE_MDM_CHK_PROP_FUNC(fluid, temperature, 0, INF, 1, 1) -static INLINE double -fluid_get_volumic_mass - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) +static INLINE res_T +fluid_check_t0(struct sdis_device* dev, const double t0) { - ASSERT(mdm && mdm->type == SDIS_FLUID); - return mdm->shader.fluid.volumic_mass(vtx, mdm->data); + if(t0 < 0) { + log_err(dev, "invalid negative initial time '%g'.\n", t0); + return RES_BAD_ARG; + } + return RES_OK; } -static INLINE double -fluid_get_temperature - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) -{ - ASSERT(mdm && mdm->type == SDIS_FLUID); - /*ASSERT(vtx->time >= mdm->shader.fluid.t0);*/ - return mdm->shader.fluid.temperature(vtx, mdm->data); -} +DEFINE_MDM_GET_PROP_FUNC(fluid, calorific_capacity) +DEFINE_MDM_GET_PROP_FUNC(fluid, volumic_mass) +DEFINE_MDM_GET_PROP_FUNC(fluid, temperature) static INLINE double fluid_get_t0(const struct sdis_medium* mdm) @@ -79,44 +140,76 @@ fluid_get_t0(const struct sdis_medium* mdm) return mdm->shader.fluid.t0; } -/******************************************************************************* - * Solid local functions - ******************************************************************************/ -static INLINE double -solid_get_calorific_capacity - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) +static INLINE res_T +fluid_check_properties + (struct sdis_device* dev, + const struct fluid_props* props, + const double pos[], + const double time) { - ASSERT(mdm && mdm->type == SDIS_SOLID); - return mdm->shader.solid.calorific_capacity(vtx, mdm->data); -} + res_T res = RES_OK; + ASSERT(dev && props); -static INLINE double -solid_get_thermal_conductivity - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) -{ - ASSERT(mdm && mdm->type == SDIS_SOLID); - return mdm->shader.solid.thermal_conductivity(vtx, mdm->data); + #define CHK_PROP(Prop, Val) { \ + res = fluid_check_##Prop(dev, Val, pos, time); \ + if(res != RES_OK) return res; \ + } (void)0 + CHK_PROP(volumic_mass, props->rho); + CHK_PROP(calorific_capacity, props->cp); + #undef CHK_PROP + + /* Do not check the temperature. An invalid temperature means that the + * temperature is unknown */ + + res = fluid_check_t0(dev, props->t0); + if(res != RES_OK) return res; + + return RES_OK; } -static INLINE double -solid_get_volumic_mass - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) +static INLINE res_T +fluid_get_properties + (const struct sdis_medium* mdm, + const struct sdis_rwalk_vertex* vtx, + struct fluid_props* props) { - ASSERT(mdm && mdm->type == SDIS_SOLID); - return mdm->shader.solid.volumic_mass(vtx, mdm->data); + ASSERT(mdm && mdm->type == SDIS_FLUID); + props->rho = fluid_get_volumic_mass(mdm, vtx); + props->cp = fluid_get_calorific_capacity(mdm, vtx); + props->temperature = fluid_get_temperature(mdm, vtx); + return fluid_check_properties(mdm->dev, props, vtx->P, vtx->time); } -static INLINE double -solid_get_delta - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) +/******************************************************************************* + * Solid local functions + ******************************************************************************/ +DEFINE_MDM_CHK_PROP_FUNC(solid, calorific_capacity,0, INF, 0, 1) +DEFINE_MDM_CHK_PROP_FUNC(solid, thermal_conductivity, 0, INF, 0, 1) +DEFINE_MDM_CHK_PROP_FUNC(solid, volumic_mass, 0, INF, 0, 1) +DEFINE_MDM_CHK_PROP_FUNC(solid, delta, 0, INF, 0, 1) +DEFINE_MDM_CHK_PROP_FUNC(solid, volumic_power, -INF, INF, 1, 1) +DEFINE_MDM_CHK_PROP_FUNC(solid, temperature, 0, INF, 1, 1) + +static INLINE res_T +solid_check_t0(struct sdis_device* dev, const double t0) { - ASSERT(mdm && mdm->type == SDIS_SOLID); - return mdm->shader.solid.delta_solid(vtx, mdm->data); + if(t0 < 0) { + log_err(dev, "invalid negative initial time '%g'.\n", t0); + return RES_BAD_ARG; + } + return RES_OK; } +DEFINE_MDM_GET_PROP_FUNC(solid, calorific_capacity) +DEFINE_MDM_GET_PROP_FUNC(solid, thermal_conductivity) +DEFINE_MDM_GET_PROP_FUNC(solid, volumic_mass) +DEFINE_MDM_GET_PROP_FUNC(solid, delta) +DEFINE_MDM_GET_PROP_FUNC(solid, temperature) + static INLINE double solid_get_volumic_power - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) + (const struct sdis_medium* mdm, + const struct sdis_rwalk_vertex* vtx) { ASSERT(mdm && mdm->type == SDIS_SOLID); return mdm->shader.solid.volumic_power @@ -125,20 +218,58 @@ solid_get_volumic_power } static INLINE double -solid_get_temperature - (const struct sdis_medium* mdm, const struct sdis_rwalk_vertex* vtx) +solid_get_t0(const struct sdis_medium* mdm) { ASSERT(mdm && mdm->type == SDIS_SOLID); - /*ASSERT(vtx->time >= mdm->shader.solid.t0);*/ - return mdm->shader.solid.temperature(vtx, mdm->data); + ASSERT(0 <= mdm->shader.solid.t0 && mdm->shader.solid.t0 < INF); + return mdm->shader.solid.t0; } -static INLINE double -solid_get_t0(const struct sdis_medium* mdm) +static INLINE res_T +solid_check_properties + (struct sdis_device* dev, + const struct solid_props* props, + const double pos[], + const double time) +{ + res_T res = RES_OK; + ASSERT(dev && props); + + #define CHK_PROP(Prop, Val) { \ + res = solid_check_##Prop(dev, Val, pos, time); \ + if(res != RES_OK) return res; \ + } (void)0 + CHK_PROP(calorific_capacity, props->cp); + CHK_PROP(thermal_conductivity, props->lambda); + CHK_PROP(volumic_mass, props->rho); + CHK_PROP(delta, props->delta); + CHK_PROP(volumic_power, props->power); + #undef CHK_PROP + + /* Do not check the temperature. An invalid temperature means that the + * temperature is unknown */ + + res = solid_check_t0(dev, props->t0); + if(res != RES_OK) return res; + + return RES_OK; +} + +static INLINE res_T +solid_get_properties + (const struct sdis_medium* mdm, + const struct sdis_rwalk_vertex* vtx, + struct solid_props* props) { ASSERT(mdm && mdm->type == SDIS_SOLID); - ASSERT(0 <= mdm->shader.solid.t0 && mdm->shader.solid.t0 < INF); - return mdm->shader.solid.t0; + props->lambda = solid_get_thermal_conductivity(mdm, vtx); + props->rho = solid_get_volumic_mass(mdm, vtx); + props->cp = solid_get_calorific_capacity(mdm, vtx); + props->delta = solid_get_delta(mdm, vtx); + props->power = solid_get_volumic_power(mdm, vtx); + props->temperature = solid_get_temperature(mdm, vtx); + props->t0 = solid_get_t0(mdm); + return solid_check_properties(mdm->dev, props, vtx->P, vtx->time); } /******************************************************************************* @@ -170,6 +301,19 @@ medium_get_t0(const struct sdis_medium* mdm) } return t0; } +#undef MDM_TYPE +#undef MDM_TYPE_solid +#undef MDM_TYPE_fluid +#undef PROP_STR +#undef PROP_STR_calorific_capacity +#undef PROP_STR_conductivity +#undef PROP_STR_delta +#undef PROP_STR_temperature +#undef PROP_STR_thermal_conductivity +#undef PROP_STR_volumic_mass +#undef PROP_STR_volumic_power +#undef DEFINE_MDM_CHK_PROP_FUNC +#undef DEFINE_MDM_GET_PROP_FUNC #endif /* SDIS_MEDIUM_C_H */ diff --git a/src/sdis_misc.h b/src/sdis_misc.h @@ -148,8 +148,8 @@ register_heat_vertex } extern LOCAL_SYM res_T -time_rewind_2d - (struct sdis_medium* mdm, /* Medium into which the time is rewinded */ +solid_time_rewind_2d + (struct sdis_medium* mdm, /* Solid into which the time is rewinded */ struct ssp_rng* rng, const double dist_in_meter, const struct rwalk_context* ctx, @@ -157,8 +157,8 @@ time_rewind_2d struct temperature_2d* T); extern LOCAL_SYM res_T -time_rewind_3d - (struct sdis_medium* mdm, /* Medium into which the time is rewinded */ +solid_time_rewind_3d + (struct sdis_medium* mdm, /* Solid into which the time is rewinded */ struct ssp_rng* rng, const double dist_in_meter, const struct rwalk_context* ctx, diff --git a/src/sdis_misc_Xd.h b/src/sdis_misc_Xd.h @@ -24,7 +24,7 @@ #include "sdis_Xd_begin.h" res_T -XD(time_rewind) +XD(solid_time_rewind) (struct sdis_medium* mdm, struct ssp_rng* rng, const double dist_in_meter, @@ -32,35 +32,33 @@ XD(time_rewind) struct XD(rwalk)* rwalk, struct XD(temperature)* T) { + struct solid_props props = SOLID_PROPS_NULL; + double tau, mu; double temperature; - double lambda, rho, cp; - double tau, mu, t0; res_T res = RES_OK; ASSERT(mdm && rng && ctx && rwalk && dist_in_meter > 0); ASSERT(sdis_medium_get_type(mdm) == SDIS_SOLID); ASSERT(T->done == 0); /* Fetch physical properties */ - lambda = solid_get_thermal_conductivity(mdm, &rwalk->vtx); - rho = solid_get_volumic_mass(mdm, &rwalk->vtx); - cp = solid_get_calorific_capacity(mdm, &rwalk->vtx); - t0 = solid_get_t0(mdm); /* Limit time */ + res = solid_get_properties(mdm, &rwalk->vtx, &props); + if(res != RES_OK) goto error; /* Sample the time to reroll */ - mu = (2*DIM*lambda)/(rho*cp*dist_in_meter*dist_in_meter); + mu = (2*DIM*props.lambda)/(props.rho*props.cp*dist_in_meter*dist_in_meter); tau = ssp_ran_exp(rng, mu); /* Increment the elapsed time */ - ASSERT(rwalk->vtx.time >= t0); - rwalk->elapsed_time += MMIN(tau, rwalk->vtx.time - t0); + ASSERT(rwalk->vtx.time >= props.t0); + rwalk->elapsed_time += MMIN(tau, rwalk->vtx.time - props.t0); if(IS_INF(rwalk->vtx.time)) goto exit; /* Steady computation */ /* Time rewind */ - rwalk->vtx.time = MMAX(rwalk->vtx.time - tau, t0); + rwalk->vtx.time = MMAX(rwalk->vtx.time - tau, props.t0); /* The path does not reach the limit condition */ - if(rwalk->vtx.time > t0) goto exit; + if(rwalk->vtx.time > props.t0) goto exit; /* Fetch initial temperature */ temperature = solid_get_temperature(mdm, &rwalk->vtx); diff --git a/src/test_sdis_compute_power.c b/src/test_sdis_compute_power.c @@ -201,7 +201,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.volumic_power = solid_get_volumic_power; /* Create the fluid */ diff --git a/src/test_sdis_conducto_radiative.c b/src/test_sdis_conducto_radiative.c @@ -377,7 +377,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; OK(sdis_solid_create(dev, &solid_shader, data, &solid)); OK(sdis_data_ref_put(data)); @@ -389,7 +389,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = temperature_unknown; OK(sdis_solid_create(dev, &solid_shader, data, &solid2)); OK(sdis_data_ref_put(data)); diff --git a/src/test_sdis_conducto_radiative_2d.c b/src/test_sdis_conducto_radiative_2d.c @@ -376,7 +376,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = temperature_unknown; OK(sdis_solid_create(dev, &solid_shader, data, &solid)); OK(sdis_data_ref_put(data)); @@ -388,7 +388,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_thermal_conductivity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; OK(sdis_solid_create(dev, &solid_shader, data, &solid2)); OK(sdis_data_ref_put(data)); diff --git a/src/test_sdis_contact_resistance.c b/src/test_sdis_contact_resistance.c @@ -283,7 +283,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; /* Create the solid medium #1 */ diff --git a/src/test_sdis_contact_resistance_2.c b/src/test_sdis_contact_resistance_2.c @@ -377,7 +377,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; /* Create the solid medium #1 */ diff --git a/src/test_sdis_flux.c b/src/test_sdis_flux.c @@ -381,7 +381,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_medium.c b/src/test_sdis_medium.c @@ -98,9 +98,9 @@ main(int argc, char** argv) BA(sdis_solid_create(dev, &solid_shader, NULL, &solid)); solid_shader.volumic_mass = DUMMY_SOLID_SHADER.volumic_mass; - solid_shader.delta_solid = NULL; + solid_shader.delta = NULL; BA(sdis_solid_create(dev, &solid_shader, NULL, &solid)); - solid_shader.delta_solid = DUMMY_SOLID_SHADER.delta_solid; + solid_shader.delta = DUMMY_SOLID_SHADER.delta; solid_shader.temperature = NULL; BA(sdis_solid_create(dev, &solid_shader, NULL, &solid)); @@ -135,7 +135,7 @@ main(int argc, char** argv) CHK(solid_shader.calorific_capacity == solid_shader2.calorific_capacity); CHK(solid_shader.thermal_conductivity == solid_shader2.thermal_conductivity); CHK(solid_shader.volumic_mass == solid_shader2.volumic_mass); - CHK(solid_shader.delta_solid == solid_shader2.delta_solid); + CHK(solid_shader.delta == solid_shader2.delta); CHK(solid_shader.volumic_power == solid_shader2.volumic_power); CHK(solid_shader.temperature == solid_shader2.temperature); CHK(solid_shader.t0 == solid_shader2.t0); diff --git a/src/test_sdis_picard.c b/src/test_sdis_picard.c @@ -262,7 +262,7 @@ create_solid shader.calorific_capacity = solid_get_calorific_capacity; shader.thermal_conductivity = solid_get_thermal_conductivity; shader.volumic_mass = solid_get_volumic_mass; - shader.delta_solid = solid_get_delta; + shader.delta = solid_get_delta; shader.temperature = solid_get_temperature; shader.volumic_power = solid_get_volumic_power; OK(sdis_solid_create(dev, &shader, data, solid)); diff --git a/src/test_sdis_solid_random_walk_robustness.c b/src/test_sdis_solid_random_walk_robustness.c @@ -293,7 +293,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; solid_shader.volumic_power = solid_get_volumetric_power; diff --git a/src/test_sdis_solve_boundary.c b/src/test_sdis_solve_boundary.c @@ -221,7 +221,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_solve_boundary_flux.c b/src/test_sdis_solve_boundary_flux.c @@ -272,7 +272,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_solve_camera.c b/src/test_sdis_solve_camera.c @@ -310,7 +310,7 @@ create_solid solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; /* Create the solid medium */ diff --git a/src/test_sdis_solve_medium.c b/src/test_sdis_solve_medium.c @@ -258,7 +258,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; /* Create the solid0 medium */ diff --git a/src/test_sdis_solve_medium_2d.c b/src/test_sdis_solve_medium_2d.c @@ -245,7 +245,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; /* Create the solid0 medium */ diff --git a/src/test_sdis_solve_probe.c b/src/test_sdis_solve_probe.c @@ -329,7 +329,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; OK(sdis_solid_create(dev, &solid_shader, data, &solid)); OK(sdis_data_ref_put(data)); diff --git a/src/test_sdis_solve_probe2.c b/src/test_sdis_solve_probe2.c @@ -185,7 +185,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = temperature_unknown; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_solve_probe2_2d.c b/src/test_sdis_solve_probe2_2d.c @@ -178,7 +178,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = temperature_unknown; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_solve_probe3.c b/src/test_sdis_solve_probe3.c @@ -208,7 +208,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = temperature_unknown; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_solve_probe3_2d.c b/src/test_sdis_solve_probe3_2d.c @@ -203,7 +203,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = temperature_unknown; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_solve_probe_2d.c b/src/test_sdis_solve_probe_2d.c @@ -172,7 +172,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; OK(sdis_solid_create(dev, &solid_shader, NULL, &solid)); diff --git a/src/test_sdis_transcient.c b/src/test_sdis_transcient.c @@ -518,7 +518,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; /* Create the solid medium */ diff --git a/src/test_sdis_unstationary_atm.c b/src/test_sdis_unstationary_atm.c @@ -733,7 +733,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; /* Create the solid media */ diff --git a/src/test_sdis_volumic_power.c b/src/test_sdis_volumic_power.c @@ -407,7 +407,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; solid_shader.volumic_power = solid_get_volumic_power; diff --git a/src/test_sdis_volumic_power2.c b/src/test_sdis_volumic_power2.c @@ -329,7 +329,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; solid_shader.volumic_power = solid_get_volumic_power; diff --git a/src/test_sdis_volumic_power2_2d.c b/src/test_sdis_volumic_power2_2d.c @@ -360,7 +360,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; solid_shader.volumic_power = solid_get_volumic_power; diff --git a/src/test_sdis_volumic_power3_2d.c b/src/test_sdis_volumic_power3_2d.c @@ -288,7 +288,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; solid_shader.volumic_power = solid_get_volumic_power; diff --git a/src/test_sdis_volumic_power4.c b/src/test_sdis_volumic_power4.c @@ -257,7 +257,7 @@ main(int argc, char** argv) solid_shader.calorific_capacity = solid_get_calorific_capacity; solid_shader.thermal_conductivity = solid_get_thermal_conductivity; solid_shader.volumic_mass = solid_get_volumic_mass; - solid_shader.delta_solid = solid_get_delta; + solid_shader.delta = solid_get_delta; solid_shader.temperature = solid_get_temperature; solid_shader.volumic_power = solid_get_volumic_power;