/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O U V E M E N T S   E L L I P T I Q U E S    D A N S   L ' E S P A C E  :                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrr/N_ellipso.11$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20051103130151).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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                                                                                                        \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(editer_les_coordonnees,EDITER_LES_COORDONNEES)));
                                        /* Indique si a chaque pas de temps on doit editer ('VRAI') ou pas ('FAUX') les coordonnees  */
                                        /* 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'.                                                                       */
                                        /*                                                                                           */
                                        /* On notera l'inutilite de ce parametre qui est introduit pour des raisons de compatibilite */
                                        /* avec 'v $xrr/N_corps.11$K'.                                                               */

#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_D_UN_CORPS                                                                                             \
                    ACCES_LISTE(liste_initiale_des_RAYON,corps)
#define   RAYON_DE_VISUALISATION                                                                                                        \
                    PARE(2.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...                                                               */

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
                                                  ,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(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 20061026125547 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_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.                                                                                  */

          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 20061026125547...                                                           */
          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 20030313151750). 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 20070827100654).            */

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 20070827100654).                                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L A   S I M U L A 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 "   A   L ' A I D E   D E                                          */
/*        M O U V E M E N T S   E L L I P T I Q U E S    D A N S   L ' E S P A C E  :                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Soit la famille {C ,C ,...,C } de 'N'                                                                          */
/*                                      1  2      N                                                                                  */
/*                  corps en mouvement elliptique suivant les                                                                        */
/*                  lois de Kepler, par rapport a un centre (appele                                                                  */
/*                  'centre_de_l_espace_pour_la_visualisation').                                                                     */
/*                  Chaque corps se deplace donc dans un plan                                                                        */
/*                  dont l'orientation est definie grace aux                                                                         */
/*                  trois angles d'Euler {theta,psi,phi}                                                                             */
/*                  ('v $ximD/definit.1$DEF INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER').                                      */
/*                                                                                                                                   */
/*                    Le systeme fonctionne comme celui du                                                                           */
/*                  'N-corps'. Ainsi, on pourra definir comme                                                                        */
/*                  premier corps, un corps dont le mouvement                                                                        */
/*                  circulaire se reduit a un point grace a :                                                                        */
/*                                                                                                                                   */
/*                                      DEMI_PETIT_AXE_2D=0                                                                          */
/*                                      DEMI_GRAND_AXE_2D=0                                                                          */
/*                                      TEMPS_INITIAL=0                                                                              */
/*                                      FACTEUR_DU_TEMPS=0                                                                           */
/*                                                                                                                                   */
/*                  sachant qu'en fait seuls 'DEMI_PETIT_AXE_2D' et 'DEMI_GRAND_AXE_2D'                                              */
/*                  sont necessaires. Ceci aura pour principal                                                                       */
/*                  avantage de materialiser ce centre dans                                                                          */
/*                  les images.                                                                                                      */
/*                                                                                                                                   */
/*                    Chaque corps sera donc defini par le                                                                           */
/*                  plan {OX2,OY2} ('OZ2' est donc la normale                                                                        */
/*                  a ce plan) de son orbite defini par ses                                                                          */
/*                  angles d'Euler :                                                                                                 */
/*                                                                                                                                   */
/*                                      {THETA_3D,PSI_3D,PHI_3D}                                                                     */
/*                                      {TRANSLATION_X_3D,TRANSLATION_Y_3D,TRANSLATION_Z_3D}                                         */
/*                                                                                                                                   */
/*                  dans l'espace absolu {OX1,OY1,OZ1} (suivant evidemment les definitions de                                        */
/*                  'v $ximD/definit.1$DEF INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER')                                        */
/*                  et par son mouvement elliptique "gravitationnelle" :                                                             */
/*                                                                                                                                   */
/*                                      {DEMI_PETIT_AXE_2D,DEMI_GRAND_AXE_2D,TEMPS_INITIAL,FACTEUR_DU_TEMPS}                         */
/*                                                                                                                                   */
/*                    Tout ceci est detaille dans l'Encyclopedia Universalis,                                                        */
/*                  Volume 10, Page 657. Ainsi, le mouvement gravitationnel                                                          */
/*                  elliptique d'un corps peut etre decrit a l'aide d'un                                                             */
/*                  mouvement circulaire sur le Cercle circonscrit a l'Ellipse.                                                      */
/*                  L'angle polaire 'thetaC' de parcours du Cercle satisfait a                                                       */
/*                  l'equation dite "de Kepler" :                                                                                    */
/*                                                                                                                                   */
/*                                      thetaC - e.sin(thetaC) = k.(t-t0)                                                            */
/*                                                                                                                                   */
/*                  d'ou :                                                                                                           */
/*                                                                                                                                   */
/*                                      thetaC = fonction1(temps)                                                                    */
/*                                                                                                                                   */
/*                  ou 'e' designe l'excentricite de l'Ellipse, 't' le                                                               */
/*                  temps courant, 't0' l'instant initial et 'k' une                                                                 */
/*                  constante. En ce qui concerne l'Ellipse, son equation                                                            */
/*                  polaire est :                                                                                                    */
/*                                                                                                                                   */
/*                                                     p                                                                             */
/*                                      rhoE = -------------------                                                                   */
/*                                              1 + e.cos(thetaE)                                                                    */
/*                                                                                                                                   */
/*                  (l'origine etant le foyer de droite de l'Ellipse) d'ou,                                                          */
/*                  le points courants du Cercle et de l'Ellipse ayant meme                                                          */
/*                  abscisee :                                                                                                       */
/*                                                                                                                                   */
/*                                      x = rhoC.cos(thetaC) = rhoE.cos(thetaE) + d                                                  */
/*                                                                                                                                   */
/*                  (l'origine etant le centre de l'Ellipse -et du Cercle-) d'ou :                                                   */
/*                                                                                                                                   */
/*                                      thetaE = fonction2(thetaC).                                                                  */
/*                                                                                                                                   */
/*                  et enfin, les coordonnees {x,y} du point courant de l'Ellipse :                                                  */
/*                                                                                                                                   */
/*                                      x = rhoE.cos(thetaE) + d                                                                     */
/*                                      y = rhoE.sin(thetaE)                                                                         */
/*                                                                                                                                   */
/*                  (l'origine etant le centre de l'Ellipse -et du Cercle-) avec :                                                   */
/*                                                                                                                                   */
/*                                      a = demi-grand axe (= rhoC)                                                                  */
/*                                      b = demi-petit axe                                                                           */
/*                                      d = distance focale                                                                          */
/*                                      e = excentricite                                                                             */
/*                                      p = parametre focal                                                                          */
/*                                                                                                                                   */
/*                  avec les definitions suivantes :                                                                                 */
/*                                                                                                                                   */
/*                                              ________                                                                             */
/*                                             / 2    2                                                                              */
/*                                      d =  \/ a  - b                                                                               */
/*                                                                                                                                   */
/*                                           d                                                                                       */
/*                                      e = ---                                                                                      */
/*                                           a                                                                                       */
/*                                                                                                                                   */
/*                                            2                                                                                      */
/*                                           b                                                                                       */
/*                                      p = ----                                                                                     */
/*                                           a                                                                                       */
/*                                                                                                                                   */
/*                  On notera que :                                                                                                  */
/*                                                                                                                                   */
/*                                      a = b     ==>       thetaE = thetaC                                                          */
/*                                                                                                                                   */
/*                  la trajectoire est alors circulaire (l'Ellipse et son                                                            */
/*                  Cercle circonscrit sont confondus...).                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    On pourra "simuler" la troisieme loi de                                                                        */
/*                  Kepler qui stipule que le carre de la periode                                                                    */
/*                  de revolution est proportionnel au cube du                                                                       */
/*                  (demi-)grand axe de la trajectoire, soit :                                                                       */
/*                                                                                                                                   */
/*                                       2      3                                                                                    */
/*                                      T  = k.a                                                                                     */
/*                                                                                                                                   */
/*                  ou encore :                                                                                                      */
/*                                                                                                                                   */
/*                                               3                                                                                   */
/*                                              ---                                                                                  */
/*                                               2                                                                                   */
/*                                      T  = k.a                                                                                     */
/*                                                                                                                                   */
/*                  ce qui se retient en se souvenant que                                                                            */
/*                  la periode 'T' croit plus vite que le                                                                            */
/*                  (demi-)grand axe 'a'...                                                                                          */
/*                                                                                                                                   */
/*                  On prendra alors :                                                                                               */
/*                                                                                                                                   */
/*                                                       k                                                                           */
/*                                      FacteurTemps = ------                                                                        */
/*                                                        3                                                                          */
/*                                                       ---                                                                         */
/*                                                        2                                                                          */
/*                                                      a                                                                            */
/*                                                                                                                                   */
/*                  ou 'FacteurTemps' designe le facteur de "conversion"                                                             */
/*                  du temps en un angle "circulaire". Mais, pour simplifier                                                         */
/*                  l'usage de ce programme, il y a deux jeux de parametres                                                          */
/*                  equivalents :                                                                                                    */
/*                                                                                                                                   */
/*                                      {TEMPS_INITIAL,FACTEUR_DU_TEMPS}                                                             */
/*                                                                                                                                   */
/*                  et :                                                                                                             */
/*                                                                                                                                   */
/*                                      {THETA_2D,DELTA_THETA_2D}                                                                    */
/*                                                                                                                                   */
/*                  le second jeu venant de 'v $xrr/N_spheres.11$K DELTA_THETA_2D'.                                                  */
/*                                                                                                                                   */
/*                    Ensuite, en jouant sur l'origine des                                                                           */
/*                  coordonnees, on pourra obtenir tous                                                                              */
/*                  les phenomenes vus avec le probleme                                                                              */
/*                  des 'N-corps'...                                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   COMPATIBILITE_20051107                                                                                                        \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(compatibilite_20051107,COMPATIBILITE_20051107)));
                                        /* Le 20051107155323, j'ai observe que des corps dont a priori les trajectoires devaient     */
                                        /* etre coplanaires ne l'etaient en fait pas dans les images. Cela venait du fait que passer */
                                        /* de la matrice d'Euler directe a la matrice d'Euler inverse ne se fait pas en changenat le */
                                        /* signe des angles {theta,psi,phi} ('v $ximD/definit.1$DEF psi..direct.et..psi..inverse').  */
                                        /* Cela a conduit aussi aux modifications 'v $xrr/N_spheres.11$K compatibilite_20051107'     */
                                        /* et 'v $xiirk/.NCOR.f1.1.11.$U _____Compatibilite_20051107'...                             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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_THETA_3D,fichier_THETA_3D,THETA_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_PSI_3D,fichier_PSI_3D,PSI_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_PHI_3D,fichier_PHI_3D,PHI_3D_IMPLICITE,FZERO)
                                        /* Definition des fichiers de definition des orientations des plans des trajectoires.        */

dfTRANSFORMAT_31(liste_initiale_des_TRANSLATION_X_3D,fichier_TRANSLATION_X_3D,TRANSLATION_X_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Y_3D,fichier_TRANSLATION_Y_3D,TRANSLATION_Y_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Z_3D,fichier_TRANSLATION_Z_3D,TRANSLATION_Z_3D_IMPLICITE,FZERO)
                                        /* Definition des fichiers de definition des translations des plans des trajectoires.        */

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_DEMI_PETIT_AXE_2D
                ,fichier_LISTE_DEMI_PETIT_AXE_2D
                ,DEMI_PETIT_AXE_2D_IMPLICITE
                ,MUL2(FLOT(MILLE),FLOT(MILLIARD))
                 )
dfTRANSFORMAT_31(liste_initiale_des_DEMI_GRAND_AXE_2D
                ,fichier_LISTE_DEMI_GRAND_AXE_2D
                ,DEMI_GRAND_AXE_2D_IMPLICITE
                ,MUL2(FLOT(MILLE),FLOT(MILLIARD))
                 )
dfTRANSFORMAT_31(liste_initiale_des_TEMPS_INITIAL,fichier_LISTE_TEMPS_INITIAL,TEMPS_INITIAL_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_TEMPS,fichier_LISTE_FACTEUR_DU_TEMPS,FACTEUR_DU_TEMPS_IMPLICITE,FRA10(FRA10(FU)))

dfTRANSFORMAT_31(liste_initiale_des_THETA_2D,fichier_LISTE_THETA_2D,THETA_2D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_DELTA_THETA_2D,fichier_LISTE_DELTA_THETA_2D,DELTA_THETA_2D_IMPLICITE,FRA10(FRA10(FU)))
                                        /* Definition du mouvement dans un plan par (rho,theta,TempsInitial), en notant que la       */
                                        /* possibilite d'introduire un 'theta' existe mais est exclue de l'introduction du           */
                                        /* 'TempsInitial'...                                                                         */

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 20061026125547. */
                                        /* Par defaut, tous les corps sont evidemment visibles ('VRAI').                             */
                                        /*                                                                                           */
                                        /* La valeur implicite est passee de 'VRAI' a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE' le         */
                                        /* 20061106140827 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]                                                     */
                                        /*                                                                                           */

#define   PAS_DU_THETA_CIRCULAIRE                                                                                                       \
                    FRA1(FU)
DEFV(Local,DEFV(Float,INIT(pas_du_theta_circulaire,PAS_DU_THETA_CIRCULAIRE)));
#define   EPSILON_DE_RESOLUTION                                                                                                         \
                    FRA10(FRA10(FRA10(FU)))
DEFV(Local,DEFV(Float,INIT(epsilon_de_resolution,EPSILON_DE_RESOLUTION)));
                                        /* Pour resoudre iterativement l'equation de Kepler. Le 20051106115656, la valeur anterieure */
                                        /* ('GRAND_EPSILON') a ete largement augmentee...                                            */
#define   FACTEUR_DE_CONVERSION__DELTA_THETA_2D__FACTEUR_DU_TEMPS                                                                       \
                    FU
DEFV(Local,DEFV(Float,INIT(facteur_de_conversion__delta_theta_2d__facteur_du_temps
                          ,FACTEUR_DE_CONVERSION__DELTA_THETA_2D__FACTEUR_DU_TEMPS
                           )
                )
     );
                                        /* Facteur pour passer de 'ACCES_DELTA_THETA_2D(...)' a 'ACCES_FACTEUR_DU_TEMPS(...)'        */
                                        /* introduit le 20051104093939...                                                            */

#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).                                                             */
                                        /*                                                                                           */
                                        /* On notera l'inutilite de ce parametre qui est introduit pour des raisons de compatibilite */
                                        /* avec 'v $xrr/N_corps.11$K'.                                                               */

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 20070827100654...).              */

#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(Float,DdTb1(POINTERs
                ,liste_des_demi_petit_axe_effectif_a_l_instant_courant
                ,nombre_de_corps
                ,ADRESSE_NON_ENCORE_DEFINIE
                 )
     );
DEFV(Float,DdTb1(POINTERs
                ,liste_des_demi_grand_axe_effectif_a_l_instant_courant
                ,nombre_de_corps
                ,ADRESSE_NON_ENCORE_DEFINIE
                 )
     );
DEFV(Float,DdTb1(POINTERs
                ,liste_des_distance_focale_a_l_instant_courant
                ,nombre_de_corps
                ,ADRESSE_NON_ENCORE_DEFINIE
                 )
     );
DEFV(Float,DdTb1(POINTERs
                ,liste_des_parametre_focal_a_l_instant_courant
                ,nombre_de_corps
                ,ADRESSE_NON_ENCORE_DEFINIE
                 )
     );
DEFV(Float,DdTb1(POINTERs
                ,liste_des_excentricite_a_l_instant_courant
                ,nombre_de_corps
                ,ADRESSE_NON_ENCORE_DEFINIE
                 )
     );
DEFV(Float,DdTb1(POINTERs
                ,liste_des_theta_circulaire_a_l_instant_courant
                ,nombre_de_corps
                ,ADRESSE_NON_ENCORE_DEFINIE
                 )
     );
DEFV(pointF_3D,DdTb1(POINTERs
                    ,liste_des_coordonnees_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.                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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_THETA_3D(corps)                                                                                                         \
                    IdTb1(liste_initiale_des_THETA_3D                                                                                   \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_PSI_3D(corps)                                                                                                           \
                    IdTb1(liste_initiale_des_PSI_3D                                                                                     \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_PHI_3D(corps)                                                                                                           \
                    IdTb1(liste_initiale_des_PHI_3D                                                                                     \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_TRANSLATION_X_3D(corps)                                                                                                 \
                    IdTb1(liste_initiale_des_TRANSLATION_X_3D                                                                           \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_TRANSLATION_Y_3D(corps)                                                                                                 \
                    IdTb1(liste_initiale_des_TRANSLATION_Y_3D                                                                           \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_TRANSLATION_Z_3D(corps)                                                                                                 \
                    IdTb1(liste_initiale_des_TRANSLATION_Z_3D                                                                           \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
                                        /* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position initiale.    */

#define   ACCES_DEMI_PETIT_AXE_EFFECTIF_COURANT(corps)                                                                                  \
                    IdTb1(liste_des_demi_petit_axe_effectif_a_l_instant_courant                                                         \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_DEMI_GRAND_AXE_EFFECTIF_COURANT(corps)                                                                                  \
                    IdTb1(liste_des_demi_grand_axe_effectif_a_l_instant_courant                                                         \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_DISTANCE_FOCALE_COURANT(corps)                                                                                          \
                    IdTb1(liste_des_distance_focale_a_l_instant_courant                                                                 \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_PARAMETRE_FOCAL_COURANT(corps)                                                                                          \
                    IdTb1(liste_des_parametre_focal_a_l_instant_courant                                                                 \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_EXCENTRICITE_COURANT(corps)                                                                                             \
                    IdTb1(liste_des_excentricite_a_l_instant_courant                                                                    \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_THETA_CIRCULAIRE_COURANT(corps)                                                                                         \
                    IdTb1(liste_des_theta_circulaire_a_l_instant_courant                                                                \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_COORDONNEES_COURANTES(corps)                                                                                            \
                    IdTb1(liste_des_coordonnees_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_DEMI_PETIT_AXE_2D(corps)                                                                                                \
                    IdTb1(liste_initiale_des_DEMI_PETIT_AXE_2D                                                                          \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_DEMI_GRAND_AXE_2D(corps)                                                                                                \
                    IdTb1(liste_initiale_des_DEMI_GRAND_AXE_2D                                                                          \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_TEMPS_INITIAL(corps)                                                                                                    \
                    IdTb1(liste_initiale_des_TEMPS_INITIAL                                                                              \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_FACTEUR_DU_TEMPS(corps)                                                                                                 \
                    IdTb1(liste_initiale_des_FACTEUR_DU_TEMPS                                                                           \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_THETA_2D(corps)                                                                                                         \
                    IdTb1(liste_initiale_des_THETA_2D                                                                                   \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_DELTA_THETA_2D(corps)                                                                                                   \
                    IdTb1(liste_initiale_des_DELTA_THETA_2D                                                                             \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_RAYON(corps)                                                                                                            \
                    IdTb1(liste_initiale_des_RAYON                                                                                      \
                         ,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.                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S   D ' U N E   E L L I P S E  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   SEUIL_DE_VALIDATION_DE_L_EXCENTRICITE                                                                                         \
                    FDU                                                                                                                 \
                                        /* Ceci fut introduit le 20051107113951 afin de valider l'excentricite des ellipses dans     */ \
                                        /* le cas ou 'IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees).             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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 20030313151750, '__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"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M O U V E M E N T S   E L L I P T I Q U E S    D A N S   L ' E S P A C E  :                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
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_THETA_3D,THETA_3D_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_PSI_3D,PSI_3D_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_PHI_3D,PHI_3D_IMPLICITE);
                                        /* Initialisation des fichiers de definition des orientations des plans des trajectoires.    */
     iTRANSFORMAT_31(liste_initiale_des_TRANSLATION_X_3D,TRANSLATION_X_3D_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Y_3D,TRANSLATION_Y_3D_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Z_3D,TRANSLATION_Z_3D_IMPLICITE);
                                        /* Initialisation des fichiers de definition des translations des plans des trajectoires.    */
     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_DEMI_PETIT_AXE_2D,DEMI_PETIT_AXE_2D_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_DEMI_GRAND_AXE_2D,DEMI_GRAND_AXE_2D_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_TEMPS_INITIAL,TEMPS_INITIAL_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_TEMPS,FACTEUR_DU_TEMPS_IMPLICITE);

     iTRANSFORMAT_31(liste_initiale_des_THETA_2D,THETA_2D_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_DELTA_THETA_2D,DELTA_THETA_2D_IMPLICITE);
                                        /* Initialisation du fichier de definition du mouvement dans un plan par (rho,theta,Dtheta). */
     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             */
                                        /* 20061026125547.                                                                           */
     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 20070827100654).                    */
     iTRANSFORMAT_31(liste_initiale_des_NOMBRES,NOMBRES_IMPLICITE);
                                        /* Initialisation du nombre variable (introduit le 20070827100654).                          */
     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 20070827100654).                                              */

#include  xrv/champs_5.1A.I"

     GET_ARGUMENTSv(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20051107=",compatibilite_20051107);

                         PROCESS_ARGUMENT_I("nombre_points=""npoints=""iterations=""corps=",nombre_de_corps
                                        /* Le 20111211095835, 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_THETA_3D="
                                                 ,fichier_THETA_3D
                                                 ,liste_initiale_des_THETA_3D
                                                 ,THETA_3D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_PSI_3D="
                                                 ,fichier_PSI_3D
                                                 ,liste_initiale_des_PSI_3D
                                                 ,PSI_3D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_PHI_3D="
                                                 ,fichier_PHI_3D
                                                 ,liste_initiale_des_PHI_3D
                                                 ,PHI_3D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

                         PROCESS_ARGUMENT_FICHIER("LISTE_TRANSLATION_X_3D="
                                                 ,fichier_TRANSLATION_X_3D
                                                 ,liste_initiale_des_TRANSLATION_X_3D
                                                 ,TRANSLATION_X_3D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_TRANSLATION_Y_3D="
                                                 ,fichier_TRANSLATION_Y_3D
                                                 ,liste_initiale_des_TRANSLATION_Y_3D
                                                 ,TRANSLATION_Y_3D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_TRANSLATION_Z_3D="
                                                 ,fichier_TRANSLATION_Z_3D
                                                 ,liste_initiale_des_TRANSLATION_Z_3D
                                                 ,TRANSLATION_Z_3D_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_DEMI_PETIT_AXE_2D="
                                                 ,fichier_LISTE_DEMI_PETIT_AXE_2D
                                                 ,liste_initiale_des_DEMI_PETIT_AXE_2D
                                                 ,DEMI_PETIT_AXE_2D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_DEMI_GRAND_AXE_2D="
                                                 ,fichier_LISTE_DEMI_GRAND_AXE_2D
                                                 ,liste_initiale_des_DEMI_GRAND_AXE_2D
                                                 ,DEMI_GRAND_AXE_2D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_TEMPS_INITIAL="
                                                 ,fichier_LISTE_TEMPS_INITIAL
                                                 ,liste_initiale_des_TEMPS_INITIAL
                                                 ,TEMPS_INITIAL_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_FACTEUR_DU_TEMPS="
                                                 ,fichier_LISTE_FACTEUR_DU_TEMPS
                                                 ,liste_initiale_des_FACTEUR_DU_TEMPS
                                                 ,FACTEUR_DU_TEMPS_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_THETA_2D="
                                                 ,fichier_LISTE_THETA_2D
                                                 ,liste_initiale_des_THETA_2D
                                                 ,THETA_2D_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_DELTA_THETA_2D="
                                                 ,fichier_LISTE_DELTA_THETA_2D
                                                 ,liste_initiale_des_DELTA_THETA_2D
                                                 ,DELTA_THETA_2D_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 20090617163958, 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_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
                                                  );

                         GET_ARGUMENT_F("facteur_conversion=""conversion=",facteur_de_conversion__delta_theta_2d__facteur_du_temps);

                         GET_ARGUMENT_F("ptc=""pas_theta_circulaire=",pas_du_theta_circulaire);
                         GET_ARGUMENT_F("epsilon=",epsilon_de_resolution);

                         PROCESS_ARGUMENTS_DE_VISUALISATION;

                         PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES;

                         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("ensemble=",visualiser_l_ensemble_des_instants);
                         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=",editer_les_coordonnees);
                         )
                    );

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

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

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

     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_demi_petit_axe_effectif_a_l_instant_courant
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_demi_grand_axe_effectif_a_l_instant_courant
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_distance_focale_a_l_instant_courant
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_parametre_focal_a_l_instant_courant
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_excentricite_a_l_instant_courant
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_theta_circulaire_a_l_instant_courant
          ,nombre_de_corps
          ,Float
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     MdTb1(liste_des_coordonnees_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_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.                                            */

     Komp(corps,nombre_de_corps)
          Bblock
          DEFV(Float,INIT(demi_petit_axe,ACCES_DEMI_PETIT_AXE_2D(corps)));
          DEFV(Float,INIT(demi_grand_axe,ACCES_DEMI_GRAND_AXE_2D(corps)));
                                        /* Caracteristiques principales de l'ellipse du corps courant...                             */
          DEFV(Float,INIT(demi_petit_axe_effectif,FLOT__UNDEF));
          DEFV(Float,INIT(demi_grand_axe_effectif,FLOT__UNDEF));
          DEFV(Float,INIT(distance_focale,FLOT__UNDEF));
          DEFV(Float,INIT(parametre_focal,FLOT__UNDEF));
          DEFV(Float,INIT(excentricite,FLOT__UNDEF));
                                        /* Caracteristiques secondaires de l'ellipse du corps courant...                             */

          EGAL(demi_petit_axe_effectif,MIN2(demi_petit_axe,demi_grand_axe));
          EGAL(demi_grand_axe_effectif,MAX2(demi_petit_axe,demi_grand_axe));

          EGAL(distance_focale,RACX(SOUS(EXP2(demi_grand_axe_effectif),EXP2(demi_petit_axe_effectif))));
          EGAL(excentricite,DIVI(distance_focale,demi_grand_axe_effectif));
          EGAL(parametre_focal,DIVI(EXP2(demi_petit_axe_effectif),demi_grand_axe_effectif));
                                        /* Calcul des caracteristiques secondaires de l'ellipse du corps courant...                  */

          EGAL(ACCES_DEMI_PETIT_AXE_EFFECTIF_COURANT(corps),demi_petit_axe_effectif);
          EGAL(ACCES_DEMI_GRAND_AXE_EFFECTIF_COURANT(corps),demi_grand_axe_effectif);
          EGAL(ACCES_DISTANCE_FOCALE_COURANT(corps),distance_focale);
          EGAL(ACCES_PARAMETRE_FOCAL_COURANT(corps),parametre_focal);
          EGAL(ACCES_EXCENTRICITE_COURANT(corps),excentricite);
                                        /* Mise a jour des listes du corps courant...                                                */

          INITIALISATION_POINT_3D(ACCES_COORDONNEES_COURANTES(corps)
                                 ,FLOT__UNDEF
                                 ,FLOT__UNDEF
                                 ,FLOT__UNDEF
                                  );

          Test(IFET(IFEQ_chaine(fichier_LISTE_TEMPS_INITIAL,NOM_PIPE_Local)
                   ,IFNE_chaine(fichier_LISTE_DELTA_THETA_2D,NOM_PIPE_Local)
                    )
               )
               Bblock
               EGAL(ACCES_FACTEUR_DU_TEMPS(corps)
                   ,SCAL(ACCES_DELTA_THETA_2D(corps)
                        ,MUL2(nombre_de_pas_de_temps_par_periode,dct)
                        ,facteur_de_conversion__delta_theta_2d__facteur_du_temps
                         )
                    );
                                        /* Definition eventuelle du facteur du temps a partir d'une variation d'un 'theta' fictif.   */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFET(IFEQ_chaine(fichier_LISTE_TEMPS_INITIAL,NOM_PIPE_Local)
                   ,IFNE_chaine(fichier_LISTE_THETA_2D,NOM_PIPE_Local)
                    )
               )
               Bblock
               Test(IZNE(ACCES_FACTEUR_DU_TEMPS(corps)))
                    Bblock
                    EGAL(ACCES_TEMPS_INITIAL(corps)
                        ,NEGA(DIVI(SOUS(ACCES_THETA_2D(corps),SINX(ACCES_THETA_2D(corps))),ACCES_FACTEUR_DU_TEMPS(corps)))
                         );
                                        /* Definition eventuelle du temps initial a partir d'un 'theta' fictif.                      */
                    Eblock
               ATes
                    Bblock
                    EGAL(ACCES_TEMPS_INITIAL(corps),instant_initial);
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          EGAL(ACCES_THETA_CIRCULAIRE_COURANT(corps)
              ,MUL2(ACCES_FACTEUR_DU_TEMPS(corps),SOUS(instant_initial,ACCES_TEMPS_INITIAL(corps)))
               );
                                        /* Definition de la position angulaire initiale des corps dans leurs plan.                   */

          Test(IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees))
               Bblock
               Test(IFGT(excentricite,SEUIL_DE_VALIDATION_DE_L_EXCENTRICITE))
                                        /* Ce test a ete introduit le 20051107113951 lorsque j'ai decouvert qu'evidemment            */
                                        /* l'utilisation d'echelles non lineaires ne pouvait pas conserver la forme des ellipses.    */
                                        /* Elles adoptent alors une forme ressemblant un peu a une galaxie vue par la tranche...     */
                    Bblock
                    PRINT_ATTENTION("un corps a une excentricite trop importante, incompatible avec les echelles non lineaires");
                    CAL1(Prer1("Il s'agit du corps %d.\n",corps));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     EKom

     Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)
          Bblock
          DEFV(Int,INIT(periode,UNDEF));

          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 20070827100654...                                               */
               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 20070827100654...                                               */
                    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 20070827100654...                                               */
               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.    */

          Komp(corps,nombre_de_corps)
               Bblock
               DEFV(Float,INIT(demi_petit_axe_effectif,ACCES_DEMI_PETIT_AXE_EFFECTIF_COURANT(corps)));
               DEFV(Float,INIT(demi_grand_axe_effectif,ACCES_DEMI_GRAND_AXE_EFFECTIF_COURANT(corps)));
               DEFV(Float,INIT(distance_focale,ACCES_DISTANCE_FOCALE_COURANT(corps)));
               DEFV(Float,INIT(parametre_focal,ACCES_PARAMETRE_FOCAL_COURANT(corps)));
               DEFV(Float,INIT(excentricite,ACCES_EXCENTRICITE_COURANT(corps)));
                                        /* Caracteristiques secondaires de l'ellipse du corps courant...                             */
               DEFV(pointF_2D,position_du_corps_dans_son_plan);
                                        /* Definition bidimensionnelle du point en coordonnees polaires, puis cartesiennes.          */
               DEFV(deltaF_3D,vecteur_position_du_corps_dans_l_espace_relatif);
                                        /* Definition tridimensionnelle du point dans un referentiel relatif lie a son plan.         */
               DEFV(deltaF_3D,vecteur_position_du_corps_dans_l_espace_absolu);
                                        /* Definition tridimensionnelle du point dans un referentiel absolu.                         */
               DEFV(matrixF_3D,matrice_de_rotation);
                                        /* Matrice de rotation d'Euler permettant de passer du plan du corps courant a l'espace      */
                                        /* absolu.                                                                                   */

               Test(IFET(IZNE(demi_petit_axe_effectif),IZNE(demi_grand_axe_effectif)))
                    Bblock
                    DEFV(Float,INIT(rho_circulaire_du_corps,FLOT__UNDEF));
                    DEFV(Float,INIT(theta_circulaire_du_corps,ACCES_THETA_CIRCULAIRE_COURANT(corps)));
                    DEFV(Float,INIT(pas_du_theta_circulaire_du_corps,pas_du_theta_circulaire));
                                        /* Coordonnees {rhoC,thetaC} de parcours du cercle circonscrit a l'ellipse du corps courant. */
                    DEFV(Float,INIT(rho_elliptique_du_corps,FLOT__UNDEF));
                    DEFV(Float,INIT(theta_elliptique_du_corps,FLOT__UNDEF));
                    DEFV(Int,INIT(correction_du_theta_elliptique_du_corps,UNDEF));
                                        /* Coordonnees {rhoE,thetaE} de parcours de l'ellipse du corps courant.                      */
                    DEFV(Float,INIT(temps_effectif
                                   ,MUL2(ACCES_FACTEUR_DU_TEMPS(corps),SOUS(temps_courant,ACCES_TEMPS_INITIAL(corps)))
                                    )
                         );
                                        /* Temps effectif dans l'equation de Kepler...                                               */
                    DEFV(Logical,INIT(resoudre_l_equation_de_Kepler,VRAI));
                                        /* Pour resoudre l'equation de Kepler iterativement...                                       */

                    EGAL(rho_circulaire_du_corps,demi_grand_axe_effectif);
                                        /* Caracteristiques du cercle circonscrit a l'ellipse du corps courant.                      */

                    Tant(IL_FAUT(resoudre_l_equation_de_Kepler))
                         Bblock
                         DEFV(Float,INIT(equation_de_kepler
                                        ,SOUS(theta_circulaire_du_corps
                                             ,MUL2(excentricite,SINX(theta_circulaire_du_corps))
                                              )
                                         )
                              );
                                        /* Formule d'equivalence entre le temps (de parcours de l'ellipse) et le 'thetaC' du cercle  */
                                        /* circonscrit a l'ellipse :                                                                 */
                                        /*                                                                                           */
                                        /*                  thetaC - e.sin(thetaC) = temps                                           */
                                        /*                                                                                           */
                                        /* d'ou :                                                                                    */
                                        /*                                                                                           */
                                        /*                  thetaC = fonction1(temps).                                               */
                                        /*                                                                                           */
                                        /* C'est l'equation de Kepler. Au passage, toute cette sequence de resolution est inspiree   */
                                        /* de 'v $xtc/EquKepler.01$c'...                                                             */

                         Test(IFLT(SOUA(equation_de_kepler,temps_effectif),epsilon_de_resolution))
                              Bblock
                              DEFV(Float,INIT(numerateur
                                             ,SOUS(MUL2(rho_circulaire_du_corps,COSX(theta_circulaire_du_corps)),distance_focale)
                                              )
                                   );
                              DEFV(Float,INIT(denominateur
                                             ,SOUS(AXPB(excentricite,distance_focale,parametre_focal)
                                                  ,MUL3(rho_circulaire_du_corps,excentricite,COSX(theta_circulaire_du_corps))
                                                   )
                                              )
                                   );
                              DEFV(Float,INIT(quotient,FLOT__UNDEF));
                                        /* On a :                                                                                    */
                                        /*                                                                                           */
                                        /*                                 p                                                         */
                                        /*                  rhoE = -------------------                                               */
                                        /*                          1 + e.cos(thetaE)                                                */
                                        /*                                                                                           */
                                        /* (l'origine etant le foyer de droite de l'ellipse) d'ou :                                  */
                                        /*                                                                                           */
                                        /*                  x = rhoC.cos(thetaC) = rhoE.cos(thetaE) + d                              */
                                        /*                                                                                           */
                                        /* (l'origine etant le centre de l'ellipse -et du cercle-) d'ou :                            */
                                        /*                                                                                           */
                                        /*                  thetaE = fonction2(thetaC).                                              */
                                        /*                                                                                           */
                                        /* et enfin, les coordonnees {x,y} du point courant de l'ellipse :                           */
                                        /*                                                                                           */
                                        /*                  x = rhoE.cos(thetaE) + d                                                 */
                                        /*                  y = rhoE.sin(thetaE)                                                     */
                                        /*                                                                                           */
                                        /* (l'origine etant le centre de l'ellipse -et du cercle-) avec :                            */
                                        /*                                                                                           */
                                        /*                  a = demi_grand_axe_effectif (= rhoC)                                     */
                                        /*                  b = demi_petit_axe_effectif                                              */
                                        /*                  d = distance_focale                                                      */
                                        /*                  e = excentricite                                                         */
                                        /*                  p = parametre_focal                                                      */
                                        /*                                                                                           */
                                        /* On notera que :                                                                           */
                                        /*                                                                                           */
                                        /*                  a = b     ==>       thetaE = thetaC                                      */
                                        /*                                                                                           */
                              EGAL(quotient,DIVI(numerateur,denominateur));

                              Test(IFINff(quotient,COSX(PI),COSX(FZERO)))
                                   Bblock
                                   EGAL(theta_elliptique_du_corps,ACOX(quotient));
                                   Eblock
                              ATes
                                   Bblock
                                   EGAL(theta_elliptique_du_corps,ACOX(MEME_SIGNE_QUE(quotient,COSX(FZERO))));
                                   Eblock
                              ETes

                              EGAL(correction_du_theta_elliptique_du_corps,INTE(DIVI(theta_circulaire_du_corps,PI)));
                                        /* En effet, 'ACOX(...)' renvoie des valeurs dans [0,pi]...                                  */

                              Test(IZGE(correction_du_theta_elliptique_du_corps))
                                   Bblock
                                   Test(EST_PAIR(correction_du_theta_elliptique_du_corps))
                                        Bblock
                                        EGAL(theta_elliptique_du_corps
                                            ,ADD2(MUL2(FLOT(ADD2(correction_du_theta_elliptique_du_corps,ZERO)),PI)
                                                 ,theta_elliptique_du_corps
                                                  )
                                             );
                                        /* Cas ou le point se situe sur le demi-cercle superieur...                                  */
                                        Eblock
                                   ATes
                                        Bblock
                                        EGAL(theta_elliptique_du_corps
                                            ,SOUS(MUL2(FLOT(ADD2(correction_du_theta_elliptique_du_corps,UN)),PI)
                                                 ,theta_elliptique_du_corps
                                                  )
                                             );
                                        /* Cas ou le point se situe sur le demi-cercle inferieur...                                  */
                                        Eblock
                                   ETes
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              EGAL(rho_elliptique_du_corps
                                  ,DIVI(parametre_focal,AXPB(excentricite,COSX(theta_elliptique_du_corps),FU))
                                   );
                                        /* Rappelons l'equation polaire de l'ellipse :                                               */
                                        /*                                                                                           */
                                        /*                                 p                                                         */
                                        /*                  rhoE = -------------------                                               */
                                        /*                          1 + e.cos(thetaE)                                                */
                                        /*                                                                                           */
                                        /* (l'origine etant le foyer de droite de l'ellipse)...                                      */

                              EGAL(resoudre_l_equation_de_Kepler,FAUX);
                                        /* Et l'equation de Kepler est resolue...                                                    */
                              Eblock
                         ATes
                              Bblock
                              Test(IFGT(equation_de_kepler,temps_effectif))
                                   Bblock
                                   EGAL(pas_du_theta_circulaire_du_corps,MOIT(pas_du_theta_circulaire_du_corps));
                                   EGAL(theta_circulaire_du_corps,SOUS(theta_circulaire_du_corps,pas_du_theta_circulaire_du_corps));
                                        /* Cas ou le point courant du cercle est en avance sur le temps, il faut le faire reculer... */
                                   Eblock
                              ATes
                                   Bblock
                                   EGAL(theta_circulaire_du_corps,ADD2(theta_circulaire_du_corps,pas_du_theta_circulaire_du_corps));
                                        /* Cas ou le point courant du cercle est en retard sur le temps, il faut le faire avancer... */
                                   Eblock
                              ETes
                              Eblock
                         ETes
                         Eblock
                    ETan

                    EGAL(ACCES_THETA_CIRCULAIRE_COURANT(corps),theta_circulaire_du_corps);
                                        /* Et ce pour l'iteration suivante de la simulation...                                       */

                    INITIALISATION_POINT_2D(position_du_corps_dans_son_plan
                                           ,ADD2(Xcartesienne_2D(rho_elliptique_du_corps,theta_elliptique_du_corps),distance_focale)
                                           ,NEUT(Ycartesienne_2D(rho_elliptique_du_corps,theta_elliptique_du_corps))
                                            );
                    Eblock
               ATes
                    Bblock
                    INITIALISATION_POINT_2D(position_du_corps_dans_son_plan
                                           ,FZERO
                                           ,FZERO
                                            );
                    Eblock
               ETes

               INITIALISATION_ACCROISSEMENT_3D(vecteur_position_du_corps_dans_l_espace_relatif
                                              ,ASD1(position_du_corps_dans_son_plan,x)
                                              ,ASD1(position_du_corps_dans_son_plan,y)
                                              ,FZERO
                                               );
                                        /* Position du corps dans un referentiel relatif lie a son plan {OX2,OY2}, la coordonnee     */
                                        /* 'Z' est donc nulle...                                                                     */

               Test(IL_FAUT(compatibilite_20051107))
                    Bblock
                    INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER(matrice_de_rotation
                                                                    ,NEGA(ACCES_THETA_3D(corps))
                                                                    ,NEGA(ACCES_PSI_3D(corps))
                                                                    ,NEGA(ACCES_PHI_3D(corps))
                                                                     );
                                        /* Initialisation de la matrice de rotation d'Euler permettant de passer du plan {OX2,OY2}   */
                                        /* du corps courant a l'espace absolu {OX1,OY1,OZ1}. On notera les 'NEGA(...)' dus au fait   */
                                        /* qu'il s'agit donc ici de l'inverse de la rotation directe et habituelle. Ceci a ete       */
                                        /* reconnue comme une erreur grave le 20051107155323...                                      */
                    Eblock
               ATes
                    Bblock
                    INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER(matrice_de_rotation
                                                                    ,NEUT(ACCES_THETA_3D(corps))
                                                                    ,NEUT(ACCES_PSI_3D(corps))
                                                                    ,NEUT(ACCES_PHI_3D(corps))
                                                                     );
                                        /* Initialisation de la matrice de rotation d'Euler permettant de passer du plan {OX2,OY2}   */
                                        /* du corps courant a l'espace absolu {OX1,OY1,OZ1}.                                         */
                    Eblock
               ETes

               PRODUIT_MATRICE_ACCROISSEMENT_3D(vecteur_position_du_corps_dans_l_espace_absolu
                                               ,matrice_de_rotation
                                               ,vecteur_position_du_corps_dans_l_espace_relatif
                                                );
                                        /* Position du corps dans l'espace absolu {OX1,OY1,OZ1}.                                     */

               INITIALISATION_POINT_3D(ACCES_COORDONNEES_COURANTES(corps)
                                      ,ADD3(X_centre_de_l_espace_pour_la_visualisation
                                           ,ACCES_TRANSLATION_X_3D(corps)
                                           ,ASD1(vecteur_position_du_corps_dans_l_espace_absolu,dx)
                                            )
                                      ,ADD3(Y_centre_de_l_espace_pour_la_visualisation
                                           ,ACCES_TRANSLATION_Y_3D(corps)
                                           ,ASD1(vecteur_position_du_corps_dans_l_espace_absolu,dy)
                                            )
                                      ,ADD3(Z_centre_de_l_espace_pour_la_visualisation
                                           ,ACCES_TRANSLATION_Z_3D(corps)
                                           ,ASD1(vecteur_position_du_corps_dans_l_espace_absolu,dz)
                                            )
                                       );
                                        /* Memorisation du point courant...                                                          */

               TRANSFERT_POINT_3D(ACCES_COORDONNEES_CUMULEES(corps,numero_de_la_periode_courante_de_la_simulation)
                                 ,ACCES_COORDONNEES_COURANTES(corps)
                                  );
                                        /* Et enfin, memorisation de la trajectoire du corps courant.                                */
               Eblock
          EKom

          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...                                                  */

                         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...                                                                 */

                         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...                                       */

                         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
                                                                )
                              );

                         CALS(memorisation_point_grave(cx_eventuellement_decentree
                                                      ,cy_eventuellement_decentree
                                                      ,cz_eventuellement_decentree
                                                      ,dcx
                                                      ,dcy
                                                      ,dcz
                                                      ,ACCES_PONDERATION_CENTRE_DE_GRAVITE(corps)
                                                      ,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...                                       */

                         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))
                              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(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)
                    )
               )
               Bblock
               INCREMENTATION_DE_L_HORLOGE(dct);
                                        /* Simulation du temps de la simulation...                                                   */
               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

     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_coordonnees_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_theta_circulaire_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_excentricite_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_parametre_focal_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_distance_focale_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_demi_grand_axe_effectif_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
     FdTb1(liste_des_demi_petit_axe_effectif_a_l_instant_courant
          ,nombre_de_corps
          ,pointF_3D
          ,ADRESSE_NON_ENCORE_DEFINIE
           );
                                        /* Liberation des espaces alloues...                                                         */
                                        /*                                                                                           */
                                        /* Les 'ADRESSE_NON_ENCORE_DEFINIE's ont ete introduits le 20050221173409...                 */

     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.