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 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:
Msrc/biblio.bib | 11+++++++++++
Msrc/sgs_compute_sensitivity_translation.nw | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
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