/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   R E L A T I V E S   A U X   C O L L I S I O N S  :                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrk/rdn_walk.41$I' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1998??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E S   C O L L I S I O N S  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   GERER_LES_COLLISIONS                                                                                                          \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(gerer_les_collisions,GERER_LES_COLLISIONS)));
                                        /* Indique s'il faut gerer les collisions entre particules ('VRAI') ou pas ('FAUX')...       */

#define   LES_COLLISIONS_SONT_EN_FAIT_DES_PSEUDO_COLLISIONS                                                                             \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(les_collisions_sont_en_fait_des_pseudo_collisions,LES_COLLISIONS_SONT_EN_FAIT_DES_PSEUDO_COLLISIONS)));
                                        /* Indique si en fait les collsions sont des pseudo-collisions ('VRAI') ou pas ('FAUX')...   */

DEFV(Local,DEFV(Positive,INIT(compteur_des_collisions_particules_particules,ZERO)));
                                        /* Compteur global des collisions de type 'particules-particules'.                           */
DEFV(Local,DEFV(Positive,INIT(compteur_des_collisions_particules_milieu,ZERO)));
                                        /* Compteur global des collisions de type 'particules-milieu'.                               */
DEFV(Local,DEFV(Positive,INIT(compteur_des_particules_immobilisees_lors_d_une_collision_avec_le_milieu,ZERO)));
                                        /* Compteur global des particules immobilisees lors d'une collision avec le milieu,          */
                                        /* qu'elles soinet "tuees" ou pas (introduit le 20020225085953).                             */
DEFV(Local,DEFV(Positive,INIT(compteur_des_particules_nees_apres_l_instant_initial,ZERO)));
                                        /* Compteur global des particules nees entre l'instant initial (exclu) et l'instant          */
                                        /* courant (introduit le 20020227091622).                                                    */

#define   EDITER_LES_COMPTEURS_DE_COLLISIONS                                                                                            \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(editer_les_compteurs_de_collisions,EDITER_LES_COMPTEURS_DE_COLLISIONS)));
                                        /* Afin d'editer les compteurs de collisions (introduit le 20011009142812).                  */

#nodefine GESTION_DES_CHOCS_VERSION_19980000000000
#define   GESTION_DES_CHOCS_VERSION_19990426135018

#define   CONSIDERER_LES_CHOCS_PONCTUELS                                                                                                \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(considerer_les_chocs_ponctuels,CONSIDERER_LES_CHOCS_PONCTUELS)));
                                        /* Indique si les chocs sont consideres comme ponctuels ('VRAI') ce qui correspond a la      */
                                        /* situation avant le 19990426135018 ou pas ('FAUX'). Etant donne que cette option donne     */
                                        /* d'excellent resultat, le 19990426164046 je lui donne la valeur 'FAUX' par defaut, ce      */
                                        /* qui supprime la compatibilite anterieure (que l'on peut retrouver en utilisant l'option   */
                                        /* "ponctuels=VRAI").                                                                        */
#define   COEFFICIENT_DE_RESTITUTION                                                                                                    \
                    FU
DEFV(Local,DEFV(Float,INIT(coefficient_de_restitution,COEFFICIENT_DE_RESTITUTION)));
                                        /* Lorsque 'IL_FAUT(gerer_les_collisions)' donne le taux de restitution dans [0,1]. Le cas   */
                                        /* par defaut (1) est le cas "parfaitement elastique".                                       */
#define   PONDERATION_MIN3_COEFFICIENT_DE_RESTITUTION                                                                                   \
                    FU
#define   PONDERATION_MOY3_COEFFICIENT_DE_RESTITUTION                                                                                   \
                    FZERO
#define   PONDERATION_MAX3_COEFFICIENT_DE_RESTITUTION                                                                                   \
                    FZERO
DEFV(Local,DEFV(Float,INIT(ponderation_MIN3_coefficient_de_restitution,PONDERATION_MIN3_COEFFICIENT_DE_RESTITUTION)));
DEFV(Local,DEFV(Float,INIT(ponderation_MOY3_coefficient_de_restitution,PONDERATION_MOY3_COEFFICIENT_DE_RESTITUTION)));
DEFV(Local,DEFV(Float,INIT(ponderation_MAX3_coefficient_de_restitution,PONDERATION_MAX3_COEFFICIENT_DE_RESTITUTION)));
                                        /* Ponderations utiles au calcul de 'coefficient_de_restitution_IJ'.                         */

dfTRANSFORMAT_31(liste_initiale_des_COEFFICIENT_DE_RESTITUTION
                ,fichier_LISTE_COEFFICIENT_DE_RESTITUTION
                ,COEFFICIENT_DE_RESTITUTION_IMPLICITE
                ,COEFFICIENT_DE_RESTITUTION
                 )
                                        /* Definition des fichiers de listes de taux de restitution. Le taux de restitution est      */
                                        /* defini dans [0,1] pour chaque particule. Le cas par defaut (1) est le cas "parfaitement   */
                                        /* elastique".                                                                               */

#define   ACCES_COEFFICIENT_DE_RESTITUTION(corps)                                                                                       \
                    IdTb1(liste_initiale_des_COEFFICIENT_DE_RESTITUTION                                                                 \
                         ,INDX(corps,PREMIER_POINT_DES_LISTES)                                                                          \
                         ,nombre_de_corps                                                                                               \
                          )

#define   gVITESSE_CORPS_APRES_COLLISION(corps1,corps2,vitesse1,vitesse2,coefficient_de_restitution_effectif)                           \
                    DIVI(LIZ2(LIZ2(FU                                                                                                   \
                                  ,ACCES_MASSES(corps1)                                                                                 \
                                  ,NEGA(coefficient_de_restitution_effectif)                                                            \
                                  ,ACCES_MASSES(corps2)                                                                                 \
                                   )                                                                                                    \
                             ,vitesse1                                                                                                  \
                             ,LIZ2(FU                                                                                                   \
                                  ,ACCES_MASSES(corps2)                                                                                 \
                                  ,NEUT(coefficient_de_restitution_effectif)                                                            \
                                  ,ACCES_MASSES(corps2)                                                                                 \
                                   )                                                                                                    \
                             ,vitesse2                                                                                                  \
                              )                                                                                                         \
                        ,ADD2(ACCES_MASSES(corps1),ACCES_MASSES(corps2))                                                                \
                         )                                                                                                              \
                                        /* L'une des 3 composantes de la vitesse du corps '1' apres le choc. Cette formule est       */ \
                                        /* empruntee a "Aide-Memoire de Physique" (B. Yavorski et A. Detlaf, Editions de Moscou)     */ \
                                        /* en haut de la page 74 ("u1=..."). On notera que lors d'un choc, les corps sont ici        */ \
                                        /* (malheureusement) consideres comme ponctuels (remarque faite le 19990421154727, un        */ \
                                        /* peu tardivement...). On a donc les vitesses "Apres le choc" en fonction des vitesses      */ \
                                        /* "Avant le choc" selon les deux formules suivantes :                                       */ \
                                        /*                                                                                           */ \
                                        /*                                         Avant                Avant                        */ \
                                        /*                            (m  - k.m ).V      + (m  + k.m ).V                             */ \
                                        /*                   Apres      1      2   1         2      2   2                            */ \
                                        /*                  V      = -----------------------------------------                       */ \
                                        /*                   1                        m  + m                                         */ \
                                        /*                                             1    2                                        */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                                         Avant                Avant                        */ \
                                        /*                            (m  - k.m ).V      + (m  + k.m ).V                             */ \
                                        /*                   Apres      2      1   2         1      1   1                            */ \
                                        /*                  V      = -----------------------------------------                       */ \
                                        /*                   2                        m  + m                                         */ \
                                        /*                                             2    1                                        */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION, le fait que l'on trouve :                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  {ACCES_MASSES(corps1),ACCES_MASSES(corps2)}                              */ \
                                        /*                                                                                           */ \
                                        /*                                    /|\                  /|\                               */ \
                                        /*                                     |                    |                                */ \
                                        /*                                                                                           */ \
                                        /* dans le premier 'LIN2(...)' interne, et :                                                 */ \
                                        /*                                                                                           */ \
                                        /*                                     |                    |                                */ \
                                        /*                                    \|/                  \|/                               */ \
                                        /*                                                                                           */ \
                                        /*                  {ACCES_MASSES(corps2),ACCES_MASSES(corps2)}                              */ \
                                        /*                                                                                           */ \
                                        /* dans le second 'LIN2(...)' interne, n'est pas une erreur. Ce manque de symetrie est       */ \
                                        /* regrettable, mais c'est comme cela...                                                     */ \
                                        /*                                                                                           */ \
                                        /* La question que je me pose le 19990510135228 est de savoir comment rendre relativiste     */ \
                                        /* (au sens "relativite restreinte") ces formules de composition de vitesses comme cela est  */ \
                                        /* fait dans 'v $xrq/nucleon.L5$I COMPOSITION_RELATIVISTE_DES_VITESSES').                    */
#define   VITESSE_CORPS_APRES_COLLISION(corps1,corps2,composante,coefficient_de_restitution_effectif)                                   \
                    gVITESSE_CORPS_APRES_COLLISION(corps1                                                                               \
                                                  ,corps2                                                                               \
                                                  ,ASD1(ACCES_VITESSE_COURANTE(corps1),composante)                                      \
                                                  ,ASD1(ACCES_VITESSE_COURANTE(corps2),composante)                                      \
                                                  ,coefficient_de_restitution_effectif                                                  \
                                                   )                                                                                    \
                                        /* L'une des 3 composantes de la vitesse du corps '1' apres le choc.                         */

#define   COLLISION_ENTRE_DEUX_CORPS(corpsI,corpsJ)                                                                                     \
                    Bblock                                                                                                              \
                    DEFV(deltaF_3D,vecteur_directeur_OX2);                                                                              \
                                        /* Vecteur unitaire de l'axe {OX2}.                                                          */ \
                                                                                                                                        \
                    DEFV(deltaF_3D,vitesse_du_corpsI_apres_la_collision);                                                               \
                    DEFV(deltaF_3D,vitesse_du_corpsJ_apres_la_collision);                                                               \
                                        /* Vitesse des corps 'I' et 'J' apres le choc. On notera que ces deux vecteurs temporaires   */ \
                                        /* sont necessaires afin de ne pas peturber la "pseudo-permutation" entre les vitesses de    */ \
                                        /* 'corpsI' et de 'corpsJ'.                                                                  */ \
                    DEFV(Float,INIT(coefficient_de_restitution_IJ                                                                       \
                                   ,LIZ3(ponderation_MIN3_coefficient_de_restitution                                                    \
                                        ,MIN3(coefficient_de_restitution                                                                \
                                             ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                                  \
                                             ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                                  \
                                              )                                                                                         \
                                        ,ponderation_MOY3_coefficient_de_restitution                                                    \
                                        ,MOY3(coefficient_de_restitution                                                                \
                                             ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                                  \
                                             ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                                  \
                                              )                                                                                         \
                                        ,ponderation_MAX3_coefficient_de_restitution                                                    \
                                        ,MAX3(coefficient_de_restitution                                                                \
                                             ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                                  \
                                             ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                                  \
                                              )                                                                                         \
                                         )                                                                                              \
                                    )                                                                                                   \
                         );                                                                                                             \
                                        /* Le coefficient de restitution effectif est le plus petit des trois coefficients en jeu :  */ \
                                        /* d'une part le coefficient de restitution global ('coefficient_de_restitution') et d'autre */ \
                                        /* part les coefficients de restitutions de chacun des deux corps 'I' et 'J'...              */ \
                                                                                                                                        \
                    INITIALISATION_ACCROISSEMENT_3D(vecteur_directeur_OX2                                                               \
                                                   ,SOUS(ASD1(ACCES_COORDONNEES_COURANTES(corpsJ),x)                                    \
                                                        ,ASD1(ACCES_COORDONNEES_COURANTES(corpsI),x)                                    \
                                                         )                                                                              \
                                                   ,SOUS(ASD1(ACCES_COORDONNEES_COURANTES(corpsJ),y)                                    \
                                                        ,ASD1(ACCES_COORDONNEES_COURANTES(corpsI),y)                                    \
                                                         )                                                                              \
                                                   ,SOUS(ASD1(ACCES_COORDONNEES_COURANTES(corpsJ),z)                                    \
                                                        ,ASD1(ACCES_COORDONNEES_COURANTES(corpsI),z)                                    \
                                                         )                                                                              \
                                                    );                                                                                  \
                                        /* Definition de l'axe 'OX2' pour choisir ensuite la methode de calcul a utiliser...         */ \
                                        /* L'axes 'OX2' passe donc par les centres de deux particules.                               */ \
                                                                                                                                        \
                    Test(IFOU(IL_FAUT(considerer_les_chocs_ponctuels)                                                                   \
                             ,IZEQ(longF3D(vecteur_directeur_OX2))                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                                        /* Lorsque l'axe 'OX2' n'a pu etre defini, on choisit 'considerer_les_chocs_ponctuels',      */ \
                                        /* meme si cette methode n'etait pas a utiliser...                                           */ \
                         INITIALISATION_ACCROISSEMENT_3D(vitesse_du_corpsI_apres_la_collision                                           \
                                                        ,VITESSE_CORPS_APRES_COLLISION(corpsI,corpsJ,dx,coefficient_de_restitution_IJ)  \
                                                        ,VITESSE_CORPS_APRES_COLLISION(corpsI,corpsJ,dy,coefficient_de_restitution_IJ)  \
                                                        ,VITESSE_CORPS_APRES_COLLISION(corpsI,corpsJ,dz,coefficient_de_restitution_IJ)  \
                                                         );                                                                             \
                                                                                                                                        \
                         INITIALISATION_ACCROISSEMENT_3D(vitesse_du_corpsJ_apres_la_collision                                           \
                                                        ,VITESSE_CORPS_APRES_COLLISION(corpsJ,corpsI,dx,coefficient_de_restitution_IJ)  \
                                                        ,VITESSE_CORPS_APRES_COLLISION(corpsJ,corpsI,dy,coefficient_de_restitution_IJ)  \
                                                        ,VITESSE_CORPS_APRES_COLLISION(corpsJ,corpsI,dz,coefficient_de_restitution_IJ)  \
                                                         );                                                                             \
                                        /* Les deux corps 'I' et 'J' etant proches l'un de l'autre, ils rentrent en collision.       */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         DEFV(deltaF_3D,vecteur_directeur_OY2);                                                                         \
                         DEFV(deltaF_3D,vecteur_directeur_OZ2);                                                                         \
                                        /* Vecteurs unitaires des axes {OY2,OZ2}.                                                    */ \
                         DEFV(matrixF_3D,matrice_de_rotation_directe);                                                                  \
                         DEFV(matrixF_3D,matrice_de_rotation_inverse);                                                                  \
                                        /* Definition de la matrice de passage {OX1,OY1,OZ1} --> {OX2,OY2,OZ2} et inverse.           */ \
                         DEFV(deltaF_3D,vitesse_du_corpsI_dans_OXYZ2_avant);                                                            \
                         DEFV(deltaF_3D,vitesse_du_corpsJ_dans_OXYZ2_avant);                                                            \
                                        /* Vitesse des corps 'I' et 'J' avant le choc dans le referentiel {OX2,OY2,OZ2}.             */ \
                         DEFV(deltaF_3D,vitesse_du_corpsI_dans_OXYZ2_apres);                                                            \
                         DEFV(deltaF_3D,vitesse_du_corpsJ_dans_OXYZ2_apres);                                                            \
                                        /* Vitesse des corps 'I' et 'J' apres le choc dans le referentiel {OX2,OY2,OZ2}.             */ \
                                                                                                                                        \
                         NORMALISATION_ACCROISSEMENT_3D(vecteur_directeur_OX2);                                                         \
                                        /* Definition de l'axe 'OX2' comme etant la "normale" de collision, c'est-a-dire la          */ \
                                        /* normale au plan tangent des deux spheres en contact ; c'est donc, par symetrie, la        */ \
                                        /* ligne des centres de ces deux spheres...                                                  */ \
                                                                                                                                        \
                         Test(IFET(IFET(IZEQ(ASD1(ACCES_VITESSE_COURANTE(corpsI),dz))                                                   \
                                       ,IZEQ(ASD1(ACCES_VITESSE_COURANTE(corpsJ),dz))                                                   \
                                        )                                                                                               \
                                  ,IZEQ(ASD1(vecteur_directeur_OX2,dz))                                                                 \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              INITIALISATION_ACCROISSEMENT_3D(vecteur_directeur_OY2                                                     \
                                                             ,FZERO                                                                     \
                                                             ,FZERO                                                                     \
                                                             ,FU                                                                        \
                                                              );                                                                        \
                                        /* Definition de l'axe 'OY2' tel qu'il soit orthogonal au plan {OX1,OY1} ; ceci ne peut      */ \
                                        /* etre fait que lorsque les vitesses de 'corpsI' et 'corpsJ' n'ont pas de composantes       */ \
                                        /* dans {OZ1} et qu'il en est de meme pour la ligne des centres. Privilegier ainsi un        */ \
                                        /* calcul bidimensionnel a ete introduit le 19990428092900 a cause des sequences :           */ \
                                        /*                                                                                           */ \
                                        /*                  xivPdf 9 2 / 007964_008475                                               */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  xivPdf 9 2 / 008476_008987                                               */ \
                                        /*                                                                                           */ \
                                        /* qui montraient un pertubation progressive de la composante 'dz' des vitesses lors des     */ \
                                        /* multiplications matricielles qui suivent. Les selections aleatoires de {OY2,OZ2} ne       */ \
                                        /* seront donc effectuees que lorsqu'il est impossible de faire autrement...                 */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IZNE(ASD1(vecteur_directeur_OX2,dx)))                                                                \
                                   Bblock                                                                                               \
                                   GENERATION_D_UNE_VALEUR(ASD1(vecteur_directeur_OY2,dy),FZERO,FU);                                    \
                                   GENERATION_D_UNE_VALEUR(ASD1(vecteur_directeur_OY2,dz),FZERO,FU);                                    \
                                                                                                                                        \
                                   EGAL(ASD1(vecteur_directeur_OY2,dx)                                                                  \
                                       ,DIVI(NEGA(ADD2(MUL2(ASD1(vecteur_directeur_OX2,dy)                                              \
                                                           ,ASD1(vecteur_directeur_OY2,dy)                                              \
                                                            )                                                                           \
                                                      ,MUL2(ASD1(vecteur_directeur_OX2,dz)                                              \
                                                           ,ASD1(vecteur_directeur_OY2,dz)                                              \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  )                                                                                     \
                                            ,ASD1(vecteur_directeur_OX2,dx)                                                             \
                                             )                                                                                          \
                                        );                                                                                              \
                                        /* Calcul des cosinus directeurs non normalises de l'axe 'OY2' tels que 'OX2' et 'OY2'       */ \
                                        /* soient orthogonaux, ce que l'on traduit par la nullite du produit scalaire :              */ \
                                        /*                                                                                           */ \
                                        /*                  (l1,m1,n1).(l2,m2,n2) = (l1,m1,n1).(lp2,mp2,np2) = 0,                    */ \
                                        /*                                                                                           */ \
                                        /* ce qui donne 'lp2', 'mp2' et 'np2' etant tires au sort au prealable...                    */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Test(IZNE(ASD1(vecteur_directeur_OX2,dy)))                                                           \
                                        Bblock                                                                                          \
                                        GENERATION_D_UNE_VALEUR(ASD1(vecteur_directeur_OY2,dz),FZERO,FU);                               \
                                        GENERATION_D_UNE_VALEUR(ASD1(vecteur_directeur_OY2,dx),FZERO,FU);                               \
                                                                                                                                        \
                                        EGAL(ASD1(vecteur_directeur_OY2,dy)                                                             \
                                            ,DIVI(NEGA(ADD2(MUL2(ASD1(vecteur_directeur_OX2,dz)                                         \
                                                                ,ASD1(vecteur_directeur_OY2,dz)                                         \
                                                                 )                                                                      \
                                                           ,MUL2(ASD1(vecteur_directeur_OX2,dx)                                         \
                                                                ,ASD1(vecteur_directeur_OY2,dx)                                         \
                                                                 )                                                                      \
                                                            )                                                                           \
                                                       )                                                                                \
                                                 ,ASD1(vecteur_directeur_OX2,dy)                                                        \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        /* Calcul des cosinus directeurs non normalises de l'axe 'OY2' tels que 'OX2' et 'OY2'       */ \
                                        /* soient orthogonaux, ce que l'on traduit par la nullite du produit scalaire :              */ \
                                        /*                                                                                           */ \
                                        /*                  (l1,m1,n1).(l2,m2,n2) = (l1,m1,n1).(lp2,mp2,np2) = 0,                    */ \
                                        /*                                                                                           */ \
                                        /* ce qui donne 'mp2', 'lp2' et 'np2' etant tires au sort au prealable...                    */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Test(IZNE(ASD1(vecteur_directeur_OX2,dz)))                                                      \
                                             Bblock                                                                                     \
                                             GENERATION_D_UNE_VALEUR(ASD1(vecteur_directeur_OY2,dx),FZERO,FU);                          \
                                             GENERATION_D_UNE_VALEUR(ASD1(vecteur_directeur_OY2,dy),FZERO,FU);                          \
                                                                                                                                        \
                                             EGAL(ASD1(vecteur_directeur_OY2,dz)                                                        \
                                                 ,DIVI(NEGA(ADD2(MUL2(ASD1(vecteur_directeur_OX2,dx)                                    \
                                                                     ,ASD1(vecteur_directeur_OY2,dx)                                    \
                                                                      )                                                                 \
                                                                ,MUL2(ASD1(vecteur_directeur_OX2,dy)                                    \
                                                                     ,ASD1(vecteur_directeur_OY2,dy)                                    \
                                                                      )                                                                 \
                                                                 )                                                                      \
                                                            )                                                                           \
                                                      ,ASD1(vecteur_directeur_OX2,dz)                                                   \
                                                       )                                                                                \
                                                  );                                                                                    \
                                        /* Calcul des cosinus directeurs non normalises de l'axe 'OY2' tels que 'OX2' et 'OY2'       */ \
                                        /* soient orthogonaux, ce que l'on traduit par la nullite du produit scalaire :              */ \
                                        /*                                                                                           */ \
                                        /*                  (l1,m1,n1).(l2,m2,n2) = (l1,m1,n1).(lp2,mp2,np2) = 0,                    */ \
                                        /*                                                                                           */ \
                                        /* ce qui donne 'np2', 'lp2' et 'mp2' etant tires au sort au prealable...                    */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             PRINT_ERREUR("les cosinus directeurs (l1,m1,n1) sont tous nuls");                          \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         NORMALISATION_ACCROISSEMENT_3D(vecteur_directeur_OY2);                                                         \
                                        /* Definition de l'axe 'OY2'. La normalisation n'est pas toujours necessaire, mais la        */ \
                                        /* rendre systematique ne peut pas nuire...                                                  */ \
                                                                                                                                        \
                         PRODUIT_VECTORIEL_ACCROISSEMENT_3D(vecteur_directeur_OZ2                                                       \
                                                           ,vecteur_directeur_OX2                                                       \
                                                           ,vecteur_directeur_OY2                                                       \
                                                            );                                                                          \
                         NORMALISATION_ACCROISSEMENT_3D(vecteur_directeur_OZ2);                                                         \
                                        /* Definition de l'axe 'OZ2'. On notera que 'NORMALISATION_ACCROISSEMENT_3D(...)' est        */ \
                                        /* inutile, mais il est mis ici par symetrie avec {OX2,OY2}.                                 */ \
                                                                                                                                        \
                         INITIALISATION_MATRICE_3D(matrice_de_rotation_directe                                                          \
                                                                                                                                        \
                                                  ,ASD1(vecteur_directeur_OX2,dx)                                                       \
                                                  ,ASD1(vecteur_directeur_OX2,dy)                                                       \
                                                  ,ASD1(vecteur_directeur_OX2,dz)                                                       \
                                                                                                                                        \
                                                  ,ASD1(vecteur_directeur_OY2,dx)                                                       \
                                                  ,ASD1(vecteur_directeur_OY2,dy)                                                       \
                                                  ,ASD1(vecteur_directeur_OY2,dz)                                                       \
                                                                                                                                        \
                                                  ,ASD1(vecteur_directeur_OZ2,dx)                                                       \
                                                  ,ASD1(vecteur_directeur_OZ2,dy)                                                       \
                                                  ,ASD1(vecteur_directeur_OZ2,dz)                                                       \
                                                                                                                                        \
                                                   );                                                                                   \
                         INITIALISATION_MATRICE_3D(matrice_de_rotation_inverse                                                          \
                                                                                                                                        \
                                                  ,ASD1(vecteur_directeur_OX2,dx)                                                       \
                                                  ,ASD1(vecteur_directeur_OY2,dx)                                                       \
                                                  ,ASD1(vecteur_directeur_OZ2,dx)                                                       \
                                                                                                                                        \
                                                  ,ASD1(vecteur_directeur_OX2,dy)                                                       \
                                                  ,ASD1(vecteur_directeur_OY2,dy)                                                       \
                                                  ,ASD1(vecteur_directeur_OZ2,dy)                                                       \
                                                                                                                                        \
                                                  ,ASD1(vecteur_directeur_OX2,dz)                                                       \
                                                  ,ASD1(vecteur_directeur_OY2,dz)                                                       \
                                                  ,ASD1(vecteur_directeur_OZ2,dz)                                                       \
                                                                                                                                        \
                                                   );                                                                                   \
                                        /* Calcul de la matrice de rotation permettant de passer du referentiel {OX1,OY1,OZ1} au     */ \
                                        /* referentiel {OX2,OY2,OZ2} et de son inverse.                                              */ \
                                                                                                                                        \
                         PRODUIT_MATRICE_ACCROISSEMENT_3D(vitesse_du_corpsI_dans_OXYZ2_avant                                            \
                                                         ,matrice_de_rotation_directe                                                   \
                                                         ,ACCES_VITESSE_COURANTE(corpsI)                                                \
                                                          );                                                                            \
                                        /* Calcul de la vitesse du corps 'I' dans le referentiel {OX2,OY2,OZ2}.                      */ \
                         PRODUIT_MATRICE_ACCROISSEMENT_3D(vitesse_du_corpsJ_dans_OXYZ2_avant                                            \
                                                         ,matrice_de_rotation_directe                                                   \
                                                         ,ACCES_VITESSE_COURANTE(corpsJ)                                                \
                                                          );                                                                            \
                                        /* Calcul de la vitesse du corps 'J' dans le referentiel {OX2,OY2,OZ2}.                      */ \
                                                                                                                                        \
                         INITIALISATION_ACCROISSEMENT_3D(vitesse_du_corpsI_dans_OXYZ2_apres                                             \
                                                        ,gVITESSE_CORPS_APRES_COLLISION(corpsI                                          \
                                                                                       ,corpsJ                                          \
                                                                                       ,ASD1(vitesse_du_corpsI_dans_OXYZ2_avant,dx)     \
                                                                                       ,ASD1(vitesse_du_corpsJ_dans_OXYZ2_avant,dx)     \
                                                                                       ,coefficient_de_restitution_IJ                   \
                                                                                        )                                               \
                                                        ,ASD1(vitesse_du_corpsI_dans_OXYZ2_avant,dy)                                    \
                                                        ,ASD1(vitesse_du_corpsI_dans_OXYZ2_avant,dz)                                    \
                                                         );                                                                             \
                         INITIALISATION_ACCROISSEMENT_3D(vitesse_du_corpsJ_dans_OXYZ2_apres                                             \
                                                        ,gVITESSE_CORPS_APRES_COLLISION(corpsJ                                          \
                                                                                       ,corpsI                                          \
                                                                                       ,ASD1(vitesse_du_corpsJ_dans_OXYZ2_avant,dx)     \
                                                                                       ,ASD1(vitesse_du_corpsI_dans_OXYZ2_avant,dx)     \
                                                                                       ,coefficient_de_restitution_IJ                   \
                                                                                        )                                               \
                                                        ,ASD1(vitesse_du_corpsJ_dans_OXYZ2_avant,dy)                                    \
                                                        ,ASD1(vitesse_du_corpsJ_dans_OXYZ2_avant,dz)                                    \
                                                         );                                                                             \
                                        /* Le choc a lieu entre les corps 'I' et 'J'. On notera que les deux composantes suivant     */ \
                                        /* les axes {OY2,OZ2} sont conservees, alors que seul la composante selon 'OX2' subit        */ \
                                        /* l'effet du choc. Des informations sur ce probleme peuvent etre trouvees dans le livre     */ \
                                        /* "Mecanique Generale" (Christian Gruber & Willy Benoit) publie aux Presses Polytechniques  */ \
                                        /* et Universitaires Romandes (reference BCX = 531 GRU MEC), a partir de la page 581.        */ \
                                        /* Rappelons au passage que l'axe 'OX2' passe par les centres des deux particules.           */ \
                                                                                                                                        \
                         PRODUIT_MATRICE_ACCROISSEMENT_3D(vitesse_du_corpsI_apres_la_collision                                          \
                                                         ,matrice_de_rotation_inverse                                                   \
                                                         ,vitesse_du_corpsI_dans_OXYZ2_apres                                            \
                                                          );                                                                            \
                         PRODUIT_MATRICE_ACCROISSEMENT_3D(vitesse_du_corpsJ_apres_la_collision                                          \
                                                         ,matrice_de_rotation_inverse                                                   \
                                                         ,vitesse_du_corpsJ_dans_OXYZ2_apres                                            \
                                                          );                                                                            \
                                        /* Et enfin, retour dans le referentiel {OX1,OY1,OZ1}.                                       */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(I3ET(IFET(IZEQ(ASD1(ACCES_VITESSE_COURANTE(corpsI),dz))                                                        \
                                  ,IZEQ(ASD1(ACCES_VITESSE_COURANTE(corpsJ),dz))                                                        \
                                   )                                                                                                    \
                             ,IZEQ(ASD1(vecteur_directeur_OX2,dz))                                                                      \
                             ,IFOU(IZNE(ASD1(vitesse_du_corpsI_apres_la_collision,dz))                                                  \
                                  ,IZNE(ASD1(vitesse_du_corpsJ_apres_la_collision,dz))                                                  \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("de la composante en 'dz' s'est introduite dans les vitesses lors d'un choc");                    \
                                                                                                                                        \
                         CAL1(Prer4("vitesse du corps %d avant le choc={%+g,%+g,%+g}\n"                                                 \
                                   ,corpsI                                                                                              \
                                   ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dx)                                                             \
                                   ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dy)                                                             \
                                   ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dz)                                                             \
                                    )                                                                                                   \
                              );                                                                                                        \
                         CAL1(Prer4("vitesse du corps %d avant le choc={%+g,%+g,%+g}\n"                                                 \
                                   ,corpsJ                                                                                              \
                                   ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dx)                                                             \
                                   ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dy)                                                             \
                                   ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dz)                                                             \
                                    )                                                                                                   \
                              );                                                                                                        \
                                                                                                                                        \
                         CAL1(Prer4("vitesse du corps %d avant le choc={%+g,%+g,%+g}\n"                                                 \
                                   ,corpsI                                                                                              \
                                   ,ASD1(vitesse_du_corpsI_apres_la_collision,dx)                                                       \
                                   ,ASD1(vitesse_du_corpsI_apres_la_collision,dy)                                                       \
                                   ,ASD1(vitesse_du_corpsI_apres_la_collision,dz)                                                       \
                                    )                                                                                                   \
                              );                                                                                                        \
                         CAL1(Prer4("vitesse du corps %d avant le choc={%+g,%+g,%+g}\n"                                                 \
                                   ,corpsJ                                                                                              \
                                   ,ASD1(vitesse_du_corpsJ_apres_la_collision,dx)                                                       \
                                   ,ASD1(vitesse_du_corpsJ_apres_la_collision,dy)                                                       \
                                   ,ASD1(vitesse_du_corpsJ_apres_la_collision,dz)                                                       \
                                    )                                                                                                   \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    TRANSFERT_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corpsI)                                                           \
                                              ,vitesse_du_corpsI_apres_la_collision                                                     \
                                               );                                                                                       \
                    TRANSFERT_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corpsJ)                                                           \
                                              ,vitesse_du_corpsJ_apres_la_collision                                                     \
                                               );                                                                                       \
                                        /* Mise a jour finale des vitesses des 'corpsI' et 'corpsJ'.                                 */ \
                    Eblock                                                                                                              \
                                        /* Collision entre deux corps 'corpsI' et 'corpsJ'.                                          */

#define   PSEUDO_COLLISION_ENTRE_DEUX_CORPS(corpsI,corpsJ)                                                                              \
                    Bblock                                                                                                              \
                    DEFV(deltaF_3D,vitesse_du_corpsI_apres_la_collision);                                                               \
                    DEFV(deltaF_3D,vitesse_du_corpsJ_apres_la_collision);                                                               \
                                        /* Vitesse des corps 'I' et 'J' apres la pseudo-collision...                                 */ \
                                                                                                                                        \
                    INITIALISATION_ACCROISSEMENT_3D(vitesse_du_corpsI_apres_la_collision                                                \
                                                   ,LRZ2(ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dx)                                        \
                                                        ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dx)                                        \
                                                         )                                                                              \
                                                   ,LRZ2(ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dy)                                        \
                                                        ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dy)                                        \
                                                         )                                                                              \
                                                   ,LRZ2(ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dz)                                        \
                                                        ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dz)                                        \
                                                         )                                                                              \
                                                    );                                                                                  \
                    INITIALISATION_ACCROISSEMENT_3D(vitesse_du_corpsJ_apres_la_collision                                                \
                                                   ,LRZ2(ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dx)                                        \
                                                        ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dx)                                        \
                                                         )                                                                              \
                                                   ,LRZ2(ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dy)                                        \
                                                        ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dy)                                        \
                                                         )                                                                              \
                                                   ,LRZ2(ACCES_COEFFICIENT_DE_RESTITUTION(corpsI)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsI),dz)                                        \
                                                        ,ACCES_COEFFICIENT_DE_RESTITUTION(corpsJ)                                       \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corpsJ),dz)                                        \
                                                         )                                                                              \
                                                    );                                                                                  \
                                        /* On notera qu'a la date du 20220812140421, 'corpsI' et 'corpsJ' ont la meme vitesse apres  */ \
                                        /* la pseudo-collision...                                                                    */ \
                                                                                                                                        \
                    TRANSFERT_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corpsI)                                                           \
                                              ,vitesse_du_corpsI_apres_la_collision                                                     \
                                               );                                                                                       \
                    TRANSFERT_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corpsJ)                                                           \
                                              ,vitesse_du_corpsJ_apres_la_collision                                                     \
                                               );                                                                                       \
                                        /* Mise a jour finale des vitesses des 'corpsI' et 'corpsJ'.                                 */ \
                    Eblock                                                                                                              \
                                        /* Pseudo-collision entre deux corps 'corpsI' et 'corpsJ'. Ceci a ete introduit le           */ \
                                        /* 20220812140421 afin de faire des experiences de type "flock"...                           */

#define   MODIFICATION_D_UNE_VITESSE_APRES_COLLISION(corps)                                                                             \
                    Bblock                                                                                                              \
                    INITIALISATION_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corps)                                                       \
                                                   ,AXPB(ACCES_FACTEUR_VITESSE_OX2_COLLISION(corps)                                     \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corps),dx)                                         \
                                                        ,ACCES_TRANSLATION_VITESSE_OX2_COLLISION(corps)                                 \
                                                         )                                                                              \
                                                   ,AXPB(ACCES_FACTEUR_VITESSE_OY2_COLLISION(corps)                                     \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corps),dy)                                         \
                                                        ,ACCES_TRANSLATION_VITESSE_OY2_COLLISION(corps)                                 \
                                                         )                                                                              \
                                                   ,AXPB(ACCES_FACTEUR_VITESSE_OZ2_COLLISION(corps)                                     \
                                                        ,ASD1(ACCES_VITESSE_COURANTE(corps),dz)                                         \
                                                        ,ACCES_TRANSLATION_VITESSE_OZ2_COLLISION(corps)                                 \
                                                         )                                                                              \
                                                    );                                                                                  \
                    Eblock                                                                                                              \
                                        /* Modification (eventuelle) d'une vitesse apres collision (introduit le 19991110082506).    */ \
                                        /* ATTENTION, 'MODIFICATION_D_UNE_VITESSE_APRES_COLLISION(...)' ne peut etre utilisee que    */ \
                                        /* si les procedures 'ACCES_FACTEUR_VITESSE_O?2_COLLISION(...)' ont ete definies, ainsi que  */ \
                                        /* 'ACCES_TRANSLATION_VITESSE_O?2_COLLISION(...)'.                                           */



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.