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 1f61fa3253faedb28f5feae43b9b420933e70452
parent 3bf7412198e20d2cabde5b206d848ebe3ea0a458
Author: Paule Lapeyre <paule.lapeyre@yahoo.fr>
Date:   Wed,  7 Dec 2022 17:03:59 +0100

Relecture globale des sources noweb

Nous avons ici retravaillé la sources noweb dans leur ensemble en vue du
travail qu'il nous reste désormais à réaliser pour mener à son terme la
rédaction du programme.

Dans l'introduction a été retravaillé le positionnement du document et
l'explicitation de ses messages.

Plusieurs parties, renvoyées en fin de document, ont été simplement
supprimées. Parmi elles figurent les premiers gribouillis du source
noweb, depuis longtemps remplacés. Ou encore des ébauches de sections
qui concernaient la description du système (géométrie et propriétés
physiques), une description qui peut se contenter d'une écriture en C.

Enfin, nous avons structuré et annoté les annexes en supprimant de ces
dernières l'entête du fichier source décrivant le copyright et la
licence du fichier C extrait du noweb. Cet en-tête est considéré comme
inutile puisque ce fichier n'a pas vocation a été distribué. Il est un
fichier intermédiaire, issue de la compilation des sources écrites en
noweb. En cela il s'apparente à un fichier objet.

Diffstat:
Msrc/sgs_compute_sensitivity_translation.nw | 291++++++++++++++++++++++++++++++-------------------------------------------------
1 file changed, 109 insertions(+), 182 deletions(-)

diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw @@ -49,6 +49,7 @@ %Math et symboles \newcommand{\PI}{\ddot \pi} +\newcommand{\etc}{\textit{etc.}} \begin{document} \pagestyle{noweb} @@ -57,24 +58,44 @@ \maketitle \paragraph{} -Construction analogue d'un algorithme de sensibilité. +Ce document est un exercice dans lequel on choisit de décrire un exemple de +sensibilité sans aucune ambition de généralité en se concentrant sur une +configuration simplifiée. Contrairement à une pratique Monte-Carlo plus +conventionnelle, nous aurons à vu l'entièreté des données qui décrivent notre +systèmes à savoir sa configuration géométriques et ses propriétés physiques. +Dit autrement, nous saurons à chaque instant où se situ nos chemins et ainsi +nous pourrons référencer les différentes étapes de suivi de ces chemins +relativement aux parois de notre scène (ex: paroi de droite, surface émettrice, +{\etc}). \paragraph{} -Ce document est un exercice dans lequel on choisit de décrire un exemple de -sensibilité sans aucune ambition de généralité en se concentrant sur "4+1": - - On se pose un pbr de sensib - - On a identifié les sources de sensib - - On a identifié un couplage ou niveau des sources - - On utilise MC pour résoudre le pbr (par double random) - - On résout le pbr de sensib jusqu'à sa mise en oeuvre - -\paragraph{} Le but du présent document est d'illustrer la mise en oeuvre -algorithmique d'un calcul de sensibilité sur un exemple simple. Le problème est -décrit par un parallélépipède dont les parois sont toutes noires à l'exception -de la paroi supérieure qui est spéculaire (figure~\ref{fig:configuration}). La -déformation géométrique que nous considérons est une translation de cette -paroi. Nous étudions l'impact de cette translation sur le flux reçu par un -récepteur situé sur la paroi inférieure. +Par cette démarche nous proposons de construire un algorithme de sensibilité de +manière analogue comme nous savons le faire en transfert radiatif +(\textbf{NOTE} insister sur l'héritage Monte-Carlo en transfert radiatif ici +reprit à l'identique pour une formulation analogue grace au modèle de +sensibilité). Le principe consiste à identifier les sources du problèmes et de +les propéger jusqu'au récepteur en fonction des propriétés (physiques et +géométriques) du système: + +\begin{itemize} + \item on se pose un pbr de sensib; + \item on a identifié les sources de sensib; + \item on a identifié un couplage ou niveau des sources; + \item on utilise MC pour résoudre le pbr (par double random); + \item on résout le pbr de sensib jusqu'à sa mise en oeuvre. +\end{itemize} + +\paragraph{TODO} Parler que l'on va décrire l'algorithme jusqu'à sa mise en +oeuvre explicite dans le code. + +\paragraph{Descrition du système} Le but du présent document est d'illustrer la +mise en oeuvre algorithmique d'un calcul de sensibilité sur un exemple simple +(\textbf{NOTE} phrase à refaire... Comme toutes les autres :-)). Le problème +est décrit par un parallélépipède dont les parois sont toutes noires à +l'exception de la paroi supérieure qui est spéculaire +(figure~\ref{fig:configuration}). La déformation géométrique que nous +considérons est une translation de cette paroi. Nous étudions l'impact de cette +translation sur le flux reçu par un récepteur situé sur la paroi inférieure. \begin{figure} \centering @@ -723,8 +744,9 @@ la réalisation que nous venons d'écrire: struct s3d_hit hit1; @ -\paragraph{TODO} Les variables du systèmes sont pi et hateur et largeur de la -géométrie +\paragraph{Note} Les variables du systèmes sont pi et hauteur et largeur de la +géométrie. Ce sont des paramètres en entrée du programme (arguments de la ligne +de commande). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Résultats @@ -734,109 +756,12 @@ géométrie \paragraph{TODO} À écrire qd on aura le programme fonctionnel. +\appendix + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Les données +% Annexe CL de sensibilité %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{Récupérer les données de la scène} -\label{sec:get-scene-data} - -\paragraph{TODO} à mettre en annexe ou pas... - -\paragraph{} -Algo Monte-Carlo fortement lié à la scène. Pas d'orthogonalité -données/traitement~: -\begin{itemize} - \item on a à l'échelle de la réalisation une description complète de - la scène considérée (section~\ref{sec:get-scene-data})\,; - \item les poids MC sont calculés (section~\ref{sec:mc-weight}) étant - donné le chemin préalablement échantillonné - (section~\ref{sec:sample-path}). -\end{itemize} - -\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 -récupère ses données spatiales (dimensions et position) via la boîte -englobante de la géométrie. Ses caractéristiques sont stockées dans les -variables locales [[box_low]], [[box_upp]], et [[box_sz]]. Notre -géométrie étant un parallélépipède, elle est confondue avec sa propre -boîte englobante. - -<<liste de variables locales>>= -double box_low[3]; /* Lower bound of the box */ -double box_upp[3]; /* Upper bound of the box */ -double box_sz[3]; /* Size of the box */ -@ -<<récupérer la description de la scène>>= -sgs_geometry_get_aabb(sgs->geom, box_low, box_upp); -d3_sub(box_sz, box_upp, box_low); -@ - -\paragraph{} -Le récepteur et l'émetteur sont tout deux fixés relativement aux -dimensions de la boîte. Ces positions et dimensions relatives sont -définies dans les constantes suivantes~: -\begin{itemize} - \item{[[RECV_MIN]] et [[RECV_MAX]]~: décrivent les bornes - inférieure et supérieure du récepteur\,;} - \item{[[EMIT_E_THRESHOLD]]~: décrit la hauteur de la source - radiative\,;} - \item{[[EMIT_E_SZ]]~: } -\end{itemize} - -<<constantes du système>>= -static const double RECV_MIN[3] = {0.125, 0.375, 0}; -static const double RECV_MAX[3] = {0.375, 0.625, 0}; -static const double EMIT_E_THRESHOLD = 2.0/3.0; -@ - -<<récupérer la description de la scène>>= - recv_min[X] = RECV_MIN[X]*box_sz[X] + box_low[X]; - recv_min[Y] = RECV_MIN[Y]*box_sz[Y] + box_low[Y]; - recv_max[X] = RECV_MAX[X]*box_sz[X] + box_low[X]; - recv_max[Y] = RECV_MAX[Y]*box_sz[Y] + box_low[Y]; - emit_e_threshold = EMIT_E_THRESHOLD*box_sz[Z] + box_low[Z]; - emit_e_sz[X] = EMIT_E_SZ[X]*box_sz[X] + box_low[X]; - emit_e_sz[Y] = EMIT_E_SZ[Y]*box_sz[Y] + box_low[Y]; - emit_e_sz[Z] = EMIT_E_SZ[Z]*box_sz[Z] + box_low[Z]; - emit_s_sz[X] = EMIT_S_SZ[X]*box_sz[X] + box_low[X]; - emit_s_sz[Y] = EMIT_S_SZ[Y]*box_sz[Y] + box_low[Y]; - emit_s_sz[Z] = EMIT_S_SZ[Z]*box_sz[Z] + box_low[Z]; -@ - -\paragraph{} -Espace de chemin~: expliquer le choix de l'espace de chemin - -\paragraph{} -Parler de l'espace matériel et de l'espace géométrique bien que dans cet -exemple il ne soit pas explicité. Souligner l'importance d'un repaire -\emph{orthogonal} pour l'espace matériel. - -<<échantilloner un rayon sur la surface spéculaire>>= - /* Sample the sensitivity emissive surface */ - sgs_geometry_sample(sgs->geom, rng, &frag); - surf_emit = frag.surface; - - /* Sample the cosine weighted sampling of the emissive direction */ - ssp_ran_hemisphere_cos(rng, frag.normal, dir_emit, NULL); - - pos_emit[0] = frag.position[0]; - pos_emit[1] = frag.position[1]; - pos_emit[2] = frag.position[2]; -@ - -<<liste des inclusions>>= -#include "sgs_c.h" -#include "sgs_geometry.h" -#include "sgs_log.h" - -#include <star/smc.h> -#include <star/ssp.h> - -#include <rsys/cstr.h> -@ - -------------------------------- ANNEXE 1 ------------------------------------ \\ +\section{Détails de la condition à la limite de sensibilité} Nous récupérons ici la condition à la limite pour une paroi spéculaire $s = s(\vec{x},\vec{\omega},\PI)$: \begin{equation} @@ -921,16 +846,47 @@ L(\vec{x},\vec{\omega}_{spec},\PI) \\ \partial_{1,\vec{u}} L(\vec{x},\vec{\omega}_{spec},\PI) \end{aligned} \end{equation} --------------------------------- FIN ANNEXE 1 ------------------------------------ \\ --------------------------------- DÉBUT ANNEXE 2 --------------------------------- \\ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Annexe décomposition +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Décomposition du vecteur de déformation} + +<<decomposition>>= +struct projection { + double alpha; + double beta; + double u[3]; +}; + +static void +decomposition + (const double chi[3], + const double normal[3], + const double omega[3], + struct projection* projection) +{ + ASSERT(chi && normal && omega && projection); + ASSERT(d3_is_normalized(normal)); + ASSERT(d3_is_normalized(omega)); + + projection->alpha = d3_dot(chi, normal) / d3_dot(omega, normal); + projection->u[X] = chi[X] - projection->alpha*omega[X]; + projection->u[Y] = chi[Y] - projection->alpha*omega[Y]; + projection->u[Z] = chi[Z] - projection->alpha*omega[Z]; + projection->beta = d3_normalize(projection->u, projection->u); +} +@ -\paragraph{TODO} Décaller le calcul suivant en annexe. Renommer [[weight]] car -on ne calcule pas vraiment une luminance mais la seule partie de la luminance -qui dépend de $\PI$, dit autrement la seule partie de la luminance qui compte -pour la sensibilité. Elle pourra donc être utilisé pour vérification par -différences finies. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Annexe "luminance" +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Calcul de la contribution de la luminance qui dépend de $\PI$} +\paragraph{TODO} Renommer [[weight]] car on ne calcule pas vraiment une +luminance mais la seule partie de la luminance qui dépend de $\PI$, dit +autrement la seule partie de la luminance qui compte pour la sensibilité. Elle +pourra donc être utilisé pour vérification par différences finies. <<calcul du poids>>= weight = Sb * rho * PI * get_Sr_area(scn); @@ -940,18 +896,41 @@ différences finies. w[1] = weight; @ -<<sgs\_compute\_sensitivity\_translation.c>>= - <<copyright>> - <<licence>> +\section{Boucle d'intégration} + +\paragraph{TODO} Utiliser Star-MC pour lancer le calcul et afficher les +résultats. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Annexe structure du C +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Structure de mise oeuvre} + +\paragraph{TODO} Décrire la structure du fichier C issu de noweb et son +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>> <<constantes du système>> - <<boucle d'intégration>> <<fonction de réalisation>> + <<boucle d'intégration>> +@ + +<<liste des inclusions>>= +#include "sgs_c.h" +#include "sgs_geometry.h" +#include "sgs_log.h" + +#include <star/smc.h> +#include <star/ssp.h> + +#include <rsys/cstr.h> @ +\section{A supprimer du noweb} <<???>>= /* TODO move me */ @@ -981,58 +960,6 @@ hit_source } @ -<<decomposition>>= -struct projection { - double alpha; - double beta; - double u[3]; -}; - -static void -decomposition - (const double chi[3], - const double normal[3], - const double omega[3], - struct projection* projection) -{ - ASSERT(chi && normal && omega && projection); - ASSERT(d3_is_normalized(normal)); - ASSERT(d3_is_normalized(omega)); - - projection->alpha = d3_dot(chi, normal) / d3_dot(omega, normal); - projection->u[X] = chi[X] - projection->alpha*omega[X]; - projection->u[Y] = chi[Y] - projection->alpha*omega[Y]; - projection->u[Z] = chi[Z] - projection->alpha*omega[Z]; - projection->beta = d3_normalize(projection->u, projection->u); -} -@ - --------------------------------- FIN ANNEXE 2 ------------------------------------ \\ - -<<copyright>>= -/* Copyright (C) 2021, 2022 Centre National de la Recherche Scientifique - * Copyright (C) 2021, 2022 Institut Mines Télécom Albi-Carmaux - * Copyright (C) 2021, 2022 |Méso|Star> (contact@meso-star.com) - * Copyright (C) 2021, 2022 Université Clermont Auvergne - * Copyright (C) 2021, 2022 Université de Lorraine - * Copyright (C) 2021, 2022 Université de Lyon - * Copyright (C) 2021, 2022 Université de Toulouse */ - -<<licence>>= -/* This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -@ - \bibliographystyle{apalike} \bibliography{biblio}