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