stardis-solver

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

commit 10af0bbb17ab30e267ddfbdd394c03479a705c36
parent a7e42ca55b9441ee132dc5fe9364a8f9ddbd2f6d
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon, 14 Jan 2019 18:46:55 +0100

Allow radiative exchanges between surfaces closing the system

Diffstat:
Msrc/sdis_scene.c | 1-
Msrc/sdis_scene_Xd.h | 8++++++++
Msrc/sdis_scene_c.h | 13+++++++++++++
Msrc/sdis_solve_Xd.h | 25+++++++++++++++++++------
4 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/src/sdis_scene.c b/src/sdis_scene.c @@ -296,4 +296,3 @@ scene_get_medium ? scene_get_medium_2d(scn, pos, info, out_medium) : scene_get_medium_3d(scn, pos, info, out_medium); } - diff --git a/src/sdis_scene_Xd.h b/src/sdis_scene_Xd.h @@ -631,6 +631,7 @@ XD(setup_enclosures)(struct sdis_scene* scn, struct sencXd(descriptor)* desc) struct sencXd(enclosure)* enc = NULL; unsigned ienc, nencs; unsigned enclosed_medium; + int outer_found = 0; res_T res = RES_OK; ASSERT(scn && desc); @@ -646,6 +647,12 @@ XD(setup_enclosures)(struct sdis_scene* scn, struct sencXd(descriptor)* desc) SENCXD(descriptor_get_enclosure(desc, ienc, &enc)); SENCXD(enclosure_get_header(enc, &header)); + if(header.is_infinite) { + ASSERT(!outer_found); + outer_found = 1; + scn->outer_enclosure_id = ienc; + } + /* As paths don't go in infinite enclosures we can accept models are broken * there. But nowhere else. */ if(header.enclosed_media_count != 1 && !header.is_infinite) { @@ -733,6 +740,7 @@ XD(scene_create) SDIS(device_ref_get(dev)); scn->dev = dev; scn->ambient_radiative_temperature = -1; + scn->outer_enclosure_id = UINT_MAX; darray_interf_init(dev->allocator, &scn->interfaces); darray_medium_init(dev->allocator, &scn->media); darray_prim_prop_init(dev->allocator, &scn->prim_props); diff --git a/src/sdis_scene_c.h b/src/sdis_scene_c.h @@ -175,6 +175,7 @@ struct sdis_scene { struct htable_d tmp_hc_ub; /* Map an enclosure id to its hc upper bound */ struct htable_enclosure enclosures; /* Map an enclosure id to its data */ + unsigned outer_enclosure_id; double ambient_radiative_temperature; /* In Kelvin */ @@ -213,6 +214,18 @@ scene_get_enclosure_ids encs[1] = darray_prim_prop_cdata_get(&scn->prim_props)[iprim].back_enclosure; } +static INLINE int +scene_is_outside + (const struct sdis_scene* scn, + const enum sdis_side side, + const unsigned iprim) +{ + unsigned encs[2]; + ASSERT(scn && scn->outer_enclosure_id != UINT_MAX); + scene_get_enclosure_ids(scn, iprim, encs); + return (encs[side] == scn->outer_enclosure_id); +} + static INLINE const struct enclosure* scene_get_enclosure(struct sdis_scene* scn, const unsigned ienc) { diff --git a/src/sdis_solve_Xd.h b/src/sdis_solve_Xd.h @@ -365,6 +365,7 @@ XD(trace_radiative_path) const double fp_to_meter, const struct rwalk_context* ctx, struct XD(rwalk)* rwalk, + const int outside, struct ssp_rng* rng, struct XD(temperature)* T) { @@ -462,10 +463,17 @@ XD(trace_radiative_path) } if(chk_mdm != rwalk->mdm) { - log_err(scn->dev, "%s: inconsistent medium definition at `%g %g %g'.\n", - FUNC_NAME, SPLIT3(rwalk->vtx.P)); - res = RES_BAD_OP; - goto error; + /* To ease the setting of models, the external enclosure is allowed to be + * incoherent regarding media. + * Here a radiative path is allowed to join 2 different fluids. */ + if(outside && chk_mdm->type == SDIS_FLUID) { + rwalk->mdm = chk_mdm; + } else { + log_err(scn->dev, "%s: inconsistent medium definition at `%g %g %g'.\n", + FUNC_NAME, SPLIT3(rwalk->vtx.P)); + res = RES_BAD_OP; + goto error; + } } alpha = interface_side_get_specular_fraction(interf, &frag); r = ssp_rng_canonical(rng); @@ -495,6 +503,7 @@ XD(radiative_temperature) * assumed to be extruded to the infinty along the Z dimension. */ float N[3] = {0, 0, 0}; float dir[3] = {0, 0, 0}; + int outside; res_T res = RES_OK; ASSERT(scn && fp_to_meter > 0 && ctx && rwalk && rng && T); @@ -512,7 +521,10 @@ XD(radiative_temperature) ssp_ran_hemisphere_cos_float(rng, N, dir, NULL); /* Launch the radiative random walk */ - res = XD(trace_radiative_path)(scn, dir, fp_to_meter, ctx, rwalk, rng, T); + outside = + scene_is_outside(scn, rwalk->hit_side, rwalk->hit.prim.prim_id); + res = XD(trace_radiative_path)(scn, dir, fp_to_meter, ctx, rwalk, outside, + rng, T); if(res != RES_OK) goto error; exit: @@ -1812,7 +1824,8 @@ XD(ray_realisation) f3_set_d3(dir, direction); - res = XD(trace_radiative_path)(scn, dir, fp_to_meter, &ctx, &rwalk, rng, &T); + res = XD(trace_radiative_path)(scn, dir, fp_to_meter, &ctx, &rwalk, 0, rng, + &T); if(res != RES_OK) goto error; if(!T.done) {