1  /*************************************************************************
  2  * COPYRIGHT (C) 1999 - 2003  EDF R&D
  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  /******************************************************************************
 21   * - Nom du fichier : test5.c
 22   *
 23   * - Description : lecture des noeuds d'un maillage MED.
 24   *
 25   *****************************************************************************/
 26
 27  #include <med.h>
 28  #include <med_utils.h>
 29  #include <string.h>
 30  #include <stdlib.h>
 31
 32  int main (int argc, char **argv)
 33  {
 34    med_err ret = 0;
 35    med_idt fid;
 36    /* la dimension du maillage */
 37    med_int mdim;
 38    /* nom du maillage de longueur maxi MED_TAILLE_NOM */
 39    char maa[MED_TAILLE_NOM+1];
 40    /* le nombre de noeuds */
 41    med_int nnoe = 0;
 42    /* table des coordonnees */
 43    med_float *coo1,*coo2;
 44    /* tables des noms et des unites des coordonnees 
 45       profil : (dimension*MED_TAILLE_PNOM+1) */
 46    char nomcoo[2*MED_TAILLE_PNOM+1];
 47    char unicoo[2*MED_TAILLE_PNOM+1];
 48    /* tables des noms, numeros, numeros de familles des noeuds
 49       autant d'elements que de noeuds - les noms ont pout longueur
 50       MED_TAILLE_PNOM */
 51    char *nomnoe;
 52    med_int *numnoe;
 53    med_int *nufano;
 54    med_repere rep;
 55    med_booleen inonoe,inunoe;
 56    char str[MED_TAILLE_PNOM+1];
 57    med_int i;
 58    med_int profil[2] = { 2, 3 };
 59    char desc[MED_TAILLE_DESC+1];
 60    med_maillage type;
 61
 62    /* Ouverture du fichier "test4.med" en lecture seule */
 63    fid = MEDouvrir("test4.med",MED_LECTURE);
 64    if (fid < 0) {
 65      MESSAGE("Erreur a l'ouverture du fichier test4.med");
 66      return -1;
 67    }
 68
 69    /* Lecture des infos concernant le premier maillage */
 70    if (MEDmaaInfo(fid,1,maa,&mdim,&type,desc) < 0) {
 71      MESSAGE("Erreur a la lecture des informations sur le maillage : ");SSCRUTE(maa);
 72      return -1;
 73    } else
 74      printf("Maillage de nom : %s et de dimension : %d \n",maa,mdim);
 75
 76    /* Combien de noeuds a lire ? */
 77    nnoe = MEDnEntMaa(fid,maa,MED_COOR,MED_NOEUD,0,0);
 78    if (nnoe < 0) {
 79      MESSAGE("Erreur a la lecture du nombre de noeuds dans : ");
 80      ret = -1;
 81    } else
 82      printf("Nombre de noeuds : %d \n",nnoe);
 83
 84    /* Allocations memoires */
 85    if (nnoe > 0) {
 86      /* table des coordonnees 
 87         profil : (dimension * nombre de noeuds ) */
 88      coo1 = (med_float*) calloc(nnoe*mdim,sizeof(med_float));
 89      coo2 = (med_float*) calloc(nnoe*mdim,sizeof(med_float));
 90      /* table des des numeros, des numeros de familles des noeuds
 91         profil : (nombre de noeuds) */
 92      numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
 93      nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
 94      /* table des noms des noeuds 
 95         profil : (nnoe*MED_TAILLE_PNOM+1) */
 96      nomnoe = (char*) malloc(MED_TAILLE_PNOM*nnoe+1);
 97    }
 98
 99    /* Lecture des composantes n°2 des coordonnees des noeuds */
100    if (nnoe > 0) {
101      if (MEDcoordLire(fid,maa,mdim,coo1,MED_FULL_INTERLACE,2,NULL,0,
102               &rep,nomcoo,unicoo) < 0) {
103        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
104        ret = -1;
105      } else {
106        printf("Valeur de coo1 : ");
107        for (i=0;i<nnoe*mdim;i++)
108      printf("%4.2f ",coo1[i]);
109        printf("\n");
110      }
111    }
112
113    /* Lecture des composantes n°1 des coordonnees des noeuds */
114    if (nnoe > 0) {
115      if (MEDcoordLire(fid,maa,mdim,coo1,MED_FULL_INTERLACE,1,NULL,0,
116                 &rep,nomcoo,unicoo) < 0) {
117      MESSAGE("Erreur a la lecture des coordonnees des noeuds");
118      ret = -1;
119      } else {
120        printf("Valeur de coo1 : ");
121        for (i=0;i<nnoe*mdim;i++)
122      printf("%4.2f ",coo1[i]);
123        printf("\n");
124      }
125    }
126
127    /* Lecture des composantes n°1 des coordonnees des noeuds du profil */
128    if (nnoe > 0) {
129      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,2,profil,2,
130                 &rep,nomcoo,unicoo) < 0) {
131        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
132        ret = -1;
133      } else {
134        printf("Valeur de coo2 : ");
135        for (i=0;i<nnoe*mdim;i++)
136      printf("%4.2f ",coo2[i]);
137        printf("\n");
138      }
139    }
140
141    /* Lecture des composantes n°2 des coordonnees des noeuds du profil */
142    if (nnoe > 0) {
143      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,1,profil,2,
144                 &rep,nomcoo,unicoo) < 0) {
145        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
146        ret = -1;
147      } else {
148        printf("Valeur de coo2 : ");
149        for (i=0;i<nnoe*mdim;i++) {
150      printf("%4.2f ",coo2[i]);
151      coo2[i] = 0.0;
152        }
153        printf("\n");
154      }
155    }
156
157    /* Lecture de toutes les composantes des coordonnees des noeuds du profil */
158    if (nnoe > 0) {
159      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,MED_ALL,profil,2,
160                 &rep,nomcoo,unicoo) < 0) {
161        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
162        ret = -1;
163      } else {
164        printf("Valeur de coo2 : ");
165        for (i=0;i<nnoe*mdim;i++) {
166      printf("%4.2f ",coo2[i]);
167      coo2[i] = 0.0;
168        }
169        printf("\n");
170      }
171    }
172
173    /* Lecture des composantes des coordonnees des noeuds */
174    if (nnoe > 0) {
175      if (MEDcoordLire(fid,maa,mdim,coo2,MED_FULL_INTERLACE,MED_ALL,NULL,0,
176                 &rep,nomcoo,unicoo) < 0) {
177        MESSAGE("Erreur a la lecture des coordonnees des noeuds");
178        ret = -1;
179      } else {
180        printf("Valeur de coo2 : ");
181        for (i=0;i<nnoe*mdim;i++)
182      printf("%4.2f ",coo2[i]);
183        printf("\n");
184      }
185    }
186
187    /* Lecture des noms des noeuds (optionnel dans un maillage MED) */
188    if (nnoe > 0)
189      if (MEDnomLire(fid,maa,nomnoe,nnoe,MED_NOEUD,0) < 0)
190        inonoe = MED_FAUX;
191      else
192        inonoe = MED_VRAI;
193
194    /* Lecture des numeros des noeuds (optionnel dans un maillage MED) */
195    if (nnoe > 0)
196      if (MEDnumLire(fid,maa,numnoe,nnoe,MED_NOEUD,0) < 0)
197        inunoe = MED_FAUX;
198      else
199        inunoe = MED_VRAI;
200
201    /* Lecture des numeros de familles des noeuds */
202    if (nnoe > 0)
203      if (MEDfamLire(fid,maa,nufano,nnoe,MED_NOEUD,0) < 0) {
204        MESSAGE("Erreur a la lecture des numeros de famille des noeuds");
205        ret = -1;
206      }
207
208    /* Fermeture du fichier */
209    if (MEDfermer(fid) < 0){
210        MESSAGE("Erreur a la fermeture du fichier");
211        ret = -1;
212      }
213
214    /* Affichage des resulats */
215    if (ret == 0 && nnoe > 0)
216      {
217        printf("Type de repere : %d \n",rep);
218        printf("Nom des coordonnees : \n");
219        for (i=0;i<mdim;i++)
220      {
221        strncpy(str,nomcoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
222            str[MED_TAILLE_PNOM] = '\0';
223            printf("%s ",str);
224      }
225        printf("\nUnites des coordonnees : \n");
226        for (i=0;i<mdim;i++)
227      {
228        strncpy(str,unicoo+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
229            str[MED_TAILLE_PNOM] = '\0';
230            printf("%s ",str);
231      }
232        printf("\nCoordonnees des noeuds : \n");
233        for (i=0;i<nnoe*mdim;i++)
234      printf("%f ",*(coo2+i));
235        if (inonoe)
236      {
237        printf("\nNoms des noeuds : \n");
238        for (i=0;i<nnoe;i++)
239          {
240            strncpy(str,nomnoe+i*MED_TAILLE_PNOM,MED_TAILLE_PNOM);
241                str[MED_TAILLE_PNOM] = '\0';
242            printf(" %s ",str);
243          }
244      }
245        if (inunoe)
246      {
247        printf("\nNumeros des noeuds : \n");
248        for (i=0;i<nnoe;i++)
249            printf("%d ",*(numnoe+i));
250      }
251        printf("\nNumeros des familles des noeuds : \n");
252        for (i=0;i<nnoe;i++)
253      printf("%d ",*(nufano+i));
254        printf("\n");
255      }
256
257    /* liberation memoire */
258    if (nnoe > 0) {
259      free(coo1);
260      free(coo2);
261      free(nomnoe);
262      free(numnoe);
263      free(nufano);
264    }
265
266    return ret;
267  }
268
269
270
271