/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O B L E M E   D I T   D E S   " N - C O R P S "  :                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                                       .:oOOoo-....-:oOOo:.                                        */
/*                                                            .:O-.                          -:.                                     */
/*                                 .-::::.-:oOOOoooo:ooooOOOoo:..-:::-..                      :.                                     */
/*                        .-::..:oo-      .-:ooooooooooooooooo:-oo.  -oo:. .::-              -.                                      */
/*                   -::  .oo.    .:oo--OOo:-.   .:..     .-:oo:-: :oo-    .o:   ::.       ...                                       */
/*               .:-   -o.    .:o..::-.  .-.-.--oo---:o:-o.:-     :-.  .:-     o:   .:. -...                                         */
/*             -:    -o     -:  .-.    .-....-o  o%%O.  .-...-.     -.   -.      o.  -...                                            */
/*            -     .:     .-.  .-      --.--.:-. :--:-------.     --   --.      -....::..                                           */
/*           .-      -- o.  .--  .--:-     --:::::::::::-.    -:::-.-::-.   .:.....   -..                                            */
/*            .-    .O.--     .--:::..-::oooooo::::::oooooo::-:ooo:-.  .:--...--.   -..                                              */
/*             ...o.    ..-:.      .--::oooooOoOooOooooooo::--..  -o--....::-..  -...                                                */
/*              O .....     ..--:o:.                      oo:o:--...:o:-....--....                                                   */
/*            .O     .......--.   ...--::ooooOOOOOOOOOOo:-....---..----......                                                        */
/*            --            ........-----::::ooo:--.....::----........                                                               */
/*             .:-:             .-:::---................                                                                             */
/*              .. ..................                                                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    (d'apres la representation 'v $xiirk/NCOR.U1.2048'                                                             */
/*                    du systeme solaire durant une annee plutonienne)                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrr/N_corps.11$K' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1995??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   FACTEUR_D_EXTENSION_DE_L_ESPACE_PHYSIQUE                                                                                      \
                    FU                                                                                                                  \
                                        /* Facteur d'extension de l'univers. Celui-ci a ete tout particulierement introduit a        */ \
                                        /* cause de 'v $xrr/N_corps.11$K' ; en effet, dans ce dernier l'univers defini initialement  */ \
                                        /* etait cinq fois trop petit pour contenir les planetes les plus exterieures. Pour assurer  */ \
                                        /* la compatibilite avec les sequences deja generees, il a suffi d'ajouter ce facteur avec   */ \
                                        /* comme valeur par defaut, l'unite. La valeur '5.0' permet de traiter le systeme solaire... */

#define   hXmin_ESPACE                                                                                                                  \
                    PARE(-1.0e12)
#define   hYmin_ESPACE                                                                                                                  \
                    PARE(-1.0e12)
#define   hZmin_ESPACE                                                                                                                  \
                    PARE(-1.0e12)
                                        /* Definition du "coin" inferieur-gauche-arriere de l'espace physique.                       */

#define   hXmax_ESPACE                                                                                                                  \
                    PARE(1.0e12)
#define   hYmax_ESPACE                                                                                                                  \
                    PARE(1.0e12)
#define   hZmax_ESPACE                                                                                                                  \
                    PARE(1.0e12)
                                        /* Definition du "coin" superieur-droit-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                                                                                                                  \
                    FLOT__NOIR
#define   dYmin_ESPACE                                                                                                                  \
                    FLOT__NOIR
#define   dZmin_ESPACE                                                                                                                  \
                    FLOT__NOIR
                                        /* Definition des minima des differentielles {dx,dy,dz}.                                     */
#define   dXmax_ESPACE                                                                                                                  \
                    FLOT__BLANC
#define   dYmax_ESPACE                                                                                                                  \
                    FLOT__BLANC
#define   dZmax_ESPACE                                                                                                                  \
                    FLOT__BLANC
                                        /* 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'.   */

#define   EDITER_LES_COORDONNEES_ET_LES_VITESSES                                                                                        \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(editer_les_coordonnees_et_les_vitesses,EDITER_LES_COORDONNEES_ET_LES_VITESSES)));
                                        /* Indique si a chaque pas de temps on doit editer ('VRAI') ou pas ('FAUX') les coordonnees  */
                                        /* et les vitesses de chaque corps...                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   nombre_de_corps                                                                                                               \
                    nombre_d_iterations                                                                                                 \
                                        /* ATTENTION, a ne pas confondre :                                                           */ \
                                        /*                                                                                           */ \
                                        /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que     */ \
                                        /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par     */ \
                                        /* 'fTRANSFORMAT_31(...)', et                                                                */ \
                                        /*                                                                                           */ \
                                        /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque       */ \
                                        /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la      */ \
                                        /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite     */ \
                                        /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'...                                      */ \
                                        /*                                                                                           */

#define   DCT                                                                                                                           \
                    CENT
DEFV(Local,DEFV(Float,INIT(dct,DCT)));
                                        /* Definition de 'dt'.                                                                       */

#include  xrk/attractor.14.I"

#define   NOMBRE_MAXIMAL_DE_POINTS_GERABLES                                                                                             \
                    MIN2(NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION)                            \
                                        /* Cette constante permet de gerer d'une facon homogene les listes de dimension              */ \
                                        /* 'nombre_de_periodes_de_la_simulation' comme celles de dimension 'nombre_d_iterations'.    */

                                        /* ATTENTION, a ne pas confondre :                                                           */
                                        /*                                                                                           */
                                        /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que     */
                                        /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par     */
                                        /* 'fTRANSFORMAT_31(...)', et                                                                */
                                        /*                                                                                           */
                                        /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque       */
                                        /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la      */
                                        /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite     */
                                        /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'...                                      */
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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                                                                                                        \
                    PARE(4.0e10)
DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION)));
                                        /* Rayon du disque materialisant une iteration. ATTENTION, cette variable n'est pas un       */
                                        /* parametre du programme ; il est mis a jour en permanence au cours des calculs...          */
#define   FACTEUR_DU_RAYON_DE_VISUALISATION                                                                                             \
                    FU
DEFV(Local,DEFV(Float,INIT(facteur_du_rayon_de_visualisation,FACTEUR_DU_RAYON_DE_VISUALISATION)));
                                        /* Et facteur multiplicatif...                                                               */

#define   RAYON_DE_VISUALISATION_D_UN_CORPS                                                                                             \
                    MUL2(facteur_du_rayon_de_visualisation                                                                              \
                        ,COND(EST_VRAI(les_rayons_de_visualisation_sont_fonction_de_la_masse)                                           \
                             ,MUL2(ACCES_LISTE(liste_initiale_des_RAYON,corps)                                                          \
                                  ,RAC3(ACCES_MASSES(corps))                                                                            \
                                   )                                                                                                    \
                             ,ACCES_LISTE(liste_initiale_des_RAYON,corps)                                                               \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Le 20070227143708, PUIX(...,INVE(TRI_DIMENSIONNEL))' fut remplace par 'RAC3(...)'.        */
#define   LES_RAYONS_DE_VISUALISATION_SONT_FONCTION_DE_LA_MASSE                                                                         \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(les_rayons_de_visualisation_sont_fonction_de_la_masse
                            ,LES_RAYONS_DE_VISUALISATION_SONT_FONCTION_DE_LA_MASSE
                             )
                )
     );
                                        /* Indique si le rayon de visualisation de chaque corps est defini de facon "absolue"        */
                                        /* ('FAUX') ou bien s'il est de plus fonction de la masse ('VRAI'). Dans ce dernier cas      */
                                        /* 'liste_initiale_des_RAYON' devient un facteur de proportionnalite. Afin de conserver      */
                                        /* tailles utilisees jusqu'a present, par exemple pour le Soleil, on pourra utiliser :       */
                                        /*                                                                                           */
                                        /*                  LISTE_RAYON=32                                                           */
                                        /*                                                                                           */
                                        /* cette constante ayant ete obtenue grace aux caracteristiques du Soleil. Jusqu'a present   */
                                        /* on utilisait :                                                                            */
                                        /*                                                                                           */
                                        /*                  M(Soleil) = +2.0e30                                                      */
                                        /*                  R(Soleil) = +40e10                                                       */
                                        /*                                                                                           */
                                        /* La constante '32' ci-dessus vient de :                                                    */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /*                      40e10                                                                */
                                        /*                  ------------- ~ 31.7 ~ 32                                                */
                                        /*                            1                                                              */
                                        /*                           ---                                                             */
                                        /*                            3                                                              */
                                        /*                   (2.0e30)                                                                */
                                        /*                                                                                           */
                                        /* Malheureusement, l'experience montre que pour voir nettement les planetes, c'est          */
                                        /* plutot '256' qu'il faut utiliser :                                                        */
                                        /*                                                                                           */
                                        /*                  LISTE_RAYON=256                                                          */
                                        /*                                                                                           */
                                        /* ce qui donne un soleil demesure (mais tres realiste...).                                  */

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

#define   VISIBILITE(niveau)                                                                                                            \
                    MUL2(visibilite_du_point,niveau)                                                                                    \
                                        /* Pour pouvoir attenuer {AdXf,AdYf,AdZf}...                                                 */

BFonctionI

DEFV(Local,DEFV(FonctionI,memorisation_point_grave(AXf,AYf,AZf
                                                  ,AdXf,AdYf,AdZf
                                                  ,pG
                                                  ,masse
                                                  ,VXf,VYf,VZf
                                                  ,numero_de_l_iteration_courante
                                                  ,visibilite_du_point
                                                   )
                )
     )
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(Float,pG));
                                        /* Ponderation du point courant lors de l'eventuel calcul du centre de gravite (introduit    */
                                        /* le 19990608091843).                                                                       */
DEFV(Argument,DEFV(Float,masse));
                                        /* Masse de l'iteration courante...                                                          */
DEFV(Argument,DEFV(Float,VXf));
DEFV(Argument,DEFV(Float,VYf));
DEFV(Argument,DEFV(Float,VZf));
                                        /* Definition de la vitesse (Vx,Vy,Vz) 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).                                    */
DEFV(Argument,DEFV(Float,visibilite_du_point));
                                        /* Indicateur introduit le 20061026114627 qui precise si le point courant est visible        */
                                        /* ('VRAI') ou pas ('FAUX')...                                                               */
                                        /*                                                                                           */
                                        /* Le type est passe de 'Logical' a 'Float' le 20061106140813 afin d'en faire simultanement  */
                                        /* une attenuation des trois composantes chromatiques...                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrk/attractor.15.I"

     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IZGT(visibilite_du_point))
          Bblock
                                        /* Cas ou le corps courant est visible :                                                     */
          DEFINITION_DE_LA_VITESSE_DE_LA_SPHERE_COURANTE(VXf,VYf,VZf);
                                        /* Memorisation de la masse du point courant.                                                */
          DEFINITION_PONDERATION_DU_PSEUDO_CENTRE_DE_GRAVITE_DE_LA_SPHERE_COURANTE(pG);
                                        /* Memorisation de la ponderation du point courant lors de l'eventuel calcul du centre de    */
                                        /* gravite.                                                                                  */
          DEFINITION_DE_LA_MASSE_DE_LA_SPHERE_COURANTE(masse);
                                        /* Memorisation de la masse du point courant.                                                */

          CALS(memorisation_1_point_07(AXf,AYf,AZf
                                      ,VISIBILITE(AdXf),VISIBILITE(AdYf),VISIBILITE(AdZf)
                                      ,numero_de_l_iteration_courante
                                       )
               );
                                        /* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est   */
                                        /* visible en fonction des conditions de visualisation...                                    */
          Eblock
     ATes
          Bblock
                                        /* Cas ou le corps courant n'est pas visible : rien a faire. Cette possibilite a ete         */
                                        /* introduite le 20061026114627...                                                           */
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND                                                                                  \
                                        /* Afin de permettre la mise en place d'un fond pour chaque image generee (definition        */ \
                                        /* deplacee ici le 20030313151705). D'autre part 'PERMETTRE_L_UTILISATION_D_UN_FOND'         */ \
                                        /* a ete change en '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' le 20030313145928          */ \
                                        /* afin de permettre sa recuperation dans 'v $xcc/cpp$Z _VERSION_'.                          */

#include  xrk/attractor.17.I"

#include  xrv/particule.31.I"

#define   VISUALISER_L_ENSEMBLE_DES_INSTANTS                                                                                            \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(visualiser_l_ensemble_des_instants,VISUALISER_L_ENSEMBLE_DES_INSTANTS)));
                                        /* Doit-on visualiser l'ensemble des instants ('VRAI') ou bien uniquement l'instant          */
                                        /* precedent ('FAUX').                                                                       */

#define   REDUCTION_DES_INSTANTS_ANTERIEURS(grandeur,facteur_de_reduction)                                                              \
                    COND(IFEQ(periode,numero_de_la_periode_courante_de_la_simulation)                                                   \
                        ,NEUT(grandeur)                                                                                                 \
                        ,MUL2(facteur_de_reduction,grandeur)                                                                            \
                         )                                                                                                              \
                                        /* Procedure de reduction d'une grandeur en fonction de son "age"...                         */

#define   FACTEUR_DE_REDUCTION_DES_RAYONS_DES_INSTANTS_ANTERIEURS                                                                       \
                    FU
DEFV(Local,DEFV(Float,INIT(facteur_de_reduction_des_rayons_des_instants_anterieurs
                          ,FACTEUR_DE_REDUCTION_DES_RAYONS_DES_INSTANTS_ANTERIEURS
                           )
                )
     );
                                        /* Lorsque 'IL_FAUT(visualiser_l_ensemble_des_instants)' l'instant precedent doit etre       */
                                        /* visualise a l'aide 'ACCES_LISTE(liste_initiale_des_RAYON,corps)', alors que les instants  */
                                        /* anterieurs seront differencies a l'aide de ce facteur d'echelle (en general inferieur ou  */
                                        /* egal a 1).                                                                                */
#define   FACTEUR_DE_REDUCTION_DES_COULEURS_DES_INSTANTS_ANTERIEURS                                                                     \
                    FU
DEFV(Local,DEFV(Float,INIT(facteur_de_reduction_des_couleurs_des_instants_anterieurs
                          ,FACTEUR_DE_REDUCTION_DES_COULEURS_DES_INSTANTS_ANTERIEURS
                           )
                )
     );
                                        /* Lorsque 'IL_FAUT(visualiser_l_ensemble_des_instants)' l'instant precedent doit etre       */
                                        /* visualise a l'aide 'ACCES_LISTE(liste_initiale_des_RVB,corps)', 'liste_initiale_des_RVB'  */
                                        /* symbolisant les listes 'liste_initiale_des_ROUGE', 'liste_initiale_des_VERTE' et          */
                                        /* 'liste_initiale_des_BLEUE', alors que les instants anterieurs seront differencies a       */
                                        /* l'aide de ce facteur d'echelle (en general inferieur ou egal a 1).                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   T E M P S                                                                                      */
/*        E T   D E   C E   Q U I   P E U T   V A R I E R   A U   C O U R S   D U   T E M P S  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
dfTRANSFORMAT_31(liste_initiale_des_PAS_DE_TEMPS,fichier_LISTE_PAS_DE_TEMPS,PAS_DE_TEMPS_IMPLICITE,DCT)
#define   ACCES_PAS_DE_TEMPS(numero_de_la_periode)                                                                                      \
                    sTRANSFORMAT_31(numero_de_la_periode                                                                                \
                                   ,liste_initiale_des_PAS_DE_TEMPS                                                                     \
                                    )                                                                                                   \
                                        /* Definition du fichier de liste des pas de temps (introduit le 20070821160427).            */

#define   NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE                                                                                            \
                    GRO4(DIX_MILLE)
DEFV(Local,DEFV(Int,INIT(nombre_de_pas_de_temps_par_periode,NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE)));
                                        /* Definition du nombre de pas de temps que l'on effectue pour une periode (c'est-a-dire     */
                                        /* entre deux images calculees).                                                             */

dfTRANSFORMAT_31(liste_initiale_des_NOMBRES,fichier_LISTE_NOMBRES,NOMBRES_IMPLICITE,NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE)
#define   ACCES_NOMBRES(numero_de_la_periode)                                                                                           \
                    sTRANSFORMAT_31(numero_de_la_periode                                                                                \
                                   ,liste_initiale_des_NOMBRES                                                                          \
                                    )                                                                                                   \
                                        /* Definition du fichier de liste des nombres (introduit le 20070821160427...).              */

dfTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_RAYON
                ,fichier_LISTE_FACTEUR_DU_RAYON
                ,FACTEUR_DU_RAYON_DE_VISUALISATION_IMPLICITE
                ,FACTEUR_DU_RAYON_DE_VISUALISATION
                 )
#define   ACCES_FACTEUR_DU_RAYON(numero_de_la_periode)                                                                                  \
                    sTRANSFORMAT_31(numero_de_la_periode                                                                                \
                                   ,liste_initiale_des_FACTEUR_DU_RAYON                                                                 \
                                    )                                                                                                   \
                                        /* Definition du fichier de liste des facteurs multiplicatifs du rayon de visualisation      */ \
                                        /* (introduit le 20070827094840).                                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   D E P L A C E M E N T   M I N I M A L   V I S U A L I S A B L E  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   FACTEUR_DU_DEPLACEMENT_MINIMAL_ACCEPTABLE                                                                                     \
                    FZERO
DEFV(Local,DEFV(Float,INIT(facteur_du_deplacement_minimal_acceptable
                          ,FACTEUR_DU_DEPLACEMENT_MINIMAL_ACCEPTABLE
                           )
                )
     );
                                        /* Permet a partir du rayon de chaque corps, de determiner le deplacement minimal entre      */
                                        /* deux positions successives. Ceci n'a de sens, bien entendu, que lorsque l'on doit         */
                                        /* visualiser l'ensemble des instants, soit 'IL_FAUT(visualiser_l_ensemble_des_instants)'.   */
                                        /* La valeur par defaut 'FZERO' a ete choisie afin d'assurer la compatibilite avec les       */
                                        /* versions anterieures...                                                                   */

/*===================================================================================================================================*/
/*        :Debut_listMN_PROBLEME_DES_N_CORPS_11:                                                                                     */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   P R O B L E M E   D I T   D E S   " N - C O R P S "  :                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Soit la famille {C ,C ,...,C } de 'N'                                                                          */
/*                                      1  2      N                                                                                  */
/*                  corps graves en interaction gravitationnelle.                                                                    */
/*                  Pour l'un d'entre-eux, la loi fondamentale de                                                                    */
/*                  la dynamique s'ecrit :                                                                                           */
/*                                                                                                                                   */
/*                                     --->      ------->                                                                            */
/*                                      F   = M . Gamma                                                                              */
/*                                       i     i       i                                                                             */
/*                                                                                                                                   */
/*                  dans le cas present, la force 'F' est la                                                                         */
/*                  resultante de l'interaction gravitationnelle                                                                     */
/*                  des 'N-1' autres corps. On aura donc :                                                                           */
/*                                                                                                                                   */
/*                                       ------->   --->                                                                             */
/*                                     M .Gamma   =  F                                                                               */
/*                                      i      i      i                                                                              */
/*                                                                                                                                   */
/*                  ou encore :                                                                                                      */
/*                                                                                                                                   */
/*                                          2 ---->     ______                                                                       */
/*                                         d   OA       \         M M                                                                */
/*                                               i       \         i k    ----->                                                     */
/*                                     M .--------- = G  /     ----------- A A                                                       */
/*                                      i      2        /_____  |----->|3   i k                                                      */
/*                                           dt           k#i   | A A  |                                                             */
/*                                                              |  i k |                                                             */
/*                                                                                                                                   */
/*                  ou encore :                                                                                                      */
/*                                                                                                                                   */
/*                                       2 ---->     ______                                                                          */
/*                                      d   OA       \          M                                                                    */
/*                                            i       \          k     ----->                                                        */
/*                                     --------- = G  /     ----------- A A                                                          */
/*                                          2        /_____  |----->|3   i k                                                         */
/*                                        dt           k#i   | A A  |                                                                */
/*                                                           |  i k |                                                                */
/*                                                                                                                                   */
/*                  On aboutit ainsi a un systeme d'equations                                                                        */
/*                  differentielles non lineaires du second                                                                          */
/*                  ordre utilisant les fonctions suivantes :                                                                        */
/*                                                                                                                                   */
/*                                     F    = 1                                                                                      */
/*                                      3X                                                                                           */
/*                                        i                                                                                          */
/*                                                                                                                                   */
/*                                     F    = 0                                                                                      */
/*                                      2X                                                                                           */
/*                                        i                                                                                          */
/*                                               ______                                                                              */
/*                                               \                         M                       X                                 */
/*                                                \                         k                       k                                */
/*                                     F    = -G  /     -----------------------------------------(---- - 1)                          */
/*                                      1X       /_____  |                                   | 3   X                                 */
/*                                        i        k#i   |                                   |---   i                                */
/*                                                       |         2            2           2| 2                                     */
/*                                                       |(X  - X )  + (Y  - Y )  + (Z  - Z )|                                       */
/*                                                       |  k    i       k    i       k    i |                                       */
/*                                                                                                                                   */
/*                                     F    = 0                                                                                      */
/*                                      0X                                                                                           */
/*                                        i                                                                                          */
/*                                                                                                                                   */
/*                  avec bien entendu des formules equivalentes                                                                      */
/*                  pour les coordonnees 'Y' et 'Z'...                                                                               */
/*                                                                                                                                   */
/*                    Pour integrer ce systeme non lineaire, on                                                                      */
/*                  suppose que la condition suivante est respectee                                                                  */
/*                  (elle est d'ailleurs verifiee a chaque iteration) :                                                              */
/*                                                                                                                                   */
/*                                     DISTANCE(C ,C ) >= |V   |.dct            \-/ i,j                                              */
/*                                               i  j       max                                                                      */
/*                                                                                                                                   */
/*                  ce qui signifie "grossierement" que deux corps                                                                   */
/*                  quelconques sont toujours suffisamment eloignes                                                                  */
/*                  pour ne pas pouvoir se rejoindre en un pas de                                                                    */
/*                  temps (ou 'Vmax' designe le plus grand module                                                                    */
/*                  des vitesses moyennes de l'ensemble des corps                                                                    */
/*                  au cours du pas de temps precedent).                                                                             */
/*                                                                                                                                   */
/*                    Enfin, a l'instant 't' (ou l'on integre), les                                                                  */
/*                  fonctions 'F1?(...)' ne peuvent etre evaluees                                                                    */
/*                  puisque dependant de {X(t),Y(t),Z(t)}. Or leurs                                                                  */
/*                  valeurs sont necessaires, on utilise donc leurs                                                                  */
/*                  valeurs "retardees" {X(t-dt),Y(t-dt),Z(t-dt)},                                                                   */
/*                  ou 'dt' designe le pas de temps.                                                                                 */
/*                                                                                                                                   */
/*                    Enfin, on se souviendra quel la troisieme                                                                      */
/*                  loi de Kepler stipule que le carre de la periode                                                                 */
/*                  'T' de revolution est proportionnel au cube du                                                                   */
/*                  (demi-)grand axe de la trajectoire 'R', soit :                                                                   */
/*                                                                                                                                   */
/*                                       2      3                                                                                    */
/*                                      T  = k.R                                                                                     */
/*                                                                                                                                   */
/*                  ou encore :                                                                                                      */
/*                                                                                                                                   */
/*                                               3                                                                                   */
/*                                              ---                                                                                  */
/*                                               2                                                                                   */
/*                                      T  = k.R                                                                                     */
/*                                                                                                                                   */
/*                  ce qui se retient en se souvenant que                                                                            */
/*                  la periode 'T' croit plus vite que le                                                                            */
/*                  rayon 'R'...                                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    En ce qui concerne les vitesses 'V' de                                                                         */
/*                  revolution, en supposant un mouvement                                                                            */
/*                  circulaire uniforme, on aura :                                                                                   */
/*                                                                                                                                   */
/*                                           2.pi.R                                                                                  */
/*                                      V = --------                                                                                 */
/*                                              T                                                                                    */
/*                                                                                                                                   */
/*                  soit :                                                                                                           */
/*                                                                                                                                   */
/*                                           2.pi.R                                                                                  */
/*                                      T = --------                                                                                 */
/*                                              V                                                                                    */
/*                                                                                                                                   */
/*                  ce qui subistitue dans la troisieme loi                                                                          */
/*                  de Kepler donne :                                                                                                */
/*                                                                                                                                   */
/*                                       1        k                                                                                  */
/*                                      ---- = -------.R                                                                             */
/*                                        2         2                                                                                */
/*                                       V      4.pi                                                                                 */
/*                                                                                                                                   */
/*                  Ainsi, pour deux corps 'a' et 'b', on aura                                                                       */
/*                  la relation :                                                                                                    */
/*                                                                                                                                   */
/*                                        2                                                                                          */
/*                                       V      R                                                                                    */
/*                                        b      a                                                                                   */
/*                                      ---- = ----                                                                                  */
/*                                        2     R                                                                                    */
/*                                       V       b                                                                                   */
/*                                        a                                                                                          */
/*                                                                                                                                   */
/*                  C'est cette relation qui est utilisee dans les                                                                   */
/*                  animations d'interpolation de points de vue                                                                      */
/*                  dans le Systeme Solaire pour calculer la vitesse                                                                 */
/*                  initiale de la planete virtuelle (dite "l'Errante" ou "The Wanderer")                                            */
/*                  pour chacune de ses trajectoires possibles                                                                       */
/*                  ('v _____xivPdf_09_1/$Fnota sqrt.OdistD.Odist.').                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
/*        :Fin_listMN_PROBLEME_DES_N_CORPS_11:                                                                                       */

/*===================================================================================================================================*/
/*        :Debut_listMN_SYSTEME_SOLAIRE_11:                                                                                          */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   S Y S T E M E   S O L A I R E   E N   U N I T E S   ' MKSA '  :                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition intemporelle du Systeme Solaire en unites MKSA :                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ------------------------------------------------------------------------------------------------------------------------   */
/*       | Corps :  | Diametre :   | Masse :           | Aphelie :    | Perihelie :  | Distance :   | Vitesse :    | Periode :    |  */
/*       | -----    | --------     | -----             | -------      | ---------    | --------     | -------      | -------      |  */
/*       |          |              |                   |              |              |              |              |              |  */
/*       |          |              |                   |              |              | (moyenne)    | (moyenne)    | (en jours)   |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       |          |              |                   |              |              |              |              |              |  */
/*       | Soleil   |  1390.0000e6 |  20000000000.0e20 |              |              |              |              |              |  */
/*       |          |              |                   |              |              |              |              |              |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Mercure  |     4.8800e6 |         3303.0e20 |       69.7e9 |       45.9e9 |       57.9e9 |      47.89e3 |       87.969 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Venus    |    12.1030e6 |        48700.0e20 |      109.0e9 |      107.4e9 |      108.2e9 |      35.03e3 |      224.701 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Terre    |    12.7560e6 |        59750.0e20 |      152.1e9 |      147.1e9 |      149.6e9 |      29.79e3 |      365.256 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Lune     |     3.4760e6 |          735.0e20 |              |              | 0.3844e9 / T |   0.96e3 / T |              |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Mars     |     6.7940e6 |         6418.0e20 |      249.1e9 |      206.7e9 |      227.9e9 |      24.13e3 |      686.980 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Jupiter  |   142.9840e6 |     18990000.0e20 |      815.7e9 |      740.9e9 |      778.3e9 |      13.06e3 |     4332.589 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Saturne  |   120.5360e6 |      5686000.0e20 |     1507.0e9 |     1347.0e9 |     1427.0e9 |       9.64e3 |    10759.220 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Uranus   |    51.1180e6 |       866000.0e20 |     3004.0e9 |     2735.0e9 |     2869.6e9 |       6.81e3 |    30685.400 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Neptune  |    49.5320e6 |      1030000.0e20 |     4537.0e9 |     4456.0e9 |     4496.6e9 |       5.43e3 |    60189.000 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Pluton   |     2.2740e6 |           66.0e20 |     7375.0e9 |     4425.0e9 |     5900.0e9 |       4.74e3 |    90465.000 |  */
/*       |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------|  */
/*       | Eris     |     2.4000e6 |                 ? |            ? |            ? |            ? |            ? |            ? |  */
/*        ------------------------------------------------------------------------------------------------------------------------   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition instantanee du Systeme Solaire (voir 'v $xtc/S_solaire.01$c') en unites MKSA :                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        -------------------------------------------------------------------------------------------------------------------        */
/*       | # : | Corps :           | Coordonnees :                              | Vitesse :                                  |       */
/*       | -   | -----             | -----------                                | -------                                    |       */
/*       |     |                   |                                            |                                            |       */
/*       |     |                   | (a une meme date t=JD 2433280.5)           | (a une meme date t=JD 2433280.5)           |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       |     |                   |                                            |                                            |       */
/*       | 01  | Soleil            |                                      0,0,0 |                                      0,0,0 |       */
/*       |     |                   |                                            |                                            |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 02  | Mercure           |     +5.145066e10,+6.823979e09,-1.634213e09 |        -1.465943e4,+4.435058e4,+2.525649e4 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 03  | Venus             |     +2.138729e10,+9.679058e10,+4.225877e10 |        -3.444528e4,+5.390232e3,+4.604716e3 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 04  | BARY(Terre,Lune)  |     -2.039987e10,+1.336504e11,+5.796294e10 |        -2.998883e4,-3.885917e3,-1.685333e3 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 05  | Mars              |     -2.049242e11,+1.261312e11,+6.340450e10 |        -1.278605e4,-1.640964e4,-7.188412e3 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 06  | Jupiter           |     +5.010578e11,-5.196673e11,-2.351902e11 |        +9.671300e3,+8.591941e3,+3.449541e3 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 07  | Saturne           |     -1.342268e12,+3.410356e11,+1.990158e11 |        -3.217483e3,-8.629336e3,-3.428730e3 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 08  | Uranus            |     -1.500473e11,+2.591560e12,+1.137666e12 |        -6.848352e3,-6.508785e2,-1.884691e2 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 09  | Neptune           |     -4.367447e12,-1.154789e12,-3.631107e11 |        +1.421090e3,-4.799768e3,-2.001765e3 |       */
/*       |-----|-------------------|--------------------------------------------|--------------------------------------------|       */
/*       | 10  | Pluton            |     -3.924498e12,+3.076028e12,+2.160875e12 |        -2.278404e3,-4.536639e3,-7.394764e2 |       */
/*        -------------------------------------------------------------------------------------------------------------------        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Le 24/08/2006, Pluton a ete declassee et est                                                                   */
/*                  devenue une "planete naine" apres un vote (conteste)                                                             */
/*                  de l'Union Atronomique Internationale.                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition de 'JD' ("Julian Day") :                                                                                        */
/*                                                                                                                                   */
/*                    Le "Julian Day" est egal au nombre de jours ecoules                                                            */
/*                  depuis le 01/01 4713 BC a 12:00. On notera que le calendrier                                                     */
/*                  Julien fut utilise avant le 04/10/1582 et le calendrier Gregorien                                                */
/*                  apres le 15/10/1582.                                                                                             */
/*                                                                                                                                   */
/*                    La formule pour calculer 'JD' est la suivante) :                                                               */
/*                                                                                                                                   */
/*                                      JD = 2415020 + [365 x (AAAA - 1900)] + JJ + LEAP - 0.5                                       */
/*                                                                                                                                   */
/*                  avec (la date a laquelle on s'interesse est {JJ,AAAA} :                                                          */
/*                                                                                                                                   */
/*                                      AAAA    = l'annee a laquelle on s'interesse,                                                 */
/*                                      JJ      = le nombre de jours ecoules depuis le 01/01 de l'annee AAAA jusqu'a un              */
/*                                                certain jour de cette annee AAAA,                                                  */
/*                                      LEAP    = le nombre d'annees bissextiles entre 1901 et l'annee AAAA,                         */
/*                                      2415020 = le "Julian Day" du 01/01/1900,                                                     */
/*                                      0.5     = vient du fait que le "point de depart" est a 12:00 le 01/01 4713 BC.               */
/*                                                                                                                                   */
/*                    Le site 'https://keisan.casio.com/exec/system/1227779487'                                                      */
/*                  permet de faire le calcul inverse et de montrer que :                                                            */
/*                                                                                                                                   */
/*                                      JD Julian Day 2433282.5 = 01/01/1950 AD.                                                     */
/*                                                                                                                                   */
/*                                      BC = Before Christ,                                                                          */
/*                                      AD = Anno Domini (After Christ).                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
/*        :Fin_SYSTEME_SOLAIRE_11:                                                                                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   L I S T E S   D E S C R I P T I V E S   I N I T I A L E S   D E S   C O R P S  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* ATTENTION, a ne pas confondre :                                                           */
                                        /*                                                                                           */
                                        /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que     */
                                        /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par     */
                                        /* 'fTRANSFORMAT_31(...)', et                                                                */
                                        /*                                                                                           */
                                        /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque       */
                                        /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la      */
                                        /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite     */
                                        /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'...                                      */
                                        /*                                                                                           */

dfTRANSFORMAT_31(liste_initiale_des_X,fichier_LISTE_X,X_IMPLICITE,Xcentre_ESPACE)
dfTRANSFORMAT_31(liste_initiale_des_Y,fichier_LISTE_Y,Y_IMPLICITE,Ycentre_ESPACE)
dfTRANSFORMAT_31(liste_initiale_des_Z,fichier_LISTE_Z,Z_IMPLICITE,hZmin_ESPACE)
                                        /* Definition des fichiers de listes de coordonnees.                                         */
                                        /* Pour les coordonnees implicites, on notera l'utilisation de 'hZmin_ESPACE' et non         */
                                        /* pas de 'Zcentre_ESPACE' comme le voudrait la logique ; ceci est du au fait que cette      */
                                        /* derniere valeur interferait malheureusement avec la position de l'observateur dans le     */
                                        /* cube de visualisation, et rendrait invisible les particules...                            */

dfTRANSFORMAT_31(liste_initiale_des_VX,fichier_LISTE_VX,VX_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_VY,fichier_LISTE_VY,VY_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_VZ,fichier_LISTE_VZ,VZ_IMPLICITE,FZERO)
                                        /* Definition des fichiers de listes de vitesses.                                            */

dfTRANSFORMAT_31(liste_initiale_des_MOBILITE,fichier_LISTE_MOBILITE,MOBILITE_IMPLICITE,VRAI)
                                        /* Definition du fichier de l'indicateur de mobilite des corps.                              */

dfTRANSFORMAT_31(liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE
                ,fichier_LISTE_PONDERATION_CENTRE_DE_GRAVITE
                ,PONDERATION_CENTRE_DE_GRAVITE_IMPLICITE
                ,FU
                 )
                                        /* Definition du fichier de liste des ponderations lors du calcul eventuel du centre de      */
                                        /* gravite. Ce dispositif a ete introduit le 19990608091843 afin de permettre, par exemple,  */
                                        /* de calculer le centre de gravite des planetes du systeme solaire (en excluant donc dans   */
                                        /* ce calcul, le Soleil...).                                                                 */

dfTRANSFORMAT_31(liste_initiale_des_MASSE,fichier_LISTE_MASSE,MASSE_IMPLICITE,PARE(1.0e30))
                                        /* Definition du fichier de liste des masses.                                                */

dfTRANSFORMAT_31(liste_initiale_des_SOURCE_DU_POTENTIEL,fichier_LISTE_SOURCE_DU_POTENTIEL,SOURCE_DU_POTENTIEL_IMPLICITE,VRAI)
                                        /* Definition du fichier de liste des indicateurs de source gravitationnelle possible.       */

dfTRANSFORMAT_31(liste_initiale_des_RAYON,fichier_LISTE_RAYON,RAYON_IMPLICITE,RAYON_DE_VISUALISATION)
                                        /* Definition du fichier de liste des rayons.                                                */
                                        /*                                                                                           */
                                        /* ATTENTION, le rayon est en unite d'ecran [0,1].                                           */

dfTRANSFORMAT_31(liste_initiale_des_VISIBILITE,fichier_LISTE_VISIBILITE,VISIBILITE_IMPLICITE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)
                                        /* Definition du fichier de la liste des visibilites des corps introduite le 20061026114627. */
                                        /* Par defaut, tous les corps sont evidemment visibles ('VRAI').                             */
                                        /*                                                                                           */
                                        /* La valeur implicite est passee de 'VRAI' a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE' le         */
                                        /* 20061106140813 afin d'en faire simultanement une attenuation des trois composantes        */
                                        /* chromatiques...                                                                           */

dfTRANSFORMAT_31(liste_initiale_des_ROUGE,fichier_LISTE_ROUGE,ROUGE_IMPLICITE,BLANC)
dfTRANSFORMAT_31(liste_initiale_des_VERTE,fichier_LISTE_VERTE,VERTE_IMPLICITE,BLANC)
dfTRANSFORMAT_31(liste_initiale_des_BLEUE,fichier_LISTE_BLEUE,BLEUE_IMPLICITE,BLANC)
                                        /* Definition des fichiers de listes de couleurs.                                            */
                                        /*                                                                                           */
                                        /* ATTENTION, les couleurs des points a visualiser doivent etre definies ainsi :             */
                                        /*                                                                                           */
                                        /*                  ROUGE E [NOIR,BLANC]                                                     */
                                        /*                  VERTE E [NOIR,BLANC]                                                     */
                                        /*                  BLEUE E [NOIR,BLANC]                                                     */
                                        /*                                                                                           */

#include  xrv/particule.21.I"

                                        /* ATTENTION, a ne pas confondre :                                                           */
                                        /*                                                                                           */
                                        /* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que     */
                                        /* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par     */
                                        /* 'fTRANSFORMAT_31(...)', et                                                                */
                                        /*                                                                                           */
                                        /* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque       */
                                        /* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la      */
                                        /* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite     */
                                        /* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'...                                      */
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   L I S T E S   D E S C R I P T I V E S   C O U R A N T E S   D E S   C O R P S  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(pointF_3D,DdTb1(POINTERs
                    ,liste_des_coordonnees_a_l_instant_initial
                    ,nombre_de_corps
                    ,ADRESSE_NON_ENCORE_DEFINIE
                     )
     );
DEFV(deltaF_3D,DdTb1(POINTERs
                    ,liste_des_vitesses_a_l_instant_initial
                    ,nombre_de_corps
                    ,ADRESSE_NON_ENCORE_DEFINIE
                     )
     );
                                        /* Definition de l'instant initial.                                                          */
DEFV(pointF_3D,DdTb1(POINTERs
                    ,liste_des_coordonnees_a_l_instant_precedent
                    ,nombre_de_corps
                    ,ADRESSE_NON_ENCORE_DEFINIE
                     )
     );
DEFV(Float,DdTb2(POINTERf
                ,matrice_des_distances_a_l_instant_precedent
                ,nombre_de_corps
                ,nombre_de_corps
                ,ADRESSE_NON_ENCORE_DEFINIE
                 )
     );
                                        /* Definition de l'instant precedent.                                                        */
DEFV(pointF_3D,DdTb1(POINTERs
                    ,liste_des_coordonnees_a_l_instant_courant
                    ,nombre_de_corps
                    ,ADRESSE_NON_ENCORE_DEFINIE
                     )
     );
DEFV(deltaF_3D,DdTb1(POINTERs
                    ,liste_des_vitesses_a_l_instant_courant
                    ,nombre_de_corps
                    ,ADRESSE_NON_ENCORE_DEFINIE
                     )
     );
                                        /* Definition de l'instant courant.                                                          */
DEFV(pointF_3D,DdTb2(POINTERs
                    ,liste_des_coordonnees_cumule_sur_toute_la_duree
                    ,nombre_de_corps
                    ,nombre_de_periodes_de_la_simulation
                    ,ADRESSE_NON_ENCORE_DEFINIE
                     )
     );
                                        /* Definition de l'ensemble des instants cumules.                                            */
DEFV(pointF_3D,DdTb1(POINTERs
                    ,liste_des_coordonnees_au_veritable_instant_precedent_visualise
                    ,nombre_de_corps
                    ,ADRESSE_NON_ENCORE_DEFINIE
                     )
     );
                                        /* Definition de l'instant precedent veritablement visualise.                                */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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.2B.vv.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C E S   A U X   L I S T E S  :                                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   DERNIER_POINT_DES_LISTES                                                                                                      \
                    LSTX(PREMIER_POINT_DES_LISTES,nombre_de_corps)                                                                      \
                                        /* Definition du dernier point des listes.                                                   */

#define   ACCES_COORDONNEES_INITIALES(corps)                                                                                            \
                    IdTb1(liste_des_coordonnees_a_l_instant_initial                                                                     \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_VITESSE_INITIALE(corps)                                                                                                 \
                    IdTb1(liste_des_vitesses_a_l_instant_initial                                                                        \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
                                        /* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position initiale.    */

#define   ACCES_COORDONNEES_PRECEDENTES(corps)                                                                                          \
                    IdTb1(liste_des_coordonnees_a_l_instant_precedent                                                                   \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ)                                                                                    \
                    IdTb2(matrice_des_distances_a_l_instant_precedent                                                                   \
                         ,INDX(corpsI,PREMIER_POINT_DES_LISTES)                                                                         \
                         ,nombre_de_corps                                                                                               \
                         ,INDX(corpsJ,PREMIER_POINT_DES_LISTES)                                                                         \
                         ,nombre_de_corps                                                                                               \
                          )
                                        /* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position precedente.  */

#define   ACCES_COORDONNEES_COURANTES(corps)                                                                                            \
                    IdTb1(liste_des_coordonnees_a_l_instant_courant                                                                     \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_VITESSE_COURANTE(corps)                                                                                                 \
                    IdTb1(liste_des_vitesses_a_l_instant_courant                                                                        \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_PONDERATION_CENTRE_DE_GRAVITE(corps)                                                                                    \
                    IdTb1(liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE                                                              \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_MASSES(corps)                                                                                                           \
                    IdTb1(liste_initiale_des_MASSE                                                                                      \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_SOURCES_DU_POTENTIEL(corps)                                                                                             \
                    LOGI(IdTb1(liste_initiale_des_SOURCE_DU_POTENTIEL                                                                   \
                              ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                     \
                              ,nombre_de_corps                                                                                          \
                               )                                                                                                        \
                         )
                                        /* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position courante.    */

#define   ACCES_COORDONNEES_CUMULEES(corps,periode)                                                                                     \
                    IdTb2(liste_des_coordonnees_cumule_sur_toute_la_duree                                                               \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                         ,INDX(periode,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION)                                                  \
                         ,nombre_de_periodes_de_la_simulation                                                                           \
                          )
                                        /* Acces aux coordonnees sur l'ensemble de la simulation.                                    */
#define   ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps)                                                 \
                    IdTb1(liste_des_coordonnees_au_veritable_instant_precedent_visualise                                                \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
                                        /* Acces aux coordonnees dans sa position precedente veritablement visualisee.               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L ' E V E N T U E L L E   I N D E P E N D A N C E   R E L A T I V E                            */
/*        D E S   C O R P S   E N T R E - E U X  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrr/N_corps.13.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E S   C O L L I S I O N S  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/rdn_walk.41.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   D O U Z E   F O N C T I O N S   ' F   '  :                                                   */
/*                                                                         ??                                                        */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   F3(coordonnees)                                                                                                               \
                    FU
#define   F2(coordonnees)                                                                                                               \
                    FZERO

#define   F1(fonction,coordonnees)                                                                                                      \
DEFV(Local,DEFV(FonctionF,fonction(corpsI)))                                                                                            \
DEFV(Argument,DEFV(Int,corpsI));                                                                                                        \
                                        /* Numero du corps par rapport auquel on calcule l'inverse pondere de la somme des           */ \
                                        /* distances...                                                                              */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     DEFV(Float,INIT(cumul_courant,FZERO));                                                                                             \
                                        /* Valeur de la fonction.                                                                    */ \
     DEFV(Int,INIT(corpsK,UNDEF));                                                                                                      \
                                        /* Index des corps...                                                                        */ \
     /*..............................................................................................................................*/ \
                                                                                                                                        \
     Komp(corpsK,nombre_de_corps)                                                                                                       \
          Bblock                                                                                                                        \
          Test(IFNE(corpsK,corpsI))                                                                                                     \
               Bblock                                                                                                                   \
               Test(IFOU(IFET(EST_VRAI(toutes_les_interactions_2_a_2_sont_prises_en_compte)                                             \
                             ,EST_VRAI(ACCES_SOURCES_DU_POTENTIEL(corpsK))                                                              \
                              )                                                                                                         \
                                        /* Cas ou toutes les interactions 2 a 2 sont calculees, et ou de plus, le corps courant      */ \
                                        /* 'corpsK' intervient dans ce calcul...                                                     */ \
                        ,IFET(EST_FAUX(toutes_les_interactions_2_a_2_sont_prises_en_compte)                                             \
                             ,IFEQ(corpsK,corps_source_du_potentiel)                                                                    \
                              )                                                                                                         \
                                        /* Cas ou un seul corps ('corps_source_du_potentiel') genere le potentiel gravitationnel.    */ \
                         )                                                                                                              \
                    )                                                                                                                   \
                    Bblock                                                                                                              \
                    Test(IZNE(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsK)))                                                              \
                         Bblock                                                                                                         \
                         Test(IZNE(ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsI),coordonnees)))                                            \
                              Bblock                                                                                                    \
                              INCR(cumul_courant                                                                                        \
                                  ,MUL2(DIVI(ACCES_MASSES(corpsK)                                                                       \
                                            ,EXP3(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsK))                                           \
                                             )                                                                                          \
                                       ,SOUS(DIVI(ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsK),coordonnees)                               \
                                                 ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsI),coordonnees)                               \
                                                  )                                                                                     \
                                            ,FU                                                                                         \
                                             )                                                                                          \
                                        )                                                                                               \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ATTENTION("un corps est sur un axe");                                                               \
                              CAL1(Prer1("pour la coordonnee coordonnees du corps %d\n",corpsI));                                       \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(gerer_les_collisions))                                                                            \
                              Bblock                                                                                                    \
                              Test(IFLT(corpsI,corpsK))                                                                                 \
                                        /* Ce test a ete ajoute le 19990430160515 car il semblait manquer. On pourra consulter       */ \
                                        /* l'etude des collisions dans 'v $xrk/rdn_walk.51$I IFLT.corpsI.corpsJ.' pour plus          */ \
                                        /* d'informations ; ce test est destine a traiter la collision {corpsI,corpsK} et            */ \
                                        /* et ne pas la traiter une deuxieme fois sous le nom {corpsK,corpsI}.                       */ \
                                   Bblock                                                                                               \
                                   COLLISION_ENTRE_DEUX_CORPS(corpsI,corpsK);                                                           \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ATTENTION("deux corps sont rentres en collision");                                                  \
                              CAL1(Prer2("(%d et %d)\n",corpsI,corpsK));                                                                \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
               ATes                                                                                                                     \
                    Bblock                                                                                                              \
                    Eblock                                                                                                              \
               ETes                                                                                                                     \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     EKom                                                                                                                               \
                                                                                                                                        \
     RETU(MUL2(NEGA(CONSTANTE_DE_LA_GRAVITATION),cumul_courant));                                                                       \
     Eblock

#define   F0(coordonnees)                                                                                                               \
                    FZERO

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   Q U A T R E   F O N C T I O N S   ' F   '  :                                                 */
/*                                                                           ?x                                                      */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   F3X(corpsI)                                                                                                                   \
                    F3(x)
#define   F2X(corpsI)                                                                                                                   \
                    F2(x)

BFonctionF

F1(F1X,x)

EFonctionF

#define   F0X(corpsI)                                                                                                                   \
                    F0(x)

#define   F3x(cx,cy,cz,t)                                                                                                               \
                    F3X(corps)
#define   F2x(cx,cy,cz,t)                                                                                                               \
                    F2X(corps)
#define   F1x(cx,cy,cz,t)                                                                                                               \
                    F1X(corps)
#define   F0x(t)                                                                                                                        \
                    F0X(corps)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   Q U A T R E   F O N C T I O N S   ' F   '  :                                                 */
/*                                                                           ?y                                                      */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   F3Y(corpsI)                                                                                                                   \
                    F3(y)
#define   F2Y(corpsI)                                                                                                                   \
                    F2(y)

BFonctionF

F1(F1Y,y)

EFonctionF

#define   F0Y(corpsI)                                                                                                                   \
                    F0(y)

#define   F3y(cx,cy,cz,t)                                                                                                               \
                    F3Y(corps)
#define   F2y(cx,cy,cz,t)                                                                                                               \
                    F2Y(corps)
#define   F1y(cx,cy,cz,t)                                                                                                               \
                    F1Y(corps)
#define   F0y(t)                                                                                                                        \
                    F0Y(corps)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   Q U A T R E   F O N C T I O N S   ' F   '  :                                                 */
/*                                                                           ?z                                                      */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   F3Z(corpsI)                                                                                                                   \
                    F3(z)
#define   F2Z(corpsI)                                                                                                                   \
                    F2(z)

BFonctionF

F1(F1Z,z)

EFonctionF

#define   F0Z(corpsI)                                                                                                                   \
                    F0(z)

#define   F3z(cx,cy,cz,t)                                                                                                               \
                    F3Z(corps)
#define   F2z(cx,cy,cz,t)                                                                                                               \
                    F2Z(corps)
#define   F1z(cx,cy,cz,t)                                                                                                               \
                    F1Z(corps)
#define   F0z(t)                                                                                                                        \
                    F0Z(corps)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   P O I N T   D E   R E F E R E N C E   C O U R A N T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrr/N_corps.11.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  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* Jusqu'au 20030313151705, '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' etait defini      */
                                        /* ici, mais cela est contraire aux tests dont il est l'objet dans                           */
                                        /* 'v $xrv/champs_5.12$I __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' via                   */
                                        /* 'v $xrk/attractor.17$I champs_5.12', d'ou son deplacement a cette date...                 */

#include  xrk/attractor.18.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O B L E M E   D I T   D E S   " N - C O R P S "  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DONNEES_NECESSAIRES_A_L_UTILISATION_D_UN_FOND;

     DEFV(Int,INIT(corpsI,UNDEF));
     DEFV(Int,INIT(corpsJ,UNDEF));
     DEFV(Int,INIT(corps,UNDEF));
                                        /* Pour manipuler les listes...                                                              */
     /*..............................................................................................................................*/
     INITIALISATIONS_GENERALES;
                                        /* Initialisations generales faites au tout debut...                                         */

     iTRANSFORMAT_31(liste_initiale_des_X,X_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_Y,Y_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_Z,Z_IMPLICITE);
                                        /* Initialisation des fichiers de listes de coordonnees.                                     */
     iTRANSFORMAT_31(liste_initiale_des_VX,VX_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_VY,VY_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_VZ,VZ_IMPLICITE);
                                        /* Initialisation des fichiers de listes de vitesses implicites.                             */
     iTRANSFORMAT_31(liste_initiale_des_MOBILITE,MOBILITE_IMPLICITE);
                                        /* Initialisation du fichier de l'indicateur de mobilite des corps.                          */
     iTRANSFORMAT_31(liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE,PONDERATION_CENTRE_DE_GRAVITE_IMPLICITE);
                                        /* Initialisation du fichier de liste des ponderations de calcul du centre de gravite.       */
     iTRANSFORMAT_31(liste_initiale_des_MASSE,MASSE_IMPLICITE);
                                        /* Initialisation du fichier de liste des masses.                                            */
     iTRANSFORMAT_31(liste_initiale_des_COEFFICIENT_DE_RESTITUTION,COEFFICIENT_DE_RESTITUTION_IMPLICITE);
                                        /* Initialisation du fichier de liste de taux de restitution.                                */
     iTRANSFORMAT_31(liste_initiale_des_SOURCE_DU_POTENTIEL,SOURCE_DU_POTENTIEL_IMPLICITE);
                                        /* Initialisation du fichier de liste des indicateurs de source gravitationnelle possible.   */
     iTRANSFORMAT_31(liste_initiale_des_RAYON,RAYON_IMPLICITE);
                                        /* Initialisation du fichier de liste des rayons.                                            */
     iTRANSFORMAT_31(liste_initiale_des_VISIBILITE,VISIBILITE_IMPLICITE);
                                        /* Initialisation du fichier de la liste des visibilites des corps introduite le             */
                                        /* 20061026114627.                                                                           */
     iTRANSFORMAT_31(liste_initiale_des_ROUGE,ROUGE_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_VERTE,VERTE_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_BLEUE,BLEUE_IMPLICITE);
                                        /* Initialisation des fichiers de listes de couleurs.                                        */

     iTRANSFORMAT_31(liste_initiale_des_PAS_DE_TEMPS,PAS_DE_TEMPS_IMPLICITE);
                                        /* Initialisation du pas de temps variable (introduit le 20070821160427).                    */
     iTRANSFORMAT_31(liste_initiale_des_NOMBRES,NOMBRES_IMPLICITE);
                                        /* Initialisation du nombre variable (introduit le 20070821160427).                          */
     iTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_RAYON,FACTEUR_DU_RAYON_DE_VISUALISATION_IMPLICITE);
                                        /* Initialisation du fichier de liste des facteurs multiplicatifs du rayon de                */
                                        /* visualisation (introduit le 20070827094840).                                              */

#include  xrv/champs_5.1A.I"

     GET_ARGUMENTSv(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("nombre_points=""npoints=""iterations=""corps=",nombre_de_corps
                                        /* Le 20111211095930, les parametres "nombre_points=""npoints=""iterations=" ont ete         */
                                        /* introduits par symetrie avec 'v $xrv/particule.10$K nombre_points= (par exemple...).      */
                                           ,BLOC(VIDE;)
                                           ,BLOC(
                                                 Bblock
                                                 PRINT_AVERTISSEMENT("'corps=' doit etre defini avant tout fichier");

                                                 Test(IFGT(nombre_de_corps,NOMBRE_MAXIMAL_DE_POINTS_GERABLES))
                                                      Bblock
                                                      PRINT_ERREUR("le nombre de points a gerer est trop important");
                                                      PRINT_ERREUR("il va donc etre seuille");
                                                      CAL1(Prer2("il vaut %d alors que le maximum est de %d\n"
                                                                ,nombre_de_corps
                                                                ,NOMBRE_MAXIMAL_DE_POINTS_GERABLES
                                                                 )
                                                           );

                                                      EGAL(nombre_de_corps,NOMBRE_MAXIMAL_DE_POINTS_GERABLES);
                                        /* Et on seuille le nombre de points...                                                      */
                                                      Eblock
                                                 ATes
                                                      Bblock
                                                      Eblock
                                                 ETes
                                                 Eblock
                                                 )
                                            );
                                        /* ATTENTION : la recuperation de 'nombre_de_corps' doit preceder les                        */
                                        /* 'PROCESS_ARGUMENT_C(...)' qui suivent car ils l'utilisent.                                */

                         PROCESS_ARGUMENTS_GEOMETRIQUES;

                         PROCESS_ARGUMENT_FICHIER("LISTE_X="
                                                 ,fichier_LISTE_X
                                                 ,liste_initiale_des_X
                                                 ,X_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_Y="
                                                 ,fichier_LISTE_Y
                                                 ,liste_initiale_des_Y
                                                 ,Y_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_Z="
                                                 ,fichier_LISTE_Z
                                                 ,liste_initiale_des_Z
                                                 ,Z_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_VX="
                                                 ,fichier_LISTE_VX
                                                 ,liste_initiale_des_VX
                                                 ,VX_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_VY="
                                                 ,fichier_LISTE_VY
                                                 ,liste_initiale_des_VY
                                                 ,VY_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_VZ="
                                                 ,fichier_LISTE_VZ
                                                 ,liste_initiale_des_VZ
                                                 ,VZ_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_MOBILITE="
                                                 ,fichier_LISTE_MOBILITE
                                                 ,liste_initiale_des_MOBILITE
                                                 ,MOBILITE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_PONDERATION_CENTRE_DE_GRAVITE="
                                                 ,fichier_LISTE_PONDERATION_CENTRE_DE_GRAVITE
                                                 ,liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE
                                                 ,PONDERATION_CENTRE_DE_GRAVITE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_MASSE="
                                                 ,fichier_LISTE_MASSE
                                                 ,liste_initiale_des_MASSE
                                                 ,MASSE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_COEFFICIENT_DE_RESTITUTION="
                                                 ,fichier_LISTE_COEFFICIENT_DE_RESTITUTION
                                                 ,liste_initiale_des_COEFFICIENT_DE_RESTITUTION
                                                 ,COEFFICIENT_DE_RESTITUTION_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_SOURCE="
                                                 ,fichier_LISTE_SOURCE_DU_POTENTIEL
                                                 ,liste_initiale_des_SOURCE_DU_POTENTIEL
                                                 ,SOURCE_DU_POTENTIEL_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_RAYON="
                                                 ,fichier_LISTE_RAYON
                                                 ,liste_initiale_des_RAYON
                                                 ,RAYON_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_VISIBILITE="
                                                 ,fichier_LISTE_VISIBILITE
                                                 ,liste_initiale_des_VISIBILITE
                                                 ,VISIBILITE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_ROUGE="
                                                 ,fichier_LISTE_ROUGE
                                                 ,liste_initiale_des_ROUGE
                                                 ,ROUGE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_VERTE="
                                                 ,fichier_LISTE_VERTE
                                                 ,liste_initiale_des_VERTE
                                                 ,VERTE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_BLEUE="
                                                 ,fichier_LISTE_BLEUE
                                                 ,liste_initiale_des_BLEUE
                                                 ,BLEUE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                                        /* Le 20090617164242, l'instruction :                                                        */
                                        /*                                                                                           */
                                        /*                  GET_ARGUMENT_F("extension=",facteur_d_extension_de_l_espace_physique);   */
                                        /*                                                                                           */
                                        /* a ete mise dans 'v $xrv/champs_5.1A$I facteur_d_extension_de_l_espace_physique' de facon  */
                                        /* globale...                                                                                */

                         GET_ARGUMENT_L("lineaire=",prendre_une_echelle_lineaire_pour_les_coordonnees);
                         GET_ARGUMENT_F("exposant=",exposant_de_l_echelle);

                         GET_ARGUMENT_L("2_a_2=",toutes_les_interactions_2_a_2_sont_prises_en_compte);
                         GET_ARGUMENT_I("source=",corps_source_du_potentiel);

                         GET_ARGUMENT_F("dt=""dct=",dct);
                         PROCESS_ARGUMENT_FICHIER("DCT="
                                                 ,fichier_LISTE_PAS_DE_TEMPS
                                                 ,liste_initiale_des_PAS_DE_TEMPS
                                                 ,PAS_DE_TEMPS_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         GET_ARGUMENT_I("nombre=",nombre_de_pas_de_temps_par_periode);
                         PROCESS_ARGUMENT_FICHIER("NOMBRE="
                                                 ,fichier_LISTE_NOMBRES
                                                 ,liste_initiale_des_NOMBRES
                                                 ,NOMBRES_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENTS_DE_VISUALISATION;

                         PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES;

                         GET_ARGUMENT_L("rayon_masse=",les_rayons_de_visualisation_sont_fonction_de_la_masse);
                         GET_ARGUMENT_F("Ar=",facteur_du_rayon_de_visualisation);
                         PROCESS_ARGUMENT_FICHIER("FACTEUR="
                                                 ,fichier_LISTE_FACTEUR_DU_RAYON
                                                 ,liste_initiale_des_FACTEUR_DU_RAYON
                                                 ,FACTEUR_DU_RAYON_DE_VISUALISATION_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         GET_ARGUMENT_L("collisions=",gerer_les_collisions);
                         GET_ARGUMENT_L("ponctuels=""chocs_ponctuels=",considerer_les_chocs_ponctuels);
                         GET_ARGUMENT_F("restitution=""elasticite=",coefficient_de_restitution);

                         GET_ARGUMENT_L("ensemble=",visualiser_l_ensemble_des_instants);
                         GET_ARGUMENT_F("acceptable=",facteur_du_deplacement_minimal_acceptable);
                         GET_ARGUMENT_F("Ranterieurs=""Ranterieur=",facteur_de_reduction_des_rayons_des_instants_anterieurs);
                         GET_ARGUMENT_F("Canterieurs=""Canterieur=",facteur_de_reduction_des_couleurs_des_instants_anterieurs);

                         GET_ARGUMENT_L("centrer=",definir_la_scene_par_rapport_au_centre_de_l_espace);
                         GET_ARGUMENT_F("Xcentre=",X_centre_de_l_espace_pour_la_visualisation);
                         GET_ARGUMENT_F("Ycentre=",Y_centre_de_l_espace_pour_la_visualisation);
                         GET_ARGUMENT_F("Zcentre=",Z_centre_de_l_espace_pour_la_visualisation);
                         GET_ARGUMENT_I("reference=",corps_de_reference);
                         GET_ARGUMENT_L("derniere_position=",se_referer_a_la_derniere_position_du_corps_de_reference);

                         GET_ARGUMENT_L("trainees=",generer_les_trainees);
                         GET_ARGUMENT_L("renormaliser=",renormaliser_les_trainees);
                         GET_ARGUMENT_I("mode_des_trainees=""mode=",mode_de_generation_des_trainees);
                         GET_ARGUMENT_F("attenuation_des_trainees=",facteur_d_attenuation_des_trainees);
                         GET_ARGUMENT_F("attenuation_des_images=",facteur_d_attenuation_des_images);

                         GET_ARGUMENT_L("coordonnees_vitesses=",editer_les_coordonnees_et_les_vitesses);
                         )
                    );

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

     Test(IZLE(dct))
          Bblock
          PRINT_ATTENTION("le pas de temps ne peut etre negatif ou nul, on lui substitue la valeur par defaut");
          EGAL(dct,DCT);
                                        /* En particulier un pas de temps nul provoque des divisions par zero lors de l'integration. */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

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

     INITIALISATION_DE_LA_SYNTHESE_D_IMAGE;
                                        /* Initialisation eventuelle du calcul des trainees...                                       */

     Test(IFET(EST_FAUX(toutes_les_interactions_2_a_2_sont_prises_en_compte)
              ,NINCff(corps_source_du_potentiel,PREMIER_POINT_DES_LISTES,nombre_de_corps)
               )
          )
          Bblock
          PRINT_ATTENTION("le corps source du potentiel demande n'existe pas, on lui substitue la valeur par defaut");
          EGAL(corps_source_du_potentiel,CORPS_SOURCE_DU_POTENTIEL);
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_NE_FAUT_PAS(definir_la_scene_par_rapport_au_centre_de_l_espace)
              ,NINCff(corps_de_reference,PREMIER_POINT_DES_LISTES,nombre_de_corps)
               )
          )
          Bblock
          PRINT_ATTENTION("le corps de reference demande n'existe pas, on lui substitue la valeur par defaut");
          EGAL(corps_de_reference,CORPS_DE_REFERENCE);
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     MdTb1(liste_des_coordonnees_a_l_instant_initial
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_vitesses_a_l_instant_initial
          ,nombre_de_corps
          ,deltaF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
                                        /* Definition de l'instant initial.                                                          */
     MdTb1(liste_des_coordonnees_a_l_instant_precedent
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb2(matrice_des_distances_a_l_instant_precedent
          ,nombre_de_corps
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
                                        /* Definition de l'instant precedent.                                                        */
     MdTb1(liste_des_coordonnees_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_vitesses_a_l_instant_courant
          ,nombre_de_corps
          ,deltaF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
                                        /* Definition de l'instant courant.                                                          */
     MdTb2(liste_des_coordonnees_cumule_sur_toute_la_duree
          ,nombre_de_corps
          ,nombre_de_periodes_de_la_simulation
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
                                        /* Definition de l'ensemble des instants cumules.                                            */
     MdTb1(liste_des_coordonnees_au_veritable_instant_precedent_visualise
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
                                        /* Definition de l'instant precedent veritablement visualise.                                */

     Komp(corps,nombre_de_corps)
          Bblock
          INITIALISATION_POINT_3D(ACCES_COORDONNEES_INITIALES(corps)
                                 ,ACCES_LISTE(liste_initiale_des_X,corps)
                                 ,ACCES_LISTE(liste_initiale_des_Y,corps)
                                 ,ACCES_LISTE(liste_initiale_des_Z,corps)
                                  );
          INITIALISATION_ACCROISSEMENT_3D(ACCES_VITESSE_INITIALE(corps)
                                         ,ACCES_LISTE(liste_initiale_des_VX,corps)
                                         ,ACCES_LISTE(liste_initiale_des_VY,corps)
                                         ,ACCES_LISTE(liste_initiale_des_VZ,corps)
                                          );
          TRANSFERT_POINT_3D(ACCES_COORDONNEES_PRECEDENTES(corps)
                            ,ACCES_COORDONNEES_INITIALES(corps)
                             );
          TRANSFERT_POINT_3D(ACCES_COORDONNEES_CUMULEES(corps,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION)
                            ,ACCES_COORDONNEES_INITIALES(corps)
                             );
          TRANSFERT_POINT_3D(ACCES_COORDONNEES_COURANTES(corps)
                            ,ACCES_COORDONNEES_INITIALES(corps)
                             );
          TRANSFERT_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corps)
                                    ,ACCES_VITESSE_INITIALE(corps)
                                     );
                                        /* Initialisation des listes relatives aux differents corps arguments meme celles pour       */
                                        /* lesquelles cela n'a pas de sens...                                                        */
          Eblock
     EKom

     INITIALISATION_DE_L_INTEGRATION_D_UN_SYSTEME_D_EQUATIONS_DIFFERENTIELLES_O2;
                                        /* Initialisations necessaires a discriminer les deux premiers pas de temps...               */

     Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)
          Bblock
          DEFV(Int,INIT(periode,UNDEF));
                                        /* Periode de parcours de 'ACCES_COORDONNEES_PRECEDENTES(...)' pour la visualisation...      */
          DEFV(Int,INIT(numero_effectif_de_la_premiere_periode_de_la_simulation
                       ,COND(IL_FAUT(visualiser_l_ensemble_des_instants)
                            ,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION
                            ,numero_de_la_periode_courante_de_la_simulation
                             )
                        )
               );
                                        /* Numero effectif de la premiere periode a visualiser.                                      */

          Test(IFNE_chaine(fichier_LISTE_PAS_DE_TEMPS,NOM_PIPE_Local))
               Bblock
               EGAL(dct,ACCES_PAS_DE_TEMPS(numero_de_la_periode_courante_de_la_simulation));
                                        /* Possibilite introduite le 20070821160427...                                               */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFNE_chaine(fichier_LISTE_NOMBRES,NOM_PIPE_Local))
               Bblock
               Test(N_EST_PAS_ENTIER(ACCES_NOMBRES(numero_de_la_periode_courante_de_la_simulation)))
                    Bblock
                    PRINT_ATTENTION("un nombre de pas de temps n'est pas entier");
                    CAL1(Prer1("numero de la periode courante=%d\n",numero_de_la_periode_courante_de_la_simulation));
                    Eblock
               ATes
                    Bblock
                    EGAL(nombre_de_pas_de_temps_par_periode,ACCES_NOMBRES(numero_de_la_periode_courante_de_la_simulation));
                                        /* Possibilite introduite le 20070821160427...                                               */
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFNE_chaine(fichier_LISTE_FACTEUR_DU_RAYON,NOM_PIPE_Local))
               Bblock
               EGAL(facteur_du_rayon_de_visualisation,ACCES_FACTEUR_DU_RAYON(numero_de_la_periode_courante_de_la_simulation));
                                        /* Possibilite introduite le 20070827094840...                                               */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante);
                                        /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image.    */

          Test(IFGE(numero_de_la_periode_courante,numero_de_la_premiere_periode_a_visualiser))
                                        /* Cette optimisation assez inhabituelle (pour moi...) a ete introduite le 1996032400 car,   */
                                        /* en effet, lorsque la periode courante n'est pas encore a visualiser, il y a ci-apres      */
                                        /* beaucoup de calculs inutiles et assez penalisants...                                      */
               Bblock
               DoIn(periode
                   ,numero_effectif_de_la_premiere_periode_de_la_simulation
                   ,numero_de_la_periode_courante_de_la_simulation
                   ,I
                    )
                    Bblock
                    Komp(corps,nombre_de_corps)
                         Bblock
                         DEFV(Float,INIT(cx_eventuellement_decentree,FLOT__UNDEF));
                         DEFV(Float,INIT(cy_eventuellement_decentree,FLOT__UNDEF));
                         DEFV(Float,INIT(cz_eventuellement_decentree,FLOT__UNDEF));
                                        /* Coordonnees eventuellement decentrees...                                                  */
                         DEFV(Float,INIT(deplacement_apparent_du_corps_courant,F_INFINI));
                                        /* Afin d'evaluer le deplacement du corps courant entre l'instant present et le veritable    */
                                        /* instant precedent visualise. La valeur infinie implicite est choisie afin d'etre sur      */
                                        /* de visualiser le premier instant. Enfin ce deplacement est calcule apres "decentrage"     */
                                        /* eventuel car, en effet et par exemple, le Soleil dans une version "geocentrique" n'aurait */
                                        /* pas de trajectoire...                                                                     */

                         EGAL(cx,ASD1(ACCES_COORDONNEES_CUMULEES(corps,periode),x));
                         EGAL(cy,ASD1(ACCES_COORDONNEES_CUMULEES(corps,periode),y));
                         EGAL(cz,ASD1(ACCES_COORDONNEES_CUMULEES(corps,periode),z));
                                        /* A cause de 'RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES', il est necessaire     */
                                        /* de passer par {cx,cy,cz}.                                                                 */
                         EGAL(cx_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cx,X,x));
                         EGAL(cy_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cy,Y,y));
                         EGAL(cz_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cz,Z,z));
                                        /* Et decentrage eventuel...                                                                 */

                         Test(IFEQ(periode,numero_effectif_de_la_premiere_periode_de_la_simulation))
                              Bblock
                              INITIALISATION_POINT_3D(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps)
                                                     ,cx_eventuellement_decentree
                                                     ,cy_eventuellement_decentree
                                                     ,cz_eventuellement_decentree
                                                      );
                              Eblock
                         ATes
                              Bblock
                              EGAL(deplacement_apparent_du_corps_courant
                                  ,RdisF3D(cx_eventuellement_decentree
                                          ,cy_eventuellement_decentree
                                          ,cz_eventuellement_decentree
                                          ,ASD1(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps),x)
                                          ,ASD1(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps),y)
                                          ,ASD1(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps),z)
                                           )
                                   );
                                        /* Calcul du deplacement du corps courant entre l'instant present et le veritable instant    */
                                        /* precedent visualise...                                                                    */

                              Test(IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees))
                                   Bblock
                                        /* On notera que l'on va transformer non lineairement la coordonnee spherique 'Rho'. Il      */
                                        /* pourrait etre utile d'en faire autant sur l'un au moins des deux angle {Phi,Theta}. En    */
                                        /* effet, on pourrait ainsi accentuer l'effet d'inclinaison, par exemple, dans le systeme    */
                                        /* solaire ou les 8 premieres planetes ne sont qu'a "epsilon" pres dans le plan de           */
                                        /* l'ecliptique. Malheureusement, ce plan est positionne d'une facon inconnue par rapport    */
                                        /* aux axes {OX,OY,OZ} utilises. Alors que faire ? Rien pour le moment (le 19971211095810).  */
                                   DEFV(Float,INIT(rho
                                                  ,Rho_3D(cx_eventuellement_decentree
                                                         ,cy_eventuellement_decentree
                                                         ,cz_eventuellement_decentree
                                                          )
                                                   )
                                        );
                                   DEFV(Float,INIT(rho_non_lineaire,FLOT__UNDEF));
                                   EGAL(rho_non_lineaire,ECHELLE_NON_LINEAIRE(rho));
                                        /* Passage en coordonnees spheriques lorsque des echelles non lineaires sont demandees. On   */
                                        /* notera que pour bien faire, il faudrait aussi calculer 'rho' et 'rho_non_lineaire' pour   */
                                        /* le point 'ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(...)',   */
                                        /* mais, on simplifie un peu...                                                              */
                                   EGAL(deplacement_apparent_du_corps_courant
                                       ,SCAL(deplacement_apparent_du_corps_courant
                                            ,rho
                                            ,rho_non_lineaire
                                             )
                                        );
                                        /* Lorsque l'echelle n'est pas lineaire, il faut le prendre en compte dans ce test qui est   */
                                        /* un test sur la transformation des coordonnees pour la visualisation, cette transformation */
                                        /* ne conservant pas les distances, d'ou cette regle de trois qui vient de la notion de      */
                                        /* "triangles semblables".                                                                   */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ETes

                         EGAL(rayon_de_visualisation
                             ,REDUCTION_DES_INSTANTS_ANTERIEURS(RAYON_DE_VISUALISATION_D_UN_CORPS
                                                               ,facteur_de_reduction_des_rayons_des_instants_anterieurs
                                                                )
                              );
                                        /* Recuperation eventuelle du rayon de chaque point...                                       */

                         Test(IFOU(IFEQ(periode,numero_de_la_periode_courante_de_la_simulation)
                                  ,IFGT(deplacement_apparent_du_corps_courant
                                       ,MUL2(facteur_du_deplacement_minimal_acceptable,rayon_de_visualisation)
                                        )
                                   )
                              )
                              Bblock
                              INITIALISATION_POINT_3D(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps)
                                                     ,cx_eventuellement_decentree
                                                     ,cy_eventuellement_decentree
                                                     ,cz_eventuellement_decentree
                                                      );
                                        /* Lorsque le deplacement du corps courant entre l'instant present et le veritable instant   */
                                        /* precedent visualise est suffisamment important, on le visualise. Bien evidemment, on      */
                                        /* visualise la derniere position (qui est la position courante...).                         */

                              EGAL(dcx
                                  ,REDUCTION_DES_INSTANTS_ANTERIEURS(ACCES_LISTE(liste_initiale_des_ROUGE,corps)
                                                                    ,facteur_de_reduction_des_couleurs_des_instants_anterieurs
                                                                     )
                                   );
                              EGAL(dcy
                                  ,REDUCTION_DES_INSTANTS_ANTERIEURS(ACCES_LISTE(liste_initiale_des_VERTE,corps)
                                                                    ,facteur_de_reduction_des_couleurs_des_instants_anterieurs
                                                                     )
                                   );
                              EGAL(dcz
                                  ,REDUCTION_DES_INSTANTS_ANTERIEURS(ACCES_LISTE(liste_initiale_des_BLEUE,corps)
                                                                    ,facteur_de_reduction_des_couleurs_des_instants_anterieurs
                                                                     )
                                   );

                              BSaveModifyVariable(Int,identite_du_point_courant_complet,corps);
                              BSaveModifyVariable(Logical,il_y_a_une_identite_pour_le_point_courant_complet,VRAI);
                                        /* Introduit le 20210101095317 car, en effet, cela peut etre utile de disposer de            */
                                        /* l'identite du corps au cas ou l'on voudrait, par exemple, calculer a posteriori des       */
                                        /* distances entre corps...                                                                  */
                                        /*                                                                                           */
                                        /* L'usage de 'BSaveModifyVariable' a eu lieu le 20210104111031...                           */

                              CALS(memorisation_point_grave(cx_eventuellement_decentree
                                                           ,cy_eventuellement_decentree
                                                           ,cz_eventuellement_decentree
                                                           ,dcx
                                                           ,dcy
                                                           ,dcz
                                                           ,ACCES_PONDERATION_CENTRE_DE_GRAVITE(corps)
                                                           ,ACCES_MASSES(corps)
                                                           ,ASD1(ACCES_VITESSE_COURANTE(corps),dx)
                                                           ,ASD1(ACCES_VITESSE_COURANTE(corps),dy)
                                                           ,ASD1(ACCES_VITESSE_COURANTE(corps),dz)
                                                           ,periode
                                                           ,ACCES_LISTE(liste_initiale_des_VISIBILITE,corps)
                                                            )
                                   );
                                        /* Memorisation du corps courant, la premiere image donnant les conditions initiales...      */
                                        /* ATTENTION, jusqu'au 19970401145229, on trouvait 'corps' a la place de 'periode' ; bien    */
                                        /* que ne servant a rien, j'ai corrige cette erreur...                                       */

                              ESaveModifyVariable(Logical,il_y_a_une_identite_pour_le_point_courant_complet);
                              ESaveModifyVariable(Int,identite_du_point_courant_complet);
                                        /* Introduits le 20210104111031...                                                           */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         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(IL_FAUT(editer_les_coordonnees_et_les_vitesses))
                              Bblock
                              Test(IFEQ(periode,numero_de_la_periode_courante_de_la_simulation))
                                   Bblock
                                        /* Edition des coordonnees et des vitesses d'une part lorsque cela est demandee et d'autre   */
                                        /* part lorsque 'IL_FAUT(visualiser_l_ensemble_des_instants)', c'est-a-dire si l'on est sur  */
                                        /* la "tete de la comete"...                                                                 */
                                   CAL2(Prin1("temps=%f",temps_courant));
                                   CAL2(Prin1("     corps=%04d",corps));
                                   CAL2(Prin3("     coordonnees={%+.17f,%+.17f,%+.17f}"
                                             ,ASD1(ACCES_COORDONNEES_COURANTES(corps),x)
                                             ,ASD1(ACCES_COORDONNEES_COURANTES(corps),y)
                                             ,ASD1(ACCES_COORDONNEES_COURANTES(corps),z)
                                              )
                                        );
                                   CAL2(Prin3("     vitesse={%+.17f,%+.17f,%+.17f}"
                                             ,ASD1(ACCES_VITESSE_COURANTE(corps),dx)
                                             ,ASD1(ACCES_VITESSE_COURANTE(corps),dy)
                                             ,ASD1(ACCES_VITESSE_COURANTE(corps),dz)
                                              )
                                        );
                                   CAL2(Prin0("\n"));
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    EKom
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Repe(COND(IFGT(numero_de_la_periode_courante_de_la_simulation,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION)
                   ,nombre_de_pas_de_temps_par_periode
                   ,SUCC(nombre_de_pas_de_temps_par_periode)
                    )
               )
                                        /* Cette precaution evitant de visualiser deux fois les conditions initiales (ce qui se      */
                                        /* voit lorsque 'nombre_de_pas_de_temps_par_periode' est egal a un...). Cette correction a   */
                                        /* ete effectuee le 1995092900 lors de l'introduction de 'v $xrk/rdn_walk.11$K'. Les images  */
                                        /* generees apres cette date devraient etre tres legerement differentes (en fait d'autant    */
                                        /* moins que le parametre 'nombre_de_pas_de_temps_par_periode' reellement utilise a une      */
                                        /* grande valeur...).                                                                        */
               Bblock
               DEFV(Float,INIT(module_de_la_vitesse_maximale,F_MOINS_L_INFINI));
                                        /* Afin de calculer la vitesse maximale actuelle.                                            */
               Komp(corps,nombre_de_corps)
                    Bblock
                    DEFV(Float,INIT(module_de_la_vitesse_courante
                                   ,DIVI(RpdisF3D(ACCES_COORDONNEES_PRECEDENTES(corps)
                                                 ,ACCES_COORDONNEES_COURANTES(corps)
                                                  )
                                        ,MUL2(nombre_de_pas_de_temps_par_periode,dct)
                                         )
                                    )
                         );
                    EGAL(module_de_la_vitesse_maximale,MAX2(module_de_la_vitesse_maximale,module_de_la_vitesse_courante));
                                        /* Determination du module de la vitesse maximale...                                         */
                    Eblock
               EKom

               Test(IFGE(module_de_la_vitesse_maximale,VITESSE_DE_LA_LUMIERE))
                    Bblock
                    PRINT_ATTENTION("les corps semblent se deplacer a des vitesses supra-lumineuses");
                    CAL1(Prer1("module de la vitesse maximale = %f\n",module_de_la_vitesse_maximale));
                    CAL1(Prer1("vitesse de la lumiere........ = %f\n",VITESSE_DE_LA_LUMIERE));
                    Eblock
               ATes
                    Bblock
                    Test(IFGE(module_de_la_vitesse_maximale,FRA10(VITESSE_DE_LA_LUMIERE)))
                         Bblock
                         PRINT_ATTENTION("les corps semblent se deplacer a des vitesses relativistes");
                         CAL1(Prer1("module de la vitesse maximale = %f\n",module_de_la_vitesse_maximale));
                         CAL1(Prer1("vitesse de la lumiere........ = %f\n",VITESSE_DE_LA_LUMIERE));
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ETes

               Komp(corpsI,nombre_de_corps)
                    Bblock
                    Komp(corpsJ,nombre_de_corps)
                         Bblock
                         EGAL(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ)
                             ,RpdisF3D(ACCES_COORDONNEES_PRECEDENTES(corpsI)
                                      ,ACCES_COORDONNEES_PRECEDENTES(corpsJ)
                                       )
                              );
                                        /* Initialisation de la matrice des distances de tous les corps 2 a 2...                     */

                         Test(I3ET(IFET(IFNE(corpsI,corpsJ)
                                       ,IFOU(EST_VRAI(toutes_les_interactions_2_a_2_sont_prises_en_compte)
                                            ,IFET(EST_FAUX(toutes_les_interactions_2_a_2_sont_prises_en_compte)
                                                 ,IFOU(IFEQ(corpsI,corps_source_du_potentiel)
                                                      ,IFEQ(corpsJ,corps_source_du_potentiel)
                                                       )
                                                  )
                                             )
                                        )
                                  ,IFOU(EST_VRAI(LOGI(ACCES_LISTE(liste_initiale_des_MOBILITE,corpsI)))
                                       ,EST_VRAI(LOGI(ACCES_LISTE(liste_initiale_des_MOBILITE,corpsJ)))
                                        )
                                  ,IFLT(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ),MUL2(module_de_la_vitesse_maximale,dct))
                                   )
                              )
                                        /* On utilise 'IFLT(...)' et non pas 'IFLE(...)' afin d'eviter des messages d'erreur lors    */
                                        /* de l'initialisation ou les coordonnees 'ACCES_COORDONNEES_PRECEDENTES(...)' et            */
                                        /* 'ACCES_COORDONNEES_COURANTES(...)' sont identiques...                                     */
                              Bblock
                                        /* Dans ces circonstances, la valeur des fonctions 'F1?(...)' peut devenir demesuree. Par    */
                                        /* exemple, en temps normal, une valeur de 1.0e-12 est acceptable ; elle peut devenir plus   */
                                        /* grande, et c'est alors une catastrophe, les corps pouvant s'echapper...                   */
                              PRINT_ATTENTION("le pas de temps semble incompatible avec les distances entre les corps");
                              CAL1(Prer1("pas de temps................. = %f\n"
                                        ,dct
                                         )
                                   );
                              CAL1(Prer1("module de la vitesse maximale = %f\n"
                                        ,module_de_la_vitesse_maximale
                                         )
                                   );
                              CAL1(Prer3("distance(%04d,%04d).......... = %f\n"
                                        ,corpsI,corpsJ,ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ)
                                         )
                                   );
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    EKom
                    Eblock
               EKom

               Komp(corps,nombre_de_corps)
                    Bblock

#include  xrr/N_corps.12.I"
                                        /* Integration du systeme d'equations differentielles pour le corps courant 'corps'.         */

                    Test(IFLT(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation))
                         Bblock
                         TRANSFERT_POINT_3D(ACCES_COORDONNEES_CUMULEES(corps
                                                                      ,SUCC(numero_de_la_periode_courante_de_la_simulation)
                                                                       )
                                           ,ACCES_COORDONNEES_PRECEDENTES(corps)
                                            );
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               EKom

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

               GESTION_DE_L_INTEGRATION_D_UN_SYSTEME_D_EQUATIONS_DIFFERENTIELLES_O2;
                                        /* Gestion de la discrimination des deux premiers pas de temps...                            */
               Eblock
          ERep

#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

     FdTb1(liste_des_coordonnees_au_veritable_instant_precedent_visualise
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb2(liste_des_coordonnees_cumule_sur_toute_la_duree
          ,nombre_de_corps
          ,nombre_de_periodes_de_la_simulation
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_vitesses_a_l_instant_courant
          ,nombre_de_corps
          ,deltaF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_coordonnees_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb2(matrice_des_distances_a_l_instant_precedent
          ,nombre_de_corps
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_coordonnees_a_l_instant_precedent
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_vitesses_a_l_instant_initial
          ,nombre_de_corps
          ,deltaF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_coordonnees_a_l_instant_initial
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
                                        /* Liberation des espaces alloues...                                                         */
                                        /*                                                                                           */
                                        /* Les 'ADRESSE_NON_ENCORE_DEFINIE's ont ete introduits le 20050221171122...                 */

     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.