/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D E   L A   G E N E R A T I O N   D E S   I M A G E S  :                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota important :                                                                                                           */
/*                                                                                                                                   */
/*                    Le numero des images, via la procedure                                                                         */
/*                  'NUMERO_DE_L_IMAGE(...)' ne peut etre                                                                            */
/*                  parametre car, en effet, il est donne                                                                            */
/*                  directement par 'numero_de_la_periode_courante',                                                                 */
/*                  qui lui-meme est fixe par un 'Komp(...)'.                                                                        */
/*                  Le numero de la premiere image generee est                                                                       */
/*                  donc egal a 'PREMIERE_ITERATION_D_UN_Komp',                                                                      */
/*                  c'est-a-dire 1, et ne peut donc etre                                                                             */
/*                  modifie...                                                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrq/nucleon.LN$I' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 1991??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V O L U T I O N   D ' U N E   C O M P O S A N T E   A F I N   D E   L I M I T E R                                    */
/*        L ' A L I A S I N G   S U R   L E S   I M A G E S   F I X E S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   CONVOLUER_LE_NOIR                                                                                                             \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(convoluer_le_NOIR,CONVOLUER_LE_NOIR)));
                                        /* Indicateur disant si le niveau 'NOIR' est "traitable" lors de la convolution, ce qui      */
                                        /* fixe donc la valeur qui lui est associee dans 'niveaux_a_traiter_lors_d_une_convolution'. */

#define   CONVOLUTION_A_NOYAU_VARIABLE                                                                                                  \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(convolution_a_noyau_variable,CONVOLUTION_A_NOYAU_VARIABLE)));
                                        /* Indicateur disant si le noyau de convolution est "statique" ('FAUX') ou bien variable     */
                                        /* ('VRAI') et calcule a partir du complement de la composante courante. Dans ce cas, il     */
                                        /* semble preferable d'avoir :                                                               */
                                        /*                                                                                           */
                                        /*                  convoluer_le_NOIR = VRAI.                                                */
                                        /*                                                                                           */

DEFV(Local,DEFV(Logical,DTb1(niveaux_a_traiter_lors_d_une_convolution,COULEURS)));
                                        /* Definit les niveaux sur lesquels on doit faire la convolution par 'Pconvolution()'.       */
DEFV(Local,DEFV(Logical,DTb1(niveaux_cumulables_lors_d_une_convolution,COULEURS)));
                                        /* Definit les niveaux cumulables lors du calcul de 'Pconvolution_____cumul_courant'.        */

#define   FACTEUR_MULTIPLICATIF_DE_CONVOLUTION                                                                                          \
                    FU
DEFV(Local,DEFV(Float,INIT(facteur_multiplicatif_de_convolution
                          ,FACTEUR_MULTIPLICATIF_DE_CONVOLUTION
                           )
                )
     );
                                        /* Facteur multiplicatif du produit de convolution en chaque point {X,Y}.                    */

#define   FACTEUR_DU_NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION                                                                           \
                    GRO1(FRA10(FU))
DEFV(Local,DEFV(Float,INIT(facteur_du_nombre_de_points_du_noyau_de_convolution
                          ,FACTEUR_DU_NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION
                           )
                )
     );
                                        /* Facteur multiplicatif destine a calculer le nombre de points des noyaux de convolution    */
                                        /* variables a partir de l'image 'GENERATEUR_DE_NOYAUX_VARIABLES'.                           */

#define   DIMENSION_DU_NOYAU_DE_CONVOLUTION(demi_longueur)                                                                              \
                    EXP2(DOUP(demi_longueur))
#define   ABSENCE_DE_CONVOLUTION                                                                                                        \
                    DIMENSION_DU_NOYAU_DE_CONVOLUTION(ZERO)
#TestADef NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION                                                                                      \
                    DIMENSION_DU_NOYAU_DE_CONVOLUTION(UN)
#define   NOMBRE_MAXIMAL_DE_POINTS_DU_NOYAU_DE_CONVOLUTION                                                                              \
                    TAILLE_MAXIMALE_D_UN_NOYAU_DE_CONVOLUTION
DEFV(Local,DEFV(Positive,INIT(nombre_de_points_du_noyau_de_convolution,NOMBRE_DE_POINTS_DU_NOYAU_DE_CONVOLUTION)));
                                        /* Nombre de points du noyau, une valeur unite signifiant l'absence de convolution...        */
DEFV(Local,DEFV(Float,DTb1(noyau_de_convolution,NOMBRE_MAXIMAL_DE_POINTS_DU_NOYAU_DE_CONVOLUTION)));
                                        /* Noyau de la convolution,                                                                  */
DEFV(Local,DEFV(Logical,DTb1(inhibition_du_noyau_de_convolution,NOMBRE_MAXIMAL_DE_POINTS_DU_NOYAU_DE_CONVOLUTION)));
                                        /* Et sa liste d'activite.                                                                   */

#define   ELEMENT_COURANT_DU_NOYAU_DE_CONVOLUTION(numero,valeur)                                                                        \
                    Bblock                                                                                                              \
                    EGAL(ITb1(noyau_de_convolution,INDX(numero,PREMIER_POINT)),valeur);                                                 \
                    EGAL(ITb1(inhibition_du_noyau_de_convolution,INDX(numero,PREMIER_POINT)),ACTIF);                                    \
                    Eblock                                                                                                              \
                                        /* Initialisation de l'element courant du noyau de convolution...                            */

#define   PRISE_EN_COMPTE_DU_POINT_CENTRAL                                                                                              \
                    FU
#define   MOYENNAGE_DES_AUTRES_POINTS                                                                                                   \
                    FDU
                                        /* Valeurs a donner aux elements du noyau de convolution pour anti-aliaser...                */

#define   INITIALISATION_DU_NOYAU_DE_CONVOLUTION                                                                                        \
                    Bblock                                                                                                              \
                    Test(IFGT(nombre_de_points_du_noyau_de_convolution,ABSENCE_DE_CONVOLUTION))                                         \
                         Bblock                                                                                                         \
                         DEFV(Int,INIT(index_du_noyau_de_convolution,UNDEF));                                                           \
                                        /* Index d'initialisation du noyau.                                                          */ \
                         BoIn(niveau_courant_du_noyau_de_convolution,NOIR,BLANC,PAS_COULEURS)                                           \
                              Bblock                                                                                                    \
                              EGAL(ITb1(niveaux_a_traiter_lors_d_une_convolution,INDX(niveau_courant_du_noyau_de_convolution,NOIR))     \
                                  ,COND(IFOU(IFNE(niveau_courant_du_noyau_de_convolution,NOIR)                                          \
                                            ,IFET(IFEQ(niveau_courant_du_noyau_de_convolution,NOIR)                                     \
                                                 ,IL_FAUT(convoluer_le_NOIR)                                                            \
                                                  )                                                                                     \
                                             )                                                                                          \
                                       ,VRAI                                                                                            \
                                       ,FAUX                                                                                            \
                                        )                                                                                               \
                                   );                                                                                                   \
                              EGAL(ITb1(niveaux_cumulables_lors_d_une_convolution,INDX(niveau_courant_du_noyau_de_convolution,NOIR))    \
                                  ,VRAI                                                                                                 \
                                   );                                                                                                   \
                                        /* Initialisation telle que tous les niveaux soient a la fois "traitables" (sauf suivant     */ \
                                        /* l'indicateur 'convoluer_le_NOIR', le 'NOIR') et "cumulables".                             */ \
                              Eblock                                                                                                    \
                         EBoI                                                                                                           \
                         DoIn(index_du_noyau_de_convolution                                                                             \
                             ,PREMIER_POINT                                                                                             \
                             ,LSTX(PREMIER_POINT                                                                                        \
                                  ,MIN2(NOMBRE_MAXIMAL_DE_POINTS_DU_NOYAU_DE_CONVOLUTION                                                \
                                       ,MAX2(ABSENCE_DE_CONVOLUTION                                                                     \
                                            ,nombre_de_points_du_noyau_de_convolution                                                   \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                             ,I                                                                                                         \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              ELEMENT_COURANT_DU_NOYAU_DE_CONVOLUTION(index_du_noyau_de_convolution                                     \
                                                                     ,COND(IFEQ(index_du_noyau_de_convolution,PREMIER_POINT)            \
                                                                          ,PRISE_EN_COMPTE_DU_POINT_CENTRAL                             \
                                                                          ,MOYENNAGE_DES_AUTRES_POINTS                                  \
                                                                           )                                                            \
                                                                      );                                                                \
                                        /* Initialisation du noyau de convolution.                                                   */ \
                              Eblock                                                                                                    \
                         EDoI                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Initialisation du noyau de convolution.                                                   */

#define   CONVOLUTION                                                                                                                   \
                    ImageA4                                                                                                             \
                                        /* Definition de l'image contenant le resultat d'une convolution.                            */
#define   GENERATEUR_DE_NOYAUX_VARIABLES                                                                                                \
                    ImageA5                                                                                                             \
                                        /* Definition de l'image contenant le generateur de noyaux variables de convolution.         */

#define   CONVOLUTION_D_UNE_COMPOSANTE(composante)                                                                                      \
                    Bblock                                                                                                              \
                    Test(IFGT(nombre_de_points_du_noyau_de_convolution,ABSENCE_DE_CONVOLUTION))                                         \
                         Bblock                                                                                                         \
                         Test(IL_NE_FAUT_PAS(convoluer_le_NOIR))                                                                        \
                              Bblock                                                                                                    \
                              CALi(Inoir(CONVOLUTION));                                                                                 \
                                        /* En effet, lorsque le 'NOIR' ne doit pas etre convolue, l'appel a 'Iconvolution(...)' ne   */ \
                                        /* met pas a jour tous les points de l'image 'CONVOLUTION', auquel cas, on recupere ainsi    */ \
                                        /* des morceaux d'autres composantes, d'ou cette initialisation...                           */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(IL_FAUT(convolution_a_noyau_variable))                                                                    \
                              Bblock                                                                                                    \
                              DEFV(genere_p,INIT(seuil_d_inhibition_du_noyau,GRIS_4));                                                  \
                              BDEFV(image,image_definissant_la_valeur_du_noyau);                                                        \
                              BDEFV(image,image_inhibant_la_valeur_du_noyau);                                                           \
                                        /* Pour definir la valeur du noyau...                                                        */ \
                                                                                                                                        \
                              CALS(Iblanc(image_definissant_la_valeur_du_noyau));                                                       \
                              CALS(Iinitialisation(image_inhibant_la_valeur_du_noyau,seuil_d_inhibition_du_noyau));                     \
                                        /* De facon a definir un noyau carre de valeur (1,1,1,...).                                  */ \
                                                                                                                                        \
                              CALS(Icomplementation(GENERATEUR_DE_NOYAUX_VARIABLES,composante));                                        \
                                        /* L'image generateur du noyau de convolution est en fait le complement de la composante     */ \
                                        /* courante...                                                                               */ \
                              CALS(Iconvolution_variable(CONVOLUTION                                                                    \
                                                        ,facteur_multiplicatif_de_convolution                                           \
                                                        ,composante                                                                     \
                                                        ,niveaux_a_traiter_lors_d_une_convolution                                       \
                                                        ,niveaux_cumulables_lors_d_une_convolution                                      \
                                                        ,facteur_du_nombre_de_points_du_noyau_de_convolution                            \
                                                        ,GENERATEUR_DE_NOYAUX_VARIABLES                                                 \
                                                        ,image_definissant_la_valeur_du_noyau                                           \
                                                        ,image_inhibant_la_valeur_du_noyau                                              \
                                                        ,seuil_d_inhibition_du_noyau                                                    \
                                                         )                                                                              \
                                   );                                                                                                   \
                                        /* Convolution de l'image point a point (sauf peut-etre ceux qui sont 'NOIR's, voir a ce     */ \
                                        /* propos 'convoluer_le_NOIR') en fonction d'un image 'GENERATEUR_DE_NOYAUX_VARIABLES'.      */ \
                                                                                                                                        \
                              EDEFV(image,image_inhibant_la_valeur_du_noyau);                                                           \
                              EDEFV(image,image_definissant_la_valeur_du_noyau);                                                        \
                                        /* Pour definir la valeur du noyau...                                                        */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              CALS(Iconvolution(CONVOLUTION                                                                             \
                                               ,facteur_multiplicatif_de_convolution                                                    \
                                               ,composante                                                                              \
                                               ,niveaux_a_traiter_lors_d_une_convolution                                                \
                                               ,niveaux_cumulables_lors_d_une_convolution                                               \
                                               ,nombre_de_points_du_noyau_de_convolution                                                \
                                               ,noyau_de_convolution                                                                    \
                                               ,inhibition_du_noyau_de_convolution                                                      \
                                                )                                                                                       \
                                   );                                                                                                   \
                                        /* Convolution de l'image point a point (sauf peut-etre ceux qui sont 'NOIR's, voir a ce     */ \
                                        /* propos 'convoluer_le_NOIR') a l'aide d'un noyau "statique"...                             */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CALS(Imove(composante,CONVOLUTION));                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Convolution d'une composante...                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   T R A I N E E S  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/champs_5.LN.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D U   N I V E A U   D E   N O I R  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NIVEAU_DE_NOIR_REMONTE                                                                                                        \
                    NOIR
DEFV(Local,DEFV(genere_p,INIT(niveau_de_NOIR_remonte,NIVEAU_DE_NOIR_REMONTE)));
                                        /* Niveau de NOIR de chacune des composantes ; on notera que bien entendu, cette remontee    */
                                        /* eventuelle du niveau de NOIR ne peut se faire qu'apres toutes les operations de calcul    */
                                        /* et de gestion des trainees...                                                             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   I M A G E S  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   MEMORISER_LES_IMAGES                                                                                                          \
                    VRAI
DEFV(Local,DEFV(Logical,INIT(memoriser_les_images,MEMORISER_LES_IMAGES)));
                                        /* Indicateur disant si les images doivent etre generees. Cet indicateur est valable aussi   */
                                        /* pour le champ global...                                                                   */
DEFV(Local,DEFV(CHAR,INIT(POINTERc(nom_imageR),NOM_PIPE_Local)));
                                        /* Nom de la sequence a generer...                                                           */

#define   NUMERO_DE_L_IMAGE(numero_de_l_image)                                                                                          \
                    ChaineNumero(numero_de_l_image,NOMBRE_DE_CHIFFRES)                                                                  \
                                        /* Numero caracteristique d'une image.                                                       */ \
                                        /*                                                                                           */ \
                                        /* Le 20080602135239 fut introduit 'ChaineNumero(...)' afin de pouvoir parametrer            */ \
                                        /* aisement le nombre de chiffres des numeros...                                             */

#if       (         (defined(__VERSION__GENERATION_D_UN_NUCLEON))                                                                       \
          ||        (defined(__VERSION__GENERATION_D_UN_MESON))                                                                         \
          ||        (defined(__VERSION__GENERATION_DU_VIDE))                                                                            \
           )
#    define    SEPARATEUR_DU_NUMERO                                                                                                     \
                         cSEPARATEUR_DES_COMPOSANTES_D_UN_NOM                                                                           \
                                        /* Pour mettre avant le numero d'une image. Le 20070423140325, 'C_POINT' fut remplace        */ \
                                        /* par 'cSEPARATEUR_DES_COMPOSANTES_D_UN_NOM'.                                               */
#    define    METTRE_LE_POSTFIXE_EN_QUEUE_DES_NOMS_DES_IMAGES                                                                          \
                         FAUX
DEFV(Local,DEFV(Logical,INIT(mettre_le_postfixe_en_queue_des_noms_des_images,METTRE_LE_POSTFIXE_EN_QUEUE_DES_NOMS_DES_IMAGES)));
                                        /* Indicateur disant si le postfixe ('c_ROUGE', 'c_VERTE' et 'c_BLEUE') doit etre mis en     */
                                        /* queue des noms des images ('VRAI'), ou bien au milieu ('FAUX') ; cette derniere option    */
                                        /* correspond au fonctionnement "ancien", et est introduite afin d'assurer la compatibilite  */
                                        /* avec ce qui a deja ete genere...                                                          */
#    define    NOM_DE_L_IMAGE(nom_de_l_image,nom_de_la_composante,numero_de_l_image)                                                    \
                         COND(IL_FAUT(mettre_le_postfixe_en_queue_des_noms_des_images)                                                  \
                             ,chain_Aconcaten4_sauf_nom_pipe(nom_de_l_image                                                             \
                                                            ,SEPARATEUR_DU_NUMERO                                                       \
                                                            ,NUMERO_DE_L_IMAGE(numero_de_l_image)                                       \
                                                            ,nom_de_la_composante                                                       \
                                                             )                                                                          \
                             ,chain_Aconcaten4_sauf_nom_pipe(nom_de_l_image                                                             \
                                                            ,nom_de_la_composante                                                       \
                                                            ,SEPARATEUR_DU_NUMERO                                                       \
                                                            ,NUMERO_DE_L_IMAGE(numero_de_l_image)                                       \
                                                             )                                                                          \
                              )                                                                                                         \
                                        /* Nom d'une composante d'une image de numero donne permettant d'assurer la compatibilite    */ \
                                        /* avec ce qui existe deja...                                                                */
#Aif      (         (defined(__VERSION__GENERATION_D_UN_NUCLEON))                                                                       \
          ||        (defined(__VERSION__GENERATION_D_UN_MESON))                                                                         \
          ||        (defined(__VERSION__GENERATION_DU_VIDE))                                                                            \
           )
#Eif      (         (defined(__VERSION__GENERATION_D_UN_NUCLEON))                                                                       \
          ||        (defined(__VERSION__GENERATION_D_UN_MESON))                                                                         \
          ||        (defined(__VERSION__GENERATION_DU_VIDE))                                                                            \
           )

#if       (defined(__VERSION__GENERATION_D_UN_DI_ELECTRON))
#    define    NOM_DE_L_IMAGE(nom_de_l_image,nom_de_la_composante,numero_de_l_image)                                                    \
                         chain_Aconcaten3_sauf_nom_pipe(nom_de_l_image                                                                  \
                                                       ,NUMERO_DE_L_IMAGE(numero_de_l_image)                                            \
                                                       ,nom_de_la_composante                                                            \
                                                        )                                                                               \
                                        /* Nom d'une composante d'une image de numero donne dans le style "nouveau"...               */
#Aif      (defined(__VERSION__GENERATION_D_UN_DI_ELECTRON))
#Eif      (defined(__VERSION__GENERATION_D_UN_DI_ELECTRON))

#define   TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE                                                                                       \
                    DEUX                                                                                                                \
                                        /* Lorsqu'il n'y a pas suffisamment d'espace-disque de libre, on attend un certain temps     */ \
                                        /* avant de renouveler le test...                                                            */
#define   TEST_D_UNE_COMPOSANTE(nom_de_l_image)                                                                                         \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(memoriser_les_images))                                                                                 \
                         Bblock                                                                                                         \
                         Test(IFGT(nombre_d_images_generees,nombre_d_images_simultanees_moins_une))                                     \
                                        /* Nota : on fait un 'IFGT(...)' afin d'assurer la coherence avec les 'COND(...)' qui sont   */ \
                                        /* dans les appels de 'TEST_D_UNE_COMPOSANTE(...)'.                                          */ \
                              Bblock                                                                                                    \
                              Tant(PAS_D_ERREUR(Itest_image(nom_de_l_image)))                                                           \
                                   Bblock                                                                                               \
                                   DODO(TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE);                                                       \
                                        /* Si la composante existe, on attend qu'elle n'existe plus, ce qui fera de la place sur     */ \
                                        /* les disques pour les nouvelles images...                                                  */ \
                                   Eblock                                                                                               \
                              ETan                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                                        /* Au debut de la simulation, ce test n'est pas effectue...                                  */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Test de l'existence d'une composante avec attente si elle existe...                       */

#ifdef    BUG_SYSTEME_COMMANDE_SYSTEM_1
#    define    GENERATION_D_UNE_COMPOSANTE(nom_de_l_image,image)                                                                        \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(memoriser_les_images))                                                                            \
                              Bblock                                                                                                    \
                              Tant(IL_Y_A_ERREUR(Iupdate_image(nom_de_l_image,image)))                                                  \
                                   Bblock                                                                                               \
                                   DODO(TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE);                                                       \
                                        /* S'il y a erreur, on considere que c'est parce qu'il n'y a pas assez de place, et dans     */ \
                                        /* dans ces conditions, on attend un peu avant de renouveler le test...                      */ \
                                   Eblock                                                                                               \
                              ETan                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Generation d'une composante de nom donne...                                               */
#Aifdef   BUG_SYSTEME_COMMANDE_SYSTEM_1

#    if        (         (defined(SYSTEME_SG4D20G_IRIX))                                                                                \
               ||        (defined(SYSTEME_SG4D25TG_IRIX))                                                                               \
               ||        (defined(SYSTEME_SG4D310VGX_IRIX))                                                                             \
               ||        (defined(SYSTEME_SG4D35TG_IRIX))                                                                               \
               ||        (defined(SYSTEME_SG4D85GT_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND308_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND324_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND3GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND408_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND424_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND4GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND508_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND524_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND5GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND808_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND824_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND8GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDA08_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDA24_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDAGA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A1_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A2_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A4_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO25224_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO252VA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO252VN_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGPCM801_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGPCMA01_IRIX))                                                                               \
                )
#         define    NOMBRE_D_IMAGES_DEVANT_ETRE_LIBRES                                                                                  \
                              HUIT                                                                                                      \
                                        /* Nombre d'images qui doivent etre libres pour poursuivre la simulation...                  */
#         define    GENERATION_D_UNE_COMPOSANTE(nom_de_l_image,image)                                                                   \
                              Bblock                                                                                                    \
                              Test(IL_FAUT(memoriser_les_images))                                                                       \
                                   Bblock                                                                                               \
                                   CALS(Itest_espace_disque_libre(NOMBRE_D_IMAGES_DEVANT_ETRE_LIBRES));                                 \
                                   CALi(Iupdate_image(nom_de_l_image,image));                                                           \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                                        /* Generation d'une composante de nom donne...                                               */
#    Aif       (         (defined(SYSTEME_SG4D20G_IRIX))                                                                                \
               ||        (defined(SYSTEME_SG4D25TG_IRIX))                                                                               \
               ||        (defined(SYSTEME_SG4D310VGX_IRIX))                                                                             \
               ||        (defined(SYSTEME_SG4D35TG_IRIX))                                                                               \
               ||        (defined(SYSTEME_SG4D85GT_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND308_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND324_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND3GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND408_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND424_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND4GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND508_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND524_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND5GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND808_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND824_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND8GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDA08_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDA24_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDAGA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A1_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A2_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A4_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO25224_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO252VA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO252VN_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGPCM801_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGPCMA01_IRIX))                                                                               \
                )
#         define    GENERATION_D_UNE_COMPOSANTE(nom_de_l_image,image)                                                                   \
                              Bblock                                                                                                    \
                              Test(IL_FAUT(memoriser_les_images))                                                                       \
                                   Bblock                                                                                               \
                                   CALi(Iupdate_image(nom_de_l_image,image));                                                           \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                                        /* Generation d'une composante de nom donne...                                               */
#    Eif       (         (defined(SYSTEME_SG4D20G_IRIX))                                                                                \
               ||        (defined(SYSTEME_SG4D25TG_IRIX))                                                                               \
               ||        (defined(SYSTEME_SG4D310VGX_IRIX))                                                                             \
               ||        (defined(SYSTEME_SG4D35TG_IRIX))                                                                               \
               ||        (defined(SYSTEME_SG4D85GT_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND308_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND324_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND3GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND408_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND424_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND4GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND508_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND524_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND5GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND808_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND824_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGIND8GA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDA08_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDA24_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGINDAGA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A1_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A2_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO200A4_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO25224_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO252VA_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGO252VN_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGPCM801_IRIX))                                                                               \
               ||        (defined(SYSTEME_SGPCMA01_IRIX))                                                                               \
                )

#Eifdef   BUG_SYSTEME_COMMANDE_SYSTEM_1

#ifdef    __VERSION__GENERATION_D_UN_NUCLEON
#    define    FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                                                  \
                         FEU_feu_nucleon_LX_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                             \
                                        /* Nom du feu de synchronisation pour l'enregistrement des images...                         */
#Aifdef   __VERSION__GENERATION_D_UN_NUCLEON
#Eifdef   __VERSION__GENERATION_D_UN_NUCLEON

#ifdef    __VERSION__GENERATION_D_UN_MESON
#    define    FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                                                  \
                         FEU_feu_meson_LX_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                               \
                                        /* Nom du feu de synchronisation pour l'enregistrement des images...                         */
#Aifdef   __VERSION__GENERATION_D_UN_MESON
#Eifdef   __VERSION__GENERATION_D_UN_MESON

#ifdef    __VERSION__GENERATION_DU_VIDE
#    define    FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                                                  \
                         FEU_feu_vide_LX_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                                \
                                        /* Nom du feu de synchronisation pour l'enregistrement des images...                         */
#Aifdef   __VERSION__GENERATION_DU_VIDE
#Eifdef   __VERSION__GENERATION_DU_VIDE

#ifdef    __VERSION__GENERATION_D_UN_DI_ELECTRON
#    define    FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                                                  \
                         FEU_feu_di_elect_LX_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS                                            \
                                        /* Nom du feu de synchronisation pour l'enregistrement des images...                         */
#Aifdef   __VERSION__GENERATION_D_UN_DI_ELECTRON
#Eifdef   __VERSION__GENERATION_D_UN_DI_ELECTRON

#if       (         (defined(__VERSION__GENERATION_D_UN_NUCLEON))                                                                       \
          ||        (defined(__VERSION__GENERATION_D_UN_MESON))                                                                         \
          ||        (defined(__VERSION__GENERATION_DU_VIDE))                                                                            \
           )
#    TestADef  NOMBRE_D_IMAGES_SIMULTANEES_MOINS_UNE                                                                                    \
                         NOMBRE_DE_PERIODES_DE_LA_SIMULATION                                                                            \
                                        /* Le passage de '#define' a '#TestADef' a eu lieu le 20111028213309...                      */
#Aif      (         (defined(__VERSION__GENERATION_D_UN_NUCLEON))                                                                       \
          ||        (defined(__VERSION__GENERATION_D_UN_MESON))                                                                         \
          ||        (defined(__VERSION__GENERATION_DU_VIDE))                                                                            \
           )
#Eif      (         (defined(__VERSION__GENERATION_D_UN_NUCLEON))                                                                       \
          ||        (defined(__VERSION__GENERATION_D_UN_MESON))                                                                         \
          ||        (defined(__VERSION__GENERATION_DU_VIDE))                                                                            \
           )

#if       (defined(__VERSION__GENERATION_D_UN_DI_ELECTRON))
#    TestADef  NOMBRE_D_IMAGES_SIMULTANEES_MOINS_UNE                                                                                    \
                         NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION                                                                    \
                                        /* Le passage de '#define' a '#TestADef' a eu lieu le 20111028213309...                      */
#Aif      (defined(__VERSION__GENERATION_D_UN_DI_ELECTRON))
#Eif      (defined(__VERSION__GENERATION_D_UN_DI_ELECTRON))

DEFV(Local,DEFV(Positive,INIT(nombre_d_images_simultanees_moins_une,NOMBRE_D_IMAGES_SIMULTANEES_MOINS_UNE)));
                                        /* Nombre d'images consecutives simultanees moins une (par exemple, si l'on donne 8 comme    */
                                        /* argument, il pourra y avoir 9=8+1 images au maximum en attente) ; ceci permet dans le     */
                                        /* cas d'un enregistrement de permettre plus d'asynchronisme que par le recours au feu       */
                                        /* 'FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS'...                              */
DEFV(Local,DEFV(Positive,INIT(nombre_d_images_generees,ZERO)));
                                        /* Nombre d'images deja generees...                                                          */
#define   SYNCHRONISER_LA_GENERATION_DES_IMAGES                                                                                         \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(synchroniser_la_generation_des_images,SYNCHRONISER_LA_GENERATION_DES_IMAGES)));
                                        /* Indicateur disant si la generation des images doit etre synchronise sur le feu rouge de   */
                                        /* nom 'FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS'.                            */
#define   GENERATION_D_UNE_IMAGE(numero_de_l_image,numero_de_la_premiere_a_generer)                                                     \
                    Bblock                                                                                                              \
                    Test(IFGE(numero_de_l_image,numero_de_la_premiere_a_generer))                                                       \
                         Bblock                                                                                                         \
                         CONVOLUTION_D_UNE_COMPOSANTE(Image_ROUGE);                                                                     \
                         CONVOLUTION_D_UNE_COMPOSANTE(Image_VERTE);                                                                     \
                         CONVOLUTION_D_UNE_COMPOSANTE(Image_BLEUE);                                                                     \
                                        /* Convolution eventuelle des composantes afin de limiter l'aliasing principalement sur les  */ \
                                        /* images fixes...                                                                           */ \
                         CUMUL_D_UNE_COMPOSANTE_POUR_LE_CALCUL_DES_TRAINEES(Image_ROUGE                                                 \
                                                                           ,TRAINEES_ROUGE                                              \
                                                                           ,trainee_du_ROUGE_avant                                      \
                                                                           ,trainee_du_ROUGE_apres                                      \
                                                                           ,numero_de_l_image                                           \
                                                                            );                                                          \
                         CUMUL_D_UNE_COMPOSANTE_POUR_LE_CALCUL_DES_TRAINEES(Image_VERTE                                                 \
                                                                           ,TRAINEES_VERTE                                              \
                                                                           ,trainee_du_VERTE_avant                                      \
                                                                           ,trainee_du_VERTE_apres                                      \
                                                                           ,numero_de_l_image                                           \
                                                                            );                                                          \
                         CUMUL_D_UNE_COMPOSANTE_POUR_LE_CALCUL_DES_TRAINEES(Image_BLEUE                                                 \
                                                                           ,TRAINEES_BLEUE                                              \
                                                                           ,trainee_du_BLEUE_avant                                      \
                                                                           ,trainee_du_BLEUE_apres                                      \
                                                                           ,numero_de_l_image                                           \
                                                                            );                                                          \
                                        /* Calcul eventuel des trainees. ATTENTION : apres chaque calcul de l'effet de trainees,     */ \
                                        /* la composante courante subit, si necessaire, 'CONVOLUTION_D_UNE_COMPOSANTE(...)'...       */ \
                         MISE_A_JOUR_D_UN_CUMUL_POUR_LE_CALCUL_DES_TRAINEES(TRAINEES_ROUGE,Image_ROUGE);                                \
                         MISE_A_JOUR_D_UN_CUMUL_POUR_LE_CALCUL_DES_TRAINEES(TRAINEES_VERTE,Image_VERTE);                                \
                         MISE_A_JOUR_D_UN_CUMUL_POUR_LE_CALCUL_DES_TRAINEES(TRAINEES_BLEUE,Image_BLEUE);                                \
                                        /* Mise a jour des cumuls pour le calcul des trainees suivantes ; cette mise a jour est      */ \
                                        /* faite avant l'eventuel renormalisation des composantes, afin de ne pas prendre en compte  */ \
                                        /* des images renormalisees lors du calcul des trainees...                                   */ \
                         RENORMALISATION_EVENTUELLE_D_UNE_COMPOSANTE(Image_ROUGE,trainee_du_ROUGE_avant,trainee_du_ROUGE_apres);        \
                         RENORMALISATION_EVENTUELLE_D_UNE_COMPOSANTE(Image_VERTE,trainee_du_VERTE_avant,trainee_du_VERTE_apres);        \
                         RENORMALISATION_EVENTUELLE_D_UNE_COMPOSANTE(Image_BLEUE,trainee_du_BLEUE_avant,trainee_du_BLEUE_apres);        \
                                        /* Puis, avant de memoriser les composantes, mais apres avoir mis a jour le systeme de       */ \
                                        /* calcul des trainees, les composantes sont eventuellement renormalisees...                 */ \
                         REMONTEE_DU_NIVEAU_DE_NOIR(Image_ROUGE,Image_ROUGE,niveau_de_NOIR_remonte);                                    \
                         REMONTEE_DU_NIVEAU_DE_NOIR(Image_VERTE,Image_VERTE,niveau_de_NOIR_remonte);                                    \
                         REMONTEE_DU_NIVEAU_DE_NOIR(Image_BLEUE,Image_BLEUE,niveau_de_NOIR_remonte);                                    \
                                        /* Enfin, avant de memoriser les composantes, mais apres avoir mis a jour le systeme de      */ \
                                        /* calcul des trainees, le niveau de noir est eventuellement remonte...                      */ \
                         TEST_D_UNE_COMPOSANTE(NOM_DE_L_IMAGE(nom_imageR                                                                \
                                                             ,c_ROUGE                                                                   \
                                                             ,COND(IFGT(nombre_d_images_generees                                        \
                                                                       ,nombre_d_images_simultanees_moins_une                           \
                                                                        )                                                               \
                                                                  ,SOUS(numero_de_l_image                                               \
                                                                       ,nombre_d_images_simultanees_moins_une                           \
                                                                        )                                                               \
                                                                  ,numero_de_l_image                                                    \
                                                                   )                                                                    \
                                                              )                                                                         \
                                               );                                                                                       \
                         TEST_D_UNE_COMPOSANTE(NOM_DE_L_IMAGE(nom_imageR                                                                \
                                                             ,c_VERTE                                                                   \
                                                             ,COND(IFGT(nombre_d_images_generees                                        \
                                                                       ,nombre_d_images_simultanees_moins_une                           \
                                                                        )                                                               \
                                                                  ,SOUS(numero_de_l_image                                               \
                                                                       ,nombre_d_images_simultanees_moins_une                           \
                                                                        )                                                               \
                                                                  ,numero_de_l_image                                                    \
                                                                   )                                                                    \
                                                              )                                                                         \
                                               );                                                                                       \
                         TEST_D_UNE_COMPOSANTE(NOM_DE_L_IMAGE(nom_imageR                                                                \
                                                             ,c_BLEUE                                                                   \
                                                             ,COND(IFGT(nombre_d_images_generees                                        \
                                                                       ,nombre_d_images_simultanees_moins_une                           \
                                                                        )                                                               \
                                                                  ,SOUS(numero_de_l_image                                               \
                                                                       ,nombre_d_images_simultanees_moins_une                           \
                                                                        )                                                               \
                                                                  ,numero_de_l_image                                                    \
                                                                   )                                                                    \
                                                              )                                                                         \
                                               );                                                                                       \
                                        /* Et on attend eventuellement de la place...                                                */ \
                         GENERATION_D_UNE_COMPOSANTE(NOM_DE_L_IMAGE(nom_imageR                                                          \
                                                                   ,c_ROUGE                                                             \
                                                                   ,numero_de_l_image                                                   \
                                                                    )                                                                   \
                                                    ,Image_ROUGE                                                                        \
                                                     );                                                                                 \
                         GENERATION_D_UNE_COMPOSANTE(NOM_DE_L_IMAGE(nom_imageR                                                          \
                                                                   ,c_VERTE                                                             \
                                                                   ,numero_de_l_image                                                   \
                                                                    )                                                                   \
                                                    ,Image_VERTE                                                                        \
                                                     );                                                                                 \
                         GENERATION_D_UNE_COMPOSANTE(NOM_DE_L_IMAGE(nom_imageR                                                          \
                                                                   ,c_BLEUE                                                             \
                                                                   ,numero_de_l_image                                                   \
                                                                    )                                                                   \
                                                    ,Image_BLEUE                                                                        \
                                                     );                                                                                 \
                                        /* Memorisation de l'image en vraies couleurs. On notera que le nom d'une composante est     */ \
                                        /* de la forme (en ce qui concerne le style "ancien"...) :                                   */ \
                                        /*                                                                                           */ \
                                        /*                  <racine><composante><numero>                                             */ \
                                        /*                                                                                           */ \
                                        /* et non pas :                                                                              */ \
                                        /*                                                                                           */ \
                                        /*                  <racine><numero><composante>                                             */ \
                                        /*                                                                                           */ \
                                        /* en effet, cela permet ensuite de manipuler tout un ensemble de composantes chromatiques   */ \
                                        /* a l'aide d'un programme tel '$xci/accumule.01$K'. Par contre le style "nouveau" utilise   */ \
                                        /* la deuxieme syntaxe...                                                                    */ \
                         INCR(nombre_d_images_generees,I);                                                                              \
                                        /* Comptage des images generees...                                                           */ \
                         Test(IL_FAUT(synchroniser_la_generation_des_images))                                                           \
                              Bblock                                                                                                    \
                              ATTENDRE_AU_FEU_ROUGE(FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS);                           \
                                        /* On attend au prealable que le feu soit vert,                                              */ \
                              MISE_DU_FEU_AU_ROUGE(FEU_feu_DE_SYNCHRONISATION_DE_LA_SIMULATION_DES_HADRONS);                            \
                                        /* Et des qu'il est vert, on le remet au rouge...                                            */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Generation d'une image de numero donne...                                                 */



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