/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O B L E M E   D I T   " D U   P E N D U L E   E T   D E S   N - A I M A N T S "  :                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrk/N_aimants.11$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1995??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

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

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

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

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

#define   hXmax_ESPACE                                                                                                                  \
                    PARE(1.0)
#define   hYmax_ESPACE                                                                                                                  \
                    PARE(1.0)
#define   hZmax_ESPACE                                                                                                                  \
                    PARE(1.0)
                                        /* 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'.   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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                                                                                                                           \
                    FRA10(FRA10(FRA10(FRA10(FU))))
DEFV(Local,DEFV(Float,INIT(dct,DCT)));
                                        /* Definition de 'dt'.                                                                       */

#include  xrk/attractor.14.I"

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

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

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

#define   RAYON_DE_VISUALISATION                                                                                                        \
                    FRA5(FRA10(mhXYZlongueur_ESPACE))
DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION)));
                                        /* Rayon du disque materialisant une iteration.                                              */

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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 20030313145043). 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').                                                                       */

/*===================================================================================================================================*/
/*        :Debut_listMN_PROBLEME_DES_N_AIMANTS_11:                                                                                   */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   P R O B L E M E   D I T                                                                        */
/*        " D U   P E N D U L E   E T   D E S   N - A I M A N T S "  :                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Soit la famille {C ,C ,...,C } de 'N'                                                                          */
/*                                      1  2      N                                                                                  */
/*                  corps en interaction magnetique.                                                                                 */
/*                  Pour l'un d'entre-eux, la loi fondamentale de                                                                    */
/*                  la dynamique s'ecrit :                                                                                           */
/*                                                                                                                                   */
/*                                     -->      ------->                                                                             */
/*                                      F  = M . Gamma                                                                               */
/*                                       i    i       i                                                                              */
/*                                                                                                                                   */
/*                  dans le cas present, la force 'F' est la                                                                         */
/*                  resultante de l'interaction magnetique ('C')                                                                     */
/*                  des 'N-1' autres corps, de l'attraction                                                                          */
/*                  gravitationnelle ('M') et de la friction                                                                         */
/*                  ('F'). On aura donc :                                                                                            */
/*                                                                                                                                   */
/*                                       2 ---->     ______                          ---->                                           */
/*                                      d   OC       \          C                   d OC                                             */
/*                                            i       \          k     ----->           i        ---->                               */
/*                                     --------- = G  /     ----------- A A   - F .-------- - M . OC                                 */
/*                                          2        /_____  |----->|3   i k     i    dt       i    i                                */
/*                                        dt           k#i   | A A  |                                                                */
/*                                                           |  i k |                                                                */
/*                                                                                                                                   */
/*                  On aboutit ainsi a un systeme d'equations                                                                        */
/*                  differentielles non lineaires du second                                                                          */
/*                  ordre utilisant les fonctions suivantes :                                                                        */
/*                                                                                                                                   */
/*                                     F    = 1                                                                                      */
/*                                      3X                                                                                           */
/*                                        i                                                                                          */
/*                                                                                                                                   */
/*                                     F    = F                                                                                      */
/*                                      2X     i                                                                                     */
/*                                        i                                                                                          */
/*                                                   ______                                                                          */
/*                                                   \                         C                       X                             */
/*                                                    \                         k                       k                            */
/*                                     F    = M  - G  /     -----------------------------------------(---- - 1)                      */
/*                                      1X     i     /_____  |                                   | 3   X                             */
/*                                        i            k#i   |                                   |---   i                            */
/*                                                           |         2            2           2| 2                                 */
/*                                                           |(X  - X )  + (Y  - Y )  + (Z  - Z )|                                   */
/*                                                           |  k    i       k    i       k    i |                                   */
/*                                                                                                                                   */
/*                                     F    = 0                                                                                      */
/*                                      0X                                                                                           */
/*                                        i                                                                                          */
/*                                                                                                                                   */
/*                  avec bien entendu des formules equivalentes                                                                      */
/*                  pour la coordonnee 'Y', alors que la coordonnee                                                                  */
/*                  'Z' est traitee a part, puisque l'on force la                                                                    */
/*                  condition suivante :                                                                                             */
/*                                                                                                                                   */
/*                                     Z  = Z                                   \-/ i                                                */
/*                                      i    0                                                                                       */
/*                                            i                                                                                      */
/*                                                                                                                                   */
/*                  pour tous les corps...                                                                                           */
/*                                                                                                                                   */
/*                    Pour integrer ce systeme non lineaire, on                                                                      */
/*                  suppose que la condition suivante est respectee                                                                  */
/*                  (elle est d'ailleurs verifiee a chaque iteration) :                                                              */
/*                                                                                                                                   */
/*                                     DISTANCE(C ,C ) >= |V   |.dct            \-/ i,j                                              */
/*                                               i  j       max                                                                      */
/*                                                                                                                                   */
/*                  ce qui signifie "grossierement" que deux corps                                                                   */
/*                  quelconques sont toujours suffisamment eloignes                                                                  */
/*                  pour ne pas pouvoir se rejoindre en un pas de                                                                    */
/*                  temps (ou 'Vmax' designe le plus grand module                                                                    */
/*                  des vitesses moyennes de l'ensemble des corps                                                                    */
/*                  au cours du pas de temps precedent).                                                                             */
/*                                                                                                                                   */
/*                    Enfin, a l'instant 't' (ou l'on integre), les                                                                  */
/*                  fonctions 'F1?(...)' ne peuvent etre evaluees                                                                    */
/*                  puisque dependant de {X(t),Y(t),Z(t)}. Or leurs                                                                  */
/*                  valeurs sont necessaires, on utilise donc leurs                                                                  */
/*                  valeurs "retardees" {X(t-dt),Y(t-dt),Z(t-dt)},                                                                   */
/*                  ou 'dt' designe le pas de temps.                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
/*        :Fin_listMN_PROBLEME_DES_N_AIMANTS_11:                                                                                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   C O N S T A N T E S   D U   P R O B L E M E  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   CONSTANTE_G                                                                                                                   \
                    GRO10(FU)
DEFV(Local,DEFV(Float,INIT(constante_G,CONSTANTE_G)));
                                        /* Constante 'G'.                                                                            */

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

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

#define   LES_COORDONNEES_X_ET_Y_SONT_DES_COORDONNEES_DE_L_ESPACE_PHYSIQUE                                                              \
                    VRAI
DEFV(Local,DEFV(Logical,INIT(les_coordonnees_X_ET_Y_sont_des_coordonnees_de_l_espace_physique
                            ,LES_COORDONNEES_X_ET_Y_SONT_DES_COORDONNEES_DE_L_ESPACE_PHYSIQUE
                             )
                )
     );
                                        /* Les coordonnees 'X' et 'Y' initiales sont-elles des coordonnees definies dans l'espace    */
                                        /* physique ('VRAI') ou dans l'image ('FAUX') afin de pouvoir generer plus facilement        */
                                        /* l'image 'nom_imageRF'.                                                                    */

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

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

dfTRANSFORMAT_31(liste_initiale_des_MASSE,fichier_LISTE_MASSE,MASSE_IMPLICITE,FU)
                                        /* Definition du fichier de liste des masses.                                                */
dfTRANSFORMAT_31(liste_initiale_des_FRICTION,fichier_LISTE_FRICTION,FRICTION_IMPLICITE,FU)
                                        /* Definition du fichier de liste des frictions.                                             */

dfTRANSFORMAT_31(liste_initiale_des_COUPLAGE_MAGNETIQUE,fichier_LISTE_COUPLAGE_MAGNETIQUE,COUPLAGE_MAGNETIQUE_IMPLICITE,FU)
                                        /* Definition du fichier de liste des constantes de couplage magnetique.                     */
                                        /* Pour la valeur implicite de la constante de couplage magnetique, on notera                */
                                        /* d'une part qu'une valeur nulle correspond a un corps qui n'est pas un aimant (par         */
                                        /* exemple la boule pendulaire que l'on teste), et que d'autre part, de faibles valeurs      */
                                        /* du couplage (inferieures a la centaine) donnent des situations non chaotiques (dans       */
                                        /* le cas de 3 aimants et d'un pendule, ce dernier tend vers une position de repos qui       */
                                        /* est le barycentre des 3 aimants).                                                         */

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_MARQUAGE_DE_PROXIMITE
                ,fichier_LISTE_MARQUAGE_DE_PROXIMITE
                ,NIVEAU_DE_MARQUAGE_DE_PROXIMITE_IMPLICITE
                ,BLANC
                 )
                                        /* Definition du fichier de liste des marqueurs de proximite des corps immobiles             */
                                        /* les plus proches a la fin de la simulation...                                             */
DEFV(Local,DEFV(genere_p,INIT(niveau_de_marquage_par_defaut,NIVEAU_DE_MARQUAGE_DE_PROXIMITE_IMPLICITE)));
                                        /* Et definition du niveau de marquage au cas ou l'on ne trouve pas de corps immobiles       */
                                        /* proches d'un corps mobile, ou bien si le corps courannt est lui-meme immobile...          */

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   NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE                                                                                            \
                    GRO2(GRO10(UN))
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).                                                             */

#include  xrv/particule.21.I"

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

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

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

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

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

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

#define   ACCES_COORDONNEES_COURANTES(corps)                                                                                            \
                    IdTb1(liste_des_coordonnees_a_l_instant_courant                                                                     \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
#define   ACCES_VITESSE_COURANTE(corps)                                                                                                 \
                    IdTb1(liste_des_vitesses_a_l_instant_courant                                                                        \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )
                                        /* 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.                                    */

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

#define   F1(fonction,coordonnees)                                                                                                      \
DEFV(Local,DEFV(FonctionF,fonction(corpsI)))                                                                                            \
DEFV(Argument,DEFV(Int,corpsI));                                                                                                        \
                                        /* Numero du corps par rapport auquel on calcule l'inverse pondere de la somme des           */ \
                                        /* distances...                                                                              */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     DEFV(Float,INIT(cumul_courant,FZERO));                                                                                             \
                                        /* Valeur de la fonction.                                                                    */ \
     DEFV(Int,INIT(corpsK,UNDEF));                                                                                                      \
                                        /* Index des corps...                                                                        */ \
     /*..............................................................................................................................*/ \
                                                                                                                                        \
     Komp(corpsK,nombre_de_corps)                                                                                                       \
          Bblock                                                                                                                        \
          Test(IFNE(corpsK,corpsI))                                                                                                     \
               Bblock                                                                                                                   \
               Test(IZNE(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsK)))                                                                   \
                    Bblock                                                                                                              \
                    Test(IZNE(ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsI),coordonnees)))                                                 \
                         Bblock                                                                                                         \
                         INCR(cumul_courant                                                                                             \
                             ,MUL2(DIVI(ACCES_LISTE(liste_initiale_des_COUPLAGE_MAGNETIQUE,corpsK)                                      \
                                       ,EXP3(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsK))                                                \
                                        )                                                                                               \
                                  ,SOUS(DIVI(ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsK),coordonnees)                                    \
                                            ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsI),coordonnees)                                    \
                                             )                                                                                          \
                                       ,FU                                                                                              \
                                        )                                                                                               \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         PRINT_ATTENTION("un corps est sur un axe");                                                                    \
                         CAL1(Prer1("pour la coordonnee coordonnees du corps %d\n",corpsI));                                            \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
               ATes                                                                                                                     \
                    Bblock                                                                                                              \
                    PRINT_ATTENTION("deux corps sont rentres en collision");                                                            \
                    CAL1(Prer2("(%d et %d)\n",corpsI,corpsK));                                                                          \
                    Eblock                                                                                                              \
               ETes                                                                                                                     \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     EKom                                                                                                                               \
                                                                                                                                        \
     RETU(SOUS(ACCES_LISTE(liste_initiale_des_MASSE,corpsI)                                                                             \
              ,MUL2(constante_G,cumul_courant)                                                                                          \
               )                                                                                                                        \
          );                                                                                                                            \
     Eblock

#define   F0(coordonnees)                                                                                                               \
                    FZERO

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

BFonctionF

F1(F1X,x)

EFonctionF

#define   F0X(corpsI)                                                                                                                   \
                    F0(x)

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

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

BFonctionF

F1(F1Y,y)

EFonctionF

#define   F0Y(corpsI)                                                                                                                   \
                    F0(y)

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

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

BFonctionF

F1(F1Z,z)

EFonctionF

#define   F0Z(corpsI)                                                                                                                   \
                    F0(z)
                                        /* On notera qu'il serait bien evidemment beaucoup plus logique de definir ainsi les         */
                                        /* quatre fonctions :                                                                        */
                                        /*                                                                                           */
                                        /*                  #define   F3Z(corpsI)                                                 \  */
                                        /*                                      FZERO                                                */
                                        /*                  #define   F2Z(corpsI)                                                 \  */
                                        /*                                      FZERO                                                */
                                        /*                  #define   F1Z(corpsI)                                                 \  */
                                        /*                                      FU                                                   */
                                        /*                  #define   F0Z(corpsI)                                                 \  */
                                        /*                                      ACCES_LISTE(liste_initiale_des_Z,corpsI)             */
                                        /*                                                                                           */
                                        /* afin de garantir la constance de la coordonnee 'Z' puisque les corps mobiles doivent      */
                                        /* rester dans leur plan {OX,OY} initial. Malheureusement la methode d'integration           */
                                        /* numerique contenue dans '$xrk/integr.2B$vv$I' ne le permet pas. En effet, pour les        */
                                        /* valeurs strictement positives de 'n', on divise par 'FONCTION_C(...)' qui, dans le        */
                                        /* cas des quatre definitions ci-dessus, est nulle...                                        */

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   P O I N T   D E   R E F E R E N C E   C O U R A N T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrr/N_corps.11.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   I N I T I A L I S A T I O N S  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* Jusqu'au 20030313145043, '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' etait defini      */
                                        /* ici, mais cela est contraire aux tests dont il est l'objet dans                           */
                                        /* 'v $xrv/champs_5.12$I __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' via                   */
                                        /* 'v $xrk/attractor.17$I champs_5.12', d'ou son deplacement a cette date...                 */

#include  xrk/attractor.18.I"

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

     DEFV(Int,INIT(corpsI,UNDEF));
     DEFV(Int,INIT(corpsJ,UNDEF));
     DEFV(Int,INIT(corps,UNDEF));
                                        /* Pour manipuler les listes...                                                              */
     DEFV(CHAR,INIC(POINTERc(nom_imageAF),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageRF),NOM_PIPE));
                                        /* Nom des images ou montrer les positions initiales des 'N' aimants.                        */
     /*..............................................................................................................................*/
     INITIALISATIONS_GENERALES;
                                        /* Initialisations generales faites au tout debut...                                         */

     iTRANSFORMAT_31(liste_initiale_des_X,X_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_Y,Y_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_Z,Z_IMPLICITE);
                                        /* Initialisation des fichiers de listes de coordonnees.                                     */
     iTRANSFORMAT_31(liste_initiale_des_VX,VX_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_VY,VY_IMPLICITE);
     iTRANSFORMAT_31(liste_initiale_des_VZ,VZ_IMPLICITE);
                                        /* Initialisation des fichiers de listes de vitesses implicites.                             */
     iTRANSFORMAT_31(liste_initiale_des_MOBILITE,MOBILITE_IMPLICITE);
                                        /* Initialisation du fichier de l'indicateur de mobilite des corps.                          */
     iTRANSFORMAT_31(liste_initiale_des_MASSE,MASSE_IMPLICITE);
                                        /* Initialisation du fichier de liste des masses.                                            */
     iTRANSFORMAT_31(liste_initiale_des_FRICTION,FRICTION_IMPLICITE);
                                        /* Initialisation du fichier de liste des frictions.                                         */
     iTRANSFORMAT_31(liste_initiale_des_COUPLAGE_MAGNETIQUE,COUPLAGE_MAGNETIQUE_IMPLICITE);
                                        /* Initialisation du fichier de liste des constantes de couplage magnetique.                 */
     iTRANSFORMAT_31(liste_initiale_des_RAYON,RAYON_IMPLICITE);
                                        /* Initialisation du fichier de liste des rayons.                                            */
     iTRANSFORMAT_31(liste_initiale_des_MARQUAGE_DE_PROXIMITE,NIVEAU_DE_MARQUAGE_DE_PROXIMITE_IMPLICITE);
                                        /* Initialisation du fichier de liste des marqueurs de proximite des corps immobiles.        */
     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.                                        */

#include  xrv/champs_5.1A.I"

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

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

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

                         PROCESS_ARGUMENTS_GEOMETRIQUES;

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

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

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

                         PROCESS_ARGUMENT_FICHIER("LISTE_MASSE="
                                                 ,fichier_LISTE_MASSE
                                                 ,liste_initiale_des_MASSE
                                                 ,MASSE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_FRICTION="
                                                 ,fichier_LISTE_FRICTION
                                                 ,liste_initiale_des_FRICTION
                                                 ,FRICTION_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );
                         PROCESS_ARGUMENT_FICHIER("LISTE_COUPLAGE_MAGNETIQUE="
                                                 ,fichier_LISTE_COUPLAGE_MAGNETIQUE
                                                 ,liste_initiale_des_COUPLAGE_MAGNETIQUE
                                                 ,COUPLAGE_MAGNETIQUE_IMPLICITE
                                                 ,lTRANSFORMAT_11
                                                  );

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

                         PROCESS_ARGUMENT_FICHIER("LISTE_MARQUAGE_DE_PROXIMITE="
                                                 ,fichier_LISTE_MARQUAGE_DE_PROXIMITE
                                                 ,liste_initiale_des_MARQUAGE_DE_PROXIMITE
                                                 ,NIVEAU_DE_MARQUAGE_DE_PROXIMITE_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
                                                  );

                         GET_ARGUMENT_C("imageAF=""AF=",nom_imageAF);
                         GET_ARGUMENT_C("imageRF=""RF=",nom_imageRF);

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

                         GET_ARGUMENT_I("nombre=",nombre_de_pas_de_temps_par_periode);

                         GET_ARGUMENT_F("cG=",constante_G);

                         PROCESS_ARGUMENTS_DE_VISUALISATION;

                         PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES;

                         GET_ARGUMENT_L("ensemble=",visualiser_l_ensemble_des_instants);

                         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_P("niveau=",niveau_de_marquage_par_defaut);

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

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

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

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

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

     CALi(Inoir(ImageR));
                                        /* Initialisation de l'image Fond a priori, meme si elle n'est pas demandee...               */

     Test(IFNE_chaine(nom_imageAF,NOM_PIPE))
          Bblock
          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageR,nom_imageAF))))
                                        /* Un fond a ete demande, on le charge...                                                    */
               Bblock
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

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

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

     Komp(corps,nombre_de_corps)
          Bblock
          Test(EST_VRAI(les_coordonnees_X_ET_Y_sont_des_coordonnees_de_l_espace_physique))
               Bblock
               INITIALISATION_POINT_3D(ACCES_COORDONNEES_INITIALES(corps)
                                      ,ACCES_LISTE(liste_initiale_des_X,corps)
                                      ,ACCES_LISTE(liste_initiale_des_Y,corps)
                                      ,ACCES_LISTE(liste_initiale_des_Z,corps)
                                       );
               Eblock
          ATes
               Bblock
               INITIALISATION_POINT_3D(ACCES_COORDONNEES_INITIALES(corps)
                                      ,X_PHYSIQUE(ACCES_LISTE(liste_initiale_des_X,corps))
                                      ,Y_PHYSIQUE(ACCES_LISTE(liste_initiale_des_Y,corps))
                                      ,NEUT(ACCES_LISTE(liste_initiale_des_Z,corps))
                                       );
               Eblock
          ETes

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

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

     Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)
          Bblock
          DEFV(Int,INIT(periode,UNDEF));
                                        /* Periode de parcours de 'ACCES_COORDONNEES_PRECEDENTES(...)' pour la visualisation...      */

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

          DoIn(periode
              ,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_de_la_periode_courante_de_la_simulation
              ,I
               )
               Bblock
               Komp(corps,nombre_de_corps)
                    Bblock
                    EGAL(rayon_de_visualisation,ACCES_LISTE(liste_initiale_des_RAYON,corps));
                                        /* Recuperation eventuelle du rayon de chaque point...                                       */

                    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(dcx,ACCES_LISTE(liste_initiale_des_ROUGE,corps));
                    EGAL(dcy,ACCES_LISTE(liste_initiale_des_VERTE,corps));
                    EGAL(dcz,ACCES_LISTE(liste_initiale_des_BLEUE,corps));

                    CALS(memorisation_1_point_07(DECENTRAGE_DES_COORDONNEES(cx,X,x)
                                                ,DECENTRAGE_DES_COORDONNEES(cy,Y,y)
                                                ,DECENTRAGE_DES_COORDONNEES(cz,Z,z)
                                                ,dcx
                                                ,dcy
                                                ,dcz
                                                ,corps
                                                 )
                         );
                                        /* Memorisation du corps courant, la premiere image donnant les conditions initiales...      */

                    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...                                 */
                    Eblock
               EKom
               Eblock
          EDoI

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

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

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

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

               Komp(corps,nombre_de_corps)
                    Bblock
                    Test(EST_VRAI(ACCES_LISTE(liste_initiale_des_MOBILITE,corps)))
                         Bblock
                                        /* Cas des corps mobiles...                                                                  */
                         Test(TOUJOURS_VRAI)
                              Bblock
                                        /* Cas general...                                                                            */
                              DEPILER_UN_POINT_LORS_DE_L_INTEGRATION_O2(ASD1(ACCES_COORDONNEES_INITIALES(corps),x)
                                                                       ,ASD1(ACCES_VITESSE_INITIALE(corps),dx)
                                                                       ,ASD1(ACCES_COORDONNEES_COURANTES(corps),x)
                                                                       ,ASD1(ACCES_VITESSE_COURANTE(corps),dx)
                                                                       ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),x)
                                                                       ,ASD1(ACCES_COORDONNEES_INITIALES(corps),y)
                                                                       ,ASD1(ACCES_VITESSE_INITIALE(corps),dy)
                                                                       ,ASD1(ACCES_COORDONNEES_COURANTES(corps),y)
                                                                       ,ASD1(ACCES_VITESSE_COURANTE(corps),dy)
                                                                       ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),y)
                                                                       ,ASD1(ACCES_COORDONNEES_INITIALES(corps),z)
                                                                       ,ASD1(ACCES_VITESSE_INITIALE(corps),dz)
                                                                       ,ASD1(ACCES_COORDONNEES_COURANTES(corps),z)
                                                                       ,ASD1(ACCES_VITESSE_COURANTE(corps),dz)
                                                                       ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),z)
                                                                        );
                                        /* Mise en place du corps courant 'corps'.                                                   */

                              INTEGRATION_POUR_UN_POINT_D_UN_SYSTEME_D_EQUATIONS_DIFFERENTIELLES_O2(temps_courant,dct);
                                        /* Integration du systeme d'equations differentielles pour le corps courant 'corps'.         */

                              EGAL(cz_1,cz0);
                              EGAL(cz,cz0);
                                        /* Cette petite supercherie etant destinee a rester dans le plan {OX,OY}. On verra avec      */
                                        /* profit les commentaires de definition des quatre fonctions 'F?Z(...)' qui montrent        */
                                        /* l'impossibilite de rendre cela plus logique...                                            */

                              EMPILER_UN_POINT_LORS_DE_L_INTEGRATION_O2(ASD1(ACCES_COORDONNEES_INITIALES(corps),x)
                                                                       ,ASD1(ACCES_VITESSE_INITIALE(corps),dx)
                                                                       ,ASD1(ACCES_COORDONNEES_COURANTES(corps),x)
                                                                       ,ASD1(ACCES_VITESSE_COURANTE(corps),dx)
                                                                       ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),x)
                                                                       ,ASD1(ACCES_COORDONNEES_INITIALES(corps),y)
                                                                       ,ASD1(ACCES_VITESSE_INITIALE(corps),dy)
                                                                       ,ASD1(ACCES_COORDONNEES_COURANTES(corps),y)
                                                                       ,ASD1(ACCES_VITESSE_COURANTE(corps),dy)
                                                                       ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),y)
                                                                       ,ASD1(ACCES_COORDONNEES_INITIALES(corps),z)
                                                                       ,ASD1(ACCES_VITESSE_INITIALE(corps),dz)
                                                                       ,ASD1(ACCES_COORDONNEES_COURANTES(corps),z)
                                                                       ,ASD1(ACCES_VITESSE_COURANTE(corps),dz)
                                                                       ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),z)
                                                                        );
                                        /* Sauvegarde de l'etat du corps courant 'corps'.                                            */
                              Eblock
                         ATes
                              Bblock
                                        /* Pour faire des tests sur le cas du mouvement inertiel...                                  */
                              INITIALISATION_POINT_3D(ACCES_COORDONNEES_COURANTES(corps)
                                                     ,AXPB(ASD1(ACCES_VITESSE_INITIALE(corps),dx)
                                                          ,dct
                                                          ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),x)
                                                           )
                                                     ,AXPB(ASD1(ACCES_VITESSE_INITIALE(corps),dy)
                                                          ,dct
                                                          ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),y)
                                                           )
                                                     ,AXPB(ASD1(ACCES_VITESSE_INITIALE(corps),dz)
                                                          ,dct
                                                          ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),z)
                                                           )
                                                      );
                              Eblock
                         ETes

                         Eblock
                    ATes
                         Bblock
                                        /* Cas des corps immobiles...                                                                */
                         Eblock
                    ETes

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

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

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

#include  xrk/attractor.1A.I"

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

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

     Test(IFNE_chaine(nom_imageRF,NOM_PIPE))
          Bblock
          Komp(corpsI,nombre_de_corps)
               Bblock
               DEFV(Logical,INIT(on_a_trouve_le_corps_immobile_le_plus_proche,FAUX));
               DEFV(Int,INIT(corps_immobile_le_plus_proche,UNDEF));
               DEFV(Float,INIT(distance_au_corps_immobile_le_plus_proche,F_INFINI));
                                        /* Afin de rechercher le corps immobile le plus proche.                                      */

               DEFV(Int,INIT(X,X_DE_VISUALISATION(X_PHYSIQUE_DANS_01(ASD1(ACCES_COORDONNEES_INITIALES(corpsI),x)))));
               DEFV(Int,INIT(Y,Y_DE_VISUALISATION(Y_PHYSIQUE_DANS_01(ASD1(ACCES_COORDONNEES_INITIALES(corpsI),y)))));
                                        /* Definition de "fausses" coordonnees bidimensionnelles, "fausses" signifiant que l'on      */
                                        /* ignore la troisieme coordonnee 'Z' (en ne faisant pas de projection et ne n'operant       */
                                        /* pas les transformations geometriques...).                                                 */

               Test(EST_VRAI(ACCES_LISTE(liste_initiale_des_MOBILITE,corpsI)))
                    Bblock
                    Komp(corpsJ,nombre_de_corps)
                         Bblock
                         Test(IFET(IFNE(corpsI,corpsJ)
                                  ,EST_FAUX(ACCES_LISTE(liste_initiale_des_MOBILITE,corpsJ))
                                   )
                              )
                              Bblock
                              Test(IFLT(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ),distance_au_corps_immobile_le_plus_proche))
                                   Bblock
                                   EGAL(corps_immobile_le_plus_proche,corpsJ);
                                   EGAL(distance_au_corps_immobile_le_plus_proche,ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ));
                                        /* Ainsi, on recherche le corps immobile 'corpsJ' qui soit le plus proche de 'corpsI' a la   */
                                        /* fin du calcul...                                                                          */
                                   EGAL(on_a_trouve_le_corps_immobile_le_plus_proche,VRAI);
                                        /* Ainsi, on memorise que l'on a trouve au moins un corps immobile...                        */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    EKom
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(EST_VRAI(ACCES_LISTE(liste_initiale_des_MOBILITE,corpsI))
                        ,EST_VRAI(on_a_trouve_le_corps_immobile_le_plus_proche)
                         )
                    )
                    Bblock
                    store_point_valide(ACCES_LISTE(liste_initiale_des_MARQUAGE_DE_PROXIMITE,corps_immobile_le_plus_proche)
                                      ,ImageR
                                      ,X,Y
                                      ,FVARIABLE
                                       );
                                        /* Et marquage "fonction" du corps immobile le plus proche...                                */
                    Eblock
               ATes
                    Bblock
                    store_point_valide(niveau_de_marquage_par_defaut
                                      ,ImageR
                                      ,X,Y
                                      ,FVARIABLE
                                       );
                                        /* Et memorisation du corps courant dans le cas ou l'on a pas trouve de corps immobile       */
                                        /* le plus proche, ce qui signifie tres certainement que tous les corps presents sont        */
                                        /* mobiles...                                                                                */
                    Eblock
               ETes
               Eblock
          EKom

          CALi(Iupdate_image(nom_imageRF,ImageR));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

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

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

     RETU_Commande;
     Eblock
ECommande



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