/*************************************************************************************************************************************/ /* */ /* I N T E R P O L A T I O N D ' U N M A I L L A G E : */ /* */ /* */ /* Author of '$xrv/maillage.10$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1992??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define IL_FAUT_RENORMALISER \ FAUX \ /* Faut-il renormaliser les trois composantes ? Mais ATTENTION : la renormalisation des */ \ /* trois composantes a lieu independamment les unes des autres, ce qui dans certains cas */ \ /* peut etre dangereux (en particulier si les trois composantes correspondent a des donnees */ \ /* de meme nature et exprimees dans les memes unites...). */ #define NOMBRE_DE_POINTS_SUR_L_HORIZONTALE \ k___dimX #define NOMBRE_DE_POINTS_SUR_LA_VERTICALE \ k___dimY /* Definition horizontale et verticale du fichier d'entree. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #define PREMIER_ELEMENT_D_UN_POINT \ ZERO \ /* Index du premier d'un point. */ Denumer06(INIS(_X_du_point,PREMIER_ELEMENT_D_UN_POINT) ,_Y_du_point ,_ROUGE_du_point ,_VERTE_du_point ,_BLEUE_du_point ,_longueur_d_un_point ,_definition_d_un_point ); #define X_du_point \ ENUM(_X_du_point) #define Y_du_point \ ENUM(_Y_du_point) #define ROUGE_du_point \ ENUM(SE23(_ROUGE_du_point,_VERTE_du_point,_BLEUE_du_point)) #define VERTE_du_point \ ENUM(SE13(_ROUGE_du_point,_VERTE_du_point,_BLEUE_du_point)) #define BLEUE_du_point \ ENUM(SE33(_ROUGE_du_point,_VERTE_du_point,_BLEUE_du_point)) /* Definition d'un point du maillage. */ #define NOMBRE_D_ELEMENTS_POUR_UN_POINT \ LENG(PREMIER_ELEMENT_D_UN_POINT,PRED(ENUM(_longueur_d_un_point))) \ /* Nombre d'elements caracterisant un point. */ #define SAUT_DANS_LE_FICHIER \ ZERO DEFV(Local,DEFV(Positive,INIT(saut_dans_le_fichier_des_coordonnees_et_des_valeurs,SAUT_DANS_LE_FICHIER))); /* Definition du nombre de valeurs a sauter entre deux valeurs recuperees du fichier de */ /* coordonnees et de valeurs. */ DEFV(Local,DEFV(CHAR,INIT(POINTERc(fichier_des_coordonnees_et_des_valeurs),NOM_PIPE_Local))); /* Contenu du fichier ASCII Argument. */ #define NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER \ MUL2(NOMBRE_D_ELEMENTS_POUR_UN_POINT,MUL2(NOMBRE_DE_POINTS_SUR_L_HORIZONTALE,NOMBRE_DE_POINTS_SUR_LA_VERTICALE)) \ /* Nombre maximal d'elements dans le fichier. */ DEFV(Local,DEFV(Float,DTb1(liste_des_coordonnees_et_des_valeurs,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER))); /* Definition de la liste contenant les coordonnees et les valeurs du maillage. */ #define ELEMENT_DU_FICHIER(index,translation) \ ITb0(liste_des_coordonnees_et_des_valeurs \ ,INDX(ADD2(AXPB(NOMBRE_D_ELEMENTS_POUR_UN_POINT \ ,SOUS(index,PREMIER_ELEMENT_D_UN_FICHIER) \ ,translation \ ) \ ,PREMIER_ELEMENT_D_UN_FICHIER \ ) \ ,PREMIER_ELEMENT_D_UN_FICHIER \ ) \ ) \ /* Acces a un element du point courant du fichier. */ #define lTRANSFORMATION(fichier_des_coordonnees_et_des_valeurs,liste_des_coordonnees_et_des_valeurs,valeur_par_defaut) \ Bblock \ CALS(Fload_fichier_formatte_Float(fichier_des_coordonnees_et_des_valeurs \ ,liste_des_coordonnees_et_des_valeurs \ ,nombre_de_coordonnees_et_de_valeurs \ ,ZERO \ ,saut_dans_le_fichier_des_coordonnees_et_des_valeurs \ ,VRAI \ ,valeur_par_defaut \ ,LE_NOM_DU_FICHIER_N_EST_PAS_CONVERTISSABLE_EN_UNE_VALEUR_NUMERIQUE \ ) \ ); \ \ &define __ParaVal liste_des_coordonnees_et_des_valeurs&&& \ &define __ParaInd PREMIER_ELEMENT_D_UN_FICHIER&&& \ &define __ParaLon nombre_de_coordonnees_et_de_valeurs&&& \ &define __ParaTyp TYPE_FORMAT_FLOT&&& \ &define __ParaFor FORMAT_FLOT_EDITION&&& \ \ Eblock \ /* Recuperation d'un fichier contenant une liste. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(CHAR,INIT(POINTERc(nom_imageR),NOM_PIPE_Local))); /* Nom de la sequence a generer... */ #define GENERATION_nombre_de_coordonnees_et_de_valeurs(nombre_de_points_sur_l_horizontale,nombre_de_points_sur_la_verticale) \ Bblock \ EGAL(nombre_de_coordonnees_et_de_valeurs \ ,MIN2(MUL2(NOMBRE_D_ELEMENTS_POUR_UN_POINT \ ,MUL2(nombre_de_points_sur_l_horizontale \ ,nombre_de_points_sur_la_verticale \ ) \ ) \ ,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER \ ) \ ); \ Eblock \ /* Generation de 'nombre_de_coordonnees_et_de_valeurs'. */ #define TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE \ DEUX \ /* Lorsqu'il n'y a pas suffisamment d'espace-disque de libre, on attend un certain temps */ \ /* avant de renouveler le test... */ #define GENERATION_D_UNE_COMPOSANTE(nom_de_la_composante,image) \ Bblock \ Tant(IL_Y_A_ERREUR(Iupdate_image(nom_de_la_composante,image))) \ Bblock \ DODO(TEMPORISATION_D_ATTENTE_D_ESPACE_DISQUE); \ /* S'il y a erreur, on considere que c'est parce qu'il n'y a pas assez de place, et dans */ \ /* dans ces conditions, on attend un peu avant de renouveler le test... */ \ Eblock \ ETan \ Eblock \ /* Generation d'une composante d'une image de nom donne... */ #define GENERATION_D_UNE_IMAGE \ Bblock \ GENERATION_D_UNE_COMPOSANTE(chain_Aconcaten2_sauf_nom_pipe(nom_imageR \ ,c_ROUGE \ ) \ ,Image_ROUGE \ ); \ GENERATION_D_UNE_COMPOSANTE(chain_Aconcaten2_sauf_nom_pipe(nom_imageR \ ,c_VERTE \ ) \ ,Image_VERTE \ ); \ GENERATION_D_UNE_COMPOSANTE(chain_Aconcaten2_sauf_nom_pipe(nom_imageR \ ,c_BLEUE \ ) \ ,Image_BLEUE \ ); \ Eblock \ /* Generation d'une image de numero donne... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R P O L A T I O N D ' U N M A I L L A G E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(nombre_de_points_sur_l_horizontale,NOMBRE_DE_POINTS_SUR_L_HORIZONTALE)); DEFV(Int,INIT(nombre_de_points_sur_la_verticale,NOMBRE_DE_POINTS_SUR_LA_VERTICALE)); /* Definition horizontale et verticale du fichier d'entree. */ DEFV(Int,INIT(nombre_de_coordonnees_et_de_valeurs,UNDEF)); /* Nombre total de points... */ DEFV(Logical,INIT(renormaliser,IL_FAUT_RENORMALISER)); /* Faut-il renormaliser les trois composantes ? Mais ATTENTION : la renormalisation des */ /* trois composantes a lieu independamment les unes des autres, ce qui dans certains cas */ /* peut etre dangereux (en particulier si les trois composantes correspondent a des donnees */ /* de meme nature et exprimees dans les memes unites...). */ DEFV(Int,INIT(index,UNDEF)); /* Index de l'element courant dans le fichier. */ DEFV(Float,INIT(Xf,FLOT__UNDEF)); DEFV(Float,INIT(Yf,FLOT__UNDEF)); /* Coordonnees du point courant. */ /*..............................................................................................................................*/ GENERATION_nombre_de_coordonnees_et_de_valeurs(NOMBRE_DE_POINTS_SUR_L_HORIZONTALE,NOMBRE_DE_POINTS_SUR_LA_VERTICALE); /* Initialisation a priori de 'nombre_de_coordonnees_et_de_valeurs'. */ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nph=",nombre_de_points_sur_l_horizontale ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'nph=' doit etre defini avant toute entree de fichiers"); GENERATION_nombre_de_coordonnees_et_de_valeurs(nombre_de_points_sur_l_horizontale ,nombre_de_points_sur_la_verticale ); Eblock ) ); PROCESS_ARGUMENT_I("npv=",nombre_de_points_sur_la_verticale ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'npv=' doit etre defini avant toute entree de fichiers"); GENERATION_nombre_de_coordonnees_et_de_valeurs(nombre_de_points_sur_l_horizontale ,nombre_de_points_sur_la_verticale ); Eblock ) ); /* ATTENTION : la recuperation de la definition horizontale.verticale doit preceder les */ /* 'PROCESS_ARGUMENT_C(...)' qui suivent car ils l'utilisent. */ PROCESS_ARGUMENT_I("saut=",saut_dans_le_fichier_des_coordonnees_et_des_valeurs ,BLOC(VIDE;) ,BLOC(PRINT_AVERTISSEMENT("'saut=' doit etre defini avant toute entree de fichiers");) ); /* ATTENTION : la recuperation de 'saut_dans_le_fichier_des_coordonnees_et_des_valeurs' doit */ /* preceder les 'PROCESS_ARGUMENT_C(...)' qui suivent car ils l'utilisent. Cela implique */ /* aussi que la definition par "saut=", dans les fichiers '$xrq/nucleon.L?$Z', soit en */ /* tete des autres.. */ PROCESS_ARGUMENT_FICHIER("fichier=" ,fichier_des_coordonnees_et_des_valeurs ,liste_des_coordonnees_et_des_valeurs ,FZERO ,lTRANSFORMATION ); GET_ARGUMENT_L("renormaliser=""r=",renormaliser); GET_ARGUMENT_C("imageR=""R=",nom_imageR); ) ); begin_nouveau_block Bblock BDEFV(imageF,composante_ROUGE); BDEFV(imageF,composante_VERTE); BDEFV(imageF,composante_BLEUE); /* Definition des trois composantes de l'image flottante. */ CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ Test(IFGT(MUL2(NOMBRE_D_ELEMENTS_POUR_UN_POINT ,MUL2(nombre_de_points_sur_l_horizontale ,nombre_de_points_sur_la_verticale ) ) ,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER ) ) Bblock PRINT_ERREUR("le fichier est trop long et va etre tronque (1)"); Eblock ATes Bblock Eblock ETes DoIn(index ,PREMIER_ELEMENT_D_UN_FICHIER ,LSTX(PREMIER_ELEMENT_D_UN_FICHIER ,MUL2(nombre_de_points_sur_l_horizontale ,nombre_de_points_sur_la_verticale ) ) ,I ) Bblock EGAL(Xf,ELEMENT_DU_FICHIER(index,X_du_point)); EGAL(Yf,ELEMENT_DU_FICHIER(index,Y_du_point)); /* Recuperation des coordonnees du point. */ storeF_point_valide(ELEMENT_DU_FICHIER(index,ROUGE_du_point),composante_ROUGE,INTE(Xf),INTE(Yf)); storeF_point_valide(ELEMENT_DU_FICHIER(index,VERTE_du_point),composante_VERTE,INTE(Xf),INTE(Yf)); storeF_point_valide(ELEMENT_DU_FICHIER(index,BLEUE_du_point),composante_BLEUE,INTE(Xf),INTE(Yf)); /* Et rangement de sa couleur... */ Eblock EDoI Test(IL_FAUT(renormaliser)) Bblock CALS(Ifloat_std_avec_renormalisation(Image_ROUGE,composante_ROUGE)); CALS(Ifloat_std_avec_renormalisation(Image_VERTE,composante_VERTE)); CALS(Ifloat_std_avec_renormalisation(Image_BLEUE,composante_BLEUE)); /* Generation des trois composantes renormalisees. Mais ATTENTION : la renormalisation des */ /* trois composantes a lieu independamment les unes des autres, ce qui dans certains cas */ /* peut etre dangereux (en particulier si les trois composantes correspondent a des donnees */ /* de meme nature et exprimees dans les memes unites...). */ Eblock ATes Bblock CALS(Ifloat_std(Image_ROUGE,composante_ROUGE,FLOT__NOIR,FLOT__BLANC)); CALS(Ifloat_std(Image_VERTE,composante_VERTE,FLOT__NOIR,FLOT__BLANC)); CALS(Ifloat_std(Image_BLEUE,composante_BLEUE,FLOT__NOIR,FLOT__BLANC)); /* Generation des trois composantes sans renormalisation... */ Eblock ETes GENERATION_D_UNE_IMAGE; /* Memorisation de l'image courante. */ EDEFV(imageF,composante_BLEUE); EDEFV(imageF,composante_VERTE); EDEFV(imageF,composante_ROUGE); /* Definition des trois composantes de l'image flottante. */ Eblock end_nouveau_block RETU_Commande; Eblock ECommande