/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E S R O T A T I O N S D E L ' E S P A C E : */
/* */
/* */
/* Author of '$xrq/nucleon.LE$I' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 1991??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N A L E A T O I R E D E L ' E S P A C E P H Y S I Q U E */
/* P A S S A N T D E L ' E S P A C E P H Y S I Q U E ( O X 1 , O Y 1 , O Z 1 ) */
/* A L ' E S P A C E A L E A T O I R E ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
#define DEBUT_DE_ROTATION_ALEATOIRE_DE_L_ESPACE_PHYSIQUE \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(Float,INIT(Euler1,FLOT__UNDEF)); \
DEFV(Float,INIT(Euler2,FLOT__UNDEF)); \
DEFV(Float,INIT(Euler3,FLOT__UNDEF)); \
/* La rotation de l'espace physique est definie par les 3 angles d'Euler (voir page 324 */ \
/* de l'aide memoire de mathematiques) : */ \
/* */ \
/* Euler1 : angle de nutation 'theta' (entre les axes OZ1 et OZ2), */ \
/* Euler2 : angle de precession 'psi' (entre l'axe OX1 et la droite d'intersection entre */ \
/* les plans (OX1,OY1) et (OX2,OY2)), */ \
/* Euler3 : angle de rotation pure 'phi' (entre l'axe OX2 et la droite d'intersection entre */ \
/* les plans (OX1,OY1) et (OX2,OY2)), */ \
/* */ \
GENERATION_D_UN_DEMI_ANGLE(Euler1); \
GENERATION_D_UN_ANGLE(Euler2); \
GENERATION_D_UN_ANGLE(Euler3); \
/* Rotation aleatoire de l'espace physique par choix aleatoire des 3 angles d'Euler, avec : */ \
/* */ \
/* Euler1 E [0,pi], */ \
/* Euler2 E [0,2*pi], */ \
/* Euler3 E [0,2*pi]. */ \
/* */ \
INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER(matrice_de_rotation,Euler1,Euler2,Euler3); \
/* Calcul de la matrice de rotation de l'espace physique permettant de passer de l'espace */ \
/* aleatoire (OX2,OY2,OZ2) a l'espace physique (OX1,OY1,OZ1). */ \
/* */ \
/* Debut de la sequence de rotation aleatoire de l'espace physique. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_ALEATOIRE_DANS_L_ESPACE_PHYSIQUE \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(Float,INIT(theta_polaire,FLOT__UNDEF)); \
/* Direction polaire aleatoire dans le plan (OX2,OY2) apres rotation de l'espace physique. */ \
GENERATION_D_UNE_DIRECTION_2D(theta_polaire); \
/* Direction polaire aleatoire dans le plan (OX2,OY2) apres rotation de l'espace physique. */ \
/* */ \
/* Debut de la sequence de choix d'une direction aleatoire dans l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_ALEATOIRE_DANS_L_ESPACE_PHYSIQUE \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Eblock \
/* Fin de la sequence de choix d'une direction aleatoire dans l'espace physique. */
#define FIN_DE_ROTATION_ALEATOIRE_DE_L_ESPACE_PHYSIQUE \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Eblock \
/* Fin de la sequence de rotation aleatoire de l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F L U C T U A T I O N A L E A T O I R E D ' U N E P O S I T I O N : */
/* */
/*************************************************************************************************************************************/
#TestADef VOISINAGE_D_INTERACTION_1_POUR_2_PARTICULES \
GRO4(FRA10(FRA10(RAYON_D_UN_HADRON))) \
/* ATTENTION : la valeur de 'VOISINAGE_D_INTERACTION_1_POUR_2_PARTICULES' est plus grande */ \
/* dans '$xrq/di_elec.L0$K' que dans '$xrq/nucleon.LE$I', et ce afin de favoriser au */ \
/* mieux l'absorbtion, par des electrons, des photons qui doivent les intercepter... */
#TestADef DISTANCE_DE_PERTURBATION_D_UNE_POSITION \
FRA4(GRO4(FRA10(FRA10(RAYON_D_UN_HADRON)))) \
/* ATTENTION : la valeur de 'DISTANCE_DE_PERTURBATION_D_UNE_POSITION' est choisie nulle */ \
/* dans '$xrq/di_elec.L0$K' afin de garantir que tout le monde restera dans le plan */ \
/* (OX,OY)... */
DEFV(Local,DEFV(Float,INIT(distance_de_perturbation_d_une_position,DISTANCE_DE_PERTURBATION_D_UNE_POSITION)));
/* Distance maximale sur la quelle une position peut etre perturbee. ATTENTION, autrefois */
/* on trouvait la definition : */
/* */
/* #define DISTANCE_DE_PERTURBATION_D_UNE_POSITION \ */
/* FRA4(VOISINAGE_D_INTERACTION_1_POUR_2_PARTICULES) */
/* */
/* mais il est plus logique de decoupler les deux definitions ; cela a ete introduit a */
/* l'occasion de la definition du "di-electron"... */
#define FLUCTUATION_ALEATOIRE_D_UNE_POSITION(position) \
Bblock \
DEFINITION_D_UNE_DIRECTION_EN_COORDONNEES_SPHERIQUES(rho_position,theta_position,phi_position); \
/* Definition d'une position en coordonnees spheriques. */ \
GENERATION_D_UNE_VALEUR(rho_position \
,FZERO \
,distance_de_perturbation_d_une_position \
); \
GENERATION_D_UNE_DIRECTION_3D(theta_position,phi_position) \
/* Generation d'une distance et d'une direction aleatoire... */ \
INCR(ASD1(position,x) \
,Xcartesienne_3D(rho_position \
,theta_position \
,phi_position \
) \
); \
INCR(ASD1(position,y) \
,Ycartesienne_3D(rho_position \
,theta_position \
,phi_position \
) \
); \
INCR(ASD1(position,z) \
,Zcartesienne_3D(rho_position \
,theta_position \
,phi_position \
) \
); \
/* Fluctuations aleatoires et independantes des trois composantes de la position. */ \
Eblock \
/* Fluctuation aleatoire d'une position. */
#define PERTURBER_UNE_POSITION \
VRAI
#define NE_PAS_PERTURBER_UNE_POSITION \
NOTL(PERTURBER_UNE_POSITION)
/* Arguments de 'FLUCTUATION_ALEATOIRE_D_UNE_POSITION_INITIALE(...)', */
/* 'FLUCTUATION_ALEATOIRE_D_UNE_POSITION_COURANTE(...)' et */
/* 'FLUCTUATION_ALEATOIRE_DES_POSITIONS_INITIALE_ET_COURANTE(...)'. */
#define FLUCTUATION_ALEATOIRE_D_UNE_POSITION_INITIALE(particule,perturber) \
Bblock \
Test(IL_FAUT(perturber)) \
Bblock \
FLUCTUATION_ALEATOIRE_D_UNE_POSITION(ASI2(particule,espace_temps,position_initiale)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Fluctuation aleatoire d'une position initiale. */
#define FLUCTUATION_ALEATOIRE_D_UNE_POSITION_COURANTE(particule,perturber) \
Bblock \
Test(IL_FAUT(perturber)) \
Bblock \
FLUCTUATION_ALEATOIRE_D_UNE_POSITION(ASI2(particule,espace_temps,position_courante)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Fluctuation aleatoire d'une position courante. */
#define FLUCTUATION_ALEATOIRE_DES_POSITIONS_INITIALE_ET_COURANTE(particule,perturber) \
Bblock \
Test(IL_FAUT(perturber)) \
Bblock \
FLUCTUATION_ALEATOIRE_D_UNE_POSITION_INITIALE(particule,perturber); \
INITIALISATION_DE_LA_POSITION_COURANTE_D_UNE_PARTICULE(particule); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Fluctuation aleatoire des positions initiale et courante. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F L U C T U A T I O N A L E A T O I R E D ' U N E D I R E C T I O N : */
/* */
/*************************************************************************************************************************************/
#define TAUX_DE_FLUCTUATION_D_UNE_DIRECTION \
GRO1(FRA2(FRA10(FU)))
DEFV(Local,DEFV(Float,INIT(taux_de_fluctuation_d_une_direction,TAUX_DE_FLUCTUATION_D_UNE_DIRECTION)));
/* Taux de fluctuation d'une direction... */
#define FLUCTUATION_ALEATOIRE_D_UNE_DIRECTION(direction,perturber_la_direction_theta,perturber_la_direction_phi) \
Bblock \
DEFINITION_D_UNE_DIRECTION_EN_COORDONNEES_SPHERIQUES(rho_direction,theta_direction,phi_direction); \
/* Definition d'une direction en coordonnees spheriques. */ \
DEFV(Float,INIT(fluctuation_de_theta_direction,FZERO)); \
DEFV(Float,INIT(fluctuation_de_phi_direction,FZERO)); \
/* Definition des fluctuations exprimees en coordonnees spheriques et initialisees comme */ \
/* si 'NE_PAS_PERTURBER_LA_DIRECTION_THETA' et 'NE_PAS_PERTURBER_LA_DIRECTION_PHI'... */ \
EGAL(rho_direction \
,Rho_3D(ASD1(direction,dx),ASD1(direction,dy),ASD1(direction,dz)) \
); \
EGAL(theta_direction \
,Phi_3D(ASD1(direction,dx),ASD1(direction,dy),ASD1(direction,dz)) \
); \
EGAL(phi_direction \
,Theta_3D(ASD1(direction,dx),ASD1(direction,dy),ASD1(direction,dz)) \
); \
/* Passage des coordonnees cartesiennes aux coordonnees spheriques. ATTENTION, a la */ \
/* permutation de 'theta' et de 'phi' liee a la definition des coordonnees spheriques (voir */ \
/* l'Aide-Memoire de Mathematiques, page 321 et 322). */ \
\
Test(IL_FAUT(perturber_la_direction_theta)) \
Bblock \
GENERATION_D_UNE_VALEUR(fluctuation_de_theta_direction \
,NEGA(MUL2(taux_de_fluctuation_d_une_direction,PI)) \
,NEUT(MUL2(taux_de_fluctuation_d_une_direction,PI)) \
); \
/* Calcul de la fluctuation aleatoire de l'angles 'theta' dans un intervalle [-p.PI,+p.PI] */ \
/* ou 'p' represente un pourcentage de 'PI'... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(perturber_la_direction_phi)) \
Bblock \
GENERATION_D_UNE_VALEUR(fluctuation_de_phi_direction \
,NEGA(MUL2(taux_de_fluctuation_d_une_direction,PI)) \
,NEUT(MUL2(taux_de_fluctuation_d_une_direction,PI)) \
); \
/* Calcul de la fluctuation aleatoire de l'angles 'phi' dans un intervalle [-p.PI,+p.PI] */ \
/* ou 'p' represente un pourcentage de 'PI'... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
INITIALISATION_ACCROISSEMENT_3D(direction \
,Xcartesienne_3D(rho_direction \
,ADD2(theta_direction,fluctuation_de_theta_direction) \
,ADD2(phi_direction,fluctuation_de_phi_direction) \
) \
,Ycartesienne_3D(rho_direction \
,ADD2(theta_direction,fluctuation_de_theta_direction) \
,ADD2(phi_direction,fluctuation_de_phi_direction) \
) \
,Zcartesienne_3D(rho_direction \
,ADD2(theta_direction,fluctuation_de_theta_direction) \
,ADD2(phi_direction,fluctuation_de_phi_direction) \
) \
); \
/* Fluctuations aleatoires et independantes des trois composantes de la direction ; pour */ \
/* ce faire, on repasse des coordonnees spheriques aux coordonnees cartesiennes en */ \
/* perturbant les deux angles (theta,phi), et en laissant 'rho' inchange... */ \
Eblock \
/* Fluctuation aleatoire d'une direction. On notera que la norme de la 'direction' est */ \
/* conservee par cette operation, puisque l'on ne touche qu'a (theta,phi)... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N D ' A L I G N E M E N T D E L ' A X E ' O X 2 ' D E L ' E S P A C E P H Y S I Q U E */
/* S U R U N E D I R E C T I O N D O N N E E , L E S A X E S ' O Y 2 ' E T ' O Z 2 ' E T A N T */
/* P O S I T I O N N E S A L E A T O I R E M E N T E E T P A S S A N T D E L ' E S P A C E P H Y S I Q U E */
/* ( O X 1 , O Y 1 , O Z 1 ) A L ' E S P A C E ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/* */
/* Definitions : */
/* */
/* . */
/* OY1 /|\ */
/* | + */
/* | . . */
/* | . . */
/* | . . OX2 . */
/* | . . . direction sur laquelle */
/* | OY2 . . . est aligne l'axe 'OX2' */
/* | . plan dans lequel . . */
/* | . est mesure . . */
/* | . 'theta' . */
/* | . . */
/* | . . */
/* | . */
/* | O2 */
/* | . */
/* | */
/* | . */
/* | */
/* O1 |_____________________.___________________________\ */
/* / / */
/* / . */
/* / OX1 */
/* / . */
/* / */
/* / . */
/* / */
/* / OZ2 . */
/* OZ1 / */
/* */
/* */
/* En general, le couple (OY2,OZ2) tourne "librement" */
/* autour de l'axe 'OX2' (l'angle de rotation etant par */
/* exemple fixe aleatoirement...). */
/* */
/* */
/*************************************************************************************************************************************/
#define PERTURBER_UNE_DIRECTION \
VRAI
#define NE_PAS_PERTURBER_UNE_DIRECTION \
NOTL(PERTURBER_UNE_DIRECTION)
/* Arguments de 'DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION()'. */
#define PERTURBER_LA_DIRECTION_THETA \
PERTURBER_UNE_DIRECTION
#define NE_PAS_PERTURBER_LA_DIRECTION_THETA \
NE_PAS_PERTURBER_UNE_DIRECTION
#define PERTURBER_LA_DIRECTION_PHI \
PERTURBER_UNE_DIRECTION
#define NE_PAS_PERTURBER_LA_DIRECTION_PHI \
NE_PAS_PERTURBER_UNE_DIRECTION
/* Arguments de 'FLUCTUATION_ALEATOIRE_D_UNE_DIRECTION(...)'. */
#define DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(direction,perturber_la_direction) \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(deltaF_3D,direction_perturbee); \
/* Definition d'une version perturbee aleatoirement de la 'direction' argument... */ \
DEFV(Float,INIT(module_du_vecteur_direction,FLOT__UNDEF)); \
/* Definition du module du vecteur direction ; on notera que ce module peut etre nul dans */ \
/* le cas exceptionnel du vecteur vitesse d'une particule immobile (cas des quarks REELs */ \
/* par exemple de temps en temps)... */ \
DEFV(deltaF_3D,vecteur_unitaire_de_OX2); \
/* Definition des cosinus directeurs (l1,m1,n1) de l'axe 'OX2'. */ \
DEFV(deltaF_3D,vecteur_unitaire_de_OY2_non_normalise); \
/* Definition des cosinus directeurs non normalises (lp2,mp2,np2) de l'axe 'OY2', */ \
DEFV(Float,INIT(module_du_vecteur_unitaire_de_OY2_non_normalise,FLOT__UNDEF)); \
/* Module du vecteur (lp2,mp2,np2). */ \
DEFV(deltaF_3D,vecteur_unitaire_de_OY2); \
/* Definition des cosinus directeurs (l2,m2,n2) de l'axe 'OY2'. */ \
DEFV(deltaF_3D,vecteur_unitaire_de_OZ2); \
/* Definition des cosinus directeurs (l3,m3,n3) de l'axe 'OZ2'. */ \
\
TRANSFERT_ACCROISSEMENT_3D(direction_perturbee,direction); \
/* Transfert de la direction argument afin de pouvoir eventuellement la perturber... */ \
Test(IL_FAUT(perturber_la_direction)) \
Bblock \
FLUCTUATION_ALEATOIRE_D_UNE_DIRECTION(direction_perturbee \
,PERTURBER_LA_DIRECTION_THETA \
,PERTURBER_LA_DIRECTION_PHI \
); \
/* Perturbation aleatoire de la 'direction' argument... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
EGAL(module_du_vecteur_direction,longF3D(direction_perturbee)); \
/* Calcul du module du vecteur direction ; on notera que ce module peut etre nul dans */ \
/* le cas exceptionnel du vecteur vitesse d'une particule immobile (cas des quarks REELs */ \
/* par exemple de temps en temps)... */ \
\
Test(IZNE(module_du_vecteur_direction)) \
Bblock \
/* Cas, par exemple, du vecteur vitesse d'une particule en mouvement : */ \
INITIALISATION_ACCROISSEMENT_3D(vecteur_unitaire_de_OX2 \
,DIVI(ASD1(direction_perturbee,dx),module_du_vecteur_direction) \
,DIVI(ASD1(direction_perturbee,dy),module_du_vecteur_direction) \
,DIVI(ASD1(direction_perturbee,dz),module_du_vecteur_direction) \
); \
/* Calcul des cosinus (l1,m1,n1) directeurs de l'axe 'OX2' que l'on aligne sur le vecteur */ \
/* direction... */ \
Test(IZNE(ASD1(vecteur_unitaire_de_OX2,dx))) \
Bblock \
GENERATION_D_UNE_VALEUR(ASD1(vecteur_unitaire_de_OY2_non_normalise,dy),FZERO,FU); \
GENERATION_D_UNE_VALEUR(ASD1(vecteur_unitaire_de_OY2_non_normalise,dz),FZERO,FU); \
\
EGAL(ASD1(vecteur_unitaire_de_OY2_non_normalise,dx) \
,DIVI(NEGA(ADD2(MUL2(ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OY2_non_normalise,dy) \
) \
,MUL2(ASD1(vecteur_unitaire_de_OX2,dz) \
,ASD1(vecteur_unitaire_de_OY2_non_normalise,dz) \
) \
) \
) \
,ASD1(vecteur_unitaire_de_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_unitaire_de_OX2,dy))) \
Bblock \
GENERATION_D_UNE_VALEUR(ASD1(vecteur_unitaire_de_OY2_non_normalise,dz),FZERO,FU); \
GENERATION_D_UNE_VALEUR(ASD1(vecteur_unitaire_de_OY2_non_normalise,dx),FZERO,FU); \
\
EGAL(ASD1(vecteur_unitaire_de_OY2_non_normalise,dy) \
,DIVI(NEGA(ADD2(MUL2(ASD1(vecteur_unitaire_de_OX2,dz) \
,ASD1(vecteur_unitaire_de_OY2_non_normalise,dz) \
) \
,MUL2(ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OY2_non_normalise,dx) \
) \
) \
) \
,ASD1(vecteur_unitaire_de_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_unitaire_de_OX2,dz))) \
Bblock \
GENERATION_D_UNE_VALEUR(ASD1(vecteur_unitaire_de_OY2_non_normalise,dx),FZERO,FU); \
GENERATION_D_UNE_VALEUR(ASD1(vecteur_unitaire_de_OY2_non_normalise,dy),FZERO,FU); \
\
EGAL(ASD1(vecteur_unitaire_de_OY2_non_normalise,dz) \
,DIVI(NEGA(ADD2(MUL2(ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OY2_non_normalise,dx) \
) \
,MUL2(ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OY2_non_normalise,dy) \
) \
) \
) \
,ASD1(vecteur_unitaire_de_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 \
\
EGAL(module_du_vecteur_unitaire_de_OY2_non_normalise,longF3D(vecteur_unitaire_de_OY2_non_normalise)); \
\
Test(IZNE(module_du_vecteur_unitaire_de_OY2_non_normalise)) \
Bblock \
INITIALISATION_ACCROISSEMENT_3D(vecteur_unitaire_de_OY2 \
,DIVI(ASD1(vecteur_unitaire_de_OY2_non_normalise,dx) \
,module_du_vecteur_unitaire_de_OY2_non_normalise \
) \
,DIVI(ASD1(vecteur_unitaire_de_OY2_non_normalise,dy) \
,module_du_vecteur_unitaire_de_OY2_non_normalise \
) \
,DIVI(ASD1(vecteur_unitaire_de_OY2_non_normalise,dz) \
,module_du_vecteur_unitaire_de_OY2_non_normalise \
) \
); \
/* Calcul des cosinus directeurs (l2,m2,n2) de l'axe 'OY2' qui est donc orthogonal a */ \
/* l'axe 'OX2', mais avec un degre d'aleatoire... */ \
Eblock \
ATes \
Bblock \
PRINT_ERREUR("le module du vecteur unitaire de 'OY2' est nul"); \
Eblock \
ETes \
\
INITIALISATION_ACCROISSEMENT_3D(vecteur_unitaire_de_OZ2 \
\
,PvectX(ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OX2,dz) \
\
,ASD1(vecteur_unitaire_de_OY2,dx) \
,ASD1(vecteur_unitaire_de_OY2,dy) \
,ASD1(vecteur_unitaire_de_OY2,dz) \
) \
\
,PvectY(ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OX2,dz) \
\
,ASD1(vecteur_unitaire_de_OY2,dx) \
,ASD1(vecteur_unitaire_de_OY2,dy) \
,ASD1(vecteur_unitaire_de_OY2,dz) \
) \
\
,PvectZ(ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OX2,dz) \
\
,ASD1(vecteur_unitaire_de_OY2,dx) \
,ASD1(vecteur_unitaire_de_OY2,dy) \
,ASD1(vecteur_unitaire_de_OY2,dz) \
) \
\
); \
/* Calcul des cosinus directeurs (l3,m3,n3) de l'axe 'OZ2' tel qu'il soit orthogonal aux */ \
/* deux axes 'OX2' et 'OY2'. On a donc '/\' representant le produit vectoriel : */ \
/* */ \
/* (l3,m3,n3) = (l1,m1,n1) /\ (l2,m2,n2). */ \
/* */ \
\
INITIALISATION_MATRICE_3D(matrice_de_rotation \
\
,ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OY2,dx) \
,ASD1(vecteur_unitaire_de_OZ2,dx) \
\
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OY2,dy) \
,ASD1(vecteur_unitaire_de_OZ2,dy) \
\
,ASD1(vecteur_unitaire_de_OX2,dz) \
,ASD1(vecteur_unitaire_de_OY2,dz) \
,ASD1(vecteur_unitaire_de_OZ2,dz) \
\
); \
/* Calcul de la matrice de rotation de l'espace physique permettant de passer de l'espace */ \
/* aligne (OX2,OY2,OZ2) a l'espace physique (OX1,OY1,OZ1). */ \
Eblock \
ATes \
Bblock \
/* Cas, par exemple, du vecteur vitesse d'une particule immobile : */ \
DEBUT_DE_ROTATION_ALEATOIRE_DE_L_ESPACE_PHYSIQUE; \
FIN_DE_ROTATION_ALEATOIRE_DE_L_ESPACE_PHYSIQUE; \
/* Dans ce cas-la, la rotation est completement aleatoire. En fait, il serait surement */ \
/* preferable de faire : */ \
/* */ \
/* DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_LE_QUARK_REEL_DOMINANT(...); */ \
/* FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_LE_QUARK_REEL_DOMINANT; */ \
/* */ \
/* mais malheureusement, la premiere de ces procedures reference la procedure courante */ \
/* 'DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(...)', d'ou */ \
/* une boucle infernale... */ \
Eblock \
ETes \
/* Debut de la sequence de rotation d'alignement dans l'espace physique. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(Float,INIT(theta_polaire,FZERO)); \
/* Direction polaire de la particule sur laquelle on s'aligne. Cet angle est donc nul, */ \
/* puisque l'on a fait coincider l'axe 'OX2' avec la direction... */ \
/* */ \
/* debut de la sequence de choix d'une direction d'alignement dans l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Eblock \
/* Fin de la sequence de choix d'une direction d'alignement dans l'espace physique. */
#define FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Eblock \
/* Fin de la sequence de rotation d'alignement dans l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N D ' A L I G N E M E N T D E L ' A X E ' O X 2 ' D E L ' E S P A C E P H Y S I Q U E */
/* S U R U N E D I R E C T I O N D O N N E E , E N C O N S E R V A N T L E P L A N ( OX , OY ) */
/* E T L ' A X E ' OZ ' E T P A S S A N T D E L ' E S P A C E P H Y S I Q U E */
/* ( O X 1 , O Y 1 , O Z 1 ) A L ' E S P A C E ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
#define DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_EN_CONSERVANT_OZ(direction,sens_de_OZ) \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(deltaF_3D,direction_perturbee); \
/* Definition d'une version perturbee aleatoirement de la 'direction' argument... */ \
DEFV(Float,INIT(module_du_vecteur_direction,FLOT__UNDEF)); \
/* Definition du module du vecteur direction ; on notera que ce module peut etre nul dans */ \
/* le cas exceptionnel du vecteur vitesse d'une particule immobile (cas des quarks REELs */ \
/* par exemple de temps en temps)... */ \
DEFV(deltaF_3D,vecteur_unitaire_de_OX2); \
/* Definition des cosinus directeurs (l1,m1,n1) de l'axe 'OX2'. */ \
DEFV(deltaF_3D,vecteur_unitaire_de_OY2); \
/* Definition des cosinus directeurs (l2,m2,n2) de l'axe 'OY2'. */ \
DEFV(deltaF_3D,vecteur_unitaire_de_OZ2); \
/* Definition des cosinus directeurs (l3,m3,n3) de l'axe 'OZ2'. */ \
\
TRANSFERT_ACCROISSEMENT_3D(direction_perturbee,direction); \
/* Transfert de la direction argument afin de pouvoir eventuellement la perturber... */ \
FLUCTUATION_ALEATOIRE_D_UNE_DIRECTION(direction_perturbee \
,PERTURBER_LA_DIRECTION_THETA \
,NE_PAS_PERTURBER_LA_DIRECTION_PHI \
); \
/* Perturbation aleatoire de la 'direction' argument, mais uniquement suivant 'theta'... */ \
\
Test(IZNE(ASD1(direction_perturbee,dz))) \
Bblock \
PRINT_ERREUR("la conservation de la Direction de 'OZ' est impossible"); \
CAL1(Prer3(" direction initiale=(%g,%g,%g)" \
,ASD1(direction,dx),ASD1(direction,dy),ASD1(direction,dz) \
) \
); \
CAL1(Prer3(" --> direction perturbee=(%g,%g,%g)\n" \
,ASD1(direction_perturbee,dx),ASD1(direction_perturbee,dy),ASD1(direction_perturbee,dz) \
) \
); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
EGAL(module_du_vecteur_direction,longF3D(direction_perturbee)); \
/* Calcul du module du vecteur direction ; on notera que ce module peut etre nul dans */ \
/* le cas exceptionnel du vecteur vitesse d'une particule immobile (cas des quarks REELs */ \
/* par exemple de temps en temps)... */ \
\
Test(IZNE(module_du_vecteur_direction)) \
Bblock \
/* Cas, par exemple, du vecteur vitesse d'une particule en mouvement : */ \
INITIALISATION_ACCROISSEMENT_3D(vecteur_unitaire_de_OX2 \
,DIVI(ASD1(direction_perturbee,dx),module_du_vecteur_direction) \
,DIVI(ASD1(direction_perturbee,dy),module_du_vecteur_direction) \
,DIVI(ASD1(direction_perturbee,dz),module_du_vecteur_direction) \
); \
/* Calcul des cosinus (l1,m1,n1) directeurs de l'axe 'OX2' que l'on aligne sur le vecteur */ \
/* direction... */ \
Eblock \
ATes \
Bblock \
/* Cas, par exemple, du vecteur vitesse d'une particule immobile : */ \
PRINT_ERREUR("un vecteur direction est nul, une direction arbitraire dans (OX,OY) est fixee"); \
INITIALISATION_ACCROISSEMENT_3D(vecteur_unitaire_de_OX2 \
,NEUT(FU) \
,NEUT(FZERO) \
,NEUT(FZERO) \
); \
/* Calcul des cosinus (l1,m1,n1) directeurs de l'axe 'OX2' que l'on aligne sur l'axe */ \
/* 'OX1' ; la rotation sera donc la transformation unite ou une rotation de pi... */ \
Eblock \
ETes \
\
INITIALISATION_ACCROISSEMENT_3D(vecteur_unitaire_de_OZ2 \
,NEUT(FZERO) \
,NEUT(FZERO) \
,MUL2(sens_de_OZ,FU) \
); \
/* Calcul des cosinus (l3,m3,n3) directeurs de l'axe 'OZ2' que l'on aligne avec l'axe */ \
/* 'OZ2', mais en changeant eventuellement de sens... */ \
\
INITIALISATION_ACCROISSEMENT_3D(vecteur_unitaire_de_OY2 \
\
,PvectX(ASD1(vecteur_unitaire_de_OZ2,dx) \
,ASD1(vecteur_unitaire_de_OZ2,dy) \
,ASD1(vecteur_unitaire_de_OZ2,dz) \
\
,ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OX2,dz) \
) \
\
,PvectY(ASD1(vecteur_unitaire_de_OZ2,dx) \
,ASD1(vecteur_unitaire_de_OZ2,dy) \
,ASD1(vecteur_unitaire_de_OZ2,dz) \
\
,ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OX2,dz) \
) \
\
,PvectZ(ASD1(vecteur_unitaire_de_OZ2,dx) \
,ASD1(vecteur_unitaire_de_OZ2,dy) \
,ASD1(vecteur_unitaire_de_OZ2,dz) \
\
,ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OX2,dz) \
) \
\
); \
/* Calcul des cosinus directeurs (l3,m3,n3) de l'axe 'OY2' tel qu'il soit orthogonal aux */ \
/* deux axes 'OZ2' et 'OX2'. On a donc '/\' representant le produit vectoriel : */ \
/* */ \
/* (l2,m2,n2) = (l3,m3,n3) /\ (l1,m1,n1). */ \
/* */ \
\
INITIALISATION_MATRICE_3D(matrice_de_rotation \
\
,ASD1(vecteur_unitaire_de_OX2,dx) \
,ASD1(vecteur_unitaire_de_OY2,dx) \
,ASD1(vecteur_unitaire_de_OZ2,dx) \
\
,ASD1(vecteur_unitaire_de_OX2,dy) \
,ASD1(vecteur_unitaire_de_OY2,dy) \
,ASD1(vecteur_unitaire_de_OZ2,dy) \
\
,ASD1(vecteur_unitaire_de_OX2,dz) \
,ASD1(vecteur_unitaire_de_OY2,dz) \
,ASD1(vecteur_unitaire_de_OZ2,dz) \
\
); \
/* Calcul de la matrice de rotation de l'espace physique permettant de passer de l'espace */ \
/* aligne (OX2,OY2,OZ2) a l'espace physique (OX1,OY1,OZ1). */ \
\
/* Debut de la sequence de rotation d'alignement dans l'espace physique. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_EN_CONSERVANT_OZ \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(Float,INIT(theta_polaire,FZERO)); \
/* Direction polaire de la particule sur laquelle on s'aligne. Cet angle est donc nul, */ \
/* puisque l'on a fait coincider l'axe 'OX2' avec la direction... */ \
/* */ \
/* Debut de la sequence de choix d'une direction d'alignement dans l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_EN_CONSERVANT_OZ \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Eblock \
/* Fin de la sequence de choix d'une direction d'alignement dans l'espace physique. */
#define FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_EN_CONSERVANT_OZ \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Eblock \
/* Fin de la sequence de rotation d'alignement dans l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N D ' A L I G N E M E N T D E L ' A X E ' O X 2 ' D E L ' E S P A C E P H Y S I Q U E */
/* S U R L E V E C T E U R V I T E S S E D ' U N E P A R T I C U L E , L E S A X E S ' O Y 2 ' E T */
/* ' O Z 2 ' E T A N T P O S I T I O N N E S A L E A T O I R E M E N T E E T */
/* P A S S A N T D E L ' E S P A C E P H Y S I Q U E ( O X 1 , O Y 1 , O Z 1 ) */
/* A L ' E S P A C E ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
#define DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UNE_PARTICULE(particule) \
BblockV \
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(ASI2(particule,espace_temps,vitesse) \
,PERTURBER_UNE_DIRECTION \
); \
/* Debut de la sequence de rotation d'alignement sur une particule dans l'espace physique. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UNE_PARTICULE \
BblockV \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
/* Direction polaire de la particule sur laquelle on s'aligne. Cet angle est donc nul, */ \
/* puisque l'on a fait coincider l'axe 'OX2' avec son vecteur vitesse... */ \
/* */ \
/* Debut de la sequence de choix d'une direction d'alignement sur une particule dans */ \
/* l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UNE_PARTICULE \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
EblockV \
/* Fin de la sequence de choix d'une direction d'alignement sur une particule dans */ \
/* l'espace physique. */
#define FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UNE_PARTICULE \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
EblockV \
/* Fin de la sequence de rotation d'alignement sur une particule dans l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N D ' A L I G N E M E N T D E L ' A X E ' O X 2 ' D E L ' E S P A C E P H Y S I Q U E */
/* V E R S U N E P A R T I C U L E D O N N E E ( P A R E X E M P L E L E Q U A R K R E E L */
/* D O M I N A N T ) , L E S A X E S ' O Y 2 ' E T ' O Z 2 ' E T A N T P O S I T I O N N E S */
/* A L E A T O I R E M E N T E T P A S S A N T D E L ' E S P A C E P H Y S I Q U E */
/* ( O X 1 , O Y 1 , O Z 1 ) A L ' E S P A C E ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
#define DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE(position,particule) \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(deltaF_3D,direction_vers_la_particule); \
/* Definition de la direction allant de la position (courante) a la particule... */ \
\
Test(IFNE(particule,PARTICULE_NON_DEFINIE)) \
Bblock \
INITIALISATION_ACCROISSEMENT_3D(direction_vers_la_particule \
,SOUS(COORDONNEES(particule,x) \
,ASD1(position,x) \
) \
,SOUS(COORDONNEES(particule,y) \
,ASD1(position,y) \
) \
,SOUS(COORDONNEES(particule,z) \
,ASD1(position,z) \
) \
); \
/* Determination de la direction allant de la position (courante) a la particule... */ \
Eblock \
ATes \
Bblock \
GENERATION_D_UNE_VALEUR(ASD1(direction_vers_la_particule,dx),NEGA(FU),NEUT(FU)); \
GENERATION_D_UNE_VALEUR(ASD1(direction_vers_la_particule,dy),NEGA(FU),NEUT(FU)); \
GENERATION_D_UNE_VALEUR(ASD1(direction_vers_la_particule,dz),NEGA(FU),NEUT(FU)); \
/* Determination d'une direction aleatoire dans le cas d'une particule indefinie. */ \
Eblock \
ETes \
\
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(direction_vers_la_particule \
,PERTURBER_UNE_DIRECTION \
); \
/* Debut de la sequence de rotation d'alignement vers une particule dans l'espace physique. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE \
BblockV \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
/* Direction polaire de la particule sur laquelle on s'aligne. Cet angle est donc nul, */ \
/* puisque l'on a fait coincider l'axe 'OX2' avec son vecteur vitesse... */ \
/* */ \
/* Debut de la sequence de choix d'une direction d'alignement vers une particule dans */ \
/* l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
EblockV \
/* Fin de la sequence de choix d'une direction d'alignement vers une particule dans */ \
/* l'espace physique. */
#define FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
Eblock \
/* Fin de la sequence de rotation d'alignement vers une particule dans l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N D ' A L I G N E M E N T D E L ' A X E ' O X 2 ' D E L ' E S P A C E P H Y S I Q U E */
/* V E R S L E Q U A R K R E E L D O M I N A N T , L E S A X E S ' O Y 2 ' E T ' O Z 2 ' E T A N T */
/* P O S I T I O N N E S A L E A T O I R E M E N T E T P A S S A N T D E L ' E S P A C E P H Y S I Q U E */
/* ( O X 1 , O Y 1 , O Z 1 ) A L ' E S P A C E ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
#define DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_LE_QUARK_REEL_DOMINANT(position) \
BblockV \
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE(position,particule_REELLE_dominante); \
/* Debut de la sequence de rotation d'alignement vers le quark REEL dominant dans l'espace */ \
/* physique. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_LE_QUARK_REEL_DOMINANT \
BblockV \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE; \
/* Debut de la sequence de choix d'une direction d'alignement vers le quark REEL dominant */ \
/* dans l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_LE_QUARK_REEL_DOMINANT \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE; \
EblockV \
/* Fin de la sequence de choix d'une direction d'alignement vers le quark REEL dominant */ \
/* dans l'espace physique. */
#define FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_LE_QUARK_REEL_DOMINANT \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_VERS_UNE_PARTICULE; \
EblockV \
/* Fin de la sequence de rotation d'alignement vers le quark REEL dominant dans l'espace */ \
/* physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N D ' A L I G N E M E N T D E L ' A X E ' O X 2 ' D E L ' E S P A C E P H Y S I Q U E */
/* E N F O N C T I O N D ' U N M O M E N T A N G U L A I R E ( P A R E X E M P L E C E L U I D U */
/* Q U A R K R E E L D O M I N A N T ) , L E S A X E S ' O Y 2 ' E T ' O Z 2 ' E T A N T */
/* P O S I T I O N N E S A L E A T O I R E M E N T E T P A S S A N T D E L ' E S P A C E P H Y S I Q U E */
/* ( O X 1 , O Y 1 , O Z 1 ) A L ' E S P A C E ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
#define DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE(position,particule) \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
Bblock \
DEFV(deltaF_3D,direction_orthogonale_au_moment_angulaire); \
/* Definition de la direction orthogonale au plan forme par le moment angulaire et le */ \
/* vecteur joignant la position a la particule... */ \
\
Test(IFNE(particule,PARTICULE_NON_DEFINIE)) \
Bblock \
INITIALISATION_ACCROISSEMENT_3D(direction_orthogonale_au_moment_angulaire \
\
,PvectX(ASI3(particule,espace_temps,moment_angulaire,dx) \
,ASI3(particule,espace_temps,moment_angulaire,dy) \
,ASI3(particule,espace_temps,moment_angulaire,dz) \
\
,SOUS(ASD1(position,x),COORDONNEES(particule,x)) \
,SOUS(ASD1(position,y),COORDONNEES(particule,y)) \
,SOUS(ASD1(position,z),COORDONNEES(particule,z)) \
) \
\
,PvectY(ASI3(particule,espace_temps,moment_angulaire,dx) \
,ASI3(particule,espace_temps,moment_angulaire,dy) \
,ASI3(particule,espace_temps,moment_angulaire,dz) \
\
,SOUS(ASD1(position,x),COORDONNEES(particule,x)) \
,SOUS(ASD1(position,y),COORDONNEES(particule,y)) \
,SOUS(ASD1(position,z),COORDONNEES(particule,z)) \
) \
\
,PvectZ(ASI3(particule,espace_temps,moment_angulaire,dx) \
,ASI3(particule,espace_temps,moment_angulaire,dy) \
,ASI3(particule,espace_temps,moment_angulaire,dz) \
\
,SOUS(ASD1(position,x),COORDONNEES(particule,x)) \
,SOUS(ASD1(position,y),COORDONNEES(particule,y)) \
,SOUS(ASD1(position,z),COORDONNEES(particule,z)) \
) \
\
); \
/* Determination de la direction orthogonale au plan forme par le moment angulaire et le */ \
/* vecteur joignant la position a la particule... */ \
Eblock \
ATes \
Bblock \
GENERATION_D_UNE_VALEUR(ASD1(direction_orthogonale_au_moment_angulaire,dx),NEGA(FU),NEUT(FU)); \
GENERATION_D_UNE_VALEUR(ASD1(direction_orthogonale_au_moment_angulaire,dy),NEGA(FU),NEUT(FU)); \
GENERATION_D_UNE_VALEUR(ASD1(direction_orthogonale_au_moment_angulaire,dz),NEGA(FU),NEUT(FU)); \
/* Determination d'une direction aleatoire dans le cas d'une particule indefinie. */ \
Eblock \
ETes \
\
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(direction_orthogonale_au_moment_angulaire \
,PERTURBER_UNE_DIRECTION \
); \
/* Debut de la sequence de rotation d'alignement orthogonalement a un moment angulaire. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE \
BblockV \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
/* Direction polaire de la particule sur laquelle on s'aligne. Cet angle est donc nul, */ \
/* puisque l'on a fait coincider l'axe 'OX2' avec son vecteur vitesse... */ \
/* */ \
/* Debut de la sequence de choix d'une direction d'alignement orthogonalement au moment */ \
/* angulaire de l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
EblockV \
/* Fin de la sequence de choix d'une direction d'alignement orthogonalement au moment */ \
/* angulaire de l'espace physique. */
#define FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE \
/* ATTENTION : on n'utilise pas ici le couple ('BblockV','EblockV') car en effet sur */ \
/* certains systemes, il est vide ; or ici, dans la mesure ou l'on redefinit des variables */ \
/* locales, il est absoluement necessaire que ce couple soit equivalent au couple */ \
/* ('Bblock','Eblock')... */ \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION; \
Eblock \
/* Fin de la sequence de rotation d'alignement orthogonalement au moment angulaire de */ \
/* l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R O T A T I O N D ' A L I G N E M E N T D E L ' A X E ' O X 2 ' D E L ' E S P A C E P H Y S I Q U E */
/* P A R R A P P O R T A U M O M E N T A N G U L A I R E D U Q U A R K R E E L D O M I N A N T , */
/* L E S A X E S ' O Y 2 ' E T ' O Z 2 ' E T A N T P O S I T I O N N E S A L E A T O I R E M E N T E T */
/* P A S S A N T D E L ' E S P A C E P H Y S I Q U E ( O X 1 , O Y 1 , O Z 1 ) A L ' E S P A C E */
/* ( O X 2 , O Y 2 , O Z 2 ) E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
#define DEBUT_DE_ROTATION_D_ALIGNEMENT_SUR_LE_MOMENT_ANGULAIRE_DU_QUARK_REEL_DOMINANT(position) \
BblockV \
DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE(position,particule_REELLE_dominante); \
/* Debut de la sequence de rotation d'alignement par rapport au moment angulaire */ \
/* du quark REEL dominant dans l'espace physique. */
#define DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_SUR_LE_MOMENT_ANGULAIRE_DU_QUARK_REEL_DOMINANT \
BblockV \
DEBUT_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE; \
/* Debut de la sequence de choix d'une direction d'alignement par rapport au moment */ \
/* angulaire du quark REEL dominant dans l'espace physique. */
#define FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_SUR_LE_MOMENT_ANGULAIRE_DU_QUARK_REEL_DOMINANT \
FIN_DE_CHOIX_D_UNE_DIRECTION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE; \
EblockV \
/* Fin de la sequence de choix d'une direction d'alignement par rapport au moment angulaire */ \
/* du quark REEL dominant dans l'espace physique. */
#define FIN_DE_ROTATION_D_ALIGNEMENT_SUR_LE_MOMENT_ANGULAIRE_DU_QUARK_REEL_DOMINANT \
FIN_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_SUR_UN_MOMENT_ANGULAIRE; \
EblockV \
/* Fin de la sequence de rotation d'alignement par rapport au moment angulaire */ \
/* du quark REEL dominant dans l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A S S A G E D ' U N E V I T E S S E P O L A I R E D E F I N I E D A N S U N */
/* P L A N P R I V I L E G I E A U N E V I T E S S E C A R T E S I E N N E */
/* D A N S L ' E S P A C E P H Y S I Q U E A T R O I S D I M E N S I O N S : */
/* */
/*************************************************************************************************************************************/
#define PAS_DE_DEPHASAGE \
FZERO \
/* Valeur d'un dephasage nul... */
#define OPPOSITION_DE_PHASE(angle) \
ADD2(angle,MOIT(CERCLE_TRIGONOMETRIQUE)) \
/* Pour passer d'un angle a cet angle dephase de PI. */
#define VITESSE_CARTESIENNE_POLAIRE(vitesse_de_la_particule,Rho_de_la_vitesse,Theta_polaire,dephasage_polaire) \
/* Voir 'DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(...)' pour */ \
/* avoir une definition precise des plans utilises et des angles de rotation... */ \
Bblock \
DEFV(deltaF_2D,vitesse_polaire_2D); \
DEFV(deltaF_3D,vitesse_polaire_3D); \
/* Vitesse de la particule dans le plan (OX2,OY2) apres rotation de l'espace physique */ \
/* avec une version tridimensionnelle pour pouvoir utiliser la procedure de produit */ \
/* matriciel 'PRODUIT_MATRICE_ACCROISSEMENT_3D(...)'. */ \
Test(IFGT(Rho_de_la_vitesse,VITESSE_DE_LA_LUMIERE)) \
Bblock \
PRINT_ERREUR("une vitesse supra-lumineuse est rencontree"); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
INITIALISATION_ACCROISSEMENT_2D(vitesse_polaire_2D \
,Xcartesienne_2D(Rho_de_la_vitesse,ADD2(Theta_polaire,dephasage_polaire)) \
,Ycartesienne_2D(Rho_de_la_vitesse,ADD2(Theta_polaire,dephasage_polaire)) \
); \
INITIALISATION_ACCROISSEMENT_3D(vitesse_polaire_3D \
,ASD1(vitesse_polaire_2D,dx) \
,ASD1(vitesse_polaire_2D,dy) \
,FZERO \
); \
/* Calcul des composantes cartesiennes de la vitesse de la particule dans le plan (OX2,OY2), */ \
/* avec prise en compte d'un dephasage 'dephasage_polaire' de 'Theta_polaire' dans ce plan, */ \
/* et ce afin de generer eventuellement plusieurs particules coplanaires (voir par exemple */ \
/* a ce propos 'STRONG_CREATION_V___GxGxG' ou 'STRONG_CREATION_V___GxGxGxG'). */ \
\
PRODUIT_MATRICE_ACCROISSEMENT_3D(vitesse_de_la_particule \
,matrice_de_rotation \
,vitesse_polaire_3D \
); \
/* Calcul des composantes cartesiennes de la vitesse de la particule dans l'espace */ \
/* physique (OX1,OY1,OZ1) par rotation des axes a l'aide de la matrice */ \
/* 'matrice_de_rotation'. On notera avec interet que les elements '(cx,cz)', '(cy,cz)' */ \
/* et '(cz,cz)' n'interviennent pas (puisque multiplies par 0) mais sont quand meme */ \
/* calcules par raison de symetrie... */ \
Eblock \
/* Conversion d'une vitesse exprimee en coordonnees polaires {rho,theta} dans le plan */ \
/* (OX2,OY2) en une vitesse exprimee en coordonnees cartesiennes {dx,dy,dz} dans l'espace */ \
/* physique (OX1,OY1,OZ1). */
#define VITESSE_CARTESIENNE_SPHERIQUE(vitesse_de_la_particule,Rho_de_la_vitesse,Theta_spherique,Phi_spherique) \
/* Voir 'DEBUT_DE_ROTATION_D_ALIGNEMENT_DE_L_ESPACE_PHYSIQUE_DANS_UNE_DIRECTION(...)' pour */ \
/* avoir une definition precise des plans utilises et des angles de rotation... */ \
Bblock \
Test(IFGT(Rho_de_la_vitesse,VITESSE_DE_LA_LUMIERE)) \
Bblock \
PRINT_ERREUR("une vitesse supra-lumineuse est rencontree"); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
INITIALISATION_ACCROISSEMENT_3D(vitesse_de_la_particule \
,Xcartesienne_3D(Rho_de_la_vitesse,Theta_spherique,Phi_spherique) \
,Ycartesienne_3D(Rho_de_la_vitesse,Theta_spherique,Phi_spherique) \
,Zcartesienne_3D(Rho_de_la_vitesse,Theta_spherique,Phi_spherique) \
); \
Eblock \
/* Conversion d'une vitesse exprimee en coordonnees spheriques {rho,theta,phi} en une */ \
/* vitesse exprimee en coordonnees cartesiennes {dx,dy,dz}. */