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