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