#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         G E N E R A T I O N   D U   F I L M   S U R   L A   D Y N A M I Q U E   I N T E R N E   D U   M E S O N  :                  #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                   $xrq/meson.L2$Z                                                                                                   #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xrq/meson.L2$Z' :                                                                                               #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, AAAAMMJJhhmmss).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

source    $xrq/proton.K2.2$Y
                                        # Definition du choix des machines a utiliser pour generer le film.                           #
source    $xrq/nucleon.L4.1$Y
                                        # Preparation eventuelle de l'enregistrement...                                               #
source    $xrq/nucleon.L4.2$Y
                                        # Quelques parametres...                                                                      #

set       imageO=1
                                        # Definition du numero de la premiere image.                                                  #
set       imageV=$imageO
                                        # Definition de la premiere image a visualiser.                                               #
set       Nimages=1050
                                        # Definition du nombre d'images a generer.                                                    #
set       simultanees=8
                                        # Nombre d'images simultanees autorisees (autrefois, je prenais '32', mais depuis             #
                                        # l'introduction de l'option 'Pal', je suis passe a '8'...). En fait, ce parametre n'a plus   #
                                        # d'importance (voir 'Fstore_fichier_non_formatte(...)' dans 'v $xig/fonct$vv$FON').          #

set       positionnement="p0=$imageO pV=$imageV"

set       convolution="noyau_variable=FAUX cNOIR=FAUX convolution=1 facteur=0.100"
set       accumulation="trainees=VRAI renormaliser=VRAI attenuation_des_trainees=0.80 attenuation_des_images=0.20 mode=0"

set       evenements="graine=1789"
set       evenements="$evenements ""ralentissement=0.1100 particules=600"
set       evenements="$evenements ""auto_reguler=VRAI Eregulation=1 Cregulation=40.0"
set       evenements="$evenements ""injection=VRAI injectionI=FAUX injectionS=VRAI neq=22000 neaq=22000 neg=44000 nefqv=2400"
set       evenements="$evenements ""caracteristique=FAUX"
                                        # Definition des parametres fondamentaux.                                                     #

set       imageN = $imageO
@         imageN = $imageN + $Nimages
@         imageN = $imageN - 1
                                        # Definition du numero de la derniere image.                                                  #

set       stereo0="0.00"
set       stereoD="0.04"
set       stereoG="-0.04"

set       stereo=$stereo0
set       Stereo="stereo=$stereo"
                                        # Choix du mode stereoscopique.                                                               #
                                        #                                                                                             #
                                        # 'stereo0' --> absent,                                                                       #
                                        # 'stereoD' --> DROITE,                                                                       #
                                        # 'stereoG' --> GAUCHE.                                                                       #

set       InomT="MESO"
                                        # On choisit un nom court afin de ne pas avoir de problemes avec la                           #
                                        # constante 'LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER'.                                  #
switch    ("$stereo")
                                        # Definition du nom relatif des images.                                                       #
     case "$stereo0":
          breaksw
     case "$stereoD":
          set       InomT="$InomT$DROITE"
          breaksw
     case "$stereoG":
          set       InomT="$InomT$GAUCHE"
          breaksw
     default:
          EROR      "Mode stereoscopique non reconnu."
          breaksw
endsw

source    $xrq/proton.K2.1$Y
                                        # Definition du choix du directory de generation des images.                                  #

source    $xrq/nucleon.L2.3$Y
                                        # Pour fixer ou modifier des parametres de derniere minute...                                 #

set       images="$DnomT$InomT"

set       generation="R=$images simultanees=$simultanees synchroniser=FAUX trace=FAUX messages=FAUX parametres=VRAI chronometrer=FAUX"
set       generation="$generation ""randomiser=FAUX interieur=1.0 exterieur=1.0 seuil=0.9 vqR=VRAI vaqR=VRAI"
set       generation="$generation ""rqR=0.0280e-15 rqV=0.0280e-15 rg=0.0093e-15 nnsG=4 npsG=4 dvG=0.4"
                                        # Definition des arguments d'entrees-sorties ; plusieurs possibilites :                       #
                                        #                                                                                             #
                                        # nnsG=16 npsG=16 dvG=0.1     : bien esthetiquement, mais tres lent,                          #
                                        # nnsG=8  npsG=8  dvG=0.2                                                                     #
                                        # nnsG=4  npsG=4  dvG=0.4     : quatre fois plus rapide, et degradation acceptable...         #
                                        #                                                                                             #

@         npA = $imageO
                                        # Definition de 'npA' (numero de la premiere periode),                                        #

@         npX = $imageN
                                        # Definition de 'npX' (numero de la derniere periode).                                        #

@         npB = $npX * 10
@         npB = $npB / 42

@         npC = $npX * 30
@         npC = $npC / 42

@         npD = $npX * 42
@         npD = $npD / 42

if        ($npB <= $npA) then
          @         npB = $npA + 1
else
endif
if        ($npC <= $npB) then
          @         npC = $npB + 1
else
endif
if        ($npD <= $npC) then
          @         npD = $npC + 1
else
endif

alias     valeurs   'set       valD=(\!:1) ; set valA=(\!:2) ; set Fval="\!:3"                                                    ;    \\
                     set       D1=1   ; set D2=`expr $D1 + 1` ; set D3=`expr $D2 + 1`                                             ;    \\
                     set       A1=$D1 ; set A2=$D2            ; set A3=$D3                                                        ;    \\
                     set       Depart  = "D=$valD[$D1] vD=$valD[$D2] dD=$valD[$D3]"                                               ;    \\
                     set       Arrivee = "A=$valA[$A1] vA=$valA[$A2] dA=$valA[$A3]"                                               ;    \\
                     $xci/valeurs_inte$X $Depart $Arrivee cubique=VRAI                                                  >>! $Fval ;    \\
                     unset     valD valA Fval D1 D2 D3 A1 A2 A3 Depart Arrivee'
                                        # Generation incrementale des fichiers des transformations par interpolation cubique.         #

                                        # On notera que les valeurs generees par '$xci/valeurs_trig$X' seront translatees ensuite     #
                                        # dans '$xrq/meson.L0$X' d'une quantite egale a 1.0 (representant le rayon). On veut avoir    #
                                        # une variation pour les coordonnees du type (donnee pour 'X') :                              #
                                        #                                                                                             #
                                        # X = Xo + (Xo - Xn).sin(t)                                                                   #
                                        #                                                                                             #
                                        # or :                                                                                        #
                                        #                                                                                             #
                                        # X = R + D                                                                                   #
                                        #                                                                                             #
                                        # ou :                                                                                        #
                                        #                                                                                             #
                                        # R = "rayon" de la particule,                                                                #
                                        # D = distance a la position standard de cette particule REELle.                              #
                                        #                                                                                             #
                                        # d'ou :                                                                                      #
                                        #                                                                                             #
                                        # Xo = R + Do                                                                                 #
                                        # Xn = R + Dn                                                                                 #
                                        #                                                                                             #
                                        # et :                                                                                        #
                                        #                                                                                             #
                                        # (R+D) = (R+Do) + [(R+Do) - (R+Dn)].sin(t)                                                   #
                                        #                                                                                             #
                                        # d'ou :                                                                                      #
                                        #                                                                                             #
                                        # D = Do + (Do - Dn).sin(t)                                                                   #
                                        #                                                                                             #
                                        # ce que l'on identifie a :                                                                   #
                                        #                                                                                             #
                                        # D = c  +         b.sin(t) + a.cos(t)                                                        #
                                        #                                                                                             #
                                        # d'ou :                                                                                      #
                                        #                                                                                             #
                                        # a = 0                                                                                       #
                                        # b = Do - Dn                                                                                 #
                                        # c = Do                                                                                      #
                                        #                                                                                             #
                                        # ou encore :                                                                                 #
                                        #                                                                                             #
                                        # a = 0                                                                                       #
                                        # b = Xo - Xn                                                                                 #
                                        # c = Xo - R                                                                                  #
                                        #                                                                                             #
                                        # Enfin, on n'oubliera pas les positions relatives du quark et de l'anti-quark REELs :        #
                                        #                                                                                             #
                                        #                   _                                                                         #
                                        #                   Q                                                                         #
                                        #              .                                                                              #
                                        #                                                                                             #
                                        #          Q                                                                                  #
                                        #                                                                                             #

set       Rayon = 1.00
                                        # Argument :                                                                                  #
                                        #                                                                                             #
                                        # R                                                                                           #
set       Gamma = 0.30
                                        # Argument :                                                                                  #
                                        #                                                                                             #
                                        # c = Do                                                                                      #
                                        # c = Xo - R                                                                                  #
                                        # c = 1.3 - 1.0                                                                               #
                                        # c = 0.3                                                                                     #
set       MDfinale = 0.35
set       Dfinale = -$MDfinale
                                        # Argument :                                                                                  #
                                        #                                                                                             #
                                        # Dn = Xn - R                                                                                 #
                                        # Dn = 0.65 - 1.0                                                                             #
                                        # Dn = -0.35                                                                                  #
set       Beta = 0.65
                                        # B = Xo - Xn                                                                                 #
                                        # b = 1.3 - 0.65                                                                              #
                                        # b = 0.65                                                                                    #

alias     oscille   'set       valD=(\!:1) ; set valA=(\!:2) ; set Fval="\!:3" ; set rayon=\!:4 ; set beta=\!:5 ; set gamma=\!:6  ;    \\
                     set       D1=1   ; set D2=`expr $D1 + 1` ; set D3=`expr $D2 + 1`                                             ;    \\
                     set       A1=$D1 ; set A2=$D2            ; set A3=$D3                                                        ;    \\
                     set       Depart  = "D=$valD[$D1] aD=$valD[$D2] daD=$valD[$D3]"                                              ;    \\
                     set       Arrivee = "A=$valA[$A1] aA=$valA[$A2] daA=$valA[$A3]"                                              ;    \\
                     $xci/valeurs_trig$X $Depart $Arrivee rD=$rayon rA=$rayon a=0.0 b=$beta c=$gamma cubique=FAUX       >>! $Fval ;    \\
                     unset     valD valA Fval rayon beta gamma D1 D2 D3 A1 A2 A3 Depart Arrivee'
                                        # Generation incrementale des fichiers des transformations par lignes trigonometriques.       #

set       luminance = "$K_VIDE"
set       luminance = "$luminance ""$K_VIDE"

set       translate = "$K_VIDE"
set       translate = "$translate ""$K_VIDE"

FileTmpB  Fzoom
set       zoom1     = ($npA 1.000000 00.000000)
set       zoom2     = ($npB 1.000000 00.000000)
set       zoom3     = ($npC 0.750000 00.000000)
set       zoom4     = ($npD 0.100000 00.000000)
valeurs   $zoom1    $zoom2    $Fzoom
valeurs   $zoom2    $zoom3    $Fzoom
valeurs   $zoom3    $zoom4    $Fzoom
set       zoom      = "$K_VIDE"
set       zoom      = "$zoom ""ZOOM=$Fzoom"

set       rot_OX    = "$K_VIDE"
set       rot_OX    = "$rot_OX ""$K_VIDE"

set       rot_OY    = "$K_VIDE"
set       rot_OY    = "$rot_OY ""$K_VIDE"

set       rot_OZ    = "$K_VIDE"
set       rot_OZ    = "$rot_OZ ""$K_VIDE"

FileTmpB  FXquark
set       Xquark1   = ($npA 0.000000 00.000000)
set       Xquark21  = ($npC 4.712389 00.000000)
set       Xquark22  = ($npC $MDfinale 00.000000)
set       Xquark3   = ($npD $MDfinale 00.000000)
oscille   $Xquark1  $Xquark21 $FXquark $Rayon -$Beta -$Gamma
valeurs   $Xquark22 $Xquark3  $FXquark
set       Xquark    = "$K_VIDE"
set       Xquark    = "$Xquark ""X_quark_REEL=$FXquark"

FileTmpB  FYquark
set       Yquark1   = ($npA 0.000000 00.000000)
set       Yquark21  = ($npC 4.712389 00.000000)
set       Yquark22  = ($npC $MDfinale 00.000000)
set       Yquark3   = ($npD $MDfinale 00.000000)
oscille   $Yquark1  $Yquark21 $FYquark $Rayon -$Beta -$Gamma
valeurs   $Yquark22 $Yquark3  $FYquark
set       Yquark    = "$K_VIDE"
set       Yquark    = "$Yquark ""Y_quark_REEL=$FYquark"

FileTmpB  FXkrauq
set       Xkrauq1   = ($npA 0.000000 00.000000)
set       Xkrauq21  = ($npC 4.712389 00.000000)
set       Xkrauq22  = ($npC $Dfinale 00.000000)
set       Xkrauq3   = ($npD $Dfinale 00.000000)
oscille   $Xkrauq1  $Xkrauq21 $FXkrauq $Rayon $Beta $Gamma
valeurs   $Xkrauq22 $Xkrauq3  $FXkrauq
set       Xkrauq    = "$K_VIDE"
set       Xkrauq    = "$Xkrauq ""X_anti_quark_REEL=$FXkrauq"

FileTmpB  FYkrauq
set       Ykrauq1   = ($npA 0.000000 00.000000)
set       Ykrauq21  = ($npC 4.712389 00.000000)
set       Ykrauq22  = ($npC $Dfinale 00.000000)
set       Ykrauq3   = ($npD $Dfinale 00.000000)
oscille   $Ykrauq1  $Ykrauq21 $FYkrauq $Rayon $Beta $Gamma
valeurs   $Ykrauq22 $Ykrauq3  $FYkrauq
set       Ykrauq    = "$K_VIDE"
set       Ykrauq    = "$Ykrauq ""Y_anti_quark_REEL=$FYkrauq"

set       Lumiere   = "$K_VIDE"
set       Lumiere   = "$Lumiere ""Lx=1.000000e-15"
set       Lumiere   = "$Lumiere ""Ly=1.000000e-15"
set       Lumiere   = "$Lumiere ""Lz=1.000000e-15"
                                        # Definition de la source lumineuse, telle que pratiquement toutes les particules soient      #
                                        # derriere elle par rapport a l'observateur...                                                #

set       transformation= "$K_VIDE"
set       transformation="$transformation $luminance"
set       transformation="$transformation $translate"
set       transformation="$transformation $zoom"
set       transformation="$transformation $rot_OX $rot_OY $rot_OZ"
set       transformation="$transformation $Xquark $Yquark $Xkrauq $Ykrauq"
                                        # Definition de la suite des transformations.                                                 #
Pal
                                        # Definition du format des images 'Pal'...                                                    #

if        ($Simulateur == $EXIST) then
          $DELETE_VALIDE      $images*                                                              >& $nul
                                        # Et ce afin, en particulier de ne pas se tromper dans la synchronisation.                    #
          nohup     $xrq/meson.L0$X     np=$Nimages $evenements $transformation $convolution $accumulation $positionnement $Lumiere     \
                                        $Stereo $generation $formatI                      &
                                        # Le programme de simulation est lance en parallele, et se synchronise sur                    #
                                        # les etats d'espace disque insuffisant, quant au programme de calcul des                     #
                                        # trainees, il se synchronise sur l'existence de l'image (J).                                 #
else
endif

if        ($Enregistreur == $EXIST) then
          if        ("$mHOTE" == "$mDKVP") then
                    set       continuer=$EXIST
                    set       imageJ=$imageV
                                        # Premiere image a enregistrer (J).                                                           #

                    set       Tinit="Initialisation"
                                        # La premiere fois on fera une grande initialisation...                                       #

                    set       compteur=1
                                        # Compteur des images.                                                                        #

                    while     ($continuer == $EXIST)
                              set       numero=`$xci/nombres$X p=$imageJ d=$imageJ`
                              set       Snumero=$Sep$numero
                                        # Numero de l'image J.                                                                        #
                              set       attendre=$EXIST
                                        # Afin de pouvoir attendre l'image J.                                                         #
                              while     ($attendre == $EXIST)
                                        if        ((-e $images$ROUGE$Snumero) &&                                                        \
                                                   (-e $images$VERTE$Snumero) &&                                                        \
                                                   (-e $images$BLEUE$Snumero)) then
                                                  SIZE      $images$ROUGE$Snumero
                                                  @         tROUGE=$Fsize
                                                  SIZE      $images$VERTE$Snumero
                                                  @         tVERTE=$Fsize
                                                  SIZE      $images$BLEUE$Snumero
                                                  @         tBLEUE=$Fsize
                                                  if        (($tROUGE == $tailleI) &&                                                   \
                                                             ($tVERTE == $tailleI) &&                                                   \
                                                             ($tBLEUE == $tailleI)) then
                                                            set       attendre=$NEXIST
                                        # Des que l'image J existe (avec la bonne taille), on arrete d'attendre, et ainsi, et ainsi,  #
                                        # on va pouvoir l'enregistrer. Cette mecanique est destinee a permettre certaines erreurs     #
                                        # d'entrees-sorties (voir le probleme dans 'xig/fonct$vv$FON' avec 'NFS' dans la fonction     #
                                        # 'Fstore_fichier_non_formatte(...)').                                                        #
                                                  else
                                                            sleep     $TEMPORISATION
                                        # Si l'image n'a pas la bonne taille, on attend un peu avant de relancer le test...           #
                                                  endif
                                        else
                                                  sleep     $TEMPORISATION
                                        # Si l'image n'existe pas, on attend un peu avant de relancer le test...                      #
                                        endif
                              end

                              if        ($compteur == 1) then
                                        set       mode=$debutS_DKVP
                              else
                                        if        ($compteur < $Nimages) then
                                                  set        mode=$ajoutS_DKVP
                                        else
                                                  set        mode=$finS_DKVP
                                        endif
                              endif
                              Pushd     $DnomT
                                        # Ainsi on se place dans le directory des images a cause de '$xci/disk_video_P$Z'.            #
                              $MV       $InomT$ROUGE$Snumero $InomT$Snumero$ROUGE
                              $MV       $InomT$VERTE$Snumero $InomT$Snumero$VERTE
                              $MV       $InomT$BLEUE$Snumero $InomT$Snumero$BLEUE
                                        # On notera que durant l'operation '$xci/disk_video_P$Z' les images '$InomT$ROUGE$Snumero',   #
                                        # '$InomT$VERTE$Snumero' et '$InomT$BLEUE$Snumero' ont change de nom (permutation de          #
                                        # l'indice de couleur et du numero) et qu'ainsi '$xrq/meson.L0$X' les considere comme         #
                                        # inexistantes (voir l'option 'simultanees='), leur destruction reelle n'ayant lieu qu'apres. #

                              $xci/disk_video_P$Z           $InomT$Sep $numero $numero $RVB_DKVP                                        \
                                                            $Disque $Face $Tinit $mode                                                  \
                                                            "$formatI"                                                                  \
                                                            $Gamma_meson_LX
                                        # Enregistrement de l'image courante.                                                         #

                              $DELETE_VALIDE      $InomT$Snumero$ROUGE
                              $DELETE_VALIDE      $InomT$Snumero$VERTE
                              $DELETE_VALIDE      $InomT$Snumero$BLEUE
                                        # ATTENTION : ces trois destructions peuvent etre partiellement, voire totalement,            #
                                        # ineffectives : c'est le cas ou ces images seraient sur un volume 'NFS', et que le           #
                                        # serveur correspondant serait temporairement (durant l'un ou plusieurs des 'del') hors       #
                                        # service (voir les coupures de courant, pour lesquelles 'LACT11' est plus sensible que       #
                                        # les autres...).                                                                             #

                              Popd

                              set       Tinit="rien"
                                        # Les fois suivantes on ne fera rien ...                                                      #

                              @         imageJ = $imageJ + 1
                                        # Changement de premiere image a accumuler (J).                                               #
                              if        ($imageJ > $imageN) then
                                        set       continuer=$NEXIST
                                        # Et on a fini...                                                                             #
                              else
                              endif

                              $xci/feu_vert$X     feu=$feu_meson_LX
                                        # Et on synchronise '$xrq/meson.L0$X' quelle que soit l'option 'simultanees='                 #
                                        # dans '$generation'.                                                                         #

                              @         compteur = $compteur + 1
                                        # Et comptage des images.                                                                     #

                    end

                    $xci/feu_init$X     feu=$feu_meson_LX
                    $DELETE_VALIDE      $images*                                                    >& $nul
                                        # Parce que l'on est propre...                                                                #
          else
          endif
else
endif

sleep     $MINUTE
sleep     $MINUTE
                                        # Cette attente avant la destruction est mise en place afin que dans le cas ou :              #
                                        #                                                                                             #
                                        # set       Simulateur=$NEXIST                                                                #
                                        #                                                                                             #
                                        # le programme de simulation ait le temps de lire les fichiers en cause...                    #
FileTmpE  Fzoom
FileTmpE  FXquark
FileTmpE  FYquark
FileTmpE  FXkrauq
FileTmpE  FYkrauq
                                        # Et elimination des fichiers des transformations...                                          #



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.