commit 26d93a01b6b1d5ecb8de946166d316588ef440ce
parent cbf8ac9885f6dd1683d2400943a234dd1c35292e
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 26 Oct 2021 16:22:45 +0200
Add maximum temperature as a scene attribute
Diffstat:
6 files changed, 73 insertions(+), 19 deletions(-)
diff --git a/src/sdis.h b/src/sdis.h
@@ -366,7 +366,7 @@ struct sdis_scene_create_args {
sdis_get_primitive_interface_T get_interface;
sdis_get_vertex_position_T get_position;
- /* Pointer toward client side sent as the last argument of the callbacks */
+ /* Pointer toward client side sent as the last argument of the callbacks */
void* context;
size_t nprimitives; /* #primitives, i.e. #segments or #triangles */
@@ -374,6 +374,7 @@ struct sdis_scene_create_args {
double fp_to_meter; /* Scale factor used to convert 1.0 in 1 meter */
double trad; /* Ambiant radiative temperature */
double tref; /* Temperature used to linearize the radiative temperature */
+ double tmax; /* Maxium temperature used to linearize the radiative temp */
};
#define SDIS_SCENE_CREATE_ARGS_DEFAULT__ { \
@@ -385,7 +386,8 @@ struct sdis_scene_create_args {
0, /* #vertices */ \
1.0, /* #Floating point to meter scale factor */ \
-1.0, /* Ambient radiative temperature */ \
- -1.0 /* Reference temperature */ \
+ -1.0, /* Reference temperature */ \
+ -1.0, /* Maximum temperature */ \
}
static const struct sdis_scene_create_args SDIS_SCENE_CREATE_ARGS_DEFAULT =
SDIS_SCENE_CREATE_ARGS_DEFAULT__;
@@ -851,6 +853,19 @@ sdis_scene_set_reference_temperature
(struct sdis_scene* scn,
const double tref);
+/* Get scene's maximum temperature */
+SDIS_API res_T
+sdis_scene_get_maximum_temperature
+ (const struct sdis_scene* scn,
+ double* tmax);
+
+/* Set scene's maximum temperature. Must be correctly defined if there is any
+ * radiative transfert in the scene. */
+SDIS_API res_T
+sdis_scene_set_maximum_temperature
+ (struct sdis_scene* scn,
+ const double tmax);
+
/* Search the point onto the scene geometry that is the closest of `pos'. The
* `radius' parameter controls the maximum search distance around `pos'. The
* returned closest point is expressed locally to the geometric primitive onto
diff --git a/src/sdis_realisation.c b/src/sdis_realisation.c
@@ -46,10 +46,15 @@ ray_realisation_3d
rwalk.hit_side = SDIS_SIDE_NULL__;
rwalk.mdm = medium;
- ctx.Tarad = scn->ambient_radiative_temperature;
- ctx.Tref3 = scn->reference_temperature * scn->reference_temperature
- * scn->reference_temperature;
ctx.heat_path = heat_path;
+ ctx.Tarad = scn->ambient_radiative_temperature;
+ ctx.That = scn->maximum_temperature;
+ ctx.That2 = ctx.That * ctx.That;
+ ctx.That3 = ctx.That * ctx.That2;
+ ctx.Tref3 =
+ scn->reference_temperature
+ * scn->reference_temperature
+ * scn->reference_temperature;
f3_set_d3(dir, direction);
diff --git a/src/sdis_realisation_Xd.h b/src/sdis_realisation_Xd.h
@@ -182,6 +182,9 @@ XD(probe_realisation)
ctx.green_path = green_path;
ctx.heat_path = heat_path;
ctx.Tarad = scn->ambient_radiative_temperature;
+ ctx.That = scn->maximum_temperature;
+ ctx.That2 = ctx.That * ctx.That;
+ ctx.That3 = ctx.That * ctx.That2;
ctx.Tref3 =
scn->reference_temperature
* scn->reference_temperature
@@ -260,8 +263,13 @@ XD(boundary_realisation)
ctx.green_path = green_path;
ctx.heat_path = heat_path;
ctx.Tarad = scn->ambient_radiative_temperature;
- ctx.Tref3 = scn->reference_temperature * scn->reference_temperature
- * scn->reference_temperature;
+ ctx.That = scn->maximum_temperature;
+ ctx.That2 = ctx.That * ctx.That;
+ ctx.That3 = ctx.That * ctx.That2;
+ ctx.Tref3 =
+ scn->reference_temperature
+ * scn->reference_temperature
+ * scn->reference_temperature;
res = XD(compute_temperature)(scn, &ctx, &rwalk, rng, &T);
if(res != RES_OK) goto error;
@@ -300,8 +308,13 @@ XD(boundary_flux_realisation)
#endif
double P[SDIS_XD_DIMENSION];
float N[SDIS_XD_DIMENSION];
- const double Tr3 = scn->reference_temperature * scn->reference_temperature
- * scn->reference_temperature;
+ const double That = scn->maximum_temperature;
+ const double That2 = That * That;
+ const double That3 = That * That2;
+ const double Tref3 =
+ scn->reference_temperature
+ * scn->reference_temperature
+ * scn->reference_temperature;
const enum sdis_side fluid_side =
(solid_side == SDIS_FRONT) ? SDIS_BACK : SDIS_FRONT;
res_T res = RES_OK;
@@ -337,7 +350,10 @@ XD(boundary_flux_realisation)
rwalk.hit.prim = prim; \
SET_PARAM(rwalk.hit, st); \
ctx.Tarad = scn->ambient_radiative_temperature; \
- ctx.Tref3 = Tr3; \
+ ctx.Tref3 = Tref3; \
+ ctx.That = That; \
+ ctx.That2 = That2; \
+ ctx.That3 = That3; \
dX(set)(rwalk.vtx.P, P); \
fX(set)(rwalk.hit.normal, N); \
T = XD(TEMPERATURE_NULL); \
diff --git a/src/sdis_scene.c b/src/sdis_scene.c
@@ -209,12 +209,12 @@ sdis_scene_get_ambient_radiative_temperature
}
res_T
-sdis_scene_set_reference_temperature
+sdis_scene_set_ambient_radiative_temperature
(struct sdis_scene* scn,
- const double tref)
+ const double trad)
{
- if(!scn || tref < 0) return RES_BAD_ARG;
- scn->reference_temperature = tref;
+ if(!scn) return RES_BAD_ARG;
+ scn->ambient_radiative_temperature = trad;
return RES_OK;
}
@@ -229,12 +229,28 @@ sdis_scene_get_reference_temperature
}
res_T
-sdis_scene_set_ambient_radiative_temperature
+sdis_scene_set_reference_temperature
(struct sdis_scene* scn,
- const double trad)
+ const double tref)
{
- if(!scn) return RES_BAD_ARG;
- scn->ambient_radiative_temperature = trad;
+ if(!scn || tref < 0) return RES_BAD_ARG;
+ scn->reference_temperature = tref;
+ return RES_OK;
+}
+
+res_T
+sdis_scene_get_maximum_temperature(const struct sdis_scene* scn, double* tmax)
+{
+ if(!scn || !tmax) return RES_BAD_ARG;
+ *tmax = scn->maximum_temperature;
+ return RES_OK;
+}
+
+res_T
+sdis_scene_set_maximum_temperature(struct sdis_scene* scn, const double tmax)
+{
+ if(!scn || tmax < 0) return RES_BAD_ARG;
+ scn->maximum_temperature = tmax;
return RES_OK;
}
diff --git a/src/sdis_scene_Xd.h b/src/sdis_scene_Xd.h
@@ -914,6 +914,7 @@ XD(scene_create)
scn->fp_to_meter = args->fp_to_meter;
scn->ambient_radiative_temperature = args->trad;
scn->reference_temperature = args->tref;
+ scn->maximum_temperature = args->tmax;
scn->outer_enclosure_id = UINT_MAX;
darray_interf_init(dev->allocator, &scn->interfaces);
darray_medium_init(dev->allocator, &scn->media);
diff --git a/src/sdis_scene_c.h b/src/sdis_scene_c.h
@@ -210,7 +210,8 @@ struct sdis_scene {
double fp_to_meter;
double ambient_radiative_temperature; /* In Kelvin */
- double reference_temperature;
+ double reference_temperature; /* In Kelvin */
+ double maximum_temperature; /* In Kelvin */
ref_T ref;
struct sdis_device* dev;