/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   E T   D E   L ' A G G R E G A T I O N  :         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrk/rdn_walk.51$I' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1998??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E   L ' A B S E N C E   D E   C O A L E S C E N C E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifndef   COALESCENCE_EVENTUELLE_LORS_DES_COLLISIONS
#    define    COALESCENCE_EVENTUELLE_LORS_DES_COLLISIONS                                                                               \
                         Bblock                                                                                                         \
                         BLOC(VIDE;);                                                                                                   \
                         Eblock                                                                                                         \
                                        /* Il ne peut y avoir coalescence lors des collisions (introduit le 20211116115112)...       */
#Aifndef  COALESCENCE_EVENTUELLE_LORS_DES_COLLISIONS
#Eifndef  COALESCENCE_EVENTUELLE_LORS_DES_COLLISIONS

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E   L ' A B S E N C E   D E   C O L L A G E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifndef   AGGREGATION_EVENTUELLE_PAR_COLLAGE_LORS_DES_COLLISIONS
#    define    AGGREGATION_EVENTUELLE_PAR_COLLAGE_LORS_DES_COLLISIONS                                                                   \
                         Bblock                                                                                                         \
                         BLOC(VIDE;);                                                                                                   \
                         Eblock                                                                                                         \
                                        /* Il ne peut y avoir aggregation par collage lors des collisions...                         */
#Aifndef  AGGREGATION_EVENTUELLE_PAR_COLLAGE_LORS_DES_COLLISIONS
#Eifndef  AGGREGATION_EVENTUELLE_PAR_COLLAGE_LORS_DES_COLLISIONS

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E   L ' A B S E N C E   D E   P R O P A G A T I O N   D E S   C O U L E U R S  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifndef   PROPAGATION_EVENTUELLE_DES_COULEURS_LORS_DES_COLLISIONS
#    define    PROPAGATION_EVENTUELLE_DES_COULEURS_LORS_DES_COLLISIONS                                                                  \
                         Bblock                                                                                                         \
                         BLOC(VIDE;);                                                                                                   \
                         Eblock                                                                                                         \
                                        /* Il ne peut y avoir propagation des couleurs lors des collisions...                        */
#Aifndef  PROPAGATION_EVENTUELLE_DES_COULEURS_LORS_DES_COLLISIONS
#Eifndef  PROPAGATION_EVENTUELLE_DES_COULEURS_LORS_DES_COLLISIONS

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E   L ' A B S E N C E   D E   " S Y N C H R O N I S A T I O N "   D E S   V I T E S S E S  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifndef   SYNCHRONISATION_EVENTUELLE_DES_VITESSES_LORS_DES_FROLAGES
#    define    SYNCHRONISATION_EVENTUELLE_DES_VITESSES_LORS_DES_FROLAGES                                                                \
                         Bblock                                                                                                         \
                         BLOC(VIDE;);                                                                                                   \
                         Eblock                                                                                                         \
                                        /* Il ne peut y avoir synchronisation des vitesses lors des frolages...                      */
#Aifndef  SYNCHRONISATION_EVENTUELLE_DES_VITESSES_LORS_DES_FROLAGES
#Eifndef  SYNCHRONISATION_EVENTUELLE_DES_VITESSES_LORS_DES_FROLAGES

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E S   C O L L I S I O N S   E T   D E   L ' A G G R E G A T I O N  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   GESTION_DES_AGGREGATIONS_ET_DES_COLLISIONS                                                                                    \
                    Bblock                                                                                                              \
                    Test(IFET(IFET(IFLT(corpsI,corpsJ)                                                                                  \
                                  ,IFET(IFET(IFLE(ACCES_DATES_DE_NAISSANCE(corpsI),temps_courant)                                       \
                                            ,IFGT(ACCES_DATES_DE_MORT(corpsI),temps_courant)                                            \
                                             )                                                                                          \
                                       ,IFET(IFLE(ACCES_DATES_DE_NAISSANCE(corpsJ),temps_courant)                                       \
                                            ,IFGT(ACCES_DATES_DE_MORT(corpsJ),temps_courant)                                            \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                             ,IFOU(IFET(EST_VRAI(une_collision_necessite_deux_corps_collisionnables)                                    \
                                       ,IFET(EST_VRAI(ACCES_COLLISIONNABLES(corpsI))                                                    \
                                            ,EST_VRAI(ACCES_COLLISIONNABLES(corpsJ))                                                    \
                                             )                                                                                          \
                                        )                                                                                               \
                                  ,IFET(EST_FAUX(une_collision_necessite_deux_corps_collisionnables)                                    \
                                       ,IFOU(EST_VRAI(ACCES_COLLISIONNABLES(corpsI))                                                    \
                                            ,EST_VRAI(ACCES_COLLISIONNABLES(corpsJ))                                                    \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                                        /* ATTENTION, le 19971222172717, j'ai remplace :                                             */ \
                                        /*                                                                                           */ \
                                        /*                  IFNE(corpsI,corpsJ)                                                      */ \
                                        /*                                                                                           */ \
                                        /* par :                                                                                     */ \
                                        /*                                                                                           */ \
                                        /*                  IFLT(corpsI,corpsJ)                                                      */ \
                                        /*                                                                                           */ \
                                        /* car, en effet, sinon, on risque de traiter deux fois chaque couple {corpsI,corpsJ}. Cela  */ \
                                        /* s'est vu avec les collisions...                                                           */ \
                                        /*                                                                                           */ \
                                        /* Le 20000719091407, j'ai rajoute la possibilite de rendre les corps insensibles aux        */ \
                                        /* collisions (via la liste 'v $xrk/rdn_walk.52$K ACCES_COLLISIONNABLES') ainsi que la       */ \
                                        /* possibilite, lorsqu'il y a collision, de distinguer deux cas : le premier cas ou les      */ \
                                        /* deux corps doivent etre "collisionnables" pour pouvoir entrer en collision (valeur 'VRAI' */ \
                                        /* de l'indicateur 'une_collision_necessite_deux_corps_collisionnables' et le second cas qui */ \
                                        /* accepte qu'un seul corps "collisionnable" suffise pour qu'il y ait collision entre deux   */ \
                                        /* corps (valeur 'FAUX' de 'une_collision_necessite_deux_corps_collisionnables'). Cela va    */ \
                                        /* permettre de simuler des gaz ou cohabitent des "photons" (donc non "collisionnables")     */ \
                                        /* et des particules "collisionnables", avec malgre tout la possibilite d'une interaction    */ \
                                        /* par collisions des "photons" sur les autres particules (avec une valeur 'FAUX' de         */ \
                                        /* 'une_collision_necessite_deux_corps_collisionnables').                                    */ \
                         DEFV(Float,INIT(distance_I_J_courante                                                                          \
                                        ,RpdisF3D(ACCES_COORDONNEES_COURANTES(corpsI)                                                   \
                                                 ,ACCES_COORDONNEES_COURANTES(corpsJ)                                                   \
                                                  )                                                                                     \
                                         )                                                                                              \
                              );                                                                                                        \
                                        /* Distance courante entre 'I' et 'J'.                                                       */ \
                                                                                                                                        \
                         Test(IFET(IFLT(distance_I_J_courante                                                                           \
                                       ,seuil_d_interaction                                                                             \
                                        )                                                                                               \
                                  ,IFLT(distance_I_J_courante                                                                           \
                                       ,MUL2(facteur_des_rayon_d_interaction                                                            \
                                            ,ADD2(ACCES_LISTE(liste_initiale_des_RAYON_D_INTERACTION,corpsI)                            \
                                                 ,ACCES_LISTE(liste_initiale_des_RAYON_D_INTERACTION,corpsJ)                            \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* ATTENTION, jusqu'au 19971222185613, il y avait ici 'ACCES_COORDONNEES_PRECEDENTES(...)'   */ \
                                        /* au lieu de 'ACCES_COORDONNEES_COURANTES(...)' ce qui a cree des problemes de chaine de    */ \
                                        /* collisions apres une premiere collision entre deux particules. ATTENTION, jusqu'au        */ \
                                        /* 19980224182217, il y avait :                                                              */ \
                                        /*                                                                                           */ \
                                        /*        ,MIN2(MUL2(ACCES_LISTE(liste_initiale_des_FACTEUR_DU_RAYON_D_INTERACTION,corpsI)   */ \
                                        /*                  ,ACCES_LISTE(liste_initiale_des_RAYON,corpsI)                            */ \
                                        /*                   )                                                                       */ \
                                        /*             ,MUL2(ACCES_LISTE(liste_initiale_des_FACTEUR_DU_RAYON_D_INTERACTION,corpsJ)   */ \
                                        /*                  ,ACCES_LISTE(liste_initiale_des_RAYON,corpsJ)                            */ \
                                        /*                   )                                                                       */ \
                                        /*              )                                                                            */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION, il est evident que la "bonne" valeur de 'facteur_des_rayon_d_interaction'      */ \
                                        /* est la valeur 1. Mais, a cause de la visualiastion et de ses deux parametres              */ \
                                        /* 'attenuation_au_bord_d_un_disque' ("attenuation_au_bord=") et                             */ \
                                        /* 'epaisseur_de_la_couronne_d_anti_aliasing' ("couronne="), on peut etre amene a tricher    */ \
                                        /* et a utiliser des valeurs inferieures a 1. Depuis tres longtemps (toujours ?), c'est la   */ \
                                        /* valeur 0.5 qui est utilisee. Avec la generation de la sequence :                          */ \
                                        /*                                                                                           */ \
                                        /*                  xivPdf 9 2 / 026783_027294                                               */ \
                                        /*                                                                                           */ \
                                        /* une meilleure comprehension du phenomene a ete obtenue. Le parametre "couronne=" peut     */ \
                                        /* etre alors passe de 4 a 2, alors que le parametre "attenuation_au_bord=" peut etre passe  */ \
                                        /* de 0.125 a 0.25.                                                                          */ \
                              Bblock                                                                                                    \
                                        /* Cas ou les deux corps 'I' et 'J' sont proches l'un de l'autre :                           */ \
                              DEFV(Float,INIT(probabilite_d_interaction,PROBABILITE_UNITE));                                            \
                              DEFV(Float,INIT(tirage_aleatoire_d_interaction,PROBABILITE_NULLE));                                       \
                                        /* A priori, l'evenement est certain...                                                      */ \
                                                                                                                                        \
                              SYNCHRONISATION_EVENTUELLE_DES_VITESSES_LORS_DES_FROLAGES;                                                \
                                        /* Calculs utiles s'il y a demande de synchronisation des vitesses lors des frolages (ceci   */ \
                                        /* fut introduit le 20060705113714...).                                                      */ \
                                                                                                                                        \
                              Test(IL_FAUT(utiliser_un_champ_de_probabilite))                                                           \
                                   Bblock                                                                                               \
                                   DEFV(Int                                                                                             \
                                       ,INIT(X                                                                                          \
                                            ,gX_PHYSIQUE_A_VISUALISATION(MOYE(ASD1(ACCES_COORDONNEES_COURANTES(corpsI),x)               \
                                                                             ,ASD1(ACCES_COORDONNEES_COURANTES(corpsJ),x)               \
                                                                              )                                                         \
                                                                        ,FZERO                                                          \
                                                                         )                                                              \
                                             )                                                                                          \
                                        );                                                                                              \
                                   DEFV(Int                                                                                             \
                                       ,INIT(Y                                                                                          \
                                            ,gY_PHYSIQUE_A_VISUALISATION(MOYE(ASD1(ACCES_COORDONNEES_COURANTES(corpsI),y)               \
                                                                             ,ASD1(ACCES_COORDONNEES_COURANTES(corpsJ),y)               \
                                                                              )                                                         \
                                                                        ,FZERO                                                          \
                                                                         )                                                              \
                                             )                                                                                          \
                                        );                                                                                              \
                                   DEFV(Int                                                                                             \
                                       ,INIT(Z                                                                                          \
                                            ,gZ_PHYSIQUE_A_VISUALISATION(MOYE(ASD1(ACCES_COORDONNEES_COURANTES(corpsI),z)               \
                                                                             ,ASD1(ACCES_COORDONNEES_COURANTES(corpsJ),z)               \
                                                                              )                                                         \
                                                                        ,FZERO                                                          \
                                                                         )                                                              \
                                             )                                                                                          \
                                        );                                                                                              \
                                        /* Positionnement dans le champ de probabilite.                                              */ \
                                                                                                                                        \
                                   EGAL(probabilite_d_interaction                                                                       \
                                       ,______NORMALISE_NIVEAU(FAload_point(champ_de_probabilite                                        \
                                                                           ,X,Y,Z                                                       \
                                                                           ,P_periodiser_X,P_periodiser_Y,P_periodiser_Z                \
                                                                           ,P_symetriser_X,P_symetriser_Y,P_symetriser_Z                \
                                                                           ,P_prolonger_X,P_prolonger_Y,P_prolonger_Z                   \
                                                                           ,P_niveau_hors_du_champ_de_probabilite                       \
                                                                            )                                                           \
                                                               )                                                                        \
                                        );                                                                                              \
                                   GENERATION_D_UNE_VALEUR(tirage_aleatoire_d_interaction                                               \
                                                          ,PROBABILITE_NULLE                                                            \
                                                          ,PROBABILITE_UNITE                                                            \
                                                           );                                                                           \
                                        /* Calcul de la probabilite locale d'interaction a "mi-chemin" entre les corps 'I' et 'J'.   */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              Test(IFLT(tirage_aleatoire_d_interaction,probabilite_d_interaction))                                      \
                                        /* Cas ou il y a interaction...                                                              */ \
                                   Bblock                                                                                               \
                                   Test(IL_FAUT(gerer_les_collisions))                                                                  \
                                        Bblock                                                                                          \
                                        DEFV(Float,INIT(distance_I_J_avant                                                              \
                                                       ,RpdisF3D(ACCES_COORDONNEES_PRECEDENTES(corpsI)                                  \
                                                                ,ACCES_COORDONNEES_PRECEDENTES(corpsJ)                                  \
                                                                 )                                                                      \
                                                        )                                                                               \
                                             );                                                                                         \
                                        /* Distance precedente entre 'I' et 'J'.                                                     */ \
                                                                                                                                        \
                                        Test(IFLT(distance_I_J_courante,distance_I_J_avant))                                            \
                                        /* Ce test permet de decreter qu'il y a collision que lorsque les corps 'I' et 'J' semblent  */ \
                                        /* s'approcher l'un de l'autre. Le test strict 'IFLT(...)' permet de plus d'eviter des       */ \
                                        /* effets nefastes, par exemple, lorsque les conditions initiales imposent que tous les      */ \
                                        /* corps partent du meme point...                                                            */ \
                                             Bblock                                                                                     \
                                             Test(EST_FAUX(les_collisions_sont_en_fait_des_pseudo_collisions))                          \
                                        /* Test introduit le 20220812141615...                                                       */ \
                                                  Bblock                                                                                \
                                                  COLLISION_ENTRE_DEUX_CORPS(corpsI,corpsJ);                                            \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  PSEUDO_COLLISION_ENTRE_DEUX_CORPS(corpsI,corpsJ);                                     \
                                        /* La notion de "pseudo-collision" a ete introduite le 20220812141615...                     */ \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                                                                                                                        \
                                             MODIFICATION_D_UNE_VITESSE_APRES_COLLISION(corpsI);                                        \
                                             MODIFICATION_D_UNE_VITESSE_APRES_COLLISION(corpsJ);                                        \
                                        /* Modification eventuelle des composantes des vitesses apres une collision (ceci a ete      */ \
                                        /* ajoute le 19991110082506 dans le but de permettre de garder le plus longtemps possible    */ \
                                        /* la "cohesion" d'un ensemble de particules -tel un "piston"-).                             */ \
                                                                                                                                        \
                                             INCR(ACCES_COMPTEURS_COLLISIONS_COURANTS(corpsI),I);                                       \
                                             INCR(ACCES_COMPTEURS_COLLISIONS_COURANTS(corpsJ),I);                                       \
                                        /* Comptage des collisions pour 'corpsI' et 'corpsJ'.                                        */ \
                                                                                                                                        \
                                             INCR(compteur_des_collisions_particules_particules,I);                                     \
                                        /* Comptage des collisions de type 'particules-particules'.                                  */ \
                                                                                                                                        \
                                             COALESCENCE_EVENTUELLE_LORS_DES_COLLISIONS;                                                \
                                        /* Gestion de la coalescence lors des collisions (introduit le 20211116115112).              */ \
                                                                                                                                        \
                                             AGGREGATION_EVENTUELLE_PAR_COLLAGE_LORS_DES_COLLISIONS;                                    \
                                        /* Gestion de l'aggregation par collage lors des collisions (introduit le 20000502091124).   */ \
                                                                                                                                        \
                                             PROPAGATION_EVENTUELLE_DES_COULEURS_LORS_DES_COLLISIONS;                                   \
                                        /* Gestion de la propagation des couleurs lors des collisions (introduit le 20050510090905). */ \
                                                                                                                                        \
                                             EDITION_E(BLOC(CAL2(Prin4("periode=%d t=%f  collisions corpsI=%d corpsJ=%d\n"              \
                                                                      ,numero_de_la_periode_courante_de_la_simulation                   \
                                                                      ,temps_courant                                                    \
                                                                      ,corpsI                                                           \
                                                                      ,corpsJ                                                           \
                                                                       )                                                                \
                                                                 );                                                                     \
                                                            )                                                                           \
                                                       );                                                                               \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   Test(IL_FAUT(generer_des_DiffusionLimitedAggregation))                                               \
                                        Bblock                                                                                          \
                                        EGAL(ACCES_BLOCAGES_COURANTS(corpsI),VRAI);                                                     \
                                        INITIALISATION_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corpsI)                                  \
                                                                       ,FZERO                                                           \
                                                                       ,FZERO                                                           \
                                                                       ,FZERO                                                           \
                                                                        );                                                              \
                                                                                                                                        \
                                        EGAL(ACCES_BLOCAGES_COURANTS(corpsJ),VRAI);                                                     \
                                        INITIALISATION_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corpsJ)                                  \
                                                                       ,FZERO                                                           \
                                                                       ,FZERO                                                           \
                                                                       ,FZERO                                                           \
                                                                        );                                                              \
                                        /* Les deux corps 'I' et 'J' etant proches l'un de l'autre, ils sont bloques.                */ \
                                                                                                                                        \
                                        EDITION_E(BLOC(CAL2(Prin4("periode=%d t=%f  DLA corpsI=%d corpsJ=%d\n"                          \
                                                                 ,numero_de_la_periode_courante_de_la_simulation                        \
                                                                 ,temps_courant                                                         \
                                                                 ,corpsI                                                                \
                                                                 ,corpsJ                                                                \
                                                                  )                                                                     \
                                                            );                                                                          \
                                                       )                                                                                \
                                                  );                                                                                    \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                        /* Cas ou il n'y a pas d'interaction...                                                      */ \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                                        /* Cas ou les deux corps 'I' et 'J' sont eloignes l'un de l'autre : rien a faire...          */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock



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.