commit fd1f28d63679eac0bdd9b75ac8987508bf30e041
parent 63ecbf818b6eb4cdb03957c039e8e3ed2939d0de
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 17 May 2018 16:22:04 +0200
Handle the volumic power on solid reinjection
Note that this is wrong on adiabatic interfaces
Diffstat:
| M | src/sdis_solve_Xd.h | | | 86 | +++++++++++++++++++++++++++++++++++++++++++++---------------------------------- |
1 file changed, 49 insertions(+), 37 deletions(-)
diff --git a/src/sdis_solve_Xd.h b/src/sdis_solve_Xd.h
@@ -378,6 +378,50 @@ XD(fluid_temperature)
}
static void
+XD(reinject_in_solid)
+ (const struct sdis_scene* scn,
+ const float fp_to_meter,
+ struct XD(rwalk)* rwalk,
+ const double delta_in,
+ const float dir[DIM],
+ struct XD(temperature)* T,
+ const int handle_volumic_power)
+{
+ float pos[DIM];
+ float range[2];
+ double power;
+ double delta = delta_in;
+ ASSERT(scn && delta > 0 && rwalk->mdm && rwalk->mdm->type == SDIS_SOLID && T);
+ ASSERT(fX(is_normalized)(dir));
+
+ fX_set_dX(pos, rwalk->vtx.P);
+ f2(range, 0, (float)delta*RAY_RANGE_MAX_SCALE);
+
+ /* "Reinject" the random walk into the solid */
+ SXD(scene_view_trace_ray
+ (scn->sXd(view), pos, dir, range, &rwalk->hit, &rwalk->hit));
+ if(!SXD_HIT_NONE(&rwalk->hit)) delta = rwalk->hit.distance * 0.5;
+
+ /* Add the volumic power */
+ if(handle_volumic_power) {
+ power = solid_get_volumic_power(rwalk->mdm, &rwalk->vtx);
+ if(power != SDIS_VOLUMIC_POWER_NONE) {
+ const double delta_in_meter = delta * fp_to_meter;
+ const double lambda = solid_get_thermal_conductivity(rwalk->mdm, &rwalk->vtx);
+ const double tmp = power * delta_in_meter * delta_in_meter / (2.0 * lambda);
+ T->value += tmp;
+ }
+ }
+
+ XD(move_pos)(rwalk->vtx.P, dir, (float)delta);
+
+ /* Switch in solid random walk */
+ T->func = XD(solid_temperature);
+ rwalk->hit = SXD_HIT_NULL;
+ rwalk->hit_side = SDIS_SIDE_NULL__;
+}
+
+static void
XD(solid_solid_boundary_temperature)
(const struct sdis_scene* scn,
const double fp_to_meter,
@@ -394,11 +438,10 @@ XD(solid_solid_boundary_temperature)
double delta_front_boundary, delta_back_boundary;
double delta_front_boundary_meter, delta_back_boundary_meter;
double delta_boundary;
- double power;
double proba;
double tmp;
double r;
- float pos[DIM], dir[DIM], range[2];
+ float dir[DIM];
ASSERT(scn && fp_to_meter > 0 && ctx && frag && rwalk && rng && T);
ASSERT(XD(check_rwalk_fragment_consistency)(rwalk, frag));
(void)frag, (void)ctx;
@@ -436,28 +479,7 @@ XD(solid_solid_boundary_temperature)
}
/* "Reinject" the path into the solid along the surface normal. */
- fX_set_dX(pos, rwalk->vtx.P);
- range[0] = 0, range[1] = (float)delta_boundary*RAY_RANGE_MAX_SCALE;
- SXD(scene_view_trace_ray
- (scn->sXd(view), pos, dir, range, &rwalk->hit, &rwalk->hit));
- if(!SXD_HIT_NONE(&rwalk->hit)) delta_boundary = rwalk->hit.distance * 0.5;
-
- /* Add the volumic power */
- power = solid_get_volumic_power(rwalk->mdm, &rwalk->vtx);
- if(power != SDIS_VOLUMIC_POWER_NONE) {
- const double delta_in_meter = delta_boundary * fp_to_meter;
- double lambda;
- lambda = solid_get_thermal_conductivity(rwalk->mdm, &rwalk->vtx);
- tmp = power * delta_in_meter * delta_in_meter / (2.0 * lambda);
- T->value += tmp;
- }
-
- /* Switch in solid random walk */
- XD(move_pos)(rwalk->vtx.P, dir, (float)delta_boundary);
-
- T->func = XD(solid_temperature);
- rwalk->hit = SXD_HIT_NULL;
- rwalk->hit_side = SDIS_SIDE_NULL__;
+ XD(reinject_in_solid)(scn, 1, rwalk, delta_boundary, dir, T, 1);
}
static void
@@ -485,7 +507,7 @@ XD(solid_fluid_boundary_temperature)
double delta_boundary;
double r;
double tmp;
- float dir[DIM], pos[DIM], range[2];
+ float dir[DIM];
ASSERT(scn && fp_to_meter > 0 && rwalk && rng && T && ctx);
ASSERT(XD(check_rwalk_fragment_consistency)(rwalk, frag));
@@ -538,18 +560,8 @@ XD(solid_fluid_boundary_temperature)
fX(normalize)(dir, rwalk->hit.normal);
if(solid == mdm_back) fX(minus)(dir, dir);
- /* "Reinject" the random walk into the solid */
- fX_set_dX(pos, rwalk->vtx.P);
- range[0] = 0, range[1] = (float)delta_boundary*RAY_RANGE_MAX_SCALE;
- SXD(scene_view_trace_ray
- (scn->sXd(view), pos, dir, range, &rwalk->hit, &rwalk->hit));
- if(!SXD_HIT_NONE(&rwalk->hit)) delta_boundary = rwalk->hit.distance * 0.5;
- XD(move_pos)(rwalk->vtx.P, dir, (float)delta_boundary);
-
- /* Switch in solid random walk */
- T->func = XD(solid_temperature);
- rwalk->hit = SXD_HIT_NULL;
- rwalk->hit_side = SDIS_SIDE_NULL__;
+ /* "Reinject" the path into the solid along the surface normal. */
+ XD(reinject_in_solid)(scn, 1, rwalk, delta_boundary, dir, T, 1);
}
}