/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D U   T E M P S  :                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrq/nucleon.L3$I' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1991??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L ' H O R L O G E   U N I V E R S E L L E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#TestADef NOMBRE_DE_PERIODES_DE_LA_SIMULATION                                                                                           \
                    SOIXANTE_QUATRE                                                                                                     \
                                        /* Definition du nombre de periodes, c'est-a-dire du nombre d'instants simules.              */
DEFV(Local,DEFV(Positive,INIT(nombre_de_periodes_de_la_simulation,NOMBRE_DE_PERIODES_DE_LA_SIMULATION)));
                                        /* Definition du nombre de periodes, c'est-a-dire du nombre d'instants simules.              */

#TestADef NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION                                                                                   \
                    DIX_MILLE                                                                                                           \
                                        /* Definition du nombre maximal de periodes de la simulation. Le 19970408111923 et a cause   */ \
                                        /* du programme 'v $xrv/particule.10$K', cette definition est passee de '#define' a          */ \
                                        /* a '#TestADef' afin de pouvoir etre pre-definie (avec une valeur plus grande...).          */

#define   NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION                                                                                \
                    PREMIERE_ITERATION_D_UN_Komp                                                                                        \
                                        /* Definition du numero de la premiere periode de la simulation...                           */
DEFV(Local,DEFV(Positive,INIT(numero_de_la_periode_courante,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION)));
                                        /* Definition du numero de la periode courante.                                              */

#define   NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION_A_VISUALISER                                                                   \
                    NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION                                                                      \
                                        /* Definition du numero de la premiere periode de la simulation...                           */
DEFV(Local,DEFV(Positive,INIT(numero_de_la_premiere_periode_a_visualiser
                             ,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION_A_VISUALISER
                              )
                )
     );
                                        /* Definition du numero de la premiere periode a visualiser, ce qui permet de se             */
                                        /* repositionner rapidement dans le modele en cas de defaut (coupure de courant,...).        */
#define   PERIODE_INITIALE_DE_L_HORLOGE                                                                                                 \
                    GRO1(FRA1(DIVI(DIVI(DIAMETRE_D_UN_HADRON,VITESSE_DE_LA_LUMIERE)                                                     \
                                  ,FLOT(NOMBRE_DE_PERIODES_DE_LA_SIMULATION)                                                            \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la periode initiale de l'horloge : elle est choisie de facon a ce que la    */ \
                                        /* duree de la simulation soit de l'ordre de grandeur du temps necessaire a un photon pour   */ \
                                        /* traverser le proton...                                                                    */
DEFV(Local,DEFV(Float,INIT(periode_initiale_de_l_horloge,PERIODE_INITIALE_DE_L_HORLOGE)));
                                        /* Definition de la periode de l'horloge : elle est choisie de facon a ce qu'un photon       */
                                        /* ait le temps de traverser le proton pendant le temps de la simulation...                  */

#define   INSTANT_INITIAL                                                                                                               \
                    FZERO                                                                                                               \
                                        /* Definition de l'instant de debut de la simulation.                                        */
DEFV(Local,DEFV(Float,INIT(instant_initial,INSTANT_INITIAL)));
DEFV(Local,DEFV(Float,INIT(temps_courant,INSTANT_INITIAL)));
                                        /* Definition de l'instant de debut de la simulation et du temps courant. On notera que      */
                                        /* l'introduction de 'instant_initial' a eu lieu le 19980925093711.                          */
#define   RE_INITIALISATION_DE_L_HORLOGE                                                                                                \
                    Bblock                                                                                                              \
                    EGAL(temps_courant,instant_initial);                                                                                \
                    Eblock                                                                                                              \
                                        /* (re-)initialisation de l'horloge...                                                       */

#define   RALENTISSEMENT_DE_L_HORLOGE(periode,temps)                                                                                    \
                    NEUT(periode)                                                                                                       \
                                        /* Fonction destinee, par exemple, a ralentir l'horloge de simulation au cours du temps...   */
#define   PERIODE_COURANTE_DE_L_HORLOGE                                                                                                 \
                    RALENTISSEMENT_DE_L_HORLOGE(tSCALE(periode_initiale_de_l_horloge),temps_courant)                                    \
                                        /* La periode reelle de l'horloge peut, si cela est souhaite, varier avec le temps...        */
#define   INCREMENTATION_DE_L_HORLOGE(top)                                                                                              \
                    Bblock                                                                                                              \
                    INCR(temps_courant,top);                                                                                            \
                    Eblock                                                                                                              \
                                        /* Incrementation de l'horloge.                                                              */
#define   TOP_D_HORLOGE                                                                                                                 \
                    Bblock                                                                                                              \
                    INCREMENTATION_DE_L_HORLOGE(PERIODE_COURANTE_DE_L_HORLOGE);                                                         \
                    INCR(numero_de_la_periode_courante,I);                                                                              \
                    Eblock                                                                                                              \
                                        /* Simulation des "tops" de l'horloge universelle.                                           */

#define   ECHELLE_DE_TEMPS                                                                                                              \
                    FU
DEFV(Local,DEFV(Float,INIT(echelle_de_temps,ECHELLE_DE_TEMPS)));
                                        /* Constante destinee a ralentir (<1) ou acceler (>1) le temps. ATTENTION : la modification  */
                                        /* de l'echelle de temps a des consequences sur les voisinages des particules (voir celui    */
                                        /* qui s'appelle 'voisinage_1_D1_D2') lorsque l'on accelere. On lira les commentaires de     */
                                        /* validation dans '$xrq/nucleon.LY.?$I' avec profit. En effet, plus on accelere, moins l'on */
                                        /* a de chance de voir des particules se froler, puisqu'alors l'echantillonnage temporel est */
                                        /* beaucoup moins precis et fin...                                                           */
#define   tSCALE(variable_temporelle)                                                                                                   \
                    MUL2(variable_temporelle,echelle_de_temps)
#define   tiSCALE(variable_temporelle)                                                                                                  \
                    DIVI(variable_temporelle,echelle_de_temps)
                                        /* Variation lineaire d'une grandeur (periode de l'horloge ou encore nombre d'evenements)    */
                                        /* permettant d'acceler ou ralentir le deroulement de la simulation...                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N   D E   D I S T O R S I O N   T E M P O R E L L E   D E S   P R O B A B I L I T E S                        */
/*        E T   D E S   N O M B R E S   D ' E V E N E M E N T S   S U I V A N T   U N   P H E N O M E N E                            */
/*        G E N E R A L   D E   V I E I L L I S S E M E N T   L I E   A   L ' H O R L O G E  :                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Principe :                                                                                                                 */
/*                                                                                                                                   */
/*                    Les probabilites (et les nombres d'evenements                                                                  */
/*                  eventuellement) vont dependre de l'echelle                                                                       */
/*                  temporelle d'observation : plus les durees                                                                       */
/*                  seront breves, et plus les evenements seront                                                                     */
/*                  improbables...                                                                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Fonction utilisee pour les nombres d'evenements :                                                                          */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                    V ^                                                                                            */
/*                                      |                                                                                            */
/*                                      |                                                                                            */
/*                                   Vn | . . . . . . . . . . . . . . . . . . . . . . . . .                                          */
/*                                      |               *     *      *       *        *                                              */
/*                                      |          *                                                                                 */
/*                                   Vc | . . . *                                                                                    */
/*                                      |       .                                                                                    */
/*                                      |    *  .                                                                                    */
/*                                      |       .                                                                                    */
/*                                      |  *    .                                                                                    */
/*                                      |       .                                                                                    */
/*                            ----------O------------------------------------------------->                                          */
/*                                      |      dtc                                      dt                                           */
/*                                      |                                                                                            */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                    dt                                                                             */
/*                                                Vn.-----                                                                           */
/*                                                    dtc                                                                            */
/*                                      V = -------------------- = V(dt,Vc,dtc,Vn)                                                   */
/*                                            dt           Vn                                                                        */
/*                                           ----- + (1 - ----)                                                                      */
/*                                            dtc          Vc                                                                        */
/*                                                                                                                                   */
/*                  ou :                                                                                                             */
/*                                                                                                                                   */
/*                  'dt'      : designe une duree "courante",                                                                        */
/*                  'dtc'     : designe la duree "caracteristique",                                                                  */
/*                  'Vc'      : designe la valeur caracteristique de 'V' pour dt=dtc,                                                */
/*                  'Vn'      : designe la valeur caracteristique de 'V' pour dt=infini,                                             */
/*                  'V'       : designe la valeur distordue pour 'dt' quelconque.                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Fonction utilisee pour les probabilites :                                                                                  */
/*                                                                                                                                   */
/*                    Soit 'P' une probabilite ; les tests qui sont                                                                  */
/*                  effectues pour savoir si l'evenement associe 'E(P)'                                                              */
/*                  va avoir lieu, sont du type (avec P E [0,1]) :                                                                   */
/*                                                                                                                                   */
/*                                      SI (P <= seuil) ALORS E(P);                                                                  */
/*                                                                                                                                   */
/*                    Ainsi, si l'on veut que les evenements deviennent                                                              */
/*                  improbables lorsque 'dt' tend vers 0, il convient que                                                            */
/*                  'P' augmente quand 'dt' diminue, et varie donc a                                                                 */
/*                  l'inverse de 'V' ci dessus... On prendra donc, pour                                                              */
/*                  les probabilites la fonction suivante :                                                                          */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                    P ^                                                                                            */
/*                                      |                                                                                            */
/*                                      |                                                                                            */
/*                                   Pn *                                                                                            */
/*                                      |                                                                                            */
/*                                      |                                                                                            */
/*                                      | *                                                                                          */
/*                                      |                                                                                            */
/*                                      |    *                                                                                       */
/*                                   Pc | . . . *                                                                                    */
/*                                      |       .  *                                                                                 */
/*                                      |       .       *     *      *       *        *                                              */
/*                            ----------O------------------------------------------------->                                          */
/*                                      |      dtc                                      dt                                           */
/*                                      |                                                                                            */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                       1                                                                           */
/*                                      P = ---------------------------- = P(dt,Pc,dtc,Pn)                                           */
/*                                            dt     1      1       1                                                                */
/*                                           -----.(---- - ----) + ----                                                              */
/*                                            dtc    Pc     Pn      Pn                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                  ou :                                                                                                             */
/*                                                                                                                                   */
/*                  'dt'      : designe une duree "courante",                                                                        */
/*                  'dtc'     : designe la duree "caracteristique",                                                                  */
/*                  'Pc'      : designe la valeur caracteristique de 'P' pour dt=dtc,                                                */
/*                  'Pn'      : designe la valeur caracteristique de 'P' pour dt=infini (c'est-a-dire 'EVENEMENT_CERTAIN'),          */
/*                  'P'       : designe la valeur distordue pour 'dt' quelconque.                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N   D E   D I S T O R S I O N   T E M P O R E L L E   D E S   N O M B R E S   D ' E V E N E M E N T S        */
/*        S U I V A N T   L A   P E R I O D E   C O U R A N T E   D E   L ' H O R L O G E  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   nDISTORSION(dt,Vc,dtc,Vn)                                                                                                     \
                    DIVI(MUL2(Vn                                                                                                        \
                             ,DIVI(dt,dtc)                                                                                              \
                              )                                                                                                         \
                        ,ADD2(DIVI(dt,dtc)                                                                                              \
                             ,DIVI(SOUS(Vn,Vc),Vc)                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Fonction generale de distorsion d'une valeur 'Vc(dtc)' pour 'dt'.                         */
#define   fNOMBRE(nombre_d_evenements)                                                                                                  \
                    INTE(nDISTORSION(PERIODE_COURANTE_DE_L_HORLOGE                                                                      \
                                    ,tSCALE(FLOT(nombre_d_evenements))                                                                  \
                                    ,PERIODE_INITIALE_DE_L_HORLOGE                                                                      \
                                    ,INFINI                                                                                             \
                                     )                                                                                                  \
                         )                                                                                                              \
                                        /* Fonction de distorsion d'un nombre d'evenements en fonction de la periode courante        */ \
                                        /* de l'horloge.                                                                             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N   D E   D I S T O R S I O N   T E M P O R E L L E   D E S   P R O B A B I L I T E S   S U I V A N T        */
/*        L ' A G E   D E S   P A R T I C U L E S   O U   L A   P E R I O D E   C O U R A N T E   D E   L ' H O R L O G E  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   pDISTORSION(dt,Pc,dtc,Pn)                                                                                                     \
                    ADD2(EVENEMENT_IMPOSSIBLE                                                                                           \
                        ,INVE(AXPB(SOUS(INVE(Pc),INVE(Pn))                                                                              \
                                  ,DIVI(dt,dtc)                                                                                         \
                                  ,INVE(Pn)                                                                                             \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Fonction generale de distorsion d'une probabilite 'Pc(dtc)' pour 'dt'.                    */
#define   hPROBABILITE(probabilite)                                                                                                     \
                    pDISTORSION(PERIODE_COURANTE_DE_L_HORLOGE                                                                           \
                               ,probabilite                                                                                             \
                               ,PERIODE_INITIALE_DE_L_HORLOGE                                                                           \
                               ,EVENEMENT_CERTAIN                                                                                       \
                                )                                                                                                       \
                                        /* Fonction de distorsion d'une probabilite en fonction de la periode courante de l'horloge. */
#define   DUREE_DE_VIE_MOYENNE_INITIALE(particule)                                                                                      \
                    ASI2(particule,espace_temps,duree_de_vie_moyenne_initiale)                                                          \
                                        /* Valeur initiale de la duree de vie moyenne d'une particule ; il est necessaire de la      */ \
                                        /* memoriser pour chaque particule, car en effet, 'duree_de_vie_moyenne_courante' peut       */ \
                                        /* augmenter au cours du temps lorsque, par exemple une particule 'Q' ou 'AQ' est "visee"    */ \
                                        /* par un 'G'. Or rien empeche qu'un meme 'Q' ou 'AQ' soit "vise" par plusieurs 'G' ; si     */ \
                                        /* tel est le cas, il ne faut pas que 'duree_de_vie_moyenne_courante' augmente demesurement  */ \
                                        /* dans 'ALLONGEMENT_DE_LA_DUREE_DE_VIE_MOYENNE(...)', la comparaison relative des deux      */ \
                                        /* valeurs 'duree_de_vie_moyenne_initiale' et  'duree_de_vie_moyenne_courante' permet de     */ \
                                        /* savoir ou l'on en est...                                                                  */
#define   DUREE_DE_VIE_MOYENNE_COURANTE(particule)                                                                                      \
                    ASI2(particule,espace_temps,duree_de_vie_moyenne_courante)                                                          \
                                        /* Duree de vie moyenne d'une particule ; on notera que cette duree peut varier au cours de  */ \
                                        /* la vie, et en particulier augmenter (c'est par exemple le cas des particules 'Q', 'AQ'    */ \
                                        /* ou 'G' en attente de collisions apres 'INTERCEPTION_PARTICULE_PAR_UN_GLUON(...)').        */
#define   AGE(particule)                                                                                                                \
                    SOUS(temps_courant,ASI2(particule,espace_temps,date_de_naissance))                                                  \
                                        /* Age d'une particule...                                                                    */
#define   aPROBABILITE(probabilite,particule,duree_de_vie_moyenne_de_la_particule)                                                      \
                    pDISTORSION(AGE(particule)                                                                                          \
                               ,probabilite                                                                                             \
                               ,MOIT(duree_de_vie_moyenne_de_la_particule)                                                              \
                               ,EVENEMENT_CERTAIN                                                                                       \
                                )                                                                                                       \
                                        /* La probabilite d'un evenement est faible pour une particule jeune (voire nulle, si la     */ \
                                        /* particule vient de naitre grace a 'FLUCTUATIONS_QUANTIQUES_DU_VIDE' par exemple), alors   */ \
                                        /* qu'elle augmente lorsque cette meme particule vieillit. Enfin, on notera que c'est        */ \
                                        /* 'MOIT(duree_de_vie_moyenne_de_la_particule)' que l'on utilise arbitrairement...           */



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.