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