commit 8fcb44f90c85ca5cd59d895e6c32157bce5c3509
parent e641202cb8bf5d404a1c84e91f07b3a0dfd59014
Author: Paule Lapeyre <paule.lapeyre@yayoo.fr>
Date: Wed, 23 Nov 2022 17:06:07 +0100
Termine l'écriture du calcul des poids
Le calcul du poids de sensibilité est désormais entièrement décrit en
noweb.
À noter que ce que l'on croyait pouvoir écrire comme le poids de la
luminance est en réalité le poids de la luminance qui dépend du
paramètre de sensibilité ; la contributions directe de la source vers le
récepteur n'est pas prise en compte. Néanmoins, l'estimation de cette
grandeur (qu'il nous reste à correctement nommer) nous est suffisante
pour valider par différences finies notre calcul de sensibilité. La
contribution directe de la source sur le récepteur étant une constante,
elle n'influence en rien la sensiblité.
Pour éviter de brouiller le discours principal, nous avons décidé de
décrire plus tard le calcul de ce poids de "luminance" (potentiellement
en annexe). Nous avons par conséquent supprimer des sources toutes
références au poids de luminance pour ne laisser d'apparence que le seul
calcul du poids de sensibilité. Nous viendrons enrichir les blocs de
codes correspondants au moment de présenter ce calcul de luminance.
Diffstat:
1 file changed, 118 insertions(+), 26 deletions(-)
diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw
@@ -57,6 +57,9 @@
\maketitle
\paragraph{}
+Construction analogue d'un algorithme de sensibilité.
+
+\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
@@ -356,15 +359,16 @@ static res_T
realisation
(struct rng* rng,
const struct sgs_scene* scene,
- double weights[WEIGHTS_COUNT__])
+ double* w)
{
<<variables locales>>
res_T res = RES_OK;
- <<échantilloner un chemin du problème couplé>>
- <<calculer les poids>>
+ <<échantillonner un chemin du problème couplé>>
+ <<calcul du poids>>
exit:
+ <<renvoyer le poids>>
return res;
error:
goto exit;
@@ -374,17 +378,7 @@ error:
\paragraph{}
Notre fonction de réalisation prends en entrée un générateur de nombres
aléatoires ([[rng]]) et un pointeur vers les données du système ([[scene]]).
-Dans la variable [[weights]] seront renvoyés la liste des poids Monte-Carlo
-calculés par la fonction, à savoir le poids du chemin échantillonné et sa
-sensibilité à $\PI$.
-
-<<définition des constantes>>=
-enum {
- WEIGHT /*0*/,
- SENSIB /*1*/,
- WEIGHTS_COUNT__ /*2*/
-};
-@
+Dans la variable [[w]] sera renvoys le poids de la sensibilité a $\PI$.
\subsection{Le chemin}
\label{subsec:chemin}
@@ -473,18 +467,16 @@ chemin couplé a une contribution \emph{nulle} si le chemin de sensibilité
n'atteint pas le récepteur ou si le chemin de dérivé spatiale n'atteint pas la
source radiative, à savoir la paroi de droite.
+\paragraph{TODO} parler de l'initialistion à 0 du poids de sensib.
+
<<échantillonner un chemin de sensibilité>>=
if(!hit_receiver(&scn, pos_emit_s, dir_emit_s, &hit0)) {
- weight = 0;
- sensib = 0;
goto exit;
}
@
<<échantillonner un chemin de dérivée spatiale>>=
if(!hit_source(&scn, pos_emit_s, dir_spec_s, &hit1)) {
- weight = 0;
- sensib = 0;
goto exit;
}
@
@@ -499,14 +491,13 @@ Dans le problème couplé la contribution du chemin (poids MC) va s'exprimer à
travers la condition à la limite de sensibilité (équation \ref{eq:clsensib}) et
des sources de chacun de ses couplages.
-<<calculer les poids>>=
+<<calcul du poids>>=
<<décomposition du vecteur de déformation $\vec{\chi}$>>
<<calcul de la dérivée surfacique de $\rho$>>
- <<calcul des source de dérivées spatiales>>
+ <<calcul des sources de dérivées spatiales>>
- sensib = <<calculer le poids de sensibilité>>
- weight = <<calculer le poids de la luminance>>
+ <<calculer le poids de sensibilité>>
@
\paragraph{}
@@ -533,7 +524,7 @@ dérivation $\vec{u}$ transformée dans ce plan ([[u_2d]]).
u_2d[1] = proj_chi_s.u[Y];
/* Surface derivative of rho */
- drho = d2_dot(grad_rho_2d, u_2d);
+ d_rho = d2_dot(grad_rho_2d, u_2d);
@
\paragraph{}
@@ -560,16 +551,117 @@ $\vec{\chi}$ et $\vec{u}$) dont les sources sont données par les équations
<<calcul des sources de dérivées spatiales>>=
<<décomposition du vecteur $\vec{\chi}$>>
<<décomposition du vecteur $\vec{u}$>>
- <<calcul du gradient surfacique de $Sb$ dans la direction [[proj_u_e.u]]>>
- <<calcul du gradient surfacique de $Sb$ dans la direction [[proj_chi_e.u]]>>
+ <<calcul du gradient surfacique de $Sb$ dans la direction $\vec{u}_e$>>
+ <<calcul du gradient surfacique de $Sb$ dans la direction $\vec{u}_{cs}$>>
@
-<<calculer le poids>>=
+\paragraph{}
+Sur la paroi de droite, la décomposition du vecteur de déformation $\vec{\chi}$
+permet d'obtenir le vecteur tangent $\vec{u}$ nécessaire dans l'expression de
+la source de de la dérivée spatiale dans la direction $\vec{\chi}$ et de sa
+dérivée surfaciques (équation \ref{eq:cl_dchiL_droite}).
+
+<<décomposition du vecteur $\vec{\chi}$>>=
decomposition(chi, normal_e, dir_spec_e, &proj_chi_e);
+@
+
+\paragraph{}
+De la même façon, la décomposition du vecteur $\vec{u}$ permet d'obtenir le
+vecteur tangent $\vec{u}_e$ nécessaire dans l'expression de la source de la
+dérivée spatiale dans la direction $\vec{u}$ et de sa dérivée surfacique
+(equation \ref{eq:cl_duL_droite}).
+
+<<décomposition du vecteur $\vec{u}$>>=
decomposition(proj_chi_s.u, normal_e, dir_spec_e, &proj_u_e);
@
+\paragraph{}
+La dérivée surfacique de $S_b$ dans la direction $\vec{u}_{e}$ ([[d_u_e_Sb]])
+est le produit scalaire entre le gradient surfacique de $S_b$ et la direction
+de dérivation $\vec{u}_{e}$ transformée dans le plan de la paroi de droite
+([[u_e_2d]]). Pour effectuer ce calcul nous devons au préalable récupérer le
+gradient de $S_b$ ([[grad_Sb_2d]]). Pour cela il suffit de transformer dans le
+plan de la paroi de droite la position d'émission [[pos_emit_e]], et
+d'interroger les données associées à la position ainsi transformée
+([[pos_emit_e_2d]]). Nous en profitons au passage pour récupérer $S_b$ qui
+nous sera utile pour le calcul du poids. Nous rappelons enfin que dans notre
+situation les deux dérivées spatiales $\partial_{\vec{\chi}} I$ et
+$\partial_{\vec{u}} I$ partagent une même position d'émission ([[pos_emit_e]]).
+
+<<calcul de la dérivée surfacique de $Sb$ dans la direction $\vec{u}_e$>>=
+ /* Calculate the shared position on the emitter */
+ pos_emit_e[X] = pos_emit_s[X] + dir_spec_s[X]*hit1.distance;
+ pos_emit_e[Y] = pos_emit_s[Y] + dir_spec_s[Y]*hit1.distance;
+ pos_emit_e[Z] = pos_emit_s[Z] + dir_spec_s[Z]*hit1.distance;
+
+ /* Transform pos_emit_e in YZ plane */
+ pos_emit_e_2d[0] = pos_emit_e[Y];
+ pos_emit_e_2d[1] = pos_emit_e[Z];
+
+ /* Récupérer le gradient surfacique de Sb */
+ Sb = get_Sb(scn, pos_emit_e_2d);
+ get_grad_Sb(scn, pos_emit_e_2d, grad_Sb_2d);
+
+ /* Transformer u_e dans le plan YZ */
+ u_e_2d[0] = proj_u_e.u[Y];
+ u_e_2d[1] = proj_u_e.u[Z];
+
+ /* Dérivée surfacique de Sb dans la direction u_e */
+ d_u_e_Sb = d2_dot(grad_Sb_2d, u_e_2d);
+@
+
+\paragraph{}
+Il ne reste plus qu'à calculer la dérivée surfacique de $S_b$ dans la direction
+$\vec{u}_{cs}$ ([[d_u_cs_Sb]]) comme étant le produit scalaire entre le
+gradient surfacique de $S_b$ et la direction $\vec{u}_{cs}$ transformée dans le
+plan de la paroi de droite ([[u_cs_2d]]).
+
+<<calcul de la dérivée surfacique de $Sb$ dans la direction $\vec{u}_{cs}$>>=
+ /* Transformer u_cs dans le plan YZ */
+ u_cs_2d[0] = proj_chi_e.u[Y];
+ u_cs_2d[1] = proj_chi_e.u[Z];
+
+ /* Dérivée surfacique de Sb dans la direction u_cs */
+ d_u_cs_Sb = d2_dot(grad_Sb_2d, u_cs_2d);
+@
+
+Le poids de sensibilité correspond à la contribution portée par le chemin du
+problème couplé, soit les sources de dérivées spatiales propagées jusqu'à la
+paroi du haut puis intégrées dans les sources de sensibilité propagées ensuite
+vers le récepteur. Cette contribution est ensuite multipliée par la surface
+$S_r$ et l'hémisphère $\PI$ échantillonnées.
+
+<<calculer le poids de sensibilité>>=
+ /* Calcul de la contribution du chemin couplé */
+ Sb_sensib =
+ - proj_chi_s.beta * d_rho * Sb
+ - rho * proj_chi_s.beta * proj_u.e.beta * d_u_e_Sb
+ + rho * proj_chi_e.beta * d_u_cs_Sb;
+
+ /* Poids de sensibilité */
+ sensib = Sb_sensib * PI * get_Sr_area(scn);
+@
+
+<<renvoyer le poids>>=
+ w[0] = sensib;
+@
+
+\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.
+
+<<calcul du poids>>=
+ weight = Sb * rho * PI * get_Sr_area(scn);
+@
+
+<<renvoyer le poids>>=
+ w[1] = weight;
+@
+
\subsection{Optimisation \& co}
+
\paragraph{}
Décrire [[TRACE_RAY]] dans un moment plus info
<<???>>=