stardis-solver

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

commit 3a0426f852e12af838a72832bb8abe61282005ce
parent 3a71aeb646307019a6a35beea8935093729d343b
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 15 Feb 2018 10:50:29 +0100

Fix the radiative temperature

Rely on the emissivity rather than the reflectivity of the interface and
fix the proba to switch in boundary/radiative temperature.

Diffstat:
Msrc/sdis.h | 6+++---
Msrc/sdis_interface.c | 8++++----
Msrc/sdis_interface_c.h | 8++++----
Msrc/sdis_solve_probe_Xd.h | 28+++++++++++++---------------
Msrc/test_sdis_interface.c | 8++++----
Msrc/test_sdis_solve_probe.c | 8++++----
Msrc/test_sdis_solve_probe2.c | 12++++++------
Msrc/test_sdis_solve_probe2_2d.c | 12++++++------
Msrc/test_sdis_solve_probe3.c | 16++++++++--------
Msrc/test_sdis_solve_probe3_2d.c | 16++++++++--------
Msrc/test_sdis_solve_probe_2d.c | 4++--
11 files changed, 62 insertions(+), 64 deletions(-)

diff --git a/src/sdis.h b/src/sdis.h @@ -145,9 +145,9 @@ struct sdis_interface_shader { sdis_interface_getter_T temperature; /* Limit condition. NULL <=> Unknown */ sdis_interface_getter_T convection_coef; /* NULL <=> Solid/Solid interface */ - /* BRDF parameter. NULL <=> Solid/solid interface */ - sdis_interface_getter_T reflectivity_spec; /* Specular reflectivity */ - sdis_interface_getter_T reflectivity_diff; /* Diffuse reflectivity */ + /* Interface emssivity */ + sdis_interface_getter_T emissivity; /* Overall emissivity */ + sdis_interface_getter_T specular_fraction; /* Specular fraction in [0, 1] */ }; #define SDIS_INTERFACE_SHADER_NULL__ {NULL} static const struct sdis_interface_shader SDIS_INTERFACE_SHADER_NULL = diff --git a/src/sdis_interface.c b/src/sdis_interface.c @@ -43,8 +43,8 @@ check_interface_shader /* Fluid<->solid interface */ if(type0 != type1) { if(shader->convection_coef == NULL - || shader->reflectivity_spec == NULL - || shader->reflectivity_diff == NULL) { + || shader->emissivity == NULL + || shader->specular_fraction == NULL) { return 0; } } @@ -52,8 +52,8 @@ check_interface_shader /* Solid<->solid interface */ if(type0 == SDIS_MEDIUM_SOLID && type1 == SDIS_MEDIUM_SOLID) { if(shader->convection_coef != NULL - || shader->reflectivity_spec != NULL - || shader->reflectivity_diff != NULL) { + || shader->emissivity != NULL + || shader->specular_fraction != NULL) { return 0; } } diff --git a/src/sdis_interface_c.h b/src/sdis_interface_c.h @@ -77,21 +77,21 @@ interface_get_convection_coef } static INLINE double -interface_get_reflectivity_spec +interface_get_emissivity (const struct sdis_interface* interf, const struct sdis_interface_fragment* frag) { ASSERT(interf && frag); - return interf->shader.reflectivity_spec(frag, interf->data); + return interf->shader.emissivity(frag, interf->data); } static INLINE double -interface_get_reflectivity_diff +interface_get_specular_fraction (const struct sdis_interface* interf, const struct sdis_interface_fragment* frag) { ASSERT(interf && frag); - return interf->shader.reflectivity_diff(frag, interf->data); + return interf->shader.specular_fraction(frag, interf->data); } #endif /* SDIS_INTERFACE_C_H */ diff --git a/src/sdis_solve_probe_Xd.h b/src/sdis_solve_probe_Xd.h @@ -226,7 +226,8 @@ XD(radiative_temperature) for(;;) { struct sdis_interface_fragment frag = SDIS_INTERFACE_FRAGMENT_NULL; const struct sdis_medium* chk_mdm = NULL; - double rho_s, rho_d, rho; + double alpha; + double epsilon; double r; float pos[DIM]; const float range[2] = { 0, FLT_MAX }; @@ -268,21 +269,19 @@ XD(radiative_temperature) interf = scene_get_interface(scn, rwalk->hit.prim.prim_id); XD(setup_interface_fragment)(&frag, &rwalk->vtx, &rwalk->hit); - /* Fetch the interface reflectivity */ - rho_s = interface_get_reflectivity_spec(interf, &frag); - rho_d = interface_get_reflectivity_diff(interf, &frag); - rho = rho_s + rho_d; - if(rho > 1) { + /* Fetch the interface emissivity */ + epsilon = interface_get_emissivity(interf, &frag); + if(epsilon > 1 && epsilon >= 0) { log_err(scn->dev, - "%s: invalid overall reflectivity `%g' at position `%g %g %g'.\n", - FUNC_NAME, rho, SPLIT3(rwalk->vtx.P)); + "%s: invalid overall emissivity `%g' at position `%g %g %g'.\n", + FUNC_NAME, epsilon, SPLIT3(rwalk->vtx.P)); res = RES_BAD_ARG; goto error; } /* Switch in boundary temperature ? */ r = ssp_rng_canonical(rng); - if(r < rho) { + if(r < epsilon) { T->func = XD(boundary_temperature); break; } @@ -303,9 +302,9 @@ XD(radiative_temperature) res = RES_BAD_ARG; goto error; } - + alpha = interface_get_specular_fraction(interf, &frag); r = ssp_rng_canonical(rng); - if(r < rho_s / rho) { /* Sample specular part */ + if(r < alpha) { /* Sample specular part */ XD(reflect)(dir, dir, N); } else { /* Sample diffuse part */ ssp_ran_hemisphere_cos_float(rng, N, dir, NULL); @@ -429,7 +428,7 @@ XD(solid_fluid_boundary_temperature) const struct sdis_medium* fluid = NULL; double hc; double hr; - double rho; /* Interface reflectivity */ + double epsilon; /* Interface emissivity */ double lambda; double fluid_proba; double radia_proba; @@ -459,12 +458,11 @@ XD(solid_fluid_boundary_temperature) delta_boundary = solid_get_delta_boundary(solid, &rwalk->vtx); /* Fetch the boundary properties */ - rho = interface_get_reflectivity_diff(interf, frag) - + interface_get_reflectivity_spec(interf, frag); + epsilon = interface_get_emissivity(interf, frag); hc = interface_get_convection_coef(interf, frag); /* Compute the radiative coefficient */ - hr = 4.0 * BOLTZMANN_CONSTANT * ctx->Tref3 * rho; + hr = 4.0 * BOLTZMANN_CONSTANT * ctx->Tref3 * epsilon; /* Compute the probas to switch in solid or fluid random walk */ tmp = lambda / (delta_boundary*fp_to_meter); diff --git a/src/test_sdis_interface.c b/src/test_sdis_interface.c @@ -78,8 +78,8 @@ main(int argc, char** argv) CHK(CREATE(dev, solid, solid, &shader, NULL, &interf) == RES_BAD_ARG); shader.convection_coef = NULL; - shader.reflectivity_diff = NULL; - shader.reflectivity_spec = NULL; + shader.specular_fraction = NULL; + shader.emissivity = NULL; CHK(CREATE(dev, solid, solid, &shader, NULL, &interf) == RES_OK); CHK(sdis_interface_ref_put(interf) == RES_OK); @@ -89,8 +89,8 @@ main(int argc, char** argv) CHK(CREATE(dev, solid, fluid, &shader, NULL, &interf) == RES_BAD_ARG); shader.convection_coef = DUMMY_INTERFACE_SHADER.convection_coef; - shader.reflectivity_spec = DUMMY_INTERFACE_SHADER.reflectivity_spec; - shader.reflectivity_diff = DUMMY_INTERFACE_SHADER.reflectivity_diff; + shader.emissivity = DUMMY_INTERFACE_SHADER.emissivity; + shader.specular_fraction = DUMMY_INTERFACE_SHADER.specular_fraction; CHK(CREATE(dev, solid, fluid, &shader, NULL, &interf) == RES_OK); CHK(sdis_interface_ref_put(interf) == RES_OK); #undef CREATE diff --git a/src/test_sdis_solve_probe.c b/src/test_sdis_solve_probe.c @@ -159,7 +159,7 @@ interface_get_convection_coef } static double -interface_get_reflectivity_spec +interface_get_emissivity (const struct sdis_interface_fragment* frag, struct sdis_data* data) { CHK(data != NULL && frag != NULL); @@ -167,7 +167,7 @@ interface_get_reflectivity_spec } static double -interface_get_reflectivity_diff +interface_get_specular_fraction (const struct sdis_interface_fragment* frag, struct sdis_data* data) { CHK(data != NULL && frag != NULL); @@ -244,8 +244,8 @@ main(int argc, char** argv) interface_param->rho_d = 0; interface_shader.convection_coef = interface_get_convection_coef; interface_shader.temperature = NULL; - interface_shader.reflectivity_spec = interface_get_reflectivity_spec; - interface_shader.reflectivity_diff = interface_get_reflectivity_diff; + interface_shader.emissivity = interface_get_emissivity; + interface_shader.specular_fraction = interface_get_specular_fraction; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &interf) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); diff --git a/src/test_sdis_solve_probe2.c b/src/test_sdis_solve_probe2.c @@ -198,8 +198,8 @@ main(int argc, char** argv) /* Create the fluid/solid interface with no limit conidition */ interface_shader.convection_coef = null_interface_value; interface_shader.temperature = NULL; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, NULL, &Tnone) == RES_OK); @@ -210,8 +210,8 @@ main(int argc, char** argv) interface_param->temperature = 300; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T300) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); @@ -223,8 +223,8 @@ main(int argc, char** argv) interface_param->temperature = 350; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T350) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); diff --git a/src/test_sdis_solve_probe2_2d.c b/src/test_sdis_solve_probe2_2d.c @@ -195,8 +195,8 @@ main(int argc, char** argv) /* Create the fluid/solid interface with no limit conidition */ interface_shader.convection_coef = null_interface_value; interface_shader.temperature = NULL; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, NULL, &Tnone) == RES_OK); @@ -207,8 +207,8 @@ main(int argc, char** argv) interface_param->temperature = 300; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T300) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); @@ -220,8 +220,8 @@ main(int argc, char** argv) interface_param->temperature = 350; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T350) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); diff --git a/src/test_sdis_solve_probe3.c b/src/test_sdis_solve_probe3.c @@ -225,8 +225,8 @@ main(int argc, char** argv) /* Create the fluid/solid interface with no limit conidition */ interface_shader.convection_coef = null_interface_value; interface_shader.temperature = NULL; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, NULL, &Tnone) == RES_OK); @@ -237,8 +237,8 @@ main(int argc, char** argv) interface_param->temperature = 300; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T300) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); @@ -250,8 +250,8 @@ main(int argc, char** argv) interface_param->temperature = 350; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T350) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); @@ -259,8 +259,8 @@ main(int argc, char** argv) /* Create the solid/solid interface */ interface_shader.convection_coef = NULL; interface_shader.temperature = NULL; - interface_shader.reflectivity_diff = NULL; - interface_shader.reflectivity_spec = NULL; + interface_shader.specular_fraction = NULL; + interface_shader.emissivity = NULL; CHK(sdis_interface_create (dev, solid, solid, &interface_shader, NULL, &solid_solid) == RES_OK); diff --git a/src/test_sdis_solve_probe3_2d.c b/src/test_sdis_solve_probe3_2d.c @@ -220,8 +220,8 @@ main(int argc, char** argv) /* Create the fluid/solid interface with no limit conidition */ interface_shader.convection_coef = null_interface_value; interface_shader.temperature = NULL; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, NULL, &Tnone) == RES_OK); @@ -232,8 +232,8 @@ main(int argc, char** argv) interface_param->temperature = 300; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T300) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); @@ -245,8 +245,8 @@ main(int argc, char** argv) interface_param->temperature = 350; interface_shader.convection_coef = null_interface_value; interface_shader.temperature = interface_get_temperature; - interface_shader.reflectivity_spec = null_interface_value; - interface_shader.reflectivity_diff = null_interface_value; + interface_shader.emissivity = null_interface_value; + interface_shader.specular_fraction = null_interface_value; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, data, &T350) == RES_OK); CHK(sdis_data_ref_put(data) == RES_OK); @@ -254,8 +254,8 @@ main(int argc, char** argv) /* Create the solid/solid interface */ interface_shader.convection_coef = NULL; interface_shader.temperature = NULL; - interface_shader.reflectivity_diff = NULL; - interface_shader.reflectivity_spec = NULL; + interface_shader.specular_fraction = NULL; + interface_shader.emissivity = NULL; CHK(sdis_interface_create (dev, solid, solid, &interface_shader, NULL, &solid_solid) == RES_OK); diff --git a/src/test_sdis_solve_probe_2d.c b/src/test_sdis_solve_probe_2d.c @@ -185,8 +185,8 @@ main(int argc, char** argv) /* Create the solid/fluid interface */ interface_shader.convection_coef = interface_get_convection_coef; interface_shader.temperature = NULL; - interface_shader.reflectivity_spec = interface_null_reflectivity; - interface_shader.reflectivity_diff = interface_null_reflectivity; + interface_shader.emissivity = interface_null_reflectivity; + interface_shader.specular_fraction = interface_null_reflectivity; CHK(sdis_interface_create (dev, solid, fluid, &interface_shader, NULL, &interf) == RES_OK);