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



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.