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 33d18c09fa2c38a5f8a5c3f1279a93ab801902f0
parent 8e999df399628c79e832acd5f0c52b3daee0a2f7
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  5 Apr 2023 21:23:32 +0200

Réécriture du script qui génère les résultats

Le script shell initial est maintenant séparé en deux scripts : mc.sh
utilise le programme sgs pour calculer par Monte Carlo la sensibilité à
pi et la luminance ; fd.sh utilise la sortie de mc.sh pour évaluer par
différences finies cette même sensibilité à pi. L'utilisation de deux
scripts différents permet de générer les résultats Monte Carlo
uniquement lorsque mc.sh est mis à jour. Par conséquent d'aucun peu
modifier fd.sh pour changer la mise en forme des résultats sans avoir à
relancer les calculs Monte Carlo.

On notera que fd.sh calcule maintenant des résultats adimensionnés, des
résultats depuis affichés directement dans le pdf généré via un
graphique de la section 4.

Diffstat:
M.gitignore | 3++-
MMakefile | 15+++++++++------
Msrc/sgs_compute_sensitivity_translation.nw | 170+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
3 files changed, 135 insertions(+), 53 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -15,4 +15,5 @@ sgs weave* *.pdf src/sgs_compute_sensitivity_translation.c -compute_sensitivities.sh +mc.sh +fd.sh diff --git a/Makefile b/Makefile @@ -26,7 +26,7 @@ include config.mk DOC = sgs_compute_sensitivity_translation -SH = compute_sensitivities.sh +SCRIPTS = mc.sh fd.sh TMPC = src/sgs_compute_sensitivity_translation.c SRC =\ @@ -66,7 +66,7 @@ $(TMPC): $(NOWEB) config.mk @$(TANGLE) $(TANGLE_OPTS)\ -R$$(c="$@" && echo "$${c##*/}" | sed 's/_/\\_/g') $(NOWEB) | cpif $@ -$(SH): $(NOWEB) +$(SCRIPTS): $(NOWEB) @echo "TANGLE $@" @$(TANGLE)\ -R$$(c="$@" && echo "$${c##*/}" | sed 's/_/\\_/g') $(NOWEB) | cpif $@ @@ -84,8 +84,11 @@ $(SH): $(NOWEB) ################################################################################ pdf: $(DOC).pdf -results.dat: $(SH) sgs - $(SHELL) $(SH) > $@ +results.mc: mc.sh sgs + $(SHELL) mc.sh > $@ + +results.fd: fd.sh results.mc + $(SHELL) fd.sh < results.mc > $@ $(DOC).pdf: .config_document $(TEX) $(DOC).bbl $(LATEX) src/$(DOC).tex && $(LATEX) src/$(DOC).tex @@ -117,12 +120,12 @@ uninstall: rm -f $(DESTDIR)$(PREFIX)/share/doc/star-gs/README.md clean: - @rm -f $(OBJ) $(SH) $(TEX) $(TMPC) sgs .config_program .config_document\ + @rm -f $(OBJ) $(SCRIPTS) $(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) + @rm -f $(DEP) results.fd results.mc lint: $(SH) @shellcheck -o all configure.sh noweave_backend.sh $(SH) diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw @@ -29,6 +29,7 @@ %\usepackage{natbib} % \citep \usepackage{noweb} \usepackage{tikz} +\usepackage{pgfplots} % \begin{axis} \usetikzlibrary{patterns} \noweboptions{smallcode,longchunks} @@ -769,6 +770,60 @@ struct sgs_hit hit1; \section{Résultats} \label{sec:results} +\begin{figure}[h!] + \centering + \begin{tikzpicture} + \begin{axis}[ + xlabel=$\frac{\PI}{h}$, + ylabel=$\partial_{\PI} \hat{\varphi}$, + width=0.7\linewidth, + legend style={at={(0.95,0.3)}} + ] + \addplot[ + color=black, + mark=square*, + only marks, + mark size=2pt, + every mark/.append style={solid, fill=black}, + error bars/.cd, + y dir=both, + y explicit, + error mark=|, + error mark options={mark size=1pt}, + error bar style={ + line width=0.6pt, + color=black} + ] + table[x=pi_over_h, y=sen_mc, y error=err_mc, col sep=space]{results.fd}; + \addlegendentry{Monte Carlo} + + \addplot[ + color=black, + mark=*, + only marks, + mark size=1.5pt, + every mark/.append style={solid, fill=white}, + error bars/.cd, + y dir=both, + y explicit, + error mark=|, + error mark options={mark size=1pt}, + error bar style={ + line width=0.6pt, + color=black} + ] + table[x=pi_over_h, y=sen_fd, y error=err_fd, col sep=space]{results.fd}; + \addlegendentry{Différences Finies} + \end{axis} + + \end{tikzpicture} + \flushleft + \caption{Sensibilité du flux reçu par le capteur de surface $A_r$ en fonction + de l'ouverture du parallélépipède paramétrée par $\PI$. La sensibilité du flux + $\partial_{\PI} \hat{\varphi} = \frac{\partial_{\PI} + \varphi}{\varphi_{max}} h$ avec $\varphi_{max} = \varphi(\PI=0)$.} +\end{figure} + \paragraph{TODO} À écrire qd on aura le programme fonctionnel. \paragraph{temp} Au delà du simple calcul de sensibilité nous proposons ici une @@ -1351,10 +1406,46 @@ code s'appuie. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Script d'exécution du calcul et résultats} -<<compute\_sensitivities.sh>>= +<<mc.sh>>= #!/bin/sh -e +# Estimation par Monte-Carlo de la sensibilité et de la fraction de la +# luminance qui dépend de pi + +h=1 # Hauteur de la boîte pi_step="0.1" +lower="0,0,0" +upper="1,1,${h}" +nrealisations=100000000 +nsteps=14 + +pi="0" +i="0" + +# Affiche la hauteur de la paroi du haut et le delta entre chaque valeur de pi +printf "%s %s\n" "${h}" "${pi_step}" + +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 +@ + +<<fd.sh>>= +#!/bin/sh -e + +# Calcule la sensibilité par différence fini à partir des estimations par +# Monte-Carlo de la fraction de luminance qui dépend de pi float_to_bc() { @@ -1367,57 +1458,44 @@ 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" +read -r header +h=$(echo "${header}" | cut -d' ' -f1) +pi_step=$(echo "${header}" | cut -d' ' -f2) - nrealisations=10000000 - nsteps=10 +printf "pi_over_h sen_mc err_mc sen_fd err_fd\n" - i="0" - while [ "${i}" -lt "${nsteps}" ]; do - out=$(./sgs \ - -n "${nrealisations}" \ - -b low="${lower}":upp="${upper}":pi="${pi}") +read -r p +read -r c - 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}' +# Conserver la valeur du flux pour pi = 0 +phi_max=$(echo "${p}" | cut -d' ' -f4 | float_to_bc) - i=$((i + 1)) - pi=$(printf "%s + %s\n" "${pi}" "${pi_step}" | bc) - done -} +while read -r n; do -# 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 -} + pi=$(echo "${c}" | cut -d' ' -f1 | float_to_bc) + sen_mc=$(echo "${c}" | cut -d' ' -f2 | float_to_bc) + err_mc=$(echo "${c}" | cut -d' ' -f3 | float_to_bc) + + pi_over_h=$(echo "${pi}/${h}" | bc_cmd) + sen_mc=$(echo "${sen_mc}/${phi_max}*${h}" | bc_cmd) + err_mc=$(echo "${err_mc}/${phi_max}*${h}" | bc_cmd) + + 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) + + sen_fd=$(echo "(${lum_n}-${lum_p})/(2*${pi_step})" | bc_cmd) + err_fd=$(echo "(${err_n}+${err_p})/(2*${pi_step})" | bc_cmd) + sen_fd=$(echo "${sen_fd}/${phi_max}*${h}" | bc_cmd) + err_fd=$(echo "${err_fd}/${phi_max}*${h}" | bc_cmd) + + printf "%s %s %s %s %s %s %s\n" \ + "${pi_over_h}" "${sen_mc}" "${err_mc}" "${sen_fd}" "${err_fd}" -mc | fd + p="${c}" + c="${n}" +done @ \bibliographystyle{apalike}