/*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E L A G E O M E T R I E : */ /* */ /* */ /* Author of '$xrq/nucleon.L7$I' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 1991??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A M P G A U S S I E N Q U E L C O N Q U E : */ /* */ /* */ /* Definition : */ /* */ /* Un champ Gaussien est defini, en */ /* coordonnees spheriques, par la */ /* formule : */ /* */ /* 2 */ /* -etalement.r */ /* G(r) = e */ /* */ /* */ /* ......... */ /* ......................... */ /* ................................. */ /* ..............:::::::::::.............. */ /* ..........:::::::::::::::::::::::.......... */ /* .........:::::::::::-------:::::::::::......... */ /* ........::::::::-------------------::::::::........ */ /* .......::::::--------+++++++++++--------::::::....... */ /* .......::::::------+++++++++++++++++++------::::::....... */ /* .......:::::-----++++++ooooooooooooo++++++-----:::::....... */ /* .......:::::----+++++ooooooooo*ooooooooo+++++----:::::....... */ /* ......:::::----++++ooooo*************ooooo++++----:::::...... */ /* ......:::::----+++ooooo*******###*******ooooo+++----:::::...... */ /* ......::::----+++oooo*****###########*****oooo+++----::::...... */ /* ......:::::---++++ooo****###############****ooo++++---:::::..... */ /* ......::::----+++oooo****###############****oooo+++----::::..... */ /* ......::::----+++ooo****#################****ooo+++----::::..... */ /* ......::::----+++oooo****###############****oooo+++----::::..... */ /* ......:::::---++++ooo****###############****ooo++++---:::::..... */ /* ......::::----+++oooo*****###########*****oooo+++----::::...... */ /* ......:::::----+++ooooo*******###*******ooooo+++----:::::...... */ /* ......:::::----++++ooooo*************ooooo++++----:::::...... */ /* .......:::::----+++++ooooooooo*ooooooooo+++++----:::::....... */ /* .......:::::-----++++++ooooooooooooo++++++-----:::::....... */ /* .......::::::------+++++++++++++++++++------::::::....... */ /* .......::::::--------+++++++++++--------::::::....... */ /* ........::::::::-------------------::::::::........ */ /* .........:::::::::::-------:::::::::::......... */ /* ..........:::::::::::::::::::::::.......... */ /* ..............:::::::::::.............. */ /* ................................. */ /* ......................... */ /* ......... */ /* */ /* */ /*************************************************************************************************************************************/ #define __CHAMP_GAUSSIEN(distance,etalement) \ EXEX(NEGA(MUL2(etalement,EXP2(distance)))) \ /* Definition d'un champ gaussien tridimensionnel en coordonnees spheriques. */ =define CHAMP_GAUSSIEN(distance,etalement) \ champ_gaussien(distance,etalement) /* Definition d'un champ gaussien tridimensionnel en coordonnees spheriques. */ BFonctionF DEFV(Local,DEFV(FonctionF,champ_gaussien(distance,etalement))) DEFV(Argument,DEFV(Float,distance)); /* Distance 'r'. */ DEFV(Argument,DEFV(Float,etalement)); /* Etalement... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(champ,FLOT__UNDEF)); /* Variable locale destinee a contenir la valeur du champ gaussien. */ /*..............................................................................................................................*/ EGAL(champ,__CHAMP_GAUSSIEN(distance,etalement)); /* Calcul du champ gaussien. */ #ifdef MODE_TEST_OVERFLOW_ET_UNDERFLOW Test(IFLT(champ,RACX(F_EPSILON))) Bblock EGAL(champ,FZERO); /* Seuillage du champ pour eviter des underflows. Il est necessaire de prendre un seuil tres */ /* petit car, en effet, les 'CHAMP_GAUSSIEN(...)' ont bien souvent des valeurs tres faibles. */ /* Mais il ne faut que cette valeur soit directement 'F_EPSILON', d'ou le 'RACX(...)', car, */ /* en effet, cette valeur de champ peut etre utilisee pour des nombres aleatoires inferieurs */ /* a ce meme champ ; il faut donc une marge de manoeuvre entre 'F_EPSILON' et le seuil... */ Eblock ATes Bblock Eblock ETes #Aifdef MODE_TEST_OVERFLOW_ET_UNDERFLOW #Eifdef MODE_TEST_OVERFLOW_ET_UNDERFLOW RETU(champ); Eblock EFonctionF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E D I S T A N C E S G E N E R A L I S E E S : */ /* */ /* */ /* Definition : */ /* */ /* Afin de definir une fonction de densite */ /* caracteristique de la structure du proton, */ /* on va definir des distances dites d'ordre */ /* 'N' et qui ont la propriete d'etre constante */ /* et minimale (nulle dans le cas present) a */ /* l'interieur de sous-espaces caracteristiques */ /* de dimension N. Ces sous-espaces sont du */ /* type N-polyedriques. */ /* */ /* Ces definitions permettent une definition */ /* beaucoup plus souple de la geometrie du proton, */ /* en permettant par exemple des deformations mais */ /* aussi, ulterieurement, des collisions... */ /* */ /* */ /* ATTENTION : */ /* */ /* Ces distances sont definies en unite de type */ /* 'pNORM(...)', d'ou le traitement particulier des */ /* des distances dites "caracteristiques"... */ /* */ /* */ /*************************************************************************************************************************************/ #define PRENDRE_EN_COMPTE_LES_DISTANCES_CARACTERISTIQUES \ FAUX DEFV(Local,DEFV(Logical,INIT(prendre_en_compte_les_distances_caracteristiques,PRENDRE_EN_COMPTE_LES_DISTANCES_CARACTERISTIQUES))); /* Cet indicateur indique s'il les distances caracteristiques definies ci-apres sont a */ /* prendre encompte ('VRAI') ou a ignorer ('FAUX'), auquel cas, elles sont remplacees par */ /* l'infini... */ #define DISTANCE_CARACTERISTIQUE(dc,pdc,DC) \ fCOND(IL_FAUT(prendre_en_compte_les_distances_caracteristiques) \ ,AXPB(pdc,SOUS(dc,DC),DC) \ ,MUL2(MUL2(F_INFINI,LONGUEUR_DE_RENORMALISATION),LONGUEUR_DE_RENORMALISATION) \ ) \ /* Lorsque la distance caracteristique courante 'dc' doit etre prise en compte (voir */ \ /* 'prendre_en_compte_les_distances_caracteristiques'), elle est renormalisee en fonction */ \ /* de deux parametres qui sont sa derivee 'pdc' (ou "pente"), et sa valeur standard 'DC' */ \ /* suivant une formule lineaire : */ \ /* */ \ /* ^ */ \ /* f(dc) | + */ \ /* | + */ \ /* DC |. . . . . .+ */ \ /* | + . */ \ /* | + . */ \ /* | + . */ \ /* + . */ \ /* | . */ \ /* O------------------------------> */ \ /* DC dc */ \ /* */ \ /* on a donc : */ \ /* */ \ /* f(dc) = pdc.(dc - DC) + DC */ \ /* */ \ /* ce qui permet, avec une pente faible (0 < pdc < 1), de limiter l'influence de 'dc'. Dans */ \ /* le cas ou elle est ignoree, on a : */ \ /* */ \ /* f(dc) = +INFINI */ \ /* */ \ /* ce qui fait qu'elle est "perdante" dans les 'fMIN2(...)'... On notera que l'infini */ \ /* utilisee est le "vrai" infini multiplie deux fois par la longueur caracteristique de */ \ /* renormalisation, car en effet, on trouve ci-apres : */ \ /* */ \ /* pNORM(DISTANCE_CARACTERISTIQUE(dc1,pdc1,DC1)) */ \ /* */ \ /* et : */ \ /* */ \ /* pNORM(pNORM(DISTANCE_CARACTERISTIQUE(dc2,pdc2,DC2))) */ \ /* */ \ /* qui causeraient (si l'on utilisait le "vrai") des overflows... */ #define DISTANCE_ORDRE_0(cX,cY,cZ,Pi,dc0,pdc0,DC0) \ RdisF3D(pNORM(cX),pNORM(cY),pNORM(cZ) \ ,pNORM(COORDONNEES(Pi,x)),pNORM(COORDONNEES(Pi,y)),pNORM(COORDONNEES(Pi,z)) \ ) \ /* Definition de la distance d'ordre 0 (ou "distance a un point") : il s'agit tout */ \ /* simplement de la distance euclidienne au point P . Soit alors un point 'M' quelconque, */ \ /* i */ \ /* on a : */ \ /* */ \ /* |---->| */ \ /* d0(M,P ) = | MP | */ \ /* i | i | */ \ /* */ \ /* ou l'on notera que la distance caracteristique 'dc0' n'est pas utilisee (puisqu'un point */ \ /* n'a pas de dimension), et n'est la que par raison de symetrie avec les ordres superieurs. */ \ /* On notera que cette fonction d0(M,P ) est constante et minimale au point P (elle vaut */ \ /* i i */ \ /* vaut alors 0), et que partout ailleurs, elle varie par valeurs superieures... */ #define DISTANCE_ORDRE_1(cX,cY,cZ,Pi,Pj,dc0,pdc0,DC0,dc1,pdc1,DC1) \ SOUS(ADD2(DISTANCE_ORDRE_0(cX,cY,cZ \ ,Pi \ ,dc0,pdc0,DC0 \ ) \ ,DISTANCE_ORDRE_0(cX,cY,cZ \ ,Pj \ ,dc0,pdc0,DC0 \ ) \ ) \ ,fMIN2(RdisF3D(pNORM(COORDONNEES(Pi,x)),pNORM(COORDONNEES(Pi,y)),pNORM(COORDONNEES(Pi,z)) \ ,pNORM(COORDONNEES(Pj,x)),pNORM(COORDONNEES(Pj,y)),pNORM(COORDONNEES(Pj,z)) \ ) \ ,pNORM(DISTANCE_CARACTERISTIQUE(dc1,pdc1,DC1)) \ ) \ ) \ /* Definition de la distance d'ordre 1 (ou "distance a un segment") : il s'agit de la */ \ /* somme des distances euclidiennes aux deux points P et P moins la longueur de P P . */ \ /* i j i j */ \ /* Soit alors un point 'M' quelconque, on a : */ \ /* */ \ /* |---->| |---->| |----->| */ \ /* d1(M,P ,P ) = (| MP | + | MP |) - min(| P P | , dc1) */ \ /* i j | i | | j | | i j | */ \ /* */ \ /* ou 'dc1' designe une distance caracteristique d'ordre 1, qui permet, de minimiser */ \ /* l'influence du segment [P ,P ] lorsque sa longueur est trop grande par rapport a cette */ \ /* i j */ \ /* longueur caracteristique. */ \ /* On notera que cette fonction d1(M,P ,P ) est constante et minimale sur le segment [P ,P ] */ \ /* i j i j */ \ /* (elle vaut alors 0 lorsque l'on est en dessous de la longueur caracteristique 'dc1'), et */ \ /* que partout ailleurs, elle varie par valeurs superieures... Enfin, on remarquera */ \ /* l'utilisation de 'fMIN2(...)' a la place de 'MIN2(...)' afin d'alleger le travail */ \ /* du compilateur... */ \ /* */ \ /* ATTENTION, voir la remarque faite au sujet de : */ \ /* */ \ /* pNORM(DISTANCE_CARACTERISTIQUE(dc1,pdc1,DC1)) */ \ /* */ \ /* dans la definition de 'DISTANCE_CARACTERISTIQUE(...)'. */ #define DISTANCE_ORDRE_2(cX,cY,cZ,Pi,Pj,Pk,dc0,pdc0,DC0,dc1,pdc1,DC1,dc2,pdc2,DC2) \ SOUS(ADD3(AIRE_TRIANGLE_3D(pNORM(cX),pNORM(cY),pNORM(cZ) \ ,pNORM(COORDONNEES(Pi,x)),pNORM(COORDONNEES(Pi,y)),pNORM(COORDONNEES(Pi,z)) \ ,pNORM(COORDONNEES(Pj,x)),pNORM(COORDONNEES(Pj,y)),pNORM(COORDONNEES(Pj,z)) \ ) \ ,AIRE_TRIANGLE_3D(pNORM(cX),pNORM(cY),pNORM(cZ) \ ,pNORM(COORDONNEES(Pj,x)),pNORM(COORDONNEES(Pj,y)),pNORM(COORDONNEES(Pj,z)) \ ,pNORM(COORDONNEES(Pk,x)),pNORM(COORDONNEES(Pk,y)),pNORM(COORDONNEES(Pk,z)) \ ) \ ,AIRE_TRIANGLE_3D(pNORM(cX),pNORM(cY),pNORM(cZ) \ ,pNORM(COORDONNEES(Pk,x)),pNORM(COORDONNEES(Pk,y)),pNORM(COORDONNEES(Pk,z)) \ ,pNORM(COORDONNEES(Pi,x)),pNORM(COORDONNEES(Pi,y)),pNORM(COORDONNEES(Pi,z)) \ ) \ ) \ ,fMIN2(AIRE_TRIANGLE_3D(pNORM(COORDONNEES(Pi,x)),pNORM(COORDONNEES(Pi,y)),pNORM(COORDONNEES(Pi,z)) \ ,pNORM(COORDONNEES(Pj,x)),pNORM(COORDONNEES(Pj,y)),pNORM(COORDONNEES(Pj,z)) \ ,pNORM(COORDONNEES(Pk,x)),pNORM(COORDONNEES(Pk,y)),pNORM(COORDONNEES(Pk,z)) \ ) \ ,pNORM(pNORM(DISTANCE_CARACTERISTIQUE(dc2,pdc2,DC2))) \ ) \ ) \ /* Definition de la distance d'ordre 2 (ou "distance a un triangle") : il s'agit de la */ \ /* somme des aires des trois triangles que l'on forme avec comme sommet commun un point */ \ /* 'M' quelconque et les trois points P , P et P moins l'aire du triangle P P P . On */ \ /* i j k i j k */ \ /* a donc : */ \ /* */ \ /* 1 |----> ---->| |----> ---->| |----> ---->| */ \ /* d2(M,P ,P ,P ) = ---.(| PM /\ PM | + | PM /\ PM | + | PM /\ PM |) */ \ /* i j k 2 | i j | | j k | | k i | */ \ /* */ \ /* 1 |-----> ----->| */ \ /* - min(---.(| M M /\ M M |) , dc2) */ \ /* 2 | i j i k | */ \ /* */ \ /* ou 'dc2' designe une distance caracteristique d'ordre 2, qui permet, de minimiser */ \ /* l'influence du triangle [P ,P ,P ] lorsque sa longueur est trop grande par rapport a */ \ /* i j k */ \ /* cette longueur caracteristique. */ \ /* On notera que cette fonction d2(M,P ,P ,P ) est constante et minimale dans le triangle */ \ /* i j k */ \ /* [P ,P ,P ] (elle vaut alors 0 lorsque l'on est en dessous de la longueur caracteristique */ \ /* i j k */ \ /* 'dc2'), et que partout ailleurs, elle varie par valeurs superieures... Enfin, on */ \ /* remarquera l'utilisation de 'fMIN2(...)' a la place de 'MIN2(...)' afin d'alleger le */ \ /* travail du compilateur... */ \ /* */ \ /* ATTENTION, voir la remarque faite au sujet de : */ \ /* */ \ /* pNORM(pNORM(DISTANCE_CARACTERISTIQUE(dc2,pdc2,DC2))) */ \ /* */ \ /* dans la definition de 'DISTANCE_CARACTERISTIQUE(...)'. */