1 /*************************************************************************
  2 * COPYRIGHT (C) 1999 - 2007  EDF R&D, CEA/DEN
  3 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  4 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE 
  5 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; 
  6 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
  7 *  
  8 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
  9 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
 10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
 11 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
 12 *
 13 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
 14 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
 15 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
 16 *
 17 *************************************************************************/
 18 
 19 /******************************************************************************
 20  * - Nom du fichier : test15.c
 21  *
 22  * - Description : lecture des noeuds d'un maillage MED
 23  *                 a l'aide des routines de niveau 2
 24  *                 - equivalent a test5.c
 25  *
 26  *****************************************************************************/
 27 
 28 #include <med.h>
 29 #define MESGERR
 30 #include <med_utils.h>
 31 
 32 #ifdef DEF_LECT_ECR
 33 #define MODE_ACCES MED_LECTURE_ECRITURE
 34 #elif DEF_LECT_AJOUT
 35 #define MODE_ACCES MED_LECTURE_AJOUT
 36 #else
 37 #define MODE_ACCES MED_CREATION
 38 #endif
 39 
 40 int main (int argc, char **argv)
 41 
 42 
 43 {
 44   med_err ret = 0;
 45   med_idt fid;
 46   /* la dimension du maillage */
 47   med_int mdim;
 48   /* nom du maillage de longueur maxi MED_TAILLE_NOM */
 49   char maa[MED_TAILLE_NOM+1];
 50   /* le nombre de noeuds */
 51   med_int nnoe = 0;
 52   /* table des coordonnees */
 53   med_float *coo;
 54   /* tables des noms et des unites des coordonnees 
 55      profil : (dimension*MED_TAILLE_PNOM+1) */
 56   char nomcoo[3*MED_TAILLE_PNOM+1];
 57   char unicoo[3*MED_TAILLE_PNOM+1];
 58   /* tables des noms, numeros, numeros de familles des noeuds
 59      autant d'elements que de noeuds - les noms ont pout longueur
 60      MED_TAILLE_PNOM */
 61   char *nomnoe;
 62   med_int *numnoe;
 63   med_int *nufano;
 64   med_repere rep;
 65   med_booleen inonoe,inunoe;
 66   char str[MED_TAILLE_PNOM+1];
 67   med_int i;
 68   char desc[MED_TAILLE_DESC+1];
 69   med_maillage type;
 70 
 71   /* Ouverture du fichier passe en argument en lecture seule */
 72   if ((fid= MEDouvrir(argv[1],MED_LECTURE)) < 0) {
 73     MESSAGE("Erreur a l'ouverture du fichier :");
 74     SSCRUTE(argv[1]);
 75     return -1;
 76   }
 77 
 78   /* Lecture des infos concernant le premier maillage */
 79   if (MEDmaaInfo(fid,1,maa,&mdim,&type,desc) < 0) {
 80     MESSAGE("Erreur a la lecture des informations du 1er maillage");
 81     return -1;
 82   }
 83   printf("Maillage de nom : %s et de dimension : %d \n",maa,mdim);
 84 
 85   /* Lecture du nombre de noeuds */
 86   if ((nnoe = MEDnEntMaa(fid,maa,MED_COOR,MED_NOEUD,0,0)) < 0) {
 87     MESSAGE("Erreur a la lecture du nombre de noeuds ");
 88     return -1;
 89   }
 90   printf("Nombre de noeuds : %d \n",nnoe);
 91 
 92   /* Allocations memoires */
 93   /* table des coordonnees 
 94      profil : (dimension * nombre de noeuds ) */
 95   if (nnoe > 0) {
 96     coo = (med_float*) malloc(sizeof(med_float)*nnoe*mdim);
 97     /* table des des numeros, des numeros de familles des noeuds
 98        profil : (nombre de noeuds) */
 99     numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
100     nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
101     /* table des noms des noeuds 
102        profil : (nnoe*MED_TAILLE_PNOM+1) */
103     nomnoe = (char*) malloc(MED_TAILLE_PNOM*nnoe+1);
104 
105     /* Lecture des noeuds : 
106        - Coordonnees
107        - Noms (optionnel dans un fichier MED) 
108        - Numeros (optionnel dans un fichier MED) 
109        - Numeros de familles    */
110     if (MEDnoeudsLire(fid,maa,mdim,coo,MED_FULL_INTERLACE,&rep,nomcoo,unicoo,
111                       nomnoe,&inonoe,numnoe,&inunoe,nufano,nnoe) < 0) {
112       MESSAGE("Erreur a la lecture des noeuds du maillage");
113       ret = -1;
114     }
115 
116     /* Affichage */
117     if (ret == 0) {
118       printf("Type de repere : %d \n",rep);
119       printf("Nom des coordonnees : \n");
120       for (i=0;i<mdim;i++) {
121         strncpy(str,nomcoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
122         str[MED_TAILLE_PNOM] = '\0';
123         printf("%s ",str);
124       }
125       printf("\nUnites des coordonnees : \n");
126       for (i=0;i<mdim;i++) {
127         strncpy(str,unicoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
128         str[MED_TAILLE_PNOM] = '\0';
129         printf("%s ",str);
130       }
131       printf("\nCoordonnees des noeuds : \n");
132       for (i=0;i<nnoe*mdim;i++)
133         printf("%f ",*(coo+i));
134       if (inonoe) {
135         printf("\nNoms des noeuds : \n");
136         for (i=0;i<nnoe;i++) {
137           strncpy(str,nomnoe+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
138           str[MED_TAILLE_PNOM] = '\0';
139           printf(" %s ",str);
140         }
141       }
142       if (inunoe) {
143         printf("\nNumeros des noeuds : \n");
144         for (i=0;i<nnoe;i++)
145           printf("%d ",*(numnoe+i));
146       }
147       printf("\nNumeros des familles des noeuds : \n");
148       for (i=0;i<nnoe;i++)
149         printf("%d ",*(nufano+i));
150       printf("\n");
151     }
152 
153     /* Liberation memoire */
154     free(coo);
155     free(nomnoe);
156     free(numnoe);
157     free(nufano);
158   }
159 
160   /* Fermeture du fichier */
161   if (MEDfermer(fid) < 0) {
162     MESSAGE("Erreur a la fermeture du fichier");
163     return -1;
164   }
165 
166   return ret;
167 }
168 
169 
170 
171