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



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.