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