commit 052bcf4adc48169bf6954299e33019faff8ce3fa
parent 17583c83f9f49240019d2e74e907fe80570177af
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 19 Oct 2022 17:28:54 +0200
Débute la rédaction lettrée de la réalisation
Diffstat:
2 files changed, 88 insertions(+), 22 deletions(-)
diff --git a/src/sgs_compute_sensitivity_translation.c b/src/sgs_compute_sensitivity_translation.c
@@ -294,6 +294,8 @@ realisation
#undef TRACE_RAY
+ /* Calcul du poids */
+
d3_set(normal_e, hit.normal);
d3_minus(dir_spec_e, dir_spec_s);
diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw
@@ -318,28 +318,92 @@ données par les conditions aux limites décrites par les équations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Résolution par Monte-Carlo}
-\begin{itemize}
- \item Décrire brièvement le modèle + CL;
- \item identifier les sources + couplages;
- \item appel au modèle du gradient spatial et à la luminance pour évaluer les
- sources de sensib: double randomization;
- \item Donner le choix algorithmique qui est d'échantillonner les sources;
-\end{itemize}
-
-\subsubsection{Le chemin}
-\subsubsection{Le poids}
-
-\subsection{Algorithm \textit{reverse}}
-\subsubsection{Le chemin}
-\subsubsection{Le poids}
-
-\paragraph{}
+\paragraph{Commentaires}
On veut estimer par Monte-Carlo la sensibilité géométrique du flux reçu par le
récepteur à l'épaisseur du cube. On va donc écrire un fichier
[[sgs_compute_trans_sensib.c]] qui lance ce calcul et affiche le résultat.
Ce fichier contient entre autre la boucle d'intégration et la fonction de
réalisation de l'algorithme.
+\paragraph{}
+On a identifié les sources. On choisit d'utiliser un algorithme direct pour
+résoudre le problème, c'est à dire de propager les sources jusqu'au récepteur
+par un échantillonnage des sources et des chemins qui les propageront vers le
+récepteur.
+
+\paragraph{}
+La présente mise en oeuvre est particulière dans le sens où le chemin (du
+problème couplé) est d'abord échantillonné en totalité
+(section~\ref{subsec:chemin}). Son poids n'est calculé qu'a posteriori à partir
+des données dudit chemin (section~\ref{subsec:poids}).
+
+\paragraph{}
+La fonction en charge d'échantillonner un chemin et d'en calculer le poids est
+la fonction [[realisation]] qui a 3 arguments: une liste de poids Monte-Carlo
+renvoyés par la fonction ([[weights]]), un générateur de nombres aléatoires
+([[rng]]), et un pointeur vers les données qui décrivent notre système
+([[scene]]).
+
+<<réalisation>>=
+
+/* TODO move me */
+struct sgs_scene {
+ struct sgs_geometry* geom;
+ /* TODO décrire le récepteur */
+};
+
+static res_T
+realisation
+ (double weights[WEIGHTS_COUNT__],
+ struct rng* rng,
+ const struct sgs_scene* scene)
+{
+ <<variables locales>>
+ res_T res = RES_OK;
+
+ <<échantilloner un chemin>>
+ <<calculer le poid du chemin>>
+
+exit:
+ return res;
+error:
+ goto exit;
+@
+
+\subsection{Le chemin}
+\label{subsec:chemin}
+
+\paragraph{}
+On commence par échantillonner la surface de la source de sensibilité $S_r$
+point de départ de notre chemin de sensibilité complété ensuite par un chemin
+de dérivée spatiale dont la combinaison est le chemin du problème couplé.
+
+<<échantillonner un chemin du problème couplé>>=
+ <<échantillonner une position sur la source de sensibilité>>
+ <<échantillonner un chemin de sensibilité>>
+ <<échantillonner un chemin de dérivée spatiale>>
+@
+
+\paragraph{}
+On utilise la fonction [[sgs_geometry_sample_sensibility_source]] pour
+échantillonner uniformément un point sur la surface émettrice de sensibilité et
+on stocke dans les variables [[pos_emit_s]] et [[normal_s]] sa position et la
+normale correspondante. On récupère également dans [[surf_emit_s]]
+l'identifiant de la surface que l'on vient d'échantillonner, dans notre cas la
+surface supérieure $S_r$ identifié dans le code par la constante
+[[SGS_SURFACE_Z_MAX]].
+
+<<échantillonner une position sur la source de sensibilité>>=
+ /* Sample the sensitivity emissive surface */
+ sgs_geometry_sample_sensibility_source(scene->geom, rng, &frag);
+ d3_set(pos_emit_s, frag.position);
+ d3_set(normal_s, frag.normal);
+ surf_emit_s = frag.surface; /* must be SGS_SURFACE_Z_MAX */
+@
+
+\subsection{Le poids}
+\label{subsec:poids}
+
% TODO mettre le schéma
<<sgs\_compute\_sensitivity\_translation.c>>=
@@ -385,6 +449,12 @@ error:
% TODO travailler le référencement des blocs de code dans le Latex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Les données
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Récupérer les données de la scène}
+\label{sec:get-scene-data}
+
\paragraph{}
Algo Monte-Carlo fortement lié à la scène. Pas d'orthogonalité
données/traitement~:
@@ -396,12 +466,6 @@ données/traitement~:
(section~\ref{sec:sample-path}).
\end{itemize}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Les données
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Récupérer les données de la scène}
-\label{sec:get-scene-data}
-
\paragraph{} La scène utilisée dans cet exemple est une parallélépipède
quelconque aligné aux axes, c'est à dire l'utilisateur peut définir
librement et sa dimension et son positionnement dans le repère. On