/*************************************************************************************************************************************/ /* */ /* 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