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 d0265d2c42284f6afed913a59f9117b5b4410b5b
parent 271838f150ff3b8c8daf999bfe22158a8e759754
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Sat, 22 Apr 2023 18:36:10 +0200

Rédige le texte qui accompagne le script fd.sh

L'ensemble des listings dans le sources noweb sont désormais lettrés.

Diffstat:
Msrc/sgs_compute_sensitivity_translation.nw | 174+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 104 insertions(+), 70 deletions(-)

diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw @@ -1557,101 +1557,135 @@ nsteps=14 pi_step=0.1 @ -\paragraph{TODO} Ajouter cette ligne pendant la description du -script [[<<fd.sh>>]]. -<<paramètres des calculs Monte Carlo>>= -printf "%s %s\n" "${h}" "${pi_step}" -@ +Dans un nouveau script [[fd.sh]] nous pouvons alors calculer par différences +finies la sensibilité du flux à $\PI$ à partir des estimations Monte Carlo en +sortie de [[<<mc.sh>>]], des résultats lus via l'entrée standard. Pour pouvoir +comparer les résultats, ce second script recopie en sortie les sensibilités +estimées par Monte Carlo ([[sen_mc]]) en plus d'écrire ces mêmes sensibilités +calculées par différences finies ([[sen_fd]]). Leur écarts types respectifs +([[err_mc]] et [[err_fd]]) sont également des données de sortie. On notera enfin +que l'ensemble des résultats seront adimentionnés aux dimensions de la +configuration géométrique et seront par conséquent donnés pour une valeur de +$\PI$ indépendante de la hauteur du parallélépipède ([[pi_over_h]]). -<<mc2.sh>>= +<<fd.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 -lower="0,0,0" -upper="1,1,${h}" - -pi="0" -i="0" +# Calcule la sensibilité par différences finies à partir des +# estimations par Monte Carlo de la fraction du flux qui dépend de pi -# Affiche la hauteur de la paroi du haut et le delta entre chaque -# valeur de pi -printf "%s %s\n" "${h}" "${pi_step}" +# Liste des données pour chaque ligne écrite en sortie +printf "pi_over_h sen_mc err_mc sen_fd err_fd\n" -while [ "${i}" -lt "${nsteps}" ]; do - out=$(./sgs \ - -n "${nrealisations}" \ - -b low="${lower}":upp="${upper}":pi="${pi}") +<<fonctions utilitaires à [[fd.sh]]>> - 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}' +<<lire les paramètres d'entrée>> - i=$((i + 1)) - pi=$(printf "%s + %s\n" "${pi}" "${pi_step}" | bc) +<<pour chaque valeur de pi considérée>> do + <<lire la valeur du flux autour de pi>> + <<calculer par différences finies la sensibilité du flux à pi>> + <<lire l'estimation Monte Carlo de la sensibilité du flux à pi>> + <<écrire les résultats adimensionner aux dimensions du système>> + <<passer au calcul suivant>> done @ -<<fd.sh>>= -#!/bin/sh -e - -# Calcule la sensibilité par différences finies à partir des -# estimations par Monte Carlo de la fraction de luminance qui dépend -# de pi - -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,\}$//' -} +Pour les calculs en différences finies nous avons besoin de connaître les +paramètres utilisés par les estimations Monte Carlo, comme le $\delta$ entre +chaque valeur de $\PI$ ([[pi_step]]) ou encore la hauteur du parallélépipède +nécessaire pour adimensionner nos résultats ([[h]]). Pour passer ces données +d'un script à l'autre, on modifie le script [[mc.sh]] pour les écrire en +en-tête de ses sorties, en-tête qui peut alors être lu par le script +[[fd.sh]]. +<<paramètres des calculs Monte Carlo>>= +printf "%s %s\n" "${h}" "${pi_step}" +@ +<<lire les paramètres d'entrée>>= read -r header h=$(echo "${header}" | cut -d' ' -f1) pi_step=$(echo "${header}" | cut -d' ' -f2) +@ -printf "pi_over_h sen_mc err_mc sen_fd err_fd\n" +Autre donnée nécessaire pour adimensionner nos résultats, la valeur maximale du +flux. Celle-ci correspond à la valeur de $\varphi$ lorsque la boîte est fermée, +c'est à dire lorsque $\PI = 0$ soit la valeur de $\PI$ du premier résultat en +sortie de [[mc.sh]]. Après l'en-tête nous lisons donc ce résultat que l'on +stocke dans la variable [[p]] avant d'en extraire la valeur $\varphi$ +([[phi_max]]). +<<lire les paramètres d'entrée>>= read -r p -read -r c - -# Conserver la valeur du flux pour pi = 0 phi_max=$(echo "${p}" | cut -d' ' -f4 | float_to_bc) +@ -while read -r n; do +La boucle principale du script consiste à lire l'entrée standard jusqu'à ce +qu'il n'y ait plus de résultat Monte Carlo à traiter. À chaque itération, le +résultat Monte Carlo pour la valeur de $\PI$ courante est stocké dans la +variable [[c]] tandis que le résultat précédent et suivant sont respectivement +stockés dans les variables [[p]] et [[n]]. - 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) +<<pour chaque valeur de pi considérée>>= +read -r c +while read -r n; +@ +<<passer au calcul suivant>>= +p="${c}" +c="${n}" +@ + +Il suffit alors d'extraire le flux ([[phi]]) et son erreur ([[err]]) aux valeurs +de $\PI$ précédente ([[p]]) et suivante ([[n]]) pour calculer par différences +finies la sensibilité et l'erreur associée pour la valeur de $\PI$ courante: + +<<lire la valeur du flux autour de pi>>= +phi_p=$(echo "${p}" | cut -d' ' -f4 | float_to_bc) +err_p=$(echo "${p}" | cut -d' ' -f5 | float_to_bc) +phi_n=$(echo "${n}" | cut -d' ' -f4 | float_to_bc) +err_n=$(echo "${n}" | cut -d' ' -f5 | float_to_bc) +@ +<<calculer par différences finies la sensibilité du flux à pi>>= +sen_fd=$(echo "(${phi_n}-${phi_p})/(2*${pi_step})" | bc_cmd) +err_fd=$(echo "(${err_n}+${err_p})/(2*${pi_step})" | bc_cmd) +@ - 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) +On utilise alors le résultat Monte Carlo au $\PI$ considéré pour en retrouver +non seulement sa valeur mais aussi pour extraire l'estimation Monte Carlo de la +sensibilité de $\varphi$ à $\PI$. Ne reste plus qu'à écrire l'ensemble des +résultats attendus. - 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) +<<lire l'estimation Monte Carlo de la sensibilité du flux à pi>>= +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) +@ +<<écrire les résultats adimensionner aux dimensions du système>>= +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) +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\n" \ + "${pi_over_h}" "${sen_mc}" "${err_mc}" "${sen_fd}" "${err_fd}" +@ - 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) +On complète finalement notre script par les fonctions utilitaires utilisées tout +du long, à savoir la fonction [[float_to_bc]] qui convertie un nombre à virgule +flottante dans le format attendu par le programme \texttt{bc}, et la fonction +[[bc_cmd]] qui exécute le programme \texttt{bc} et en post-traite le résultat pour +supprimer les zéros qui suivent le dernier chiffre significatif. - printf "%s %s %s %s %s %s %s\n" \ - "${pi_over_h}" "${sen_mc}" "${err_mc}" "${sen_fd}" "${err_fd}" +<<fonctions utilitaires à [[fd.sh]]>>= +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' +} - p="${c}" - c="${n}" -done +bc_cmd() +{ + bc -l | sed '/\./s/\.\{0,\}0\{1,\}$//' +} @ \bibliographystyle{apalike}