commit a9380f4e1955cc936bb58d7144049da30c9014d4
parent 1f61fa3253faedb28f5feae43b9b420933e70452
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 14 Dec 2022 18:55:03 +0100
Rédaction de l'annexe sur la fonction de calcul
Dans cette validation débute l'écriture de la fonction principale
du calcul qui utilise Star-MonteCarlo pour lancer en parallèle
notre intégration Monte-Carlo.
Diffstat:
2 files changed, 90 insertions(+), 6 deletions(-)
diff --git a/src/biblio.bib b/src/biblio.bib
@@ -0,0 +1,11 @@
+@article{
+ matsumoto1998mersenne,
+ title={Mersenne twister: a 623-dimensionally equidistributed uniform pseudo-random number generator},
+ author={Matsumoto, Makoto and Nishimura, Takuji},
+ journal={ACM Transactions on Modeling and Computer Simulation (TOMACS)},
+ volume={8},
+ number={1},
+ pages={3--30},
+ year={1998},
+ publisher={ACM New York, NY, USA}
+}
diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw
@@ -50,6 +50,7 @@
%Math et symboles
\newcommand{\PI}{\ddot \pi}
\newcommand{\etc}{\textit{etc.}}
+\newcommand{\ie}{\textit{i.e.}}
\begin{document}
\pagestyle{noweb}
@@ -342,6 +343,7 @@ données par les conditions aux limites décrites par les équations
% Algorithme Direct
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Résolution par Monte-Carlo}
+\label{sec:monte-carlo}
\paragraph{Commentaires}
On veut estimer par Monte-Carlo la sensibilité géométrique du flux reçu par le
@@ -375,7 +377,7 @@ realisation
const struct sgs_scene* scene,
double* w)
{
- <<données locales à la fonction>>
+ <<données locales à la fonction de réalisation>>
res_T res = RES_OK;
<<échantillonner un chemin du problème couplé>>
@@ -683,7 +685,7 @@ stocke le triangle sur lequel se trouve l'origine du rayon, une donnée d'entré
utilisé pour éviter une auto-intersection, c'est à dire l'intersection du
rayon avec le triangle dont il est issu.
-<<données locales à la fonction>>=
+<<données locales à la fonction de réalisation>>=
/* Macro utilisée comme sucre syntaxique */
#define TRACE_RAY(Org, Dir, StartFrom, Hit) { \
double range[2]; \
@@ -701,7 +703,7 @@ rayon avec le triangle dont il est issu.
Enfin, nous déclarons ci-après l'ensemble des variables locales nécessaires à
la réalisation que nous venons d'écrire:
-<<données locales à la fonction>>=
+<<données locales à la fonction de réalisation>>=
/* Variables de la source de sensibilité */
double dir_emit_s[3];
double pos_emit_s[3];
@@ -896,10 +898,81 @@ pourra donc être utilisé pour vérification par différences finies.
w[1] = weight;
@
-\section{Boucle d'intégration}
+\section{Fonction de calcul}
-\paragraph{TODO} Utiliser Star-MC pour lancer le calcul et afficher les
-résultats.
+\paragraph{}
+Le programme présenté jusqu'alors s'est concentré sur la mise en {\oe}uvre de
+la seule fonction de réalisation de notre algorithme de Monte-Carlo; la boucle
+d'intégration, l'accumulation des poids ou encore l'affichage des résultats y
+sont absents. Dans cette section nous détaillons ces étapes manquantes afin de
+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>>=
+res_T
+compute(struct sgs* sgs)
+{
+ <<variables locales au calcul de sensibilité>>
+ res_T res = RES_OK;
+
+ <<exécuter l'intégration Monte Carlo>>
+ <<afficher les résultats de l'estimation>>
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+@
+
+\paragraph{} Dans cette fonction on commence par exécuter l'intégration
+Monte-Carlo. Cette étape consiste à invoquer notre fonction de
+[[<<réalisation>>]] autant de fois que de nombre de réalisations demandées, et
+à accumuler les poids qu'elle retourne. D'apparence triviale, cette simple
+boucle s'avère plus compliquée pour qui souhaite paralléliser son calcul. Au
+delà des questions propres à une exécution parallèle, d'aucun doit s'assurer
+que chaque processus dispose d'une séquence de nombre aléatoires qui lui est
+propre. C'est pourquoi nous utilisons ici la bibliothèque
+\texttt{Star-MonteCarlo} en charge de cette intégration parallèle. Pour cela
+nous créons d'abord un système \texttt{Star-MonteCarlo}, c'est à dire une
+variable qui matérialise la bibliothèque à l'échelle de notre programme
+([[smc]]). Et nous le configurons pour qu'il utilise le journal d'évènement
+([[logger]]), l'allocateur mémoire ([[allocator]]) et le nombre de processus
+légers ([[nthreads]]) soumis en entrée de la fonction via la variable [[sgs]].
+Nous configurons enfin le type de générateur aléatoire à utiliser, en
+l'occurrence le générateur pseudo alétoire
+Mersenne-Twister~\cite{matsumoto1998mersenne} ([[SSP_RNG_MT19937_64]]). Nous
+pouvons alors lancer l'intégration Monte-Carlo à proprement parler. Pour cela
+nous définissons un intégrateur qui détermine la fonction à appeler à chaque
+réalisation ([[run_realisation]]), le type de poids calculés ([[smc_doubleN]],
+{\ie} un vecteur de réels) et le nombre total de réalisations
+([[nrealisations]]) défini comme paramètre d'entrée via la variable [[sgs]].
+
+<<exécuter l'intégration Monte Carlo>>=
+/* Configurer et créer le système Star-MonteCarlo */
+smc_args.logger = &sgs->logger;
+smc_args.allocator = sgs->allocator;
+smc_args.nthreads_hint = sgs->nthreads_hint;
+smc_args.rng_type = SSP_RNG_MT19937_64;
+res = smc_device_create(&smc_args, &smc);
+if(res != RES_OK) goto error;
+
+/* Configurer l'intégrateur */
+integrator.integrand = run_realisation;
+integrator.type = &smc_doubleN;
+integrator.max_realisations = sgs->nrealisations;
+ctx.count = 2; /* Nombre de poids calculés (Sensibilité & "luminance") */
+ctx.integrand_data = sgs; /* Données d'entrée de la fonction integrand */
+
+/* Intégration Monte-Carlo */
+res = smc_solve(smc, &integrator, &ctx, &estimator);
+if(res != RES_OK) goto error;
+@
+
+\paragraph{TODO}
+Expliquer brièvement la variable [[ctx]] et la fonction [[run_realisation]] que
+l'on défini dans la foulée dans un bloc [[<<fonctions utilitaires>>]]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Annexe structure du C