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