/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E T U D E   D E   L ' E R G O D I C I T E   D E   L A   D I F F U S I O N   D ' U N E   P A R T I C U L E  :               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                  ..                                                                                               */
/*                                   .:                                                                                              */
/*                              .      .     ..                                                                                      */
/*                                .     ..   ..  .:                                                                                  */
/*                                 ..     :  : . ..    .   :      ..                                                                 */
/*                                   ...   . o . + .   :. :     :- .       .                                                         */
/*                                     o. .oo.  *- o  o..-o.  ..+.-.    ..                                                           */
/*                              -o:..:-+..       -+..: ::  +--.   o  ..  ....                                                        */
/*                                :                 .*::.-:.-     .++o:  +.                                                          */
/*                            .     :.                -#+*-:.          o                                                             */
/*                             .::o:. .+                oo  +*-.                                                                     */
/*                                ...-o#:.            :-.       :#+..                                                                */
/*                                   o#++            o            o#:                                                                */
/*                                    .*       :   o                       .-::.                                                     */
/*                                      ++   .o+#*.                        +..                                                       */
/*                                         -    ooo**                 -o.                                                            */
/*                                        *                          .                                                               */
/*                                      .o                           o                                                               */
/*                                     *.    ..                       .                                                              */
/*                                    +...+o-*   *-          o-+.                                                                    */
/*                                   ::...  +o-o ..          -                                                                       */
/*                                     .    :..:   +.::     ..                                                                       */
/*                                            :+ ..  :+     +                                                                        */
/*                                            + o +   -.:+o-.                                                                        */
/*                                            ..  :* ...-                                                                            */
/*                                                o.*  ..                                                                            */
/*                                                ++:  o                                                                             */
/*                                                .. .                                                                               */
/*                                                    :                                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrk/ergodique.11$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1993??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CL_____MODULE_NON_OPTIMISABLE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D E   B A S E   E T   U N I V E R S E L L E S  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.11.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*                                                                                    3                                              */
/*        D E F I N I T I O N   D E   L ' E S P A C E   P H Y S I Q U E   D A N S   R     ( D E B U T )  :                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Les extrema des coordonnees {x,y,z}                                                                            */
/*                  ainsi que ceux de leurs differentielles                                                                          */
/*                  {dx,dy,dz} sont fixees un peu arbitrairement                                                                     */
/*                  et sans etre parametrees.                                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   hXmin_ESPACE                                                                                                                  \
                    PARE(-20.0)
#define   hYmin_ESPACE                                                                                                                  \
                    PARE(-20.0)
#define   hZmin_ESPACE                                                                                                                  \
                    PARE(-20.0)
                                        /* Definition du "coin" inferieur-gauche-arriere de l'espace physique.                       */

#define   hXmax_ESPACE                                                                                                                  \
                    PARE(20.0)
#define   hYmax_ESPACE                                                                                                                  \
                    PARE(20.0)
#define   hZmax_ESPACE                                                                                                                  \
                    PARE(20.0)
                                        /* Definition du "coin" superieur-droite-avant de l'espace physique.                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*                                                                                    3                                              */
/*        D E F I N I T I O N   D E   L ' E S P A C E   P H Y S I Q U E   D A N S   R     ( D E B U T )  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.12.I"

#define   dXmin_ESPACE                                                                                                                  \
                    PARE(-2.0)
#define   dYmin_ESPACE                                                                                                                  \
                    PARE(-2.0)
#define   dZmin_ESPACE                                                                                                                  \
                    PARE(-2.0)
                                        /* Definition des minima des differentielles {dx,dy,dz}.                                     */
#define   dXmax_ESPACE                                                                                                                  \
                    PARE(2.0)
#define   dYmax_ESPACE                                                                                                                  \
                    PARE(2.0)
#define   dZmax_ESPACE                                                                                                                  \
                    PARE(2.0)
                                        /* Definition des maxima des differentielles {dx,dy,dz}.                                     */

#include  xrk/attractor.1D.I"
                                        /* Formules de renormalisation des differentielles dans [0,1] ; elles sont utilisees lorsque */
                                        /* la production d'images en couleurs est demandee (voir 'visualiser_en_RVB').               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   D I F F E R E N T S   E S P A C E S   E T   D E   L ' E F F E T   D E   B R U M E  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.13.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A I D E   A U   C A D R A G E   D E S   I M A G E S  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.1C.I"

DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES
                                        /* Definition des extrema des coordonnees et des derivees. On notera bien l'absence de       */
                                        /* point-virgule apres 'DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES'.   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   I M A G E S  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/champs_5.14.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   G E N E R A L E S   R E L A T I V E S   A   L A   V I S U A L I S A T I O N  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   DCT                                                                                                                           \
                    GRO1(FRA8(FU))
DEFV(Local,DEFV(Float,INIT(dct,DCT)));
                                        /* Definition de 'dt'. On notera la valeur 0.125 utilisee (apres que 0.2 l'ait ete) ; cette  */

#include  xrk/attractor.14.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N   D E   M E M O R I S A T I O N   D U   P O I N T   C O U R A N T  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.16.I"

#define   RAYON_DE_VISUALISATION                                                                                                        \
                    GRO1(FRA10(FRA10(mhXYZlongueur_ESPACE)))
DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION)));
                                        /* Rayon du disque materialisant une iteration. Il fut exprime longtemps sous la             */
                                        /* forme :                                                                                   */
                                        /*                                                                                           */
                                        /*                  GRO4(FRA10(FU))                                                          */
                                        /*                                                                                           */

BFonctionI

DEFV(Local,DEFV(FonctionI,memorisation_1_point_07(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante)))
DEFV(Argument,DEFV(Float,AXf));
DEFV(Argument,DEFV(Float,AYf));
DEFV(Argument,DEFV(Float,AZf));
                                        /* Definition de la position {x,y,z} de l'iteration courante.                                */
DEFV(Argument,DEFV(Float,AdXf));
DEFV(Argument,DEFV(Float,AdYf));
DEFV(Argument,DEFV(Float,AdZf));
                                        /* Definition des differentielles {dx,dy,dz} de la position de l'iteration courante.         */
DEFV(Argument,DEFV(Int,numero_de_l_iteration_courante));
                                        /* Numero de l'iteration courante afin d'attenuer eventuellement la luminance des points     */
                                        /* materialisant chaque iteration en fonction de leur numero (les premieres iterations etant */
                                        /* plus sombres, et les dernieres etant plus lumineuses).                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrk/attractor.15.I"

     INIT_ERROR;
     /*..............................................................................................................................*/
     MEMORISATION_DU_POINT_COURANT(X_DERIVEE_DANS_01(AdXf)
                                  ,Y_DERIVEE_DANS_01(AdYf)
                                  ,Z_DERIVEE_DANS_01(AdZf)
                                   );
                                        /* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est   */
                                        /* visible en fonction des conditions de visualisation...                                    */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   S Y S T E M E   D E   D I F F U S I O N  :                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition (Claude Bardos & Francois Golse) :                                                                              */
/*                                                                                                                                   */
/*                    Soit une particule P de coordonnees                                                                            */
/*                  {x,y,z}. Son mouvement se fait dans l'espace                                                                     */
/*                  tridimensionnel entre deux plans paralleles                                                                      */
/*                  sur lesquels elle rebondit. Il est calcule                                                                       */
/*                  iterativement connaissant les derivees en 't'                                                                    */
/*                  des trois coordonnees :                                                                                          */
/*                                                                                                                                   */
/*                                       dx                                                                                          */
/*                                      ---- = F (u,v)                                                                               */
/*                                       dt     x                                                                                    */
/*                                                                                                                                   */
/*                                       dy                                                                                          */
/*                                      ---- = F (u,v)                                                                               */
/*                                       dt     y                                                                                    */
/*                                                                                                                                   */
/*                                       dz                                                                                          */
/*                                      ---- = constante (en valeur absolue)                                                         */
/*                                       dt                                                                                          */
/*                                                                                                                                   */
/*                  ou :                                                                                                             */
/*                                                                                                                                   */
/*                                      u E [0,2.pi]                                                                                 */
/*                                      v E [0,2.pi]                                                                                 */
/*                                                                                                                                   */
/*                  et :                                                                                                             */
/*                                                                                                                                   */
/*                                      'F (u,v)' et 'F (u,v)' etant deux fonctions quelconques de moyenne nulle :                   */
/*                                        x            y                                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                      <F (u,v)> = 0                                                                                */
/*                                        x                                                                                          */
/*                                                                                                                                   */
/*                                      <F (u,v)> = 0                                                                                */
/*                                        y                                                                                          */
/*                                                                                                                                   */
/*                  par exemple :                                                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                      F (u,v) = cos(u)                                                                             */
/*                                       x                                                                                           */
/*                                                                                                                                   */
/*                                      F (u,v) = cos(v)                                                                             */
/*                                       y                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    Les donnees initiales du probleme                                                                              */
/*                  sont :                                                                                                           */
/*                                                                                                                                   */
/*                                      (x ,y ,z ),                                                                                  */
/*                                        0  0  0                                                                                    */
/*                                                                                                                                   */
/*                                      (u ,v ).                                                                                     */
/*                                        0  0                                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    La reflexion sur l'un des deux plans paralleles                                                                */
/*                  (que l'on choisit perpendiculaires a l'axe 'OZ'                                                                  */
/*                  a cause des definitions des trois derivees, et                                                                   */
/*                  particulierement de la constance de la derivee de                                                                */
/*                  la coordonnee 'z') se fait en changeant le couple                                                                */
/*                  (u,v) courant suivant la loi ("chat d'Arnold") :                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                      | u |   | 2 1 || u |                                                                         */
/*                                      |   | = |     ||   | (modulo 2.pi)                                                           */
/*                                      | v |   | 1 1 || v |                                                                         */
/*                                                                                                                                   */
/*                                     [apres]        [avant]                                                                        */
/*                                                                                                                                   */
/*                  associee a :                                                                                                     */
/*                                                                                                                                   */
/*                                       dz       dz                                                                                 */
/*                                      ---- = - ----                                                                                */
/*                                       dt       dt                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.17.I"

dfTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,fichier_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE,NOMBRE_D_ITERATIONS)
                                        /* Definition du fichier des nombres d'iterations.                                           */
#define   sNOMBRE_D_ITERATIONS(numero_de_la_periode)                                                                                    \
                    INTE(sTRANSFORMAT_31(numero_de_la_periode,liste_NOMBRE_D_ITERATIONS))                                               \
                                        /* Formule generale definissant les variations du nombre d'iterations.                       */

#define   CU0                                                                                                                           \
                    GRO1(FRA1(FU))
#define   CV0                                                                                                                           \
                    GRO1(FRA1(FU))
DEFV(Local,DEFV(Float,INIT(cu,CU0)));
DEFV(Local,DEFV(Float,INIT(cv,CV0)));
                                        /* Definition des deux angles (u,v),                                                         */

#define   COMPOSANTE_EN_Z_DE_LA_VITESSE                                                                                                 \
                    FU
#define   DCZ                                                                                                                           \
                    COMPOSANTE_EN_Z_DE_LA_VITESSE

#define   CX0                                                                                                                           \
                    FZERO
#define   CY0                                                                                                                           \
                    FZERO
#define   CZ0                                                                                                                           \
                    FZERO

                                        /* Nouvelle valeur est destinee a limiter un probleme vu dans la sequence :                  */
                                        /*                                                                                           */
                                        /*                  xivPdf 2 1 / 017100_017227                                               */
                                        /*                                                                                           */
                                        /* pour laquelle la transition entre l'avant-derniere et la derniere images est bizarre ; en */
                                        /* particulier une des "branches" en bas a droite change de couleur (du bleu a l'orange).    */
                                        /* Une partie du probleme vient de l'incrementation/decrementation de la coordonnee 'z'      */
                                        /* (voir la definition de la fonction 'Fz(...)') ce qui a ete mise en evidence grace au      */
                                        /* programme 'v $xtc/increment.01$c' ; ce probleme a disparu pour un pas 'dct' inverse d'une */
                                        /* puissance de 2. Malheureusement ce n'est pas le seul probleme, et il reste surement       */
                                        /* quelque chose qui releve du meme principe. Ca y est j'ai compris :                        */
                                        /*                                                                                           */
                                        /* Soient par exemple les trois points suivants (dans l'espace physique) :                   */
                                        /*                                                                                           */
                                        /*                  P1=(X,Y,Z)=(7.3155693120848868,8.2766071523526143,-0.8750000000000000)   */
                                        /*                  P2=(X,Y,Z)=(7.4171054615643000,8.3137138067576046,-1.0000000000000000)   */
                                        /*                  P3=(X,Y,Z)=(7.3158618945904497,8.2742346945782863,-0.8750000000000000)   */
                                        /*                                                                                           */
                                        /*                  .                                                                        */
                                        /*               Y /|\                                                                       */
                                        /*                  |                                                                        */
                                        /*                  |                                P2                                      */
                                        /*                  |                                                                        */
                                        /*                  |                                                                        */
                                        /*                  |                                                                        */
                                        /*                  |        P1                                                              */
                                        /*                  |                                                                        */
                                        /*                  |           P3                                                           */
                                        /*                  |                                                                        */
                                        /*                  |                                                                        */
                                        /*                  O--------------------------------------->                                */
                                        /*                                                                                           */
                                        /*                                                          X                                */
                                        /*                                                                                           */
                                        /* Les points 'P1' et 'P3' sont donc dans le meme plan orthogonal a l'axe 'OZ' physique,     */
                                        /* ce que l'on va noter :                                                                    */
                                        /*                                                                                           */
                                        /*                  P1=P3                                                                    */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Faisons maintenant les deux rotations suivantes d'angle 'ANGLE' autour de l'axe 'OX' :    */
                                        /*                                                                                           */
                                        /* 1-ANGLE=pi-epsilon (=3.1) :                                                               */
                                        /*                                                                                           */
                                        /*                  Pm1=(X,Y,Z)=(0.7438523104028295,0.2255644649570133,0.0406130021528017)   */
                                        /*                  Pm2=(X,Y,Z)=(0.7472368487188100,0.2245018989596498,0.0448274959213018)   */
                                        /*                  Pm3=(X,Y,Z)=(0.7438620631530150,0.2256434784888424,0.0406097138739400)   */
                                        /*                                                                                           */
                                        /* et le point 'Pm1' est devant le point 'Pm3', soit :                                       */
                                        /*                                                                                           */
                                        /*                  Pm1>Pm3                                                                  */
                                        /*                                                                                           */
                                        /* (l'axe 'OZ' va d'arriere en avant)                                                        */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* 2-ANGLE=pi+epsilon (=3.2) :                                                               */
                                        /*                                                                                           */
                                        /*                  Pp1=(X,Y,Z)=(0.7438523104028295,0.2228809647667255,0.0130122691938415)   */
                                        /*                  Pp2=(X,Y,Z)=(0.7472368487188100,0.2214029598611198,0.0170996284541076)   */
                                        /*                  Pp3=(X,Y,Z)=(0.7438620631530150,0.2229599118401223,0.0130168855335212)   */
                                        /*                                                                                           */
                                        /* et le point 'Pp1' est derriere le point 'Pp3', soit :                                     */
                                        /*                                                                                           */
                                        /*                  Pp1<Pp3                                                                  */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Ainsi, les points 'P1' et 'P3' n'ayant pas la meme couleur, il y a, lors du passage       */
                                        /* de l'angle de rotation par la valeur 'pi' un basculement des couleurs...                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   V I S U A L I S A T I O N   E T   D ' I N T E R P O L A T I O N  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/particule.31.I"

dfTRANSFORMAT_31(liste_VARIABLE_cu0,fichier_VARIABLE_cu0,VARIABLE_cu0_IMPLICITE,CU0)
dfTRANSFORMAT_31(liste_VARIABLE_cv0,fichier_VARIABLE_cv0,VARIABLE_cv0_IMPLICITE,CV0)
                                        /* Definition des fichiers des valeurs initiales des deux angles (u0,v0).                    */
#define   sVARIABLE_cu0(numero_de_la_periode)                                                                                           \
                    FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cu0))
#define   sVARIABLE_cv0(numero_de_la_periode)                                                                                           \
                    FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cv0))
                                        /* Formule generale definissant les variations des valeurs initiales des deux angles.        */

dfTRANSFORMAT_31(liste_VARIABLE_dcz,fichier_VARIABLE_dcz,VARIABLE_dcz_IMPLICITE,DCZ)
                                        /* Definition du fichier de la valeur initiale de la composante en 'Z' de la vitesse.        */
#define   sVARIABLE_dcz(numero_de_la_periode)                                                                                           \
                    FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_dcz))
                                        /* Formule generale definissant la variation de la valeur initiale de la composante en 'Z'   */
                                        /* de la vitesse.                                                                            */

dfTRANSFORMAT_31(liste_VARIABLE_cx0,fichier_VARIABLE_cx0,VARIABLE_cx0_IMPLICITE,CX0)
dfTRANSFORMAT_31(liste_VARIABLE_cy0,fichier_VARIABLE_cy0,VARIABLE_cy0_IMPLICITE,CY0)
dfTRANSFORMAT_31(liste_VARIABLE_cz0,fichier_VARIABLE_cz0,VARIABLE_cz0_IMPLICITE,CZ0)
                                        /* Definition des fichiers des valeurs initiales des trois variables (x0,y0,z0).             */
#define   sVARIABLE_cx0(numero_de_la_periode)                                                                                           \
                    FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cx0))
#define   sVARIABLE_cy0(numero_de_la_periode)                                                                                           \
                    FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cy0))
#define   sVARIABLE_cz0(numero_de_la_periode)                                                                                           \
                    FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cz0))
                                        /* Formule generale definissant les variations des valeurs initiales des trois variables.    */

dfTRANSFORMAT_31(liste_PAS_DE_TEMPS_dct,fichier_PAS_DE_TEMPS_dct,PAS_DE_TEMPS_dct_IMPLICITE,DCT)
                                        /* Definition du fichier des pas de temps.                                                   */
#define   sPAS_DE_TEMPS_dct(numero_de_la_periode)                                                                                       \
                    FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PAS_DE_TEMPS_dct))

                                        /* Formule generale definissant les variations du pas de temps.                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   E N   P L A C E   D ' U N   S Y S T E M E   " N O N   D I F F U S I F "  :                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Au lieu de prendre les fonctions 'Fx' et                                                                       */
/*                  'Fy' definies precedemment, on utilise les                                                                       */
/*                  fonction 'Gx' et 'Gy' definies ainsi :                                                                           */
/*                                                                                                                                   */
/*                                       dx                                                                                          */
/*                                      ---- = G (u,v)                                                                               */
/*                                       dt     x                                                                                    */
/*                                                                                                                                   */
/*                                       dy                                                                                          */
/*                                      ---- = G (u,v)                                                                               */
/*                                       dt     y                                                                                    */
/*                                                                                                                                   */
/*                  ou :                                                                                                             */
/*                                                                                                                                   */
/*                                      G (u,v) = F (T(u,v)) - F (u,v)                                                               */
/*                                       x         x            x                                                                    */
/*                                                                                                                                   */
/*                                      G (u,v) = F (T(u,v)) - F (u,v)                                                               */
/*                                       y         y            y                                                                    */
/*                                                                                                                                   */
/*                  mais en fait pour simplifier les choses, nous allons utiliser :                                                  */
/*                                                                                                                                   */
/*                                                              -1                                                                   */
/*                                      G (u,v) = F (u,v) - F (T  (u,v))                                                             */
/*                                       x         x         x                                                                       */
/*                                                                                                                                   */
/*                                                              -1                                                                   */
/*                                      G (u,v) = F (u,v) - F (T  (u,v))                                                             */
/*                                       y         y         y                                                                       */
/*                                                                                                                                   */
/*                  (ou 'T' represente la matrice d'Arnold)                                                                          */
/*                                                                                                                                   */
/*                    Dans ces conditions, les particules devraient                                                                  */
/*                  diffuser beaucoup moins qu'avec les fonctions                                                                    */
/*                  'Fx' et 'Fy'...                                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   UN_SYSTEME_DIFFUSIF                                                                                                           \
                    VRAI
DEFV(Local,DEFV(Logical,INIT(un_systeme_diffusif,UN_SYSTEME_DIFFUSIF)));
                                        /* Indique si l'on utilise les fonctions [Fx,Fy] ('VRAI') ou les fonctions [Gx,Gy] ('FAUX'). */

DEFV(Local,DEFV(Float,INIT(cu_avant_la_reflexion,FLOT__UNDEF)));
DEFV(Local,DEFV(Float,INIT(cv_avant_la_reflexion,FLOT__UNDEF)));
                                        /* Memorisation des angles 'u' et 'v' avant la precedente reflexion (ces deux valeurs sont   */
                                        /* remises a 0 lors de toute reinitialisation...).                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   T R O I S   F O N C T I O N S   ' F '  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Fx(u,v)                                                                                                                       \
                    COSX(u)                                                                                                             \
                                        /* Definition de la fonction F (u,v).                                                        */ \
                                        /*                            x                                                              */
#define   Fy(u,v)                                                                                                                       \
                    COSX(v)                                                                                                             \
                                        /* Definition de la fonction F (u,v).                                                        */ \
                                        /*                            y                                                              */
#define   Fz(u,v)                                                                                                                       \
                    composante_en_Z_de_la_vitesse                                                                                       \
                                        /* Definition de la fonction F (u,v).                                                        */ \
                                        /*                            z                                                              */

DEFV(Local,DEFV(Float,INIT(composante_en_Z_de_la_vitesse,COMPOSANTE_EN_Z_DE_LA_VITESSE)));
                                        /* Definition de la composante en 'z' de la vitesse.                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   D E U X   P L A N S   P A R A L L E L E S  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Z_DU_PLAN_1                                                                                                                   \
                    NEGA(FU)
DEFV(Local,DEFV(Float,INIT(z_du_plan_1,Z_DU_PLAN_1)));
                                        /* Definition du premier orthogonal a l'axe 'OZ',                                            */
#define   Z_DU_PLAN_2                                                                                                                   \
                    NEUT(FU)
DEFV(Local,DEFV(Float,INIT(z_du_plan_2,Z_DU_PLAN_2)));
                                        /* Definition du second orthogonal a l'axe 'OZ'.                                             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L A   R E F L E X I O N   S U R   L E S   D E U X   P L A N S   P A R A L L E L E S  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   REFLEXION_11                                                                                                                  \
                    FDEUX
#define   REFLEXION_12                                                                                                                  \
                    FU
#define   REFLEXION_21                                                                                                                  \
                    FU
#define   REFLEXION_22                                                                                                                  \
                    FU

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L ' I N T E G R A T I O N   D U   S Y S T E M E                                                */
/*        D ' E Q U A T I O N S   D I F F E R E N T I E L L E S  :                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/integr.1B.vv.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   I N I T I A L I S A T I O N S  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.18.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E T U D E   D E   L ' E R G O D I C I T E   D E   L A   D I F F U S I O N   D ' U N E   P A R T I C U L E  :               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     INITIALISATIONS_GENERALES;
                                        /* Initialisations generales faites au tout debut...                                         */

     iTRANSFORMAT_31(liste_VARIABLE_cu0,VARIABLE_cu0_IMPLICITE);
     iTRANSFORMAT_31(liste_VARIABLE_cv0,VARIABLE_cv0_IMPLICITE);
                                        /* Initialisation des valeurs initiales des deux angles (u0,v0).                             */
     iTRANSFORMAT_31(liste_VARIABLE_dcz,VARIABLE_dcz_IMPLICITE);
                                        /* Initialisation de la valeur implicite de la valeur initiale de la composante en 'Z' de    */
                                        /* la vitesse.                                                                               */
     iTRANSFORMAT_31(liste_VARIABLE_cx0,VARIABLE_cx0_IMPLICITE);
     iTRANSFORMAT_31(liste_VARIABLE_cy0,VARIABLE_cy0_IMPLICITE);
     iTRANSFORMAT_31(liste_VARIABLE_cz0,VARIABLE_cz0_IMPLICITE);
                                        /* Initialisation des valeurs initiales des trois variables (x0,y0,z0).                      */
     iTRANSFORMAT_31(liste_PAS_DE_TEMPS_dct,PAS_DE_TEMPS_dct_IMPLICITE);
                                        /* Initialisation du pas de temps.                                                           */
     iTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE);
                                        /* Initialisation du nombre d'iterations.                                                    */

#include  xrv/champs_5.1A.I"

     GET_ARGUMENTSv(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENTS_GEOMETRIQUES;

                         PROCESS_ARGUMENT_FICHIER("VARIABLE_cu0="
                                                 ,fichier_VARIABLE_cu0
                                                 ,liste_VARIABLE_cu0
                                                 ,VARIABLE_cu0_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("VARIABLE_cv0="
                                                 ,fichier_VARIABLE_cv0
                                                 ,liste_VARIABLE_cv0
                                                 ,VARIABLE_cv0_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("VARIABLE_dcz="
                                                 ,fichier_VARIABLE_dcz
                                                 ,liste_VARIABLE_dcz
                                                 ,VARIABLE_dcz_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("VARIABLE_cx0="
                                                 ,fichier_VARIABLE_cx0
                                                 ,liste_VARIABLE_cx0
                                                 ,VARIABLE_cx0_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("VARIABLE_cy0="
                                                 ,fichier_VARIABLE_cy0
                                                 ,liste_VARIABLE_cy0
                                                 ,VARIABLE_cy0_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("VARIABLE_cz0="
                                                 ,fichier_VARIABLE_cz0
                                                 ,liste_VARIABLE_cz0
                                                 ,VARIABLE_cz0_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("PAS_DE_TEMPS_dct="
                                                 ,fichier_PAS_DE_TEMPS_dct
                                                 ,liste_PAS_DE_TEMPS_dct
                                                 ,PAS_DE_TEMPS_dct_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("NOMBRE_D_ITERATIONS="
                                                 ,fichier_NOMBRE_D_ITERATIONS
                                                 ,liste_NOMBRE_D_ITERATIONS
                                                 ,NOMBRE_D_ITERATIONS_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENTS_DE_VISUALISATION;

                         PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES;

                         GET_ARGUMENT_I("n=""iterations=",nombre_d_iterations);

                         GET_ARGUMENT_L("diffusif=",un_systeme_diffusif);

                         GET_ARGUMENT_F("vz=",composante_en_Z_de_la_vitesse);

                         GET_ARGUMENT_F("z1=",z_du_plan_1);
                         GET_ARGUMENT_F("z2=",z_du_plan_2);

                         GET_ARGUMENT_F("dt=""dct=",dct);
                         )
                    );

#include  xrv/champs_5.19.I"
                                        /* Pour eviter le message :                                                                  */
                                        /*                                                                                           */
                                        /*                  Static function is not referenced.                                       */
                                        /*                                                                                           */
                                        /* sur 'SYSTEME_ES9000_AIX_CC'...                                                            */

#include  xrk/attractor.19.I"
                                        /* Validations et definition de l'espace physique.                                           */

     Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)
          Bblock
          RE_INITIALISATION_DE_L_HORLOGE;
          INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante);
                                        /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image.    */

          EGAL(cu,sVARIABLE_cu0(numero_de_la_periode_courante));
          EGAL(cv,sVARIABLE_cv0(numero_de_la_periode_courante));
                                        /* Calcul des valeurs initiales des deux angles (u0,v0).                                     */

          Test(IL_NE_FAUT_PAS(un_systeme_diffusif))
               Bblock
               EGAL(cu_avant_la_reflexion,FZERO);
               EGAL(cv_avant_la_reflexion,FZERO);
                                        /* Initialisation des valeurs des fonctions 'Fx' et 'Fy' a l'instant precedent...            */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          EGAL(composante_en_Z_de_la_vitesse,sVARIABLE_dcz(numero_de_la_periode_courante));
                                        /* Calcul de la valeur initiale de la composante en 'Z' de la vitesse.                       */

          EGAL(cx,sVARIABLE_cx0(numero_de_la_periode_courante));
          EGAL(cy,sVARIABLE_cy0(numero_de_la_periode_courante));
          EGAL(cz,sVARIABLE_cz0(numero_de_la_periode_courante));
                                        /* Calcul des valeurs initiales des trois variables (x0,y0,z0).                              */
          Test(NINCff(cz,z_du_plan_1,z_du_plan_2))
               Bblock
               PRINT_ERREUR("la coordonnee 'z' initiale n'est pas situee entre les deux plans paralleles");
               CAL1(Prer3("z=%g   plans=(%g,%g)\n",cz,z_du_plan_1,z_du_plan_2));
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          EGAL(dcx,FZERO);
          EGAL(dcy,FZERO);
          EGAL(dcz,FZERO);
                                        /* Initialisation des differentielles pour la premiere visualisation si celle-ci a lieu      */
                                        /* en couleurs. On notera que 'FZERO' est la valeur la plus "logique"...                     */

          vTRANSFORMAT_31(nombre_d_iterations,sNOMBRE_D_ITERATIONS,numero_de_la_periode_courante,fichier_NOMBRE_D_ITERATIONS);
                                        /* Calcul du nombre d'iterations lorsqu'il est variable.                                     */

          vTRANSFORMAT_31(dct,sPAS_DE_TEMPS_dct,numero_de_la_periode_courante,fichier_PAS_DE_TEMPS_dct);
                                        /* Calcul du pas de temps.                                                                   */
          Test(IFLT(DIVI(SOUA(z_du_plan_1,z_du_plan_2)
                        ,ABSO(composante_en_Z_de_la_vitesse)
                         )
                   ,GRO1(GRO10(dct))
                    )
               )
               Bblock
               PRINT_ERREUR("le pas de temps est trop grand, ce qui creera des artefacts au moment de la reflexion");
               CAL1(Prer2("temps de vol du plan 1 au plan 2=%g   dct=%g\n"
                         ,DIVI(SOUA(z_du_plan_1,z_du_plan_2)
                              ,ABSO(composante_en_Z_de_la_vitesse)
                               )
                         ,dct
                          )
                    );
                                        /* Voir a ce propos l'instruction :                                                          */
                                        /*                                                                                           */
                                        /*                  EGAL(cz,TRON(cz,...));                                                   */
                                        /*                                                                                           */
                                        /* ci-apres et les commentaires associes...                                                  */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Komp(numero_de_l_iteration_courante,nombre_d_iterations)
               Bblock
               RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES;
                                        /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les    */
                                        /* extrema pourraient etre utilises pour la visualisation...                                 */

               Test(IFOU(IL_FAUT(visualiser_le_fantome)
                        ,IFGE(numero_de_l_iteration_courante,PREMIERE_ITERATION_VISUALISEE)
                         )
                    )
                    Bblock
                    CALS(memorisation_1_point_07(SOUS(cx,Xcentre_ESPACE)
                                                ,SOUS(cy,Ycentre_ESPACE)
                                                ,SOUS(cz,Zcentre_ESPACE)
                                                ,dcx
                                                ,dcy
                                                ,dcz
                                                ,numero_de_l_iteration_courante
                                                 )
                         );
                                        /* Memorisation de l'iteration courante...                                                   */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               INTEGRE(Icx,cx,dcx
                      ,COND(IL_FAUT(un_systeme_diffusif)
                           ,Fx(cu,cv)
                           ,SOUS(Fx(cu,cv),Fx(cu_avant_la_reflexion,cv_avant_la_reflexion))
                            )
                      ,dct
                       );
               INTEGRE(Icy,cy,dcy
                      ,COND(IL_FAUT(un_systeme_diffusif)
                           ,Fy(cu,cv)
                           ,SOUS(Fy(cu,cv),Fy(cu_avant_la_reflexion,cv_avant_la_reflexion))
                            )
                      ,dct
                       );
               INTEGRE(Icz,cz,dcz
                      ,Fz(cu,cv)
                      ,dct
                       );
               MISE_A_JOUR(cx,Icx,cy,Icy,cz,Icz);
                                        /* Integration de la trajectoire. On notera qu'il est possible d'observer des retours en     */
                                        /* arriere presque parfaits ; par exemple avec :                                             */
                                        /*                                                                                           */
                                        /*                 (u ,v )=(1.0,1.0)                                                         */
                                        /*                   0  0                                                                    */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                 dct=0.2                                                                   */
                                        /*                                                                                           */
                                        /* on observe apres la dix-neuvieme reflexion :                                              */
                                        /*                                                                                           */
                                        /*                 (u,v)=(3.351,5.768) ==> {dx,dy,dz}=(-0.9781,+0.8702,+1)                   */
                                        /*                                                                                           */
                                        /* et lors de la reflexion suivante :                                                        */
                                        /*                                                                                           */
                                        /*                 (u,v)=(6.188,2.836) ==> {dx,dy,dz}=(+0.9954,-0.9537,-1)                   */
                                        /*                                                                                           */
                                        /* ou l'on voit les signes des trois derivees s'inverser, alors que leurs valeurs absolues   */
                                        /* ne changent pratiquement pas...                                                           */

               Test(NINCoo(cz,z_du_plan_1,z_du_plan_2))
                    Bblock
                                        /* Cas ou la particule tente de franchir l'un des deux plans, il y a reflexion :             */
                    DEFV(Float,INIT(cu_manoeuvre,FLOT__UNDEF));
                    DEFV(Float,INIT(cv_manoeuvre,FLOT__UNDEF));
                                        /* Deux valeurs de manoeuvre pour faire le produit matriciel de reflexion...                 */

                    Test(IL_NE_FAUT_PAS(un_systeme_diffusif))
                         Bblock
                         INIT(cu_avant_la_reflexion,cu);
                         INIT(cv_avant_la_reflexion,cv);
                                        /* Memorisation des angles 'u' et 'v' avant la reflexion...                                  */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(cu_manoeuvre,LIZ2(REFLEXION_11,cu,REFLEXION_12,cv));
                    EGAL(cv_manoeuvre,LIZ2(REFLEXION_21,cu,REFLEXION_22,cv));
                    EGAL(cu,CERC(cu_manoeuvre));
                    EGAL(cv,CERC(cv_manoeuvre));
                                        /* Reflexion par modification des deux angles (u,v) suivant :                                */
                                        /*                                                                                           */
                                        /*                  | u |   | 2 1 || u |                                                     */
                                        /*                  |   | = |     ||   | (modulo 2.pi)                                       */
                                        /*                  | v |   | 1 1 || v |                                                     */
                                        /*                                                                                           */
                                        /*                 [apres]        [avant]                                                    */
                                        /*                                                                                           */
                                        /* On pourrait croire que le modulo '2.pi' n'est pas necessaire puisque les angles 'u'       */
                                        /* et 'v' sont utilises via des lignes trigonometriques, mais en fait, il n'en n'est rien    */
                                        /* car en effet, on est en presence ci-dessus approximativement d'une exponentielle en base  */
                                        /* 2 lors du calcul de 'u', or il est connu que cela va tres vite, d'ou des risques de       */
                                        /* debordement...                                                                            */
                    EGAL(composante_en_Z_de_la_vitesse,NEGA(composante_en_Z_de_la_vitesse));
                                        /* Et bien sur, il faut aussi inverser la composante en 'Z' de la vitesse :                  */
                                        /*                                                                                           */
                                        /*                   dz       dz                                                             */
                                        /*                  ---- = - ----                                                            */
                                        /*                   dt       dt                                                             */
                                        /*                                                                                           */
                    EGAL(cz,TROQ(cz,z_du_plan_1,z_du_plan_2));
                                        /* Malheureusement, il faut tricher un peu en ramenant la coordonnee 'z' sur le plan         */
                                        /* adequat car en effet, si l'on restait la ou l'on est, et surtout a l'exterieur des        */
                                        /* des deux plans, a l'iteration suivante on pourrait, en cas de deplacement reduit,         */
                                        /* rester a l'exterieur des deux plans. Ceci explique que l'on valide le pas de temps        */
                                        /* utilise, car s'il est trop grand, cette operation 'TROQ(...)' peut modifier de facon      */
                                        /* considerable la trajectoire de la particule...                                            */
                    Eblock
               ATes
                    Bblock
                                        /* Cas ou il n'y a pas reflexion, la particule continue a se deplacer en ligne droite...     */
                    Eblock
               ETes

               INCREMENTATION_DE_L_HORLOGE(dct);
                                        /* Simulation du temps de la simulation...                                                   */
               Eblock
          EKom

#include  xrk/attractor.1A.I"

          VISUALISATION_DES_AXES_DE_COORDONNEES;
                                        /* Visualisation si necessaire des trois axes de coordonnees.                                */

          GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;));
                                        /* Generation de l'image courante...                                                         */
          Eblock
     EKom

     EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES;
                                        /* Edition facultative des extrema des coordonnees et des derivees.                          */

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.