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:
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) {