/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C O N S T I T U T I O N   D ' U N   M A I L L A G E   { U , V }   P E R I O D I Q U E   O U   P A S  :                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/maillage_u_v$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20060412112704).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L E U R S   I M P L I C I T E S   D E S   P A R A M E T R E S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   F I C H I E R S  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.41.I"

#define   VALEUR_U_IMPLICITE                                                                                                            \
                    FZERO
#define   VALEUR_V_IMPLICITE                                                                                                            \
                    FZERO
#define   VALEUR_S_IMPLICITE                                                                                                            \
                    FZERO

gGENERATION_D_UN_FICHIER(fichierU_des_valeurs,listeU_des_valeurs);
gGENERATION_D_UN_FICHIER(fichierV_des_valeurs,listeV_des_valeurs);
gGENERATION_D_UN_FICHIER(fichierS_des_valeurs,listeS_des_valeurs);
                                        /* Definition en memoire des fichiers {U,V} et Scalaire...                                   */
gGENERATION_D_UN_FICHIER_liste(sauvegarde_de_la_listeU_des_valeurs);
gGENERATION_D_UN_FICHIER_liste(sauvegarde_de_la_listeV_des_valeurs);
gGENERATION_D_UN_FICHIER_liste(sauvegarde_de_la_listeS_des_valeurs);
                                        /* Et leur sauvegarde...                                                                     */

gGENERATION_D_UN_FICHIER_liste(liste_des_index);
                                        /* Definition en memoire de la liste des index pour gerer le tri (en NxN)...                 */

%define   ELEMENT_DU_FICHIER_U(index)                                                                                                   \
                    gELEMENT_DU_FICHIER(listeU_des_valeurs,index)
%define   ELEMENT_DU_FICHIER_V(index)                                                                                                   \
                    gELEMENT_DU_FICHIER(listeV_des_valeurs,index)
#define   ELEMENT_DU_FICHIER_S(index)                                                                                                   \
                    gELEMENT_DU_FICHIER(listeS_des_valeurs,index)

%define   ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_U(index)                                                                                  \
                    gELEMENT_DU_FICHIER(sauvegarde_de_la_listeU_des_valeurs,index)
%define   ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_V(index)                                                                                  \
                    gELEMENT_DU_FICHIER(sauvegarde_de_la_listeV_des_valeurs,index)
%define   ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_S(index)                                                                                  \
                    gELEMENT_DU_FICHIER(sauvegarde_de_la_listeS_des_valeurs,index)

#define   ELEMENT_DU_FICHIER_INDEX(index)                                                                                               \
                    gELEMENT_DU_FICHIER(liste_des_index,index)
#define   iELEMENT_DU_FICHIER_INDEX(index)                                                                                              \
                    INTE(ELEMENT_DU_FICHIER_INDEX(index))
                                        /* Acces a un element courant des fichiers.                                                  */
                                        /*                                                                                           */
                                        /* La procedure 'iELEMENT_DU_FICHIER_INDEX(...)' a ete introduite le 20071211075434 afin     */
                                        /* de supprimer le message :                                                                 */
                                        /*                                                                                           */
                                        /*                  error: invalid lvalue in assignment                                      */
                                        /*                                                                                           */
                                        /* sur '$LACT18' dans le cas d'une ecriture du type :                                        */
                                        /*                                                                                           */
                                        /*                  EGAL(INTE(...),...);                                                     */
                                        /*                                                                                           */
                                        /* qui est effectivement incorrecte...                                                       */

                                        /* Le passage en '$PASSE_3' est lie a l'usage qui est fait de l'operateur de concatenation   */
                                        /* '$S_UNDERSCORE' dans la procedure 'TRI_DES_FICHIERS_SELON_L_UN_D_ENTRE_EUX(...)' avec     */
                                        /* 'ELEMENT_DU_FICHIER''...                                                                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R O C E D U R E   D ' E D I T I O N  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   EDITER_LE_RESULTAT_DU_TRI                                                                                                     \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(editer_le_resultat_du_tri,EDITER_LE_RESULTAT_DU_TRI)));
                                        /* Afin de permettre d'editer le travail du tri...                                           */

#define   EDITION_DES_FICHIERS_ET_DES_INDEX(message)                                                                                    \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_le_resultat_du_tri))                                                                            \
                         Bblock                                                                                                         \
                         CALS(Fsauts_de_lignes(UN));                                                                                    \
                         CAL3(Prme1("Edition %s le tri :\n\n",message));                                                                \
                                                                                                                                        \
                         DoIn(index                                                                                                     \
                             ,PREMIER_ELEMENT_D_UN_FICHIER                                                                              \
                             ,DERNIER_ELEMENT_D_UN_FICHIER                                                                              \
                             ,I                                                                                                         \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              CAL3(Prme5("Index=%d U=%+.^^^ V=%+.^^^ S=%+.^^^ IndexPermute=%d\n"                                        \
                                        ,index                                                                                          \
                                        ,ELEMENT_DU_FICHIER_U(index)                                                                    \
                                        ,ELEMENT_DU_FICHIER_V(index)                                                                    \
                                        ,ELEMENT_DU_FICHIER_S(index)                                                                    \
                                        ,iELEMENT_DU_FICHIER_INDEX(index)                                                               \
                                         )                                                                                              \
                                   );                                                                                                   \
                                        /* Le 20091123123627, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                              Eblock                                                                                                    \
                         EDoI                                                                                                           \
                                                                                                                                        \
                         CALS(Fsauts_de_lignes(UN));                                                                                    \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure d'edition du contenu des fichiers, ce qui est utile, en particulier pour        */ \
                                        /* visualiser le travail du tri...                                                           */

#define   TRI_DES_FICHIERS_SELON_L_UN_D_ENTRE_EUX(composante)                                                                           \
                    Bblock                                                                                                              \
                    DEFV(Int,INIT(index_1_de_permutation,UNDEF));                                                                       \
                    DEFV(Int,INIT(index_2_de_permutation,UNDEF));                                                                       \
                                        /* Pour ordonner les listes...                                                               */ \
                                                                                                                                        \
                    DoIn(index                                                                                                          \
                        ,PREMIER_ELEMENT_D_UN_FICHIER                                                                                   \
                        ,DERNIER_ELEMENT_D_UN_FICHIER                                                                                   \
                        ,I                                                                                                              \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         EGAL(ELEMENT_DU_FICHIER_INDEX(index),index);                                                                   \
                                        /* Afin de preparer le tri (en NxN) a venir...                                               */ \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                                                                                                                                        \
                    EDITION_DES_FICHIERS_ET_DES_INDEX("AVANT");                                                                         \
                                                                                                                                        \
                    DoIn(index_1_de_permutation                                                                                         \
                        ,NEUT(PREMIER_ELEMENT_D_UN_FICHIER)                                                                             \
                        ,DERNIER_ELEMENT_D_UN_FICHIER                                                                                   \
                        ,I                                                                                                              \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         DoIn(index_2_de_permutation                                                                                    \
                             ,SUCC(PREMIER_ELEMENT_D_UN_FICHIER)                                                                        \
                             ,LSTX(PREMIER_ELEMENT_D_UN_FICHIER                                                                         \
                                  ,SOUS(nombre_d_elements,SOUS(index_1_de_permutation,PREMIER_ELEMENT_D_UN_FICHIER))                    \
                                   )                                                                                                    \
                             ,I                                                                                                         \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              Test(IFLT(ELEMENT_DU_FICHIER`composante(NEUT(index_2_de_permutation))                                     \
                                       ,ELEMENT_DU_FICHIER`composante(PRED(index_2_de_permutation))                                     \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   fSWAP(ELEMENT_DU_FICHIER_U(PRED(index_2_de_permutation))                                             \
                                        ,ELEMENT_DU_FICHIER_U(NEUT(index_2_de_permutation))                                             \
                                         );                                                                                             \
                                   fSWAP(ELEMENT_DU_FICHIER_V(PRED(index_2_de_permutation))                                             \
                                        ,ELEMENT_DU_FICHIER_V(NEUT(index_2_de_permutation))                                             \
                                         );                                                                                             \
                                   fSWAP(ELEMENT_DU_FICHIER_S(PRED(index_2_de_permutation))                                             \
                                        ,ELEMENT_DU_FICHIER_S(NEUT(index_2_de_permutation))                                             \
                                         );                                                                                             \
                                   fSWAP(ELEMENT_DU_FICHIER_INDEX(PRED(index_2_de_permutation))                                         \
                                        ,ELEMENT_DU_FICHIER_INDEX(NEUT(index_2_de_permutation))                                         \
                                         );                                                                                             \
                                        /* Et tri suivant 'composante' ('u' ou 'v') qui amene en tete les plus petits elements       */ \
                                        /* sans changer un eventuel ordre correct pre-existant...                                    */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         EDoI                                                                                                           \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                                                                                                                                        \
                    EDITION_DES_FICHIERS_ET_DES_INDEX("APRES");                                                                         \
                    Eblock                                                                                                              \
                                        /* Procedure de tri (en NxN) des fichiers suivant 'U' ou 'V'.                                */

#define   AUTORISER_LES_SUITES_NON_MONOTONES                                                                                            \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(autoriser_les_suites_non_monotones,AUTORISER_LES_SUITES_NON_MONOTONES)));
                                        /* Afin de permettre l'existence de suites non monotones (tel qu'elles peuvent etre          */
                                        /* rencontrees : 'v $xrv/maillage_u_v$K 20090619111803'). Cet indicateur a ete introduit     */
                                        /* le 20090619114651...                                                                      */

#define   EDITER_LES_MESSAGES_D_ERREUR_D_ORDONNANCEMENT                                                                                 \
                    VRAI
DEFV(Local,DEFV(Logical,INIT(editer_les_messages_d_erreur_d_ordonnancement,EDITER_LES_MESSAGES_D_ERREUR_D_ORDONNANCEMENT)));
                                        /* Afin de permettre de bloquer les messages d'erreur d'ordonnancement (ceci a ete introduit */
                                        /* le 20090619102250).                                                                       */

#define   PERIODISER_U                                                                                                                  \
                    FAUX
#define   PERIODISER_V                                                                                                                  \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(periodiser_U,PERIODISER_U)));
DEFV(Local,DEFV(Logical,INIT(periodiser_V,PERIODISER_V)));
                                        /* Afin de pouvoir periodiser les deux coordonnees 'U' et 'V' (introduit le 20060417114616). */

#define   EDITION_DES_ARETES_DU_MAILLAGE                                                                                                \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer_les_aretes))                                                                                    \
                         Bblock                                                                                                         \
                         CAL2(Prin0(" --> "));                                                                                          \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         CAL2(Prin0("\n"));                                                                                             \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Afin d'editer les aretes du maillage si necessaire...                                     */

#define   GESTION_DE_LA_PERIODICITE(composante1,composante2)                                                                            \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(periodiser`composante2))                                                                               \
                                        /* Introduit le 20060417114616...                                                            */ \
                         Bblock                                                                                                         \
                         Test(IFOU(IL_FAUT(autoriser_les_suites_non_monotones)                                                          \
                                  ,IFET(IL_NE_FAUT_PAS(autoriser_les_suites_non_monotones)                                              \
                                       ,IFLT(valeur`composante2`premiere,valeur`composante2`precedente)                                 \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* Test complete par les suites non monotones le 20090619114651...                           */ \
                              Bblock                                                                                                    \
                              EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(valeur_S_precedente);                                            \
                                                                                                                                        \
                              EDITION_DES_ARETES_DU_MAILLAGE;                                                                           \
                                                                                                                                        \
                              EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(valeur_S_premiere);                                              \
                              CAL2(Prin0("\n"));                                                                                        \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IL_FAUT(editer_les_messages_d_erreur_d_ordonnancement))                                              \
                                        /* Test introduit le 20090619102250...                                                       */ \
                                   Bblock                                                                                               \
                                   PRINT_ERREUR("l'un des fichiers est mal ordonne (2)");                                               \
                                   CAL1(Prer1("il s'agit du fichier des '%s' ",QUOTAGE_AVEC_____K_QD(composante2)));                    \
                                   CAL1(Prer2("alors que les index courant et permutes valent respectivement %d et %d "                 \
                                             ,index                                                                                     \
                                             ,iELEMENT_DU_FICHIER_INDEX(index)                                                          \
                                              )                                                                                         \
                                        );                                                                                              \
                                   CAL1(Prer4("(ValeurPremiere=%+.^^^%s>=%sValeurPrecedente=%+.^^^),\n"                                 \
                                             ,valeur`composante2`premiere                                                               \
                                             ," "                                                                                       \
                                             ," "                                                                                       \
                                             ,valeur`composante2`precedente                                                             \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* Les deux "%s" sont destines a mettre un espace de part et d'autre de ">=", ce qui ne      */ \
                                        /* peut etre fait en ecrivant " >= " a cause de 'v $xccp/compacte.1$sed' qui les supprime... */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123123627, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                                   CAL1(Prer1("l'autre fichier est celui des '%s' ",QUOTAGE_AVEC_____K_QD(composante1)));               \
                                   CAL1(Prer2("(ValeurPremiere=%+.^^^, ValeurPrecedente=%+.^^^).\n"                                     \
                                             ,valeur`composante1`premiere                                                               \
                                             ,valeur`composante1`precedente                                                             \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* L'edition de "l'autre fichier" a ete introduit le 20090619100148...                       */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123123627, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Afin de reboucler si necessaire...                                                        */

#define   EDITER_LES_ARETES                                                                                                             \
                    FAUX
DEFV(Local,DEFV(Logical,INIT(editer_les_aretes,EDITER_LES_ARETES)));
                                        /* Afin de pouvoir editer les couples {origine,extremite} des aretes. Ceci fut introduit     */
                                        /* le 20060417120647 pour faciliter les tests...                                             */

#define   GENERATION_DU_MAILLAGE(composante1,composante2)                                                                               \
                    Bblock                                                                                                              \
                    DEFV(Logical,INIT(initialiser_le_processus,VRAI));                                                                  \
                                        /* Pour initialiser le processus...                                                          */ \
                                                                                                                                        \
                    DEFV(Float,INIT(valeur_U_premiere,FLOT__UNDEF));                                                                    \
                    DEFV(Float,INIT(valeur_V_premiere,FLOT__UNDEF));                                                                    \
                    DEFV(Float,INIT(valeur_S_premiere,FLOT__UNDEF));                                                                    \
                    DEFV(Float,INIT(valeur_U_precedente,FLOT__UNDEF));                                                                  \
                    DEFV(Float,INIT(valeur_V_precedente,FLOT__UNDEF));                                                                  \
                    DEFV(Float,INIT(valeur_S_precedente,FLOT__UNDEF));                                                                  \
                                        /* Memorisation des valeurs "premieres" et precedentes. Les conventions de notation sont     */ \
                                        /* les suivantes : il y a deux fichiers de coordonnees 'U' et 'V' ; soit par exemple :       */ \
                                        /*                                                                                           */ \
                                        /*                  U = {1,1,1,.....2,2,2,.....3,3,3,.....}                                  */ \
                                        /*                  V = {1,2,3,4,...1,2,3,4,...1,2,3,4,...}                                  */ \
                                        /*                                                                                           */ \
                                        /* les deux fichiers etant supposes tries ('TRI_DES_FICHIERS_SELON_L_UN_D_ENTRE_EUX(...)'    */ \
                                        /* est la pour ce faire...).                                                                 */ \
                                        /*                                                                                           */ \
                                        /* Le fichier des Scalaires 'S' peut alors etre represente matriciellement, chaque element   */ \
                                        /* 'S' etant en quelque sorte indexe par un couple {U,V} :                                   */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*                3 |---------+---------+---------+------                                    */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*                  |         |   {S}   |         |                                          */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*        {U}     2 |---------+---------+---------+------                                    */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*                  |         |         |         |                                          */ \
                                        /*                1  ------------------------------------                                    */ \
                                        /*                                                                                           */ \
                                        /*                  1         2         3         4                                          */ \
                                        /*                                                                                           */ \
                                        /*                                {V}                                                        */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Un element "courant" est un element quelconque de cette matrice ; l'element "precedent"   */ \
                                        /* est celui qui le precede (a gauche) sur sa ligne. Enfin, l'element "premier" est le       */ \
                                        /* premier (a gauche donc) de sa ligne...                                                    */ \
                                                                                                                                        \
                    DoIn(index                                                                                                          \
                        ,PREMIER_ELEMENT_D_UN_FICHIER                                                                                   \
                        ,DERNIER_ELEMENT_D_UN_FICHIER                                                                                   \
                        ,I                                                                                                              \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(valeur_U_courante,ELEMENT_DU_FICHIER_U(index)));                                               \
                         DEFV(Float,INIT(valeur_V_courante,ELEMENT_DU_FICHIER_V(index)));                                               \
                         DEFV(Float,INIT(valeur_S_courante,ELEMENT_DU_FICHIER_S(index)));                                               \
                                        /* Recuperation des valeurs courantes dans les fichiers.                                     */ \
                                                                                                                                        \
                         Test(IL_FAUT(initialiser_le_processus))                                                                        \
                              Bblock                                                                                                    \
                              EGAL(valeur_U_premiere,valeur_U_courante);                                                                \
                              EGAL(valeur_V_premiere,valeur_V_courante);                                                                \
                              EGAL(valeur_S_premiere,valeur_S_courante);                                                                \
                                                                                                                                        \
                              EGAL(valeur_U_precedente,valeur_U_courante);                                                              \
                              EGAL(valeur_V_precedente,valeur_V_courante);                                                              \
                              EGAL(valeur_S_precedente,valeur_S_courante);                                                              \
                                                                                                                                        \
                              EGAL(initialiser_le_processus,FAUX);                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFEQ(valeur`composante1`courante,valeur`composante1`precedente))                                     \
                                   Bblock                                                                                               \
                                   Test(IFOU(IL_FAUT(autoriser_les_suites_non_monotones)                                                \
                                            ,IFET(IL_NE_FAUT_PAS(autoriser_les_suites_non_monotones)                                    \
                                                 ,IFGT(valeur`composante2`courante,valeur`composante2`precedente)                       \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                        /* Test complete par les suites non monotones le 20090619114651...                           */ \
                                        Bblock                                                                                          \
                                        EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(valeur_S_precedente);                                  \
                                                                                                                                        \
                                        EDITION_DES_ARETES_DU_MAILLAGE;                                                                 \
                                                                                                                                        \
                                        EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(valeur_S_courante);                                    \
                                        CAL2(Prin0("\n"));                                                                              \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        /* On notera le 20090619111803 que cette situation, a priori anormale, peut se rencontrer,   */ \
                                        /* par exemple avec les fichiers issus d'un programme tel 'v $xrs/CalabiYau.12$K' (voir la   */ \
                                        /* sequence 'v $xias/CAYA.E1$R16') ou la surface est composee de l'assemblage de plusieurs   */ \
                                        /* morceaux (ou "patches") qui chacun balayent l'espace [Umin,Umax]x[Vmin,Vmax] et donc      */ \
                                        /* apres le tri 'TRI_DES_FICHIERS_SELON_L_UN_D_ENTRE_EUX(...)' il est possible de trouver    */ \
                                        /* a 'U' constant des suites non monotones de 'V' correspondant a l'ensemble des "patches".  */ \
                                        Test(IL_FAUT(editer_les_messages_d_erreur_d_ordonnancement))                                    \
                                        /* Test introduit le 20090619102250...                                                       */ \
                                             Bblock                                                                                     \
                                             PRINT_ERREUR("l'un des fichiers est mal ordonne (1)");                                     \
                                             CAL1(Prer1("il s'agit du fichier des '%s' ",QUOTAGE_AVEC_____K_QD(composante2)));          \
                                        /* L'usage de 'QUOTAGE_AVEC_____K_QD(...)' fut introduit le 20060415170837...                */ \
                                             CAL1(Prer2("alors que les index courant et permutes valent respectivement %d et %d "       \
                                                       ,index                                                                           \
                                                       ,iELEMENT_DU_FICHIER_INDEX(index)                                                \
                                                        )                                                                               \
                                                  );                                                                                    \
                                             CAL1(Prer4("(ValeurCourante=%+.^^^%s<=%sValeurPrecedente=%+.^^^),\n"                       \
                                                       ,valeur`composante2`courante                                                     \
                                                       ," "                                                                             \
                                                       ," "                                                                             \
                                                       ,valeur`composante2`precedente                                                   \
                                                        )                                                                               \
                                                  );                                                                                    \
                                        /* Les deux "%s" sont destines a mettre un espace de part et d'autre de "<=", ce qui ne      */ \
                                        /* peut etre fait en ecrivant " <= " a cause de 'v $xccp/compacte.1$sed' qui les supprime... */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123123627, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                                             CAL1(Prer1("l'autre fichier est celui des '%s' ",QUOTAGE_AVEC_____K_QD(composante1)));     \
                                             CAL1(Prer2("(ValeurCourante=%+.^^^, ValeurPrecedente=%+.^^^).\n"                           \
                                                       ,valeur`composante1`courante                                                     \
                                                       ,valeur`composante1`precedente                                                   \
                                                        )                                                                               \
                                                  );                                                                                    \
                                        /* L'edition de "l'autre fichier" a ete introduit le 20090619100148...                       */ \
                                        /*                                                                                           */ \
                                        /* Le 20091123123627, le format "^^g" est passe a "^^^" pour plus de souplesse...            */ \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   GESTION_DE_LA_PERIODICITE(composante1,composante2);                                                  \
                                                                                                                                        \
                                   EGAL(valeur_U_premiere,valeur_U_courante);                                                           \
                                   EGAL(valeur_V_premiere,valeur_V_courante);                                                           \
                                   EGAL(valeur_S_premiere,valeur_S_courante);                                                           \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              EGAL(valeur_U_precedente,valeur_U_courante);                                                              \
                              EGAL(valeur_V_precedente,valeur_V_courante);                                                              \
                              EGAL(valeur_S_precedente,valeur_S_courante);                                                              \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    EDoI                                                                                                                \
                                                                                                                                        \
                    GESTION_DE_LA_PERIODICITE(composante1,composante2);                                                                 \
                                        /* Traitement specifique des eventuelles periodicites a la fin des fichiers...               */ \
                    Eblock                                                                                                              \
                                        /* Procedure d'edition du maillage defini a partir de l'ensemble des {U,V}.                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C O N S T I T U T I O N   D ' U N   M A I L L A G E   { U , V }    P E R I O D I Q U E   O U   P A S  :                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrv/ARITHMET.22.I"
#include  xci/valeurs.03.I"
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"
                                        /* Ceci fut introduit le 20070103173809...                                                   */

     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
                                                 Eblock
                                                 )
                                            );

                         PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;

                         PROKESF_ARGUMENT_FICHIER("fichierU="
                                                 ,fichierU_des_valeurs
                                                 ,listeU_des_valeurs
                                                 ,VALEUR_U_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("fichierV="
                                                 ,fichierV_des_valeurs
                                                 ,listeV_des_valeurs
                                                 ,VALEUR_V_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("fichierS="
                                                 ,fichierS_des_valeurs
                                                 ,listeS_des_valeurs
                                                 ,VALEUR_S_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         GET_ARGUMENT_L("editer_aretes=""ea=",editer_les_aretes);

                         GET_ARGUMENT_L("pu=""periodiser_u=""periodiser_U=""pU=",periodiser_U);
                         GET_ARGUMENT_L("pv=""periodiser_v=""periodiser_V=""pV=",periodiser_V);

                         GET_ARGUMENT_L("et=""editer_tri=",editer_le_resultat_du_tri);

                         GET_ARGUMENT_L("snm=""suites_non_monotones=",autoriser_les_suites_non_monotones);
                                        /* Arguments introduits le 20090619114651...                                                 */
                         GET_ARGUMENT_L("meo=""messages_erreur_ordonnancement=",editer_les_messages_d_erreur_d_ordonnancement);
                                        /* Arguments introduits le 20090619102250...                                                 */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
                                        /* Cette procedure fut introduite le 20070103173809...                                       */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                                        /* Cette procedure fut introduite le 20061226193706...                                       */

                         GET_ARGUMENT_I("exemplaires=",nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes);
                         )
                    );

     iGENERATION_D_UN_FICHIER(sauvegarde_de_la_listeU_des_valeurs,FLOT__UNDEF);
     iGENERATION_D_UN_FICHIER(sauvegarde_de_la_listeV_des_valeurs,FLOT__UNDEF);
     iGENERATION_D_UN_FICHIER(sauvegarde_de_la_listeS_des_valeurs,FLOT__UNDEF);
     iGENERATION_D_UN_FICHIER(liste_des_index,FLOT__UNDEF);
                                        /* Allocation de la memoire des listes qui ne sont pas des Arguments...                      */

     DoIn(index
         ,PREMIER_ELEMENT_D_UN_FICHIER
         ,DERNIER_ELEMENT_D_UN_FICHIER
         ,I
          )
          Bblock
          EGAL(ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_U(index),ELEMENT_DU_FICHIER_U(index));
          EGAL(ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_V(index),ELEMENT_DU_FICHIER_V(index));
          EGAL(ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_S(index),ELEMENT_DU_FICHIER_S(index));
                                        /* Sauvegarde des trois fichiers...                                                          */
          Eblock
     EDoI

     TRI_DES_FICHIERS_SELON_L_UN_D_ENTRE_EUX(U);
                                        /* Tri croissant en NxN des points selon la coordonnee 'u'...                                */
     GENERATION_DU_MAILLAGE(U,V);
                                        /* Edition "horizontale" du maillage a 'u' constant et 'v' variable...                       */
                                        /*                                                                                           */
                                        /* L'hypothese est faite (et verifiee dans 'GENERATION_DU_MAILLAGE(...)') que les fichiers   */
                                        /* {U,V} sont tries par ordre croissant, c'est-a-dire sont sous la forme :                   */
                                        /*                                                                                           */
                                        /*                  U = {1,1,1,...2,2,2,...3,3,3,...}                                        */
                                        /*                  V = {1,2,3,...1,2,3,...1,2,3,...}                                        */
                                        /*                                                                                           */
                                        /* et lorsque cela n'est pas verifie, il y a erreur...                                       */
                                        /*                                                                                           */
                                        /* Une erreur d'odre dans 'GENERATION_DU_MAILLAGE(...)' signifie que le tri croissant        */
                                        /* effectue precedemment s'est mal passe...                                                  */

     DoIn(index
         ,PREMIER_ELEMENT_D_UN_FICHIER
         ,DERNIER_ELEMENT_D_UN_FICHIER
         ,I
          )
          Bblock
          EGAL(ELEMENT_DU_FICHIER_U(index),ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_U(index));
          EGAL(ELEMENT_DU_FICHIER_V(index),ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_V(index));
          EGAL(ELEMENT_DU_FICHIER_S(index),ELEMENT_DE_LA_SAUVEGARDE_DU_FICHIER_S(index));
                                        /* Restauration des trois fichiers...                                                        */
          Eblock
     EDoI

     TRI_DES_FICHIERS_SELON_L_UN_D_ENTRE_EUX(V);
                                        /* Tri croissant en NxN des points selon la coordonnee 'v'...                                */
     GENERATION_DU_MAILLAGE(V,U);
                                        /* Edition "verticale" du maillage a 'u' variable et 'v' constant...                         */
                                        /*                                                                                           */
                                        /* L'hypothese est faite (et verifiee dans 'GENERATION_DU_MAILLAGE(...)') que les fichiers   */
                                        /* {U,V} sont tries par ordre croissant, c'est-a-dire sont sous la forme :                   */
                                        /*                                                                                           */
                                        /*                  U = {1,1,1,...2,2,2,...3,3,3,...}                                        */
                                        /*                  V = {1,2,3,...1,2,3,...1,2,3,...}                                        */
                                        /*                                                                                           */
                                        /* et lorsque cela n'est pas verifie, il y a erreur...                                       */
                                        /*                                                                                           */
                                        /* Une erreur d'odre dans 'GENERATION_DU_MAILLAGE(...)' signifie que le tri croissant        */
                                        /* effectue precedemment s'est mal passe...                                                  */

     lGENERATION_D_UN_FICHIER(liste_des_index,FLOT__UNDEF);
     lGENERATION_D_UN_FICHIER(sauvegarde_de_la_listeS_des_valeurs,FLOT__UNDEF);
     lGENERATION_D_UN_FICHIER(sauvegarde_de_la_listeV_des_valeurs,FLOT__UNDEF);
     lGENERATION_D_UN_FICHIER(sauvegarde_de_la_listeU_des_valeurs,FLOT__UNDEF);
     lGENERATION_D_UN_FICHIER(listeS_des_valeurs,VALEUR_S_IMPLICITE);
     lGENERATION_D_UN_FICHIER(listeV_des_valeurs,VALEUR_V_IMPLICITE);
     lGENERATION_D_UN_FICHIER(listeU_des_valeurs,VALEUR_U_IMPLICITE);

     RETU_Commande;
     Eblock
ECommande



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.