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 : test28.c
 21  *
 22  * - Description : lecture d'un maillage structure (grille cartesienne |
 23  *                 grille polaire) dans le fichier test27.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   int i;
 44   med_err ret = 0;
 45   med_idt fid;
 46   /* la dimension du maillage */
 47   med_int mdim,axe,j;
 48   med_float *indices;
 49   med_int nind,nmaa;
 50   /* nom du maillage de longueur maxi MED_TAILLE_NOM */
 51   char maa[MED_TAILLE_NOM+1];
 52   /* composantes et unites */
 53   char comp[MED_TAILLE_PNOM+1];
 54   char unit[MED_TAILLE_PNOM+1];
 55   char desc[MED_TAILLE_DESC+1];
 56   med_maillage type_maillage;
 57   med_type_grille type;
 58   med_table quoi;
 59   med_int nnoeuds;
 60   char *comp2, *unit2;
 61   med_float *coo;
 62   med_int *structure_grille;
 63   med_repere repere;
 64 
 65   /* Ouverture du fichier test17.med en lecture seule */
 66   fid = MEDouvrir("test27.med",MED_LECTURE);
 67   if (fid < 0) {
 68     MESSAGE("Erreur a l'ouverture du fichier test27.med");
 69     return -1;
 70   }
 71 
 72   /* Lecture du nombre de maillage */
 73   nmaa = MEDnMaa(fid);
 74   if (nmaa < 0) {
 75     MESSAGE("Erreur a la lecture du nombre de maillage");
 76     return -1;
 77   }
 78 
 79   /* On boucle sur les maillages et on ne lit que la grille cartesienne 
 80      et la grille desturcutree */
 81   for (i=0;i<nmaa;i++) {
 82 
 83     /* On repere le maillage qui nous interesse */
 84     if (MEDmaaInfo(fid,i+1,maa,&mdim,&type_maillage,desc) < 0) {
 85       MESSAGE("Erreur a la lecture des infos sur le maillage");
 86       return -1;
 87     }
 88     printf("Maillage de nom [%s] de dimension %d \n",maa,mdim);
 89     if (type_maillage == MED_STRUCTURE)
 90       printf("- Type : Maillage structure \n");
 91     else
 92       printf("- Type : Maillage non structure \n");
 93 
 94     /* On regarde le type de la grille */
 95     if (type_maillage == MED_STRUCTURE) {
 96       if (MEDnatureGrilleLire(fid,maa,&type) < 0) {
 97         MESSAGE("Erreur a la lecture de la nature d'une grille");
 98         return -1;
 99       }
100       if (type == MED_GRILLE_CARTESIENNE)
101         printf("- Grille cartesienne \n");
102       if (type == MED_GRILLE_STANDARD)
103         printf("- Grille de-structureee \n");
104     }
105 
106     /* On regarde les coordonnees de la grille standard */
107     if (type_maillage == MED_STRUCTURE && type == MED_GRILLE_STANDARD) {
108 
109       nnoeuds = MEDnEntMaa(fid,maa,MED_COOR,MED_NOEUD,0,0);
110       if (nnoeuds < 0) {
111         MESSAGE("Erreur a la lecture du nombre de noeuds");
112         return -1;
113       }
114       printf("Nombre de noeuds : %d \n",nnoeuds);
115 
116       structure_grille = (med_int *) malloc(sizeof(med_int)*mdim);
117       if (MEDstructureCoordLire(fid,maa,mdim,structure_grille) < 0) {
118         MESSAGE("Erreur a la lecture de la structure de la grille");
119         ret = -1;
120       }
121       if (ret == 0) {
122         printf("Structure des noeuds de la grille : [ ");
123         for (j=0;j<mdim;j++)
124           printf(" %d ",*(structure_grille+j));
125         printf(" ] \n");
126         free(structure_grille);
127       }
128 
129       if (ret == 0) {
130         coo = (med_float *) malloc(sizeof(med_float)*nnoeuds*mdim);
131         comp2 = (char *) malloc(sizeof(char)*(mdim*MED_TAILLE_PNOM+1));
132         unit2 = (char *) malloc(sizeof(char)*(mdim*MED_TAILLE_PNOM+1));
133 
134         if (ret = MEDcoordLire(fid,maa,mdim,coo,MED_FULL_INTERLACE,MED_ALL,NULL,0,
135                                &repere,comp2,unit2) < 0) {
136           MESSAGE("Erreur a la lecture des coordonnees des noeuds");
137           ret = -1;
138         }
139       }
140 
141       if (ret == 0) {
142         printf("Coordonnees : [ ");
143         for (j=0;j<nnoeuds*mdim;j++)
144           printf(" %f ",*(coo+j));
145         printf(" ] \n");
146         free(coo);
147         free(comp2);
148         free(unit2);
149       }
150     }
151 
152     /* On regarde les coordonnees des indices de la grille cartesienne */
153     if (type_maillage == MED_STRUCTURE && type == MED_GRILLE_CARTESIENNE)
154       for(axe=1;axe<=mdim;axe++) {
155         switch(axe) {
156         case 1 :
157           quoi = MED_COOR_IND1;
158           break;
159 
160         case 2 :
161           quoi = MED_COOR_IND2;
162           break;
163 
164         case 3 :
165           quoi = MED_COOR_IND3;
166           break;
167 
168         default :
169           return -1;
170         }
171 
172         nind = MEDnEntMaa(fid,maa,quoi,MED_NOEUD,0,0);
173         if (nind < 0) {
174           MESSAGE("Erreur a la lecture de la taille de l'indice");
175           return -1;
176         }
177         printf("Lecture de la taille de l'indice : %d \n",nind);
178 
179           /* on lit le tableau des indices */
180         indices = (med_float *) malloc(sizeof(med_float)*nind);
181         if (MEDindicesCoordLire(fid,maa,mdim,indices,nind,axe,comp,unit) < 0) {
182           MESSAGE("Erreur a lecture de indices de coordonnees");
183           ret = -1;
184         }
185         if (ret == 0) {
186           printf("Axe %s [%s] : [ ",comp,unit);
187           for (j=0;j<nind;j++)
188             printf(" %f ",indices[j]);
189           printf(" ] \n");
190           free(indices);
191         }
192       }
193   }
194 
195   /* On ferme le fichier */
196   if (MEDfermer(fid) < 0) {
197     MESSAGE("Erreur a la fermeture du fichier");
198     return -1;
199   }
200   printf("Fermeture du fichier \n");
201 
202   return ret;
203 }