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