/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A P P I N G   E N T R E   U N   E S P A C E   N - D I M E N S I O N N E L                                                */
/*        E T   U N   E S P A C E   B I D I M E N S I O N N E L  :                                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Pour plus d'informations et un exemple                                                                         */
/*                  d'utilisation d'un tel mapping, voir le                                                                          */
/*                  programme 'v $xrv/map_ND_2D.11$Z'.                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/map_ND_2D.11$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1997??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   NOMBRE_DE_DIMENSIONS                                                                                                          \
                    TRI_DIMENSIONNEL                                                                                                    \
                                        /* Dimension a priori de l'espace N-dimensionnel.                                            */
#define   INTERPOLATION_DE_L_ORIGINE_A_UN_POLYGONE                                                                                      \
                    FZERO                                                                                                               \
                                        /* Constante permettant de passer d'une representation centree a l'origine (0) a une         */ \
                                        /* representation "polygonale" (par exemple avec 1).                                         */

#define   ECHELLE_GENERALE_DES_COORDONNEES                                                                                              \
                    FU
#define   TRANSLATION_GENERALE_DES_COORDONNEES                                                                                          \
                    FZERO
                                        /* Echelle et translation generales des coordonnees.                                         */
#define   MAPPING_INFINI_M1_P1                                                                                                          \
                    FAUX                                                                                                                \
                                        /* Permet de passer de ]-infini,+infini[ a ]-1,+1[.                                          */

#define   FAIRE_DU_FAUX_TRIDIMENSIONNEL                                                                                                 \
                    FAUX                                                                                                                \
                                        /* Permet d'editer en plus des coordonnees {X,Y} une troisieme coordonnee 'Z' (=Zmin), ce    */ \
                                        /* les sorties compatibles a 'v $xrv/champs_5.11$I lister_la_liste_des_points'.              */
#define   COORDONNEE_Z                                                                                                                  \
                    FLOT(Zmin)                                                                                                          \
                                        /* Coordonnee 'Z' a priori.                                                                  */

#define   EDITER_DES_INFORMATIONS_ARBITRAIRES                                                                                           \
                    FAUX                                                                                                                \
                                        /* Permet d'editer pour chaque axe une chaine de caracteres arbitraire (ceci pouvant etre    */ \
                                        /* utile pour ajouter des informations de type 'RAYON' ou encore {ROUGE,VERTE,BLEUE},        */ \
                                        /* celles-ci venant par exemple de 'v $xrv/champs_5.11$I lister_la_liste_des_points'.        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   F I C H I E R  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   SAUT_DANS_LE_FICHIER                                                                                                          \
                    ZERO
DEFV(Local,DEFV(Positive,INIT(saut_dans_le_fichier_des_coordonnees,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),NOM_PIPE_Local)));
                                        /* Contenu du fichier ASCII Argument.                                                        */
#define   NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER                                                                                     \
                    MILLE                                                                                                               \
                                        /* Nombre maximal d'elements dans le fichier (valeur tres arbitraire...).                    */
DEFV(Local,DEFV(Float,DTb1(liste_des_coordonnees,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER)));
                                        /* Definition de la liste contenant les coordonnees.                                         */
#define   ELEMENT_DU_FICHIER(index)                                                                                                     \
                    ITb0(liste_des_coordonnees                                                                                          \
                        ,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER)                                                                       \
                         )                                                                                                              \
                                        /* Acces a un element du point courant du fichier.                                           */

#define   lTRANSFORMATION(fichier_des_coordonnees,liste_des_coordonnees,valeur_par_defaut)                                              \
                    Bblock                                                                                                              \
                    CALS(Fload_fichier_formatte_Float(fichier_des_coordonnees                                                           \
                                                     ,liste_des_coordonnees                                                             \
                                                     ,nombre_de_dimensions                                                              \
                                                     ,ZERO                                                                              \
                                                     ,saut_dans_le_fichier_des_coordonnees                                              \
                                                     ,VRAI                                                                              \
                                                     ,valeur_par_defaut                                                                 \
                                                     ,LE_NOM_DU_FICHIER_N_EST_PAS_CONVERTISSABLE_EN_UNE_VALEUR_NUMERIQUE                \
                                                      )                                                                                 \
                         );                                                                                                             \
                                                                                                                                        \
&define   __ParaVal liste_des_coordonnees&&&                                                                                            \
&define   __ParaInd PREMIER_ELEMENT_D_UN_FICHIER&&&                                                                                     \
&define   __ParaLon nombre_de_dimensions&&&                                                                                             \
&define   __ParaTyp TYPE_FORMAT_FLOT&&&                                                                                                 \
&define   __ParaFor FORMAT_FLOT_EDITION&&&                                                                                              \
                                                                                                                                        \
                    Eblock                                                                                                              \
                                        /* Recuperation d'un fichier contenant une liste.                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A P P I N G   E N T R E   U N   E S P A C E   N - D I M E N S I O N N E L                                                */
/*        E T   U N   E S P A C E   B I D I M E N S I O N N E L  :                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(nombre_de_dimensions,NOMBRE_DE_DIMENSIONS));
                                        /* Dimension a priori de l'espace N-dimensionnel.                                            */
     DEFV(Float,INIT(interpolation_de_l_origine_a_un_polygone,INTERPOLATION_DE_L_ORIGINE_A_UN_POLYGONE));
                                        /* Constante permettant de passer d'une representation centree a l'origine (0) a une         */
                                        /* representation "polygonale" (par exemple avec 1).                                         */
     DEFV(Float,INIT(echelle_generale_des_coordonnees,ECHELLE_GENERALE_DES_COORDONNEES));
     DEFV(Float,INIT(translation_generale_des_coordonnees,TRANSLATION_GENERALE_DES_COORDONNEES));
                                        /* Echelle et translation generales des coordonnees.                                         */
     DEFV(Logical,INIT(mapping_infini_m1_p1,MAPPING_INFINI_M1_P1));
                                        /* Permet de passer de ]-infini,+infini[ dans ]-1,+1[.                                       */
     DEFV(Logical,INIT(faire_du_faux_tridimensionnel,FAIRE_DU_FAUX_TRIDIMENSIONNEL));
                                        /* Permet d'editer en plus des coordonnees {X,Y} une troisieme coordonnee 'Z', ce qui rend   */
                                        /* les sorties compatibles a 'v $xrv/champs_5.11$I lister_la_liste_des_points'.              */
     DEFV(Float,INIT(coordonnee_Z,COORDONNEE_Z));
                                        /* Coordonnee 'Z' a priori.                                                                  */
     DEFV(Logical,INIT(editer_des_informations_arbitraires,EDITER_DES_INFORMATIONS_ARBITRAIRES));
     DEFV(CHAR,INIC(POINTERc(informations_arbitraires),C_VIDE));
                                        /* Permet d'editer pour chaque axe une chaine de caracteres arbitraire (ceci pouvant etre    */
                                        /* utile pour ajouter des informations de type 'RAYON' ou encore {ROUGE,VERTE,BLEUE},        */
                                        /* celles-ci venant par exemple de 'v $xrv/champs_5.11$I lister_la_liste_des_points'.        */
     DEFV(Int,INIT(index,UNDEF));
                                        /* Index de l'element courant dans le fichier.                                               */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("nd=",nombre_de_dimensions
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 PRINT_AVERTISSEMENT("'nd=' doit etre defini avant toute entree de fichiers");

                                                 Test(IFGT(nombre_de_dimensions,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER))
                                                      Bblock
                                                      PRINT_ERREUR("le fichier est trop long et va etre tronque (1)");
                                                      CAL1(Prer2("Il possede %d elements alors que le maximum est de %d.\n"
                                                                ,nombre_de_dimensions
                                                                ,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER
                                                                 )
                                                           );
                                                      EGAL(nombre_de_dimensions,NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER);
                                                      Eblock
                                                 ATes
                                                      Bblock
                                                      Eblock
                                                 ETes
                                                 Eblock
                                                 )
                                            );
                         PROCESS_ARGUMENT_I("saut=",saut_dans_le_fichier_des_coordonnees
                                           ,BLOC(VIDE;)
                                           ,BLOC(PRINT_AVERTISSEMENT("'saut=' doit etre defini avant toute entree de fichiers");)
                                            );
                                        /* ATTENTION : la recuperation de 'saut_dans_le_fichier_des_coordonnees' 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
                                                 ,liste_des_coordonnees
                                                 ,FZERO
                                                 ,lTRANSFORMATION
                                                  );

                         GET_ARGUMENT_F("interpolation=",interpolation_de_l_origine_a_un_polygone);
                         GET_ARGUMENT_F("echelle=",echelle_generale_des_coordonnees);
                         GET_ARGUMENT_F("translation=",translation_generale_des_coordonnees);
                         GET_ARGUMENT_L("mapping=",mapping_infini_m1_p1);

                         GET_ARGUMENT_L("tridimensionnel=",faire_du_faux_tridimensionnel);
                         GET_ARGUMENT_F("z=""Zf=""Z=",coordonnee_Z);

                         GET_ARGUMENT_L("editer=",editer_des_informations_arbitraires);
                         GET_ARGUMENT_C("informations=",informations_arbitraires);
                         )
                    );

     DoIn(index
         ,PREMIER_ELEMENT_D_UN_FICHIER
         ,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,nombre_de_dimensions)
         ,I
          )
          Bblock
          DEFV(Int,INIT(index_de_l_axe_courant,SOUS(index,PREMIER_ELEMENT_D_UN_FICHIER)));
                                        /* Index 'k' de l'axe courant.                                                               */
          DEFV(Float,INIT(coordonnee_courante
                         ,AXPB(echelle_generale_des_coordonnees
                              ,ELEMENT_DU_FICHIER(index)
                              ,translation_generale_des_coordonnees
                               )
                          )
               );
          DEFV(Float,INIT(coordonnee_courante_eventuellement_mappee,FLOT__UNDEF));
                                        /* Coordonnee courante dans le fichier et sa version eventuellement "mappee" dans ]-1,+1[.   */

          CAL2(Prin1("axe=%d",index_de_l_axe_courant));
                                        /* Edition de l'axe courant.                                                                 */

          Test(IL_FAUT(mapping_infini_m1_p1))
               Bblock
               Test(IFLE(ABSO(coordonnee_courante),LOGX(F_INFINI)))
                    Bblock
                    EGAL(coordonnee_courante_eventuellement_mappee,TAHX(coordonnee_courante));
                                        /* Mapping de ]-infini,+infini[ dans ]-1,+1[+1].                                             */
                    Eblock
               ATes
                    Bblock
                    DEFV(Float,INIT(coordonnee_courante_mappee_et_seuillee,MEME_SIGNE_QUE(coordonnee_courante,FU)));
                                        /* Valeur du mapping de la coordonnee courante lorsqu'il y a debordement potentiel dans      */
                                        /* 'EXPX(...)' via 'TAHX(...)'.                                                              */

                    PRINT_ERREUR("une coordonnee est trop grande pour passser dans 'EXPX(...)' via 'TAHX(...)'");
                    CAL1(Prer3("elle vaut %+g alors que la valeur absolue du maximum est de %+g, elle est donc seuillee a %+g\n"
                              ,coordonnee_courante
                              ,LOGX(F_INFINI)
                              ,coordonnee_courante_mappee_et_seuillee
                               )
                         );

                    EGAL(coordonnee_courante_eventuellement_mappee,coordonnee_courante_mappee_et_seuillee);
                                        /* Et on lui donne une valeur correspondant a l'un des deux infinis remappes...              */
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               EGAL(coordonnee_courante_eventuellement_mappee,coordonnee_courante);
               Eblock
          ETes

          CAL2(Prin1(" X=%+g"
                    ,LIZ2(coordonnee_courante_eventuellement_mappee
                         ,COSX(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant))
                         ,interpolation_de_l_origine_a_un_polygone
                         ,COSX(SOUS(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant),PI_SUR_2))
                          )
                     )
               );
          CAL2(Prin1(" Y=%+g"
                    ,LIZ2(coordonnee_courante_eventuellement_mappee
                         ,SINX(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant))
                         ,interpolation_de_l_origine_a_un_polygone
                         ,SINX(SOUS(SCAL(PI,nombre_de_dimensions,index_de_l_axe_courant),PI_SUR_2))
                          )
                     )
               );
                                        /* Edition des coordonnees bidimensionnelles {X,Y} equivalentes.                             */

          Test(IL_FAUT(faire_du_faux_tridimensionnel))
               Bblock
               CAL2(Prin1(" Z=%+g"
                         ,coordonnee_Z
                          )
                    );
                                        /* Permet d'editer en plus des coordonnees {X,Y} une troisieme coordonnee 'Z', ce qui rend   */
                                        /* les sorties compatibles a 'v $xrv/champs_5.11$I lister_la_liste_des_points'.              */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IL_FAUT(editer_des_informations_arbitraires))
               Bblock
               CAL2(Prin1(" %s",informations_arbitraires));
                                        /* Permet d'editer pour chaque axe une chaine de caracteres arbitraire (ceci pouvant etre    */
                                        /* utile pour ajouter des informations de type 'RAYON' ou encore {ROUGE,VERTE,BLEUE},        */
                                        /* celles-ci venant par exemple de 'v $xrv/champs_5.11$I lister_la_liste_des_points'.        */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          CAL2(Prin0("\n"));
                                        /* "Fermeture" de la ligne courante...                                                       */
          Eblock
     EDoI

     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.