stardis-solver

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

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:
Msrc/sdis.h | 19+++++++++++++++++--
Msrc/sdis_realisation.c | 11++++++++---
Msrc/sdis_realisation_Xd.h | 26+++++++++++++++++++++-----
Msrc/sdis_scene.c | 32++++++++++++++++++++++++--------
Msrc/sdis_scene_Xd.h | 1+
Msrc/sdis_scene_c.h | 3++-
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;