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