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