####################################################################################################################################### # # # T R A C E D E D E U X H I S T O G R A M M E S D U M O D U L E D E S V I T E S S E S # # S U I V A N T U N E R E P A R T I T I O N D E S P A R T I C U L E S E N D E U X S O U S - E N S E M B L E S # # A V E C A J U S T E M E N T A U T O M A T I Q U E : # # # # # # Author of '$xivP/disk.000000009/face.2/.REFL.w.13.$U' : # # # # Jean-Francois Colonna (LACTAMME, AAAAMMJJhhmmss). # # # ####################################################################################################################################### $Z SETENVParam _____Fhisto 0.25 $X echo "neutre" $X # commande destinee uniquement a mettre a jour l'environnement 'env'... # $c #include <stdio.h> $c $c #define COND(c,x,y) ((c) ? (x) : (y)) $c #define MIN2(x,y) COND(((x) < (y)),x,y) $c $c extern int atoi(); $c extern double atof(); $c extern char *getenv(); $c $c #define NA0 (atoi(getenv("PremiereA"))) $c #define NA (atoi(getenv("DerniereA"))) $c $c #define NOMBRE 10 $c /* Definition de la moitie (a 1 pres) de la taille de l'histogramme. */ $c #define L_AXE_OX 0.2 $c #define AXE_OX1_0 0.0 $c #define AXE_OX1_N (AXE_OX1_0+L_AXE_OX) $c #define AXE_OX2_0 (AXE_OX2_N-L_AXE_OX) $c #define AXE_OX2_N (1-AXE_OX1_0) $c #define AXE_OX_0 COND((k == 1),AXE_OX1_0,COND((k == 2),AXE_OX2_0,0)) $c #define AXE_OX_N COND((k == 1),AXE_OX1_N,COND((k == 2),AXE_OX2_N,1)) $c #define AXE_OY 0.1 $c #define AXE_OZ 0.5 $c /* Definition des 3 axes. */ $c #define A_HISTO (atof(getenv("_____Fhisto"))) $c #define B_HISTO AXE_OY $c /* Transformation lineaire des valeurs de l'histogramme. */ $c #define RAYON 0.012 $c /* Taille des boules de l'histogramme. */ $c $c int main() $c { $c int n; $c $c printf("$DELETE $xTV/VITESSES\n"); $c $c printf("$CA $xTV/LISTE_POINTS | $c $GRE -v '^ *$' | $c $SE -e 's/^.*VITESSE=//' $c -e 's/ .*$//' $c > $xTV/VITESSES\n" $c ); $c $c printf("set MinL=`$xrv/extrema.01$X ne=0 fichier=$xTV/VITESSES | $GRE '^minimum=' | $SE -e 's/^.*=//'`\n"); $c printf("set MinL=`$xcg/MIN2.01$X a=0 b=$MinL`\n"); $c printf("set MaxL=`$xrv/extrema.01$X ne=0 fichier=$xTV/VITESSES | $GRE '^maximum=' | $SE -e 's/^.*=//'`\n"); $c $c printf("$DELETE $xTV/VITESSES\n"); $c $c for (n=NA0 ; n<=NA ; n++) $c { $c int k; $c $c printf("$DELETE $xTV/VITESSES\n"); $c printf("$DELETE $xTV/VITESSES.1\n"); $c printf("$DELETE $xTV/VITESSES.2\n"); $c $c printf("$CA $xTV/LISTE_POINTS | $c $GRE 'periode=%d ' | $c $SE -e 's/^.*VITESSE=//' $c -e 's/ .*$//' | $c $xrv/neutre$X $c ne=0 $c fichier='=' $c formater=VRAI decimales=8 $c > $xTV/VITESSES\n" $c ,n $c ); $c /* L'utilisation de 'decimales=8' permet de traiter proprement le probleme du aux erreurs */ $c /* d'arrondi. En effet, si par exemple tous les modules sont censes valoir '0.02' dans la */ $c /* definition de '$xTV/MODULE', le fait de passer des coordonnees polaires aux coordonnees */ $c /* cartesiennes donne en fait dans '$xTV/MODULE' les valeurs differentes suivantes : */ $c /* */ $c /* +0.01999999999999999 */ $c /* +0.02 */ $c /* +0.02000000000000001 */ $c /* */ $c /* et alors avec 8 decimales, toutes ces valeurs redonnent '0.02'. */ $c $c printf("$xrv/selection.01$X $c ne=0 $c fichier=$xTV/VITESSES $c selection=$xTV/ENSEMBLE.100 $c > $xTV/VITESSES.1\n" $c ,n $c ); $c printf("$xrv/selection.01$X $c ne=0 $c fichier=$xTV/VITESSES $c selection=$xTV/ENSEMBLE.001 $c > $xTV/VITESSES.2\n" $c ,n $c ); $c $c for (k=1 ; k<=2 ; k++) $c { $c printf("$DELETE $xTV/HISTOGRAMME\n"); $c printf("$DELETE $xTV/COORD.1$COORD_X\n"); $c printf("$DELETE $xTV/COORD.2$COORD_X\n"); $c printf("$DELETE $xTV/COORDONNEES$COORD_X\n"); $c printf("$DELETE $xTV/COORD.1$COORD_Y\n"); $c printf("$DELETE $xTV/COORD.2$COORD_Y\n"); $c printf("$DELETE $xTV/COORDONNEES$COORD_Y\n"); $c printf("$DELETE $xTV/COORD.1$COORD_Z\n"); $c printf("$DELETE $xTV/COORD.2$COORD_Z\n"); $c printf("$DELETE $xTV/COORDONNEES$COORD_Z\n"); $c $c printf("set Particules=`$WC $xTV/VITESSES.%d`\n" $c ,k $c ); $c printf("set Particules=$Particules[$WC1]\n"); $c $c printf("$xrv/histogram.01$X $c ne=0 $c fichier=$xTV/VITESSES.%d $c nombre=%d $c forcer=VRAI minimum=$MinL maximum=$MaxL $c > $xTV/HISTOGRAMME\n" $c ,k $c ,(2*NOMBRE)+1 $c ); $c /* Il est preferable d'utiliser un nombre impair d'elements pour l'histogramme afin de */ $c /* garantir un centrage d'une barre unique dans le cas ou tous les elements du fichier */ $c /* '$xTV/VITESSES.?' sont egaux et centres dans {minimum,maximum}. */ $c $c printf("set Lhistogramme=`$WC $xTV/HISTOGRAMME`\n"); $c printf("set Lhistogramme=$Lhistogramme[$WC1]\n"); $c printf("@ Lhistogramme2 = $Lhistogramme * 2\n"); $c $c printf("$xci/valeurs_inte$X $c premiere=1 derniere=$Lhistogramme $c vD=%f vA=%f $c cubique=FAUX $c > $xTV/COORD.1$COORD_X\n" $c ,AXE_OX_0,AXE_OX_N $c ); $c printf("$xci/valeurs_inte$X $c premiere=1 derniere=$Lhistogramme $c vD=%f vA=%f $c cubique=FAUX $c > $xTV/COORD.2$COORD_X\n" $c ,AXE_OX_0,AXE_OX_N $c ); $c printf("$PAST $c $xTV/COORD.1$COORD_X $c $xTV/COORD.2$COORD_X $c | $R %c$K_TAB%c %c$K_NL%c $c > $xTV/COORDONNEES$COORD_X\n" $c ,'"','"','"','"' $c ); $c $c printf("$xci/valeurs_inte$X $c premiere=1 derniere=$Lhistogramme $c vD=%f vA=%f $c cubique=FAUX $c > $xTV/COORD.1$COORD_Y\n" $c ,AXE_OY,AXE_OY $c ); $c $c printf("set Ahistogramme=`$xcg/MUL2.01$X a=2 b=$Particules`\n"); $c printf("set Ahistogramme=`$xcg/DIVZ.01$X a=$Ahistogramme b=$Lhistogramme`\n"); $c printf("set Ahistogramme=`$xcg/INVZ.01$X a=$Ahistogramme`\n"); $c printf("set Ahistogramme=`$xcg/MUL2.01$X a=%f b=$Ahistogramme`\n" $c ,A_HISTO $c ); $c /* Le principe de ce calcul est de considerer que l'histogramme va etre grossierement un */ $c /* triangle de base '$Lhistogramme' et d'aire '$Particules'. Soit donc 'h' sa hauteur : */ $c /* */ $c /* 1 1 */ $c /* aire = $Particules = ---.base.hauteur = ---.$Lhistogramme.h */ $c /* 2 2 */ $c /* */ $c /* d'ou : */ $c /* */ $c /* $Particules */ $c /* h = 2.--------------- */ $c /* $Lhistogramme */ $c /* */ $c /* Le facteur de reduction '$Ahistogramme' est donc l'inverse de 'h' multiplie par un */ $c /* facteur arbitraire 'A_HISTO'. */ $c $c printf("$xrv/AXPB.01$X $c ne=0 $c fichier=$xTV/HISTOGRAMME $c a=$Ahistogramme b=%f $c > $xTV/COORD.2$COORD_Y\n" $c ,B_HISTO $c ); $c printf("$PAST $c $xTV/COORD.1$COORD_Y $c $xTV/COORD.2$COORD_Y $c | $R %c$K_TAB%c %c$K_NL%c $c > $xTV/COORDONNEES$COORD_Y\n" $c ,'"','"','"','"' $c ); $c $c printf("$xrv/particule.10$X $c np=1 $c iterations=$Lhistogramme2 $c isoles=VRAI $c LISTE_X=$xTV/COORDONNEES$COORD_X $c LISTE_Y=$xTV/COORDONNEES$COORD_Y $c LISTE_Z=%f $c LISTE_ROUGE=$BLANC $c LISTE_VERTE=$BLANC $c LISTE_BLEUE=$BLANC $c LISTE_RAYON=%f $c zoom_automatique=FAUX ZOOM=1.0 $c isoles=FAUX $c chainer=FAUX $c ajuster_points=VRAI $c Apoints=16 $c Rpoints=4 $c fond=VRAI fond_dynamique=FAUX F=$_____imagesW.%04d $c Lz=100 $c R=$xTV/HIST.1. $c $formatI\n" $c ,AXE_OZ,RAYON,n $c ); $c $c printf("$xci/acces$X $c A=$xTV/HIST.1.%04d$ROUGE $c R=$_____imagesW.%04d$ROUGE $c $formatI\n" $c ,NA0,n $c ); $c printf("$xci/acces$X $c A=$xTV/HIST.1.%04d$VERTE $c R=$_____imagesW.%04d$VERTE $c $formatI\n" $c ,NA0,n $c ); $c printf("$xci/acces$X $c A=$xTV/HIST.1.%04d$BLEUE $c R=$_____imagesW.%04d$BLEUE $c $formatI\n" $c ,NA0,n $c ); $c } $c } $c } $Z $DELETE $xTV/LISTE_POINTS $Z $DELETE $xTV/VITESSES $Z $DELETE $xTV/VITESSES.1 $Z $DELETE $xTV/VITESSES.2 $Z $DELETE $xTV/HISTOGRAMME $Z $DELETE $xTV/COORD.1$COORD_X $Z $DELETE $xTV/COORD.2$COORD_X $Z $DELETE $xTV/COORDONNEES$COORD_X $Z $DELETE $xTV/COORD.1$COORD_Y $Z $DELETE $xTV/COORD.2$COORD_Y $Z $DELETE $xTV/COORDONNEES$COORD_Y $Z $DELETE $xTV/COORD.1$COORD_Z $Z $DELETE $xTV/COORD.2$COORD_Z $Z $DELETE $xTV/COORDONNEES$COORD_Z