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 c364464ff87f6cab19a38ac87457e6d61daabde3
parent 067f9c24fbf1ed931a3bee23ced44ef960836b96
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  1 Feb 2023 15:46:18 +0100

Ajoute la structure sgs_scene

Cette structure, anticipée dans les sources Noweb, décrit l'entièreté de
la scène. Elle contient non seulement sa géométrie mais aussi ses autres
données telle que la taille du récepteur ainsi que la taille des surfaces
réfléchissantes et émettrices. Les sources C du calcul de sensibilité
n'utilise que les seules données géométriques.

Diffstat:
Msrc/sgs.c | 41++++++++++++++++++++++++++++++++++++++---
Msrc/sgs_c.h | 11++++++++++-
Msrc/sgs_compute_sensitivity_translation.c | 8++++----
3 files changed, 52 insertions(+), 8 deletions(-)

diff --git a/src/sgs.c b/src/sgs.c @@ -27,9 +27,44 @@ #include <star/s3d.h> #include <rsys/cstr.h> +#include <rsys/double3.h> #include <rsys/mem_allocator.h> /******************************************************************************* + * Helper functions + ******************************************************************************/ +static res_T +setup_scene(struct sgs* sgs, const struct sgs_args* args) +{ + double sz[3]; + res_T res = RES_OK; + + res = sgs_geometry_box_create(sgs, &args->geom, &sgs->scene.geom); + if(res != RES_OK) goto error; + + d3_sub(sz, args->geom.upper, args->geom.lower); + + /* Setup the 2D size of the emitting surface (YZ frame) */ + sgs->scene.Se_sz[0] = sz[1]; + sgs->scene.Se_sz[1] = sz[2]; + + /* Setup the 2D size of the reflective surface (XY frame) */ + sgs->scene.Sr_sz[0] = sz[0]; + sgs->scene.Sr_sz[1] = sz[1]; + + /* Setup the 2D lower/upper bounds of the receiver */ + sgs->scene.recv_min[0] = sz[0]*1.0/8.0 + args->geom.lower[0]; + sgs->scene.recv_min[1] = sz[1]*3.0/8.0 + args->geom.lower[1]; + sgs->scene.recv_max[0] = sz[0]*3.0/8.0 + args->geom.lower[0]; + sgs->scene.recv_max[1] = sz[1]*5.0/8.0 + args->geom.lower[1]; + +exit: + return res; +error: + goto exit; +} + +/******************************************************************************* * sgs API ******************************************************************************/ res_T @@ -65,7 +100,7 @@ sgs_create goto error; } - res = sgs_geometry_box_create(sgs, &args->geom, &sgs->geom); + res = setup_scene(sgs, args); if(res != RES_OK) goto error; exit: @@ -85,7 +120,7 @@ sgs_release(struct sgs* sgs) ASSERT(sgs); if(sgs->s3d) S3D(device_ref_put(sgs->s3d)); - if(sgs->geom) sgs_geometry_ref_put(sgs->geom); + if(sgs->scene.geom) sgs_geometry_ref_put(sgs->scene.geom); logger_release(&sgs->logger); MEM_RM(sgs->allocator, sgs); } @@ -135,7 +170,7 @@ sgs_run(struct sgs* sgs) ASSERT(sgs); if(sgs->dump_geometry) { - res = sgs_geometry_dump_vtk(sgs->geom, stdout); + res = sgs_geometry_dump_vtk(sgs->scene.geom, stdout); if(res != RES_OK) goto error; } else { res = compute_sensitivity_translation(sgs); diff --git a/src/sgs_c.h b/src/sgs_c.h @@ -26,9 +26,18 @@ #include <rsys/logger.h> #include <rsys/rsys.h> +struct sgs_scene { + struct sgs_geometry* geom; + + double Sr_sz[2]; /* 2D size of the reflective surface (in XY frame) */ + double Se_sz[2]; /* 2D size of the emitting surface (in YZ frame) */ + double recv_min[2]; /* 2D lower bound of the receiver (in XY frame) */ + double recv_max[2]; /* 2D upper bound of the receiver (in XY frame) */ +}; + struct sgs { struct s3d_device* s3d; - struct sgs_geometry* geom; + struct sgs_scene scene; size_t nrealisations; /* #realisations */ unsigned int nthreads; /* #threads */ diff --git a/src/sgs_compute_sensitivity_translation.c b/src/sgs_compute_sensitivity_translation.c @@ -265,10 +265,10 @@ realisation res_T res = RES_OK; (void)ithread; - setup_scene(sgs->geom, &scn); + setup_scene(sgs->scene.geom, &scn); /* Sample the sensitivity emissive surface */ - sgs_geometry_sample(sgs->geom, rng, &frag); + sgs_geometry_sample(sgs->scene.geom, rng, &frag); d3_set(pos_emit_s, frag.position); d3_set(normal_s, frag.normal); surf_emit_s = frag.surface; @@ -279,7 +279,7 @@ realisation /* Helper macro used as syntactic sugar */ #define TRACE_RAY(Org, Dir, StartFrom, Hit) { \ const double range[2] = {0, DBL_MAX}; \ - sgs_geometry_trace_ray(sgs->geom, (Org), (Dir), range, (StartFrom), (Hit));\ + sgs_geometry_trace_ray(sgs->scene.geom, (Org), (Dir), range, (StartFrom), (Hit));\ if(SGS_HIT_NONE(&hit)) { res = RES_BAD_ARG; goto error; } \ } (void)0 @@ -354,7 +354,7 @@ compute_sensitivity_translation(struct sgs* sgs) res_T res = RES_OK; ASSERT(sgs); - if(sgs_geometry_get_sampling_mask(sgs->geom) != SGS_SURFACE_Z_MAX) { + if(sgs_geometry_get_sampling_mask(sgs->scene.geom) != SGS_SURFACE_Z_MAX) { sgs_log_err(sgs, "Invalid sensitivity emissive surface. Only positive Z face of the box " "geometry can be a sensitivity source.\n");