star-gs

Literate program for a geometric sensitivity calculation
git clone git://git.meso-star.fr/star-gs.git
Log | Files | Refs | README | LICENSE

commit 6f0c04f4efc298cb78ffccd492849d61e6cd8e4c
parent 381594965e7475474acb11b1d66615853228bbfa
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  6 Jul 2022 16:26:51 +0200

Refactor the realisation of the sensitivity computation

Diffstat:
Msrc/sgs_compute_sensitivity_translation.c | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 90 insertions(+), 38 deletions(-)

diff --git a/src/sgs_compute_sensitivity_translation.c b/src/sgs_compute_sensitivity_translation.c @@ -28,28 +28,82 @@ /* Sugar syntax */ enum {X, Y, Z}; -enum {WEIGHT, SENSIT, WEIGHTS_COUNT__}; +enum {WEIGHT, SENSIB, WEIGHTS_COUNT__}; /* FIXME this should be variables */ #if 0 +/* Il semblerait que le cube soit de taille {4, 4, 3} */ static const double RECV_MIN[2] = {0.5, 1.5}; static const double RECV_MAX[2] = {1.5, 2.5}; static const double EMIT_E_THRESHOLD = 2; static const double EMIT_E_SZ[3] = {0, 4, 2}; static const double EMIT_S_SZ[3] = {4, 4, 0}; #else -static const double RECV_MIN[2] = {0.125, 0.375}; -static const double RECV_MAX[2] = {0.375, 0.625}; +static const double RECV_MIN[2] = {0.125/*<=>1/8*/, 0.375/*<=>3/8*/}; +static const double RECV_MAX[2] = {0.375/*<=>3/8*/, 0.625/*<=>5/8*/}; static const double EMIT_E_THRESHOLD = 2.0/3.0; static const double EMIT_E_SZ[3] = {0, 1, 2.0/3.0}; static const double EMIT_S_SZ[3] = {1, 1, 0}; #endif +/* Vecteur de déformation (à renommer en gamma ?) */ static const double V[3] = {0, 0, 1}; /******************************************************************************* * Helper functions ******************************************************************************/ +static double +compute_rho + (const double position[2], /* Position sur la surface réfléchissante */ + const double size[2]) /* Taille de la surface réfléchissante */ +{ + ASSERT(position && size); + return 0.25 + * (1 - cos(2*PI*position[X]/size[X])) + * (1 - cos(2*PI*position[Y]/size[Y])); +} + +static void +compute_grad_rho + (const double position[2], /* Position sur la surface réfléchissante */ + const double size[2], /* Taille de la surface réfléchissante */ + double out_gradient[2]) +{ + ASSERT(position && size && out_gradient); + out_gradient[X] = 0.25 + * (((2*PI)/size[X])*sin(2*PI*position[X]/size[X])) + * (1 - cos(2*PI*position[Y]/size[Y])); + out_gradient[Y] = 0.25 + * (((2*PI)/size[Y])*sin(2*PI*position[Y]/size[Y])) + * (1 - cos(2*PI*position[X]/size[X])); +} + +static double +compute_I + (const double position[2], /* Position sur la surface émettrice */ + const double size[2]) /* Taille de la surface émettrice */ +{ + ASSERT(position && size); + return + (1 - cos(2*PI*position[X]/size[X])) + * (1 - cos(2*PI*position[Y]/size[Y])); +} + +static void +compute_grad_I + (const double position[2], /* Position sur la surface réfléchissante */ + const double size[2], /* Taille de la surface réfléchissante */ + double out_gradient[2]) +{ + ASSERT(position && size && out_gradient); + out_gradient[X] = + (((2*PI)/size[X])*sin(2*PI*position[X]/size[X])) + * (1 - cos(2*PI*position[Y]/size[Y])); + out_gradient[Y] = + (((2*PI)/size[Y])*sin(2*PI*position[Y]/size[Y])) + * (1 - cos(2*PI*position[X]/size[X])); +} + static res_T realisation (void* weights, @@ -65,8 +119,8 @@ realisation double recv_min[2]; double recv_max[2]; double emit_e_threshold; - double emit_e_sz[3]; - double emit_s_sz[3]; + double emit_e_sz[3], emit_e_sz_2d[2]; + double emit_s_sz[3], emit_s_sz_2d[2]; double box_low[3]; double box_upp[3]; @@ -78,8 +132,8 @@ realisation double dir_emit_s[3]; double dir_spec_e[3]; double dir_spec_s[3]; - double pos_emit_e[3]; - double pos_emit_s[3]; + double pos_emit_e[3], pos_emit_e_2d[2]; + double pos_emit_s[3], pos_emit_s_2d[2]; double pos_recv[3]; double range[2]; @@ -97,11 +151,11 @@ realisation double beta_spec_e; double beta_emit_s; double beta_spec_s; - + double rho; - double grad_rho[3]; + double grad_rho[3], grad_rho_2d[2]; double I; - double grad_I[3]; + double grad_I[3], grad_I_2d[2]; double S; @@ -143,12 +197,12 @@ realisation /* Sample the cosine weighted sampling of the emissive direction */ ssp_ran_hemisphere_cos(rng, frag.normal, dir_emit_s, NULL); - + /* Trace the ray from the sensitivity emissive surface */ sgs_geometry_trace_ray (sgs->geom, pos_emit_s, dir_emit_s, range, surf_emit_s, &hit); if(SGS_HIT_NONE(&hit)) { - res = RES_OK; + res = RES_BAD_ARG; goto error; } pos_recv[X] = pos_emit_s[X] + hit.distance*dir_emit_s[X]; @@ -167,7 +221,7 @@ realisation sgs_geometry_trace_ray (sgs->geom, pos_emit_s, dir_spec_s, range, surf_emit_s, &hit); if(SGS_HIT_NONE(&hit)) { - res = RES_OK; + res = RES_BAD_ARG; goto error; } pos_emit_e[X] = pos_emit_s[X] + hit.distance*dir_spec_s[X]; @@ -209,30 +263,28 @@ realisation beta_emit_e = d3_normalize(u_emit_e, u_emit_e); beta_spec_e = d3_normalize(u_spec_e, u_spec_e); - rho = 0.25 - * (1 - cos(2*PI*pos_emit_s[X]/emit_s_sz[X])) - * (1 - cos(2*PI*pos_emit_s[Y]/emit_s_sz[Y])); - grad_rho[X] = 0.25 - * (((2*PI)/emit_s_sz[X])*sin(2*PI*pos_emit_s[X]/emit_s_sz[X])) - * (1 - cos(2*PI*pos_emit_s[Y]/emit_s_sz[Y])); - grad_rho[Y] = 0.25 - * (((2*PI)/emit_s_sz[Y])*sin(2*PI*pos_emit_s[Y]/emit_s_sz[Y])) - * (1 - cos(2*PI*pos_emit_s[X]/emit_s_sz[X])); + pos_emit_s_2d[X] = pos_emit_s[X]; + pos_emit_s_2d[Y] = pos_emit_s[Y]; + emit_s_sz_2d[X] = emit_s_sz[X]; + emit_s_sz_2d[Y] = emit_s_sz[Y]; + rho = compute_rho(pos_emit_s_2d, emit_s_sz_2d); + compute_grad_rho(pos_emit_s_2d, emit_s_sz_2d, grad_rho_2d); + grad_rho[X] = grad_rho_2d[X]; + grad_rho[Y] = grad_rho_2d[Y]; grad_rho[Z] = 0; - I = - (1 - cos(2*PI*pos_emit_e[Y]/emit_e_sz[Y])) - * (1 - cos(2*PI*pos_emit_e[Z]/emit_e_sz[Z])); + pos_emit_e_2d[X] = pos_emit_e[Y]; + pos_emit_e_2d[Y] = pos_emit_e[Z]; + emit_e_sz_2d[X] = emit_e_sz[Y]; + emit_e_sz_2d[Y] = emit_e_sz[Z]; + I = compute_I(pos_emit_e_2d, emit_e_sz_2d); + compute_grad_I(pos_emit_e_2d, emit_e_sz_2d, grad_I_2d); grad_I[X] = 0; - grad_I[Y] = - (((2*PI)/emit_e_sz[Y])*sin(2*PI*pos_emit_e[Y]/emit_e_sz[Y])) - * (1 - cos(2*PI*pos_emit_e[Z]/emit_e_sz[Z])); - grad_I[Z] = - (((2*PI)/emit_e_sz[Z])*sin(2*PI*pos_emit_e[Z]/emit_e_sz[Z])) - * (1 - cos(2*PI*pos_emit_e[Y]/emit_e_sz[Y])); - - S = - - beta_emit_s * d3_dot(grad_rho, u_emit_s) * I + grad_I[Y] = grad_I_2d[X]; + grad_I[Z] = grad_I_2d[Y]; + + S = + - beta_emit_s * d3_dot(grad_rho, u_emit_s) * I - rho * beta_emit_s * beta_emit_e * d3_dot(grad_I, u_emit_e) + rho * beta_spec_s * beta_spec_e * d3_dot(grad_I, u_spec_e); @@ -241,7 +293,7 @@ realisation exit: SMC_DOUBLEN(weights)[WEIGHT] = w; - SMC_DOUBLEN(weights)[SENSIT] = s; + SMC_DOUBLEN(weights)[SENSIB] = s; return res; error: goto exit; @@ -314,11 +366,11 @@ compute_sensitivity_translation(struct sgs* sgs) } /* Print the result */ - sgs_log(sgs, "estim ~ %g +/- %g; sensib ~ %g +/- %g\n", + sgs_log(sgs, "estim ~ %g +/- %g; sensib ~ %g +/- %g\n", SMC_DOUBLEN(status.E)[WEIGHT], SMC_DOUBLEN(status.SE)[WEIGHT], - SMC_DOUBLEN(status.E)[SENSIT], - SMC_DOUBLEN(status.SE)[SENSIT]); + SMC_DOUBLEN(status.E)[SENSIB], + SMC_DOUBLEN(status.SE)[SENSIB]); sgs_log(sgs, "#failures = %lu/%lu\n", (unsigned long)status.NF, (unsigned long)sgs->nrealisations);