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 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:
Msrc/sgs_compute_sensitivity_translation.c | 2++
Msrc/sgs_compute_sensitivity_translation.nw | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
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