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 4949744aa064016ed770bc9157700f327bfb9727
parent d4123c289179f55fb36f5f99eaedeeb4ba3bb035
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  1 Mar 2023 21:55:58 +0100

Ajoute en annexe le script shell POSIX des résultats

Seule les sources du script sont données, sans aucun texte qui
l'accompagne à l'exception des quelques commentaires directement dans le
script.

Ce script lance N fois notre programme de calcul pour estimer par
Monte-Carlo la sensibilité à pi et la fraction de luminance qui dépend
de pi. Ces dernières sont ensuite utilisées pour estimer la sensibilité
à pi mais cette fois par différence finie. La comparaison croisée des
résultats vérifie la validité de notre algorithme Monte-Carlo.

Diffstat:
M.gitignore | 1+
MMakefile | 18+++++++++++++-----
Msrc/sgs_compute_sensitivity_translation.nw | 96++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
Msrc/sgs_log.c | 2+-
4 files changed, 100 insertions(+), 17 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -15,3 +15,4 @@ sgs weave* *.pdf src/sgs_compute_sensitivity_translation.c +compute_sensitivities.sh diff --git a/Makefile b/Makefile @@ -26,8 +26,8 @@ include config.mk DOC = sgs_compute_sensitivity_translation -TMPC =\ - src/sgs_compute_sensitivity_translation.c +SH = compute_sensitivities.sh +TMPC = src/sgs_compute_sensitivity_translation.c SRC =\ src/sgs_args.c\ @@ -66,6 +66,11 @@ $(TMPC): $(NOWEB) config.mk @$(TANGLE) $(TANGLE_OPTS)\ -R$$(c="$@" && echo "$${c##*/}" | sed 's/_/\\_/g') $(NOWEB) | cpif $@ +$(SH): $(NOWEB) + @echo "TANGLE $@" + @$(TANGLE)\ + -R$$(c="$@" && echo "$${c##*/}" | sed 's/_/\\_/g') $(NOWEB) | cpif $@ + .SUFFIXES: .c .d .o .c.d: @$(CC) $(CFLAGS) -MM -MT "$(@:.d=.o) $@" $< -MF $@ @@ -79,6 +84,9 @@ $(TMPC): $(NOWEB) config.mk ################################################################################ pdf: $(DOC).pdf +results.dat: $(SH) sgs + $(SHELL) $(SH) > $@ + $(DOC).pdf: .config_document $(TEX) $(DOC).bbl $(LATEX) src/$(DOC).tex && $(LATEX) src/$(DOC).tex @@ -109,9 +117,9 @@ uninstall: rm -f $(DESTDIR)$(PREFIX)/share/doc/star-gs/README.md clean: - @rm -f $(OBJ) $(TEX) $(TMPC) sgs .config_program .config_document ./*.aux\ - ./*.bbl ./*.idx ./*.log ./*.dvi ./*.glo ./*.lof ./*.toc ./*.out ./*.blg\ - ./*.nav ./*.snm ./*.vrb weave* $(DOC).pdf + @rm -f $(OBJ) $(SH) $(TEX) $(TMPC) sgs .config_program .config_document\ + ./*.aux ./*.bbl ./*.idx ./*.log ./*.dvi ./*.glo ./*.lof ./*.toc ./*.out\ + ./*.blg ./*.nav ./*.snm ./*.vrb weave* $(DOC).pdf distclean: clean @rm -f $(DEP) diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw @@ -85,10 +85,10 @@ géométriques) du système: \paragraph{TODO} Parler que l'on va décrire l'algorithme jusqu'à sa mise en oeuvre explicite dans le code. + Préciser que les notations feront référence à la position des parois par rapport à l'orientation présentée sur le schéma (h -$=$ haut, d $=$ droite etc...), soit par rapport à l'origine du repère. +$=$ haut, d $=$ droite etc...), soit par rapport à l'origine du repère. \section{Description du problème} -%\paragraph{Descrition du système} +%\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 @@ -179,7 +179,7 @@ bas et a pour dimension $R_x \times R_y$.} \paragraph{La configuration radiative} Toutes les parois du parallélépipède sont noires à l'exception de la paroi du haut (de surface $A_h = D_x \times D_y$) qui est spéculaire, froide, et munie -d'un coefficient de réflexion $\rho$: +d'un coefficient de réflexion $\rho$: % défini dans l'équation \ref{eq:rho}. \begin{equation} \rho(\vec{x},-\vec{\omega}) = 0.25 \Bigl[ 1- \cos \left(2 \pi \frac{x}{Dx} @@ -192,9 +192,9 @@ La profil spécifique de $\rho$ n'est pas discuté dans ce document, il permet d simplifier le problème de sensibilité (\textbf{TODO :} refaire cette phrase). Seule la paroi noire de droite (de surface $A_d = D_y \times h$) est émettrice et la condition à la limite en luminance correspondante est décrite par: -% l'équation \ref{eq:cl_rad}. +% l'équation \ref{eq:cl_rad}. \begin{equation} -L(\vec{x},\vec{\omega},\PI) = S_b(\vec{x}) \quad \quad \quad \vec{x} \in A_d \ ; \ +L(\vec{x},\vec{\omega},\PI) = S_b(\vec{x}) \quad \quad \quad \vec{x} \in A_d \ ; \ \vec{\omega} \cdot \vec{n}_d > 0 \label{eq:cl_rad} \end{equation} @@ -220,7 +220,7 @@ L(\vec{x},\vec{\omega},\PI)$ , dans toutes les directions entrantes et en tout point du récepteur. De façon similaire, pour évaluer $\partial_{\PI} \varphi$ nous avons besoin de connaître la sensibilité géométrique $\partial_{\PI} L(\vec{x},\vec{\omega},\PI) $, dans toutes les directions entrantes et en tout -point du récepteur. +point du récepteur. \paragraph{} L'objet de la section \ref{modele_sensib} est de donner le modèle physique qui décrit les sources et le transport de la sensibilité @@ -272,7 +272,7 @@ avec $S_{b,\PI}$ la source de sensibilité et $\rho(\vec{x},-\vec{\omega}) s(\vec{x},\vec{\omega}_{spec},\PI)$ la réflection de la sensibilité incidente à la paroi dans la direction spéculaire. Dans notre example, le milieu étant transparant et toutes les autres conditions aux limites de snesibilité étant -nulles, il n'y a pas de sensibilité incidente à la paroi. +nulles, il n'y a pas de sensibilité incidente à la paroi. La paroi du haut étant spéculaire, la source de sensibilité $S_{b,\PI}$ prend la forme suivante (voir annexe \ref{ann:cl_sensib} pour les développements qui mènent à cette expression): @@ -303,14 +303,14 @@ $\vec{\gamma}$. \paragraph{La source de sensibilité} Dans ce problème la source de sensibilité est une source de surface, émise par la paroi du haut et donnée par la -condition à la limite (équation \ref{eq:clsensib}). +condition à la limite (équation \ref{eq:clsensib}). Toutefois, dans l'équation \ref{eq:clsensib} la condition à la limite de sensibilité dépend : \begin{itemize} \item de la luminance incidente à la paroi (dans la direction de transport -spéculaire), +spéculaire), \item de la dérivée spatiale de la luminance, dans la direction de dérivation -$\vec{u}$, incidente à la paroi (dans la direction de transport spéculaire), +$\vec{u}$, incidente à la paroi (dans la direction de transport spéculaire), \item de la dérivée spatiale de la luminance, dans la direction de dérivation $\vec{\chi}$, incidente à la paroi (dans la direction de transport spéculaire). \end{itemize} @@ -360,7 +360,7 @@ dans \cite{}, peut comprendre des sources volumiques, des sources de surfaces et des sources locales situées sur les arrêtes d'une géométrie facétisée. Dans notre exemple le modèle de dérivée spatiale se simplifie (voir annexe \ref{ann:der_spatiale}) de sorte que les sources soient uniquement des sources -émises par la surface du haut $A_h$ et la surface de droite $A_d$. +émises par la surface du haut $A_h$ et la surface de droite $A_d$. Pour la dérivée spatiale dans la direction $\vec{u}_h$, la source de la paroi du haut est donnée par la condition à la limite : @@ -1389,6 +1389,80 @@ code s'appuie. #include <rsys/double3.h> @ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Annexe script de résultat +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Script d'exécution du calcul et résultats} + +<<compute\_sensitivities.sh>>= +#!/bin/sh -e + +pi_step="0.1" + +float_to_bc() +{ + sed 's/\([+-]\{0,1\}[0-9]\{0,\}\.\{0,1\}[0-9]\{1,\}\)'\ +'[eE]+\{0,1\}\(-\{0,1\}\)\([0-9]\{1,\}\)/(\1*10^\2\3)/g' +} + +bc_cmd() +{ + bc -l | sed '/\./s/\.\{0,\}0\{1,\}$//' +} + +# Estimation par Monte-Carlo de la sensibilité et de la fraction de la +# luminance qui dépend de pi +mc() +{ + lower="0,0,0" + upper="1,1,1" + pi="0" + + nrealisations=10000000 + nsteps=10 + + i="0" + while [ "${i}" -lt "${nsteps}" ]; do + out=$(./sgs \ + -n "${nrealisations}" \ + -b low="${lower}":upp="${upper}":pi="${pi}") + + printf "%s " "${pi}" + echo "${out}" | sed -n '1{N;s/^'\ +'[^~]\{1,\}~ \([^[:blank:]]\{1,\}\) +\/- \([^\n]\{1,\}\)\n'\ +'[^~]\{1,\}~ \([^[:blank:]]\{1,\}\) +\/- \([^$]\{1,\}\)$'\ +'/\1 \2 \3 \4/p}' + + i=$((i + 1)) + pi=$(printf "%s + %s\n" "${pi}" "${pi_step}" | bc) + done +} + +# Calcule la sensibilité par différence fini à partir des estimations par +# Monte-Carlo de la fraction de luminance qui dépend de pi +fd() +{ + read -r p + read -r c + while read -r n; do + lum_p=$(echo "${p}" | cut -d' ' -f4 | float_to_bc) + err_p=$(echo "${p}" | cut -d' ' -f5 | float_to_bc) + lum_n=$(echo "${n}" | cut -d' ' -f4 | float_to_bc) + err_n=$(echo "${n}" | cut -d' ' -f5 | float_to_bc) + + lum_fd=$(echo "(${lum_n}-${lum_p})/(2*${pi_step})" | bc_cmd) + err_fd=$(echo "(${err_n}+${err_p})/(2*${pi_step})" | bc_cmd) + + printf "%s %s %s\n" "${c}" "${lum_fd}" "${err_fd}" + + p="${c}" + c="${n}" + done +} + +mc | fd +@ + \bibliographystyle{apalike} \bibliography{biblio} diff --git a/src/sgs_log.c b/src/sgs_log.c @@ -32,7 +32,7 @@ print_out(const char* msg, void* ctx) { ASSERT(msg); (void)ctx; - fprintf(stderr, SGS_LOG_INFO_PREFIX"%s", msg); + fprintf(stdout, SGS_LOG_INFO_PREFIX"%s", msg); } static void