commit 5d0dc00b94833aac4669978fdcd9ce6361bd3d17
parent d09048f5d4035f89afb9adb1eea955436e608645
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 11 Jan 2023 18:44:14 +0100
Rédige plusieurs fonctions utilitaires
Dans cette validation sont ajoutées plusieurs fonctions utilitaires qui
n'étaient pas encore écrites ou traduites en noweb. Ces fonctions sont
pour l'instant regroupées dans la section "Structure de mise en oeuvre"
mais pourraient être amenées à être déplacées.
Diffstat:
1 file changed, 128 insertions(+), 23 deletions(-)
diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw
@@ -752,8 +752,8 @@ la réalisation que nous venons d'écrire:
double sensib;
/* Intersections avec la géométrie */
- struct s3d_hit hit0;
- struct s3d_hit hit1;
+ struct sgs_hit hit0;
+ struct sgs_hit hit1;
@
\paragraph{Note} Les variables du systèmes sont pi et hauteur et largeur de la
@@ -1003,7 +1003,7 @@ compléter le programme écrit jusqu'ici et ainsi proposer une mise en {\oe}uvre
complète de l'algorithme de Monte-Carlo objet du présent document. Ces étapes
sont regroupées dans la fonction qui suit:
-<<calculer la sensibilté à la translation>>=
+<<calculer la sensibilité à la translation>>=
res_T
compute(struct sgs* sgs)
{
@@ -1112,7 +1112,7 @@ permet de faciliter l'écriture et la lecture de la fonction [[realisation]] en
la libérant de contraintes fonctionnelles imposées par
\texttt{Star-MonteCarlo}.
-<<fonction utilitaire>>=
+<<fonctions utilitaires>>=
static res_T
run_realisation
(void* output,
@@ -1140,12 +1140,13 @@ articulation avec le reste des sources écrites en C notamment lors de
l'énumération des fichiers à inclure.
<<sgs\_compute\_sensitivity\_translation.c>>=
- <<liste des inclusions>>
+<<liste des inclusions>>
- <<constantes du système>>
+<<constantes du système>>
- <<fonction de réalisation>>
- <<boucle d'intégration>>
+<<fonctions utilitaires>>
+<<fonction de réalisation>>
+<<calculer la sensibilité à la translation>>
@
<<liste des inclusions>>=
@@ -1159,36 +1160,140 @@ l'énumération des fichiers à inclure.
#include <rsys/cstr.h>
@
-\section{A supprimer du noweb}
+<<fonctions utilitaires>>=
+static double
+get_rho
+ (const struct sgs_scene* scn,
+ const double pos[2])
+{
+ ASSERT(scn && pos);
-<<???>>=
-/* TODO move me */
-struct sgs_scene {
- struct sgs_geometry* geom;
- /* TODO décrire le récepteur */
-};
+ return 0.25
+ * (1 - cos(2*PI*pos[X]/scn->Sr_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scn->Sr_sz[Y]));
+}
+
+static double
+get_grad_rho
+ (const struct sgs_scene* scn,
+ const double pos[2],
+ double grad[2])
+{
+ ASSERT(scn && pos && grad);
+
+ grad[X] = 0.25
+ * (((2*PI)/scn->Sr_sz[X])*sin(2*PI*pos[X]/scn->Sr_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scn->Sr_sz[Y]));
+ grad[Y] = 0.25
+ * (((2*PI)/scn->Sr_sz[Y])*sin(2*PI*pos[Y]/scn->Sr_sz[Y]))
+ * (1 - cos(2*PI*pos[X]/scn->Sr_sz[X]));
+}
+@
+
+\paragraph{TODO avec Paule} Que vaut [[scn->Se_sz]]? S'assure qu'il faut bien
+prendre en compte {$\PI$}?
+
+<<fonctions utilitaires>>=
+static double
+get_Sb
+ (const struct sgs_scene* scn,
+ const double pos[2])
+{
+ ASSERT(position && size);
+ return
+ (1 - cos(2*PI*pos[X]/scn->Se_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scn->Se_sz[Y]));
+}
+
+static void
+compute_grad_Sb
+ (const struct sgs_scene* scn,
+ const double pos[2],
+ double grad[2])
+{
+ ASSERT(scn && pos && grad);
+
+ grad[X] =
+ (((2*PI)/scn->Se_sz[X])*sin(2*PI*pos[X]/scn->Se_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scn->Se_sz[Y]));
+ grad[Y] =
+ (((2*PI)/scn->Se_sz[Y])*sin(2*PI*pos[Y]/scn->Se_sz[Y]))
+ * (1 - cos(2*PI*pos[X]/scn->Se_sz[X]));
+}
+@
+
+<<fonctions utilitaires>>=
+static void
+get_Sr_area(const struct sgs_scene* scn)
+{
+ ASSERT(scn);
+ return scn->Sr_sz[X] * scn->Sr_sz[Y];
+}
+@
+<<fonctions utilitaires>>=
static int
hit_receiver
(struct sgs_scene* scn,
- const double pos_emit_s[3],
- const double dir_emit_s[3],
- const struct s3d_hit* hit)
+ const double ray_org[3],
+ const double ray_dir[3],
+ const struct sgs_hit* hit)
{
- /* TODO */
+ double hit_pos[3];
+ ASSERT(scn && ray_org && ray_dir && hit);
+
+ /* Le rayon n'intersecte pas la surface où le récepteur se trouve */
+ if(SGS_HIT_NONE(hit) || hit->surface != SGS_SURFACE_Z_MIN) {
+ return 0;
+ }
+
+ hit_pos[X] = ray_org[X] + hit->distance*ray_dir[X];
+ hit_pos[Y] = ray_org[Y] + hit->distance*ray_dir[Y];
+ hit_pos[Z] = ray_org[Z] + hit->distance*ray_dir[Z];
+
+ /* Le rayon n'intersecte pas le récepteur*/
+ if(hit_pos[X] < scn->recv_min[X] || hit_pos[X] > scn->recv_max[X]
+ || hit_pos[Y] < scn->recv_min[Y] || hit_pos[Y] > scn->recv_max[Y]) {
+ return 0;
+
+ /* Le rayon intersecte le récepteur*/
+ } else {
+ return 1;
+ }
}
+@
+<<fonctions utilitaires>>=
static int
hit_source
(struct sgs_scene* scn,
- const double pos_emit_s[3],
- const double dir_emit_s[3],
- const struct s3d_hit* hit)
+ const double ray_org[3],
+ const double ray_dir[3],
+ const struct sgs_hit* hit)
{
- /* TODO */
+ ASSERT(scn && ray_org && ray_dir && hit);
+ /* Éviter l'avertissement de compilation "variable inutilisée" */
+ (void)ray_org, (void)ray_dir;
+
+ if(SGS_HIT_NONE(hit) || hit->surface != SGS_SURFACE_X_MAX) {
+ return 0;
+ } else {
+ return 1;
+ }
}
@
+\section{A supprimer du noweb}
+
+<<???>>=
+/* TODO move me */
+struct sgs_scene {
+ struct sgs_geometry* geom;
+ /* TODO décrire le récepteur */
+};
+
+@
+
\bibliographystyle{apalike}
\bibliography{biblio}