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