1 /*  This file is part of MED.
2  *
3  *  COPYRIGHT (C) 1999 - 2019  EDF R&D, CEA/DEN
4  *  MED is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU Lesser General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  MED is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /******************************************************************************
19  * - Nom du fichier : mdump.c
20  *
21  * - Description : utilitaire de dump pour fichier MED
22  *                 Ce fichier contient les fonctions suivantes
23  *                 qui constituent des modeles de programmation
24  *                 pour une lecture generique d'un fichier MED :
25  *                 - lecture_maillage_non_structure () :
26  *                        1. Noeuds.
27  *                        2. Mailles.
28  *                        3. Faces (connectivite descendante).
29  *                        4. Aretes (connectivite descendante).
30  *                        5. Familles.
31  *                        6. Equivalences.
32  *                        7. Joints.
33  *                 - lecture_maillage_structure ()     :
34  *                        1. Noeuds.
35  *                        2. Mailles.
36  *                        3. Familles.
37  *                        4. Equivalences.
38  *                        5. Joints.
39  *                 - lecture_resultats () :
40  *                        1. Champs de resultats relatifs à un maillage.
41  *                           - Entites :
42  *                                - Noeuds
43  *                                - Mailles
44  *                                - Faces
45  *                                - Aretes
46  *                           - Gestion des pas de temps et numeros d'ordre :
47  *                                  valeurs associees a un ou plusieurs maillages sous
48  *                                  un meme pas de temps.
49  *                           - Gestion des profils.
50  *                           - Gestion des liens vers des maillages distants
51  *                           - Gestion des points de Gauss :
52  *                                - localisation des points de Gauss.
53  *                 - lecture_parametres_scalaires () :
54  *                           - Valeurs scalaires entieres ou flottantes.
55  *                           - Gestion des pas de temps et numeros d'ordre.
56  *                 - main() : infos generales + lecture de tous les champs et
57  *                            du fichier MED passe en parametre.
58  *
59  *****************************************************************************/
60 
61 #ifndef MESGERR
62 #define MESGERR 1
63 #endif
64 
65 #ifdef __cplusplus
66 extern "C" {
67 #endif
68 
69 #include <med.h>
70 #include <med_config.h>
71 #include <med_utils.h>
72 #include <med_misc.h>
73 #include <stdio.h>
74 #include <string.h>
75 #include <stdlib.h>
76 
77 #ifdef __cplusplus
78 }
79 #endif
80 
81 #ifdef PPRO_NT
82 #define F_OK 0
83 #else
84 #include <unistd.h>
85 #endif
86 
87 
88 extern med_entity_type MED23MESH_GET_ENTITY_TYPE[MED_N_ENTITY_TYPES+2];
89 extern const char * const MED23MESH_GET_ENTITY_TYPENAME[MED_N_ENTITY_TYPES+2];
90 extern med_geometry_type MED23MESH_GET_CELL_GEOMETRY_TYPE[MED_N_CELL_FIXED_GEO+2];
91 extern const char * const MED23MESH_GET_CELL_GEOMETRY_TYPENAME[MED_N_CELL_FIXED_GEO+2];
92 extern med_geometry_type MED23MESH_GET_FACE_GEOMETRY_TYPE[MED_N_FACE_FIXED_GEO+2];
93 extern const char * const MED23MESH_GET_FACE_GEOMETRY_TYPENAME[MED_N_FACE_FIXED_GEO+2];
94 extern med_geometry_type MED23MESH_GET_EDGE_GEOMETRY_TYPE[MED_N_EDGE_FIXED_GEO+2];
95 extern const char * MED23MESH_GET_EDGE_GEOMETRY_TYPENAME[MED_N_EDGE_FIXED_GEO+2];
96 extern med_geometry_type MED23MESH_GET_NODE_GEOMETRY_TYPE[MED_N_NODE_FIXED_GEO+2];
97 extern const char * MED23MESH_GET_NODE_GEOMETRY_TYPENAME[MED_N_NODE_FIXED_GEO+2];
98 
99 extern med_entity_type MED23FIELD_GET_ENTITY_TYPE[MED_N_ENTITY_TYPES+2];
100 extern const char * const MED23FIELD_GET_ENTITY_TYPENAME[MED_N_ENTITY_TYPES+2];
101 extern med_geometry_type MED23FIELD_GET_CELL_GEOMETRY_TYPE[MED_N_CELL_FIXED_GEO+2];
102 extern const char * const MED23FIELD_GET_CELL_GEOMETRY_TYPENAME[MED_N_CELL_FIXED_GEO+2];
103 extern med_geometry_type MED23FIELD_GET_FACE_GEOMETRY_TYPE[MED_N_FACE_FIXED_GEO+2];
104 extern const char * const MED23FIELD_GET_FACE_GEOMETRY_TYPENAME[MED_N_FACE_FIXED_GEO+2];
105 extern med_geometry_type MED23FIELD_GET_EDGE_GEOMETRY_TYPE[MED_N_EDGE_FIXED_GEO+2];
106 extern const char * MED23FIELD_GET_EDGE_GEOMETRY_TYPENAME[MED_N_EDGE_FIXED_GEO+2];
107 extern med_geometry_type MED23FIELD_GET_NODE_GEOMETRY_TYPE[MED_N_NODE_FIXED_GEO+2];
108 extern const char * MED23FIELD_GET_NODE_GEOMETRY_TYPENAME[MED_N_NODE_FIXED_GEO+2];
109 
110 
111 /* indique si on ecrit seulement la structure */
112 int structure = 0;
113 
114 /* types geometriques des mailles references dans le modele MED */
115 const med_geometry_type * const typmai = MED23MESH_GET_CELL_GEOMETRY_TYPE+1;
116 const med_geometry_type * const typfac = MED23MESH_GET_FACE_GEOMETRY_TYPE+1;
117 const med_geometry_type * const typare = MED23MESH_GET_EDGE_GEOMETRY_TYPE+1;
118 
119 const char * const *nommai = MED23MESH_GET_CELL_GEOMETRY_TYPENAME+1;
120 const char * const *nomfac = MED23MESH_GET_FACE_GEOMETRY_TYPENAME+1;
121 const char * const *nomare = MED23MESH_GET_EDGE_GEOMETRY_TYPENAME+1;
122 
123 
124 #define USER_MODE MED_COMPACT_STMODE
125 
126 #define xstr(s) str(s)
127 #define str(s) #s
128 
lecture_nombre_famille(med_idt fid,const char * const nommaa)129 med_int lecture_nombre_famille(med_idt fid,const char * const nommaa)
130 {
131   med_int nfam = MEDnFamily(fid,nommaa);
132   EXIT_IF(nfam < 0,"lors de la lecture du nombre de familles",NULL);
133   fprintf(stdout,"- Nombre de familles : %d \n",nfam);
134 
135   return nfam;
136 }
137 
lecture_famille_maillage(med_idt fid,const char * const nommaa,med_int nfam)138 void lecture_famille_maillage(med_idt fid,const char * const nommaa,med_int nfam)
139 {
140   med_int i,j;
141   med_int natt,ngro;
142   char *attdes=NULL,*gro=NULL;
143   med_int *attval=NULL,*attide=NULL;
144   char nomfam[MED_NAME_SIZE+1];
145   med_int numfam;
146   char str1[MED_COMMENT_SIZE+1];
147   char str2[MED_LNAME_SIZE+1];
148   med_err ret = 0;
149   int famille_0 = 0;
150 
151   fprintf(stdout,"\n(**************************)\n");
152   fprintf(stdout,"(* FAMILLES DU MAILLAGE : *)\n");
153   fprintf(stdout,"(**************************)\n");
154 
155   for (i=0;i<nfam;i++) {
156 
157     /* nombre de groupes */
158     ngro = MEDnFamilyGroup(fid,nommaa,i+1);
159     EXIT_IF(ngro < 0,"lors de la lecture du nombre de groupe d'une famille",
160 	    NULL);
161 
162     /* nombre d'attributs */
163     natt = MEDnFamily23Attribute(fid,nommaa,i+1);
164     EXIT_IF(natt < 0,"lors de la lecture du nombre d'attributs d'une famille",
165 	    NULL);
166 
167     fprintf(stdout,"- Famille %d a %d attributs et %d groupes \n",i+1,natt,
168 	    ngro);
169 
170     /* nom,numero,attributs,groupes */
171 
172     /* allocation memoire */
173     attide = (med_int*) malloc(sizeof(med_int)*natt);
174     EXIT_IF(attide == NULL,NULL,NULL);
175     attval = (med_int*) malloc(sizeof(med_int)*natt);
176     EXIT_IF(attval == NULL,NULL,NULL);
177     attdes = (char *) malloc(MED_COMMENT_SIZE*natt+1);
178     EXIT_IF(attdes == NULL,NULL,NULL);
179     gro = (char*) malloc(MED_LNAME_SIZE*ngro+1);
180     EXIT_IF(gro == NULL,NULL,NULL);
181     ret = MEDfamily23Info(fid,nommaa,i+1,nomfam,attide,attval,
182 			  attdes,&numfam,gro);
183     EXIT_IF(ret < 0,"lors de la lecture des informations d'une famille",
184 	    NULL);
185 	if (numfam == 0)
186 	  famille_0 = 1;
187 
188     if (!structure) {
189     /* affichage des resultats */
190     fprintf(stdout,"  - Famille de nom %s et de numero %d : \n",nomfam,numfam);
191     fprintf(stdout,"  - Attributs : \n");
192     for (j=0;j<natt;j++) {
193       strncpy(str1,attdes+j*MED_COMMENT_SIZE,MED_COMMENT_SIZE);
194       str1[MED_COMMENT_SIZE] = '\0';
195       fprintf(stdout,"   ide = %d - val = %d - des = %s\n",*(attide+j),
196 	      *(attval+j),str1);
197     }
198     }
199 
200     /* on libere la memoire */
201     if (attide) {free(attide);attide=NULL;}
202     if (attval) {free(attval);attval=NULL;}
203     if (attdes) {free(attdes);attdes=NULL;}
204 
205     if (!structure) {
206     fprintf(stdout,"  - Groupes :\n");
207     for (j=0;j<ngro;j++) {
208       strncpy(str2,gro+j*MED_LNAME_SIZE,MED_LNAME_SIZE);
209       str2[MED_LNAME_SIZE] = '\0';
210       fprintf(stdout,"   gro = %s\n",str2);
211     }
212     }
213 
214     /* on libere la memoire */
215     if (gro) {free(gro);gro=NULL;}
216   }
217 
218   if (famille_0 != 1) {
219     MESSAGE("Erreur : La famille FAMILLE_ZERO n'a pas été trouvée, elle est obligatoire. ");
220   }
221 
222   return;
223 }
224 
lecture_nombre_equivalence(med_idt fid,const char * const nommaa)225 med_int lecture_nombre_equivalence(med_idt fid,const char * const nommaa)
226 {
227   med_int nequ = MEDnEquivalence(fid,nommaa);
228   EXIT_IF(nequ < 0,"lors de la lecture du nombre d'equivalences",NULL);
229   fprintf(stdout,"- Nombre d'equivalences : %d \n",nequ);
230 
231   return nequ;
232 }
233 
234 /* nombre de mailles concernees par les equivalences */
lecture_equivalence_maillage(med_idt fid,const char * const nommaa,med_int nequ)235 void lecture_equivalence_maillage(med_idt fid,const char * const nommaa,med_int nequ)
236 {
237   med_int i,j,k;
238   med_int ncor;
239   med_int *cor;
240   char equ[MED_NAME_SIZE+1];
241   char des[MED_COMMENT_SIZE+1];
242   med_err ret = 0;
243   med_int nstep=0,nocstpncor=0;
244   int     _cstpit=0;
245   med_int _numdt,_numit;
246 
247   fprintf(stdout,"\n(******************************)\n");
248   fprintf(stdout,"(* EQUIVALENCES DU MAILLAGE : *)\n");
249   fprintf(stdout,"(******************************)\n");
250 
251   if (nequ == 0)
252     fprintf(stdout,"- Aucune équivalence \n");
253 
254   /* lecture de toutes les equivalences associes a nommaa */
255   for (i = 0;i<nequ;i++) {
256     fprintf(stdout,"- Equivalence numero : %d ",i+1);
257 
258     /* lecture des infos sur l'equivalence */
259     ret = MEDequivalenceInfo(fid,nommaa,i+1,equ,des,&nstep,&nocstpncor);
260     EXIT_IF(ret < 0,"lors de la lecture des informations sur une equivalence",
261 	    NULL);
262     fprintf(stdout,"\n  - Nom de l'equivalence: %s \n",equ);
263     fprintf(stdout,"\n  - Description de l'equivalence : %s \n",des);
264     if (nstep > 1)
265       fprintf(stdout,"\n  - L'equivalence est définie sur "IFORMAT" étapes de calcul\n",nstep);
266 
267     for (_cstpit=1; _cstpit <= nstep; ++_cstpit) {
268 
269       ret = MEDequivalenceComputingStepInfo   (fid, nommaa, equ, _cstpit,
270 					       & _numdt, &_numit,&nocstpncor);
271       EXIT_IF(ret < 0,
272 	      "lors de la lecture des valeurs de séquence de calcul  d'une equivalence",
273 	      NULL);
274       if ( (_numdt != MED_NO_DT) || (_numit != MED_NO_IT) )
275 	fprintf(stdout,"\n  - Séquence de calcul définie sur (numdt,numit) ("IFORMAT","IFORMAT") :\n",_numdt,_numit);
276 
277       /* lecture des correspondances sur les differents types d'entites */
278 
279       /* les noeuds */
280       ret = MEDequivalenceCorrespondenceSize(fid,nommaa,equ,_numdt,_numit,MED_NODE,MED_NONE,&ncor);
281       EXIT_IF(ret < 0,
282 	      "lors de la lecture du nombre de correspondances d'une equivalence",
283 	      NULL);
284       fprintf(stdout,"\n  - Il y a %d correspondances sur les noeuds \n",ncor);
285 
286       if (ncor > 0) {
287 
288 	/* allocation memoire */
289 	cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
290 	EXIT_IF(cor == NULL,NULL,NULL);
291 	ret= MEDequivalenceCorrespondenceRd(fid,nommaa,equ,_numdt,_numit,
292 					    MED_NODE,MED_NONE,cor);
293 	EXIT_IF(ret < 0,"lors de la lecture du tableau des correspondances",
294 		NULL);
295 	if (!structure) {
296 	  for (j=0;j<ncor;j++)
297 	    fprintf(stdout,"\n  - Correspondance %d : %d et %d \n",j+1,*(cor+2*j),
298 		    *(cor+2*j+1));
299 	}
300 	free(cor);
301       }
302 
303       /* sur les mailles : */
304       for (j=0;j<MED_N_CELL_FIXED_GEO;j++) {
305 
306 	ret = MEDequivalenceCorrespondenceSize(fid,nommaa,equ,_numdt,_numit,MED_CELL,typmai[j],&ncor);
307 	EXIT_IF(ret < 0,
308 		"lors de la lecture du nombre de correspondances dans une equivalence",
309 		NULL);
310 	fprintf(stdout,"\n  - Il y a %d correspondances sur les mailles %s \n",ncor,
311 		nommai[j]);
312 
313 	if (ncor > 0) {
314 
315 	  /* allocation memoire */
316 	  cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
317 	  EXIT_IF(cor == NULL,NULL,NULL);
318 	  ret = MEDequivalenceCorrespondenceRd(fid,nommaa,equ,_numdt,_numit,
319 					       MED_CELL,typmai[j],cor);
320 	  EXIT_IF(ret < 0,"lors de la lecture du tableau des equivalences",
321 		  NULL);
322 
323 	  if (!structure) {
324 	    for (k=0;k<ncor;k++)
325 	      fprintf(stdout,"\n  - Correspondance %d : %d et %d \n",k+1,
326 		      *(cor+2*k),*(cor+2*k+1));
327 	  }
328 	  free(cor);
329 	}
330       }
331 
332 
333       /* sur les faces */
334       for (j=0;j<MED_N_FACE_FIXED_GEO;j++) {
335 
336 	ret = MEDequivalenceCorrespondenceSize(fid,nommaa,equ,_numdt,_numit,
337 					       MED_DESCENDING_FACE,typfac[j],&ncor);
338 
339 	EXIT_IF(ret < 0,
340 		"lors de la lecture du nombre de correspondances dans une equivalence",
341 		NULL);
342 	fprintf(stdout,"\n  - Il y a %d correspondances sur les faces %s\n",ncor,
343 	      nomfac[j]);
344 
345 	if (ncor > 0) {
346 
347 	  /* allocation memoire */
348 	  cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
349 	  EXIT_IF(cor == NULL,NULL,NULL);
350 	  ret = MEDequivalenceCorrespondenceRd(fid,nommaa,equ,_numdt,_numit,
351 					       MED_DESCENDING_FACE,typfac[j],cor);
352 	  EXIT_IF(ret < 0,"lors de la lecture du tableau des equivalences",
353 		  NULL);
354 
355 	  if (!structure) {
356 	    for (k=0;k<ncor;k++)
357 	      fprintf(stdout,"\n  - Correspondance %d : %d et %d \n",k+1,*(cor+2*k),
358 		      *(cor+2*k+1));
359 	  }
360 	  free(cor);
361 	}
362       }
363 
364 
365       /*  sur les aretes */
366       for (j=0;j<MED_N_NODE_FIXED_GEO;j++) {
367 
368 	ret = MEDequivalenceCorrespondenceSize(fid,nommaa,equ,_numdt,_numit,
369 					     MED_DESCENDING_EDGE,typare[j],&ncor);
370 	EXIT_IF(ret < 0,"lors de la lecture du nombre de correspondances",
371 		NULL);
372 	fprintf(stdout,"\n  - Il y a %d correspondances sur les aretes %s \n",
373 		ncor,nomare[j]);
374 
375 	if (ncor > 0) {
376 
377 	  /* allocation memoire */
378 	  cor = (med_int*) malloc(sizeof(med_int)*ncor*2);
379 	  EXIT_IF(cor == NULL,NULL,NULL);
380 	  ret =MEDequivalenceCorrespondenceRd(fid,nommaa,equ,_numdt,_numit,
381 					      MED_DESCENDING_EDGE,typare[j],cor);
382 	  EXIT_IF(ret < 0,"lors de la lecture du tableau des equivalences",
383 		  NULL);
384 
385 	  if (!structure) {
386 	    for (k=0;k<ncor;k++)
387 	      fprintf(stdout,"\n  Correspondance %d : %d et %d \n",k+1,*(cor+2*k),
388 		      *(cor+2*k+1));
389 	  }
390 
391 	  free(cor);
392 	}
393       }
394     }
395   }
396 
397   return;
398 }
399 
400 
lecture_nombre_joint(med_idt fid,const char * const nommaa)401 med_int lecture_nombre_joint(med_idt fid,const char * const nommaa)
402 {
403   med_int njnt = MEDnSubdomainJoint(fid,nommaa);
404   EXIT_IF(njnt < 0,"lors de la lecture du nombre de joints",NULL);
405   fprintf(stdout,"- Nombre de joints : %d \n",njnt);
406 
407   return njnt;
408 }
409 
410 
lecture_joint_maillage(med_idt fid,const char * const nommaa,med_int njnt)411 void lecture_joint_maillage(med_idt fid,const char * const nommaa,med_int njnt)
412 {
413   med_int i,k;
414   char des[MED_COMMENT_SIZE+1];
415   med_int ndom,nent;
416   med_int typ_ent_local,typ_geo_local,typ_ent_distant,typ_geo_distant;
417 /*   med_int geo_ent_local,geo_ent_distant; */
418 
419   char jn                  [MED_NAME_SIZE+1]="";
420   char maa_dist            [MED_NAME_SIZE+1]="";
421   char nom_geo_ent_local   [MED_NAME_SIZE+1]="";
422   char nom_geo_ent_distant [MED_NAME_SIZE+1]="";
423   med_int *cortab;
424 
425   med_err ret = 0;
426   med_int njstep=0,ncor=0,nodtitncor=0;
427   int corit=0,csit=0;
428   med_int _numdt,_numit;
429 
430   fprintf(stdout,"\n(******************************)\n");
431   fprintf(stdout,"(* JOINTS DU MAILLAGE       : *)\n");
432   fprintf(stdout,"(******************************)\n");
433 
434   if (njnt == 0)
435     fprintf(stdout,"- Aucun joint \n");
436 
437   /* lecture de touts les joints associes a nommaa */
438   for (i = 0;i<njnt;i++) {
439     fprintf(stdout,"- Joint numero : %d ",i+1);
440 
441     /* lecture des infos sur le joint */
442     ret = MEDsubdomainJointInfo(fid,nommaa,i+1,jn,des,&ndom,maa_dist,&njstep,&nodtitncor);
443     EXIT_IF(ret < 0,"lors de la lecture des informations sur un joint",
444 	    NULL);
445 
446     fprintf(stdout,"\n  - Nom du joint: %s \n",jn);
447     fprintf(stdout,"\n  - Description du joint      : %s ",des);
448     fprintf(stdout,"\n  - Domaine en regard         : %d ",ndom);
449     fprintf(stdout,"\n  - Maillage distant          : %s ",maa_dist);
450     if (njstep > 1 ) {
451       printf("Nombre d'étapes de calcul : "IFORMAT" \n",njstep);
452       printf("Nombre de correspondance pour (NO_DT,NO_IT) : "IFORMAT" \n",nodtitncor);
453     }
454 
455     for (csit=1; csit <= njstep; ++csit) {
456 
457       ret = MEDsubdomainComputingStepInfo( fid, nommaa, jn, csit, &_numdt, &_numit, &ncor);
458       EXIT_IF(ret < 0,"Erreur a la lecture des valeurs (numdt,numit) dans les joints",
459 	    NULL);
460       if ( (_numdt != MED_NO_DT) || (_numit != MED_NO_IT) ) {
461 	printf("Séquence de calcul (numdt,numit) : ("IFORMAT","IFORMAT")\n",_numdt,_numit);
462       }
463       corit=1;
464       while ( corit <= ncor ) {
465 
466 	ret = MEDsubdomainCorrespondenceSizeInfo(fid,nommaa,jn,_numdt,_numit,corit,
467 						 (med_entity_type *) &typ_ent_local, (med_geometry_type *) &typ_geo_local,
468 						 (med_entity_type *) &typ_ent_distant,(med_geometry_type *)&typ_geo_distant,
469 						 &nent);
470 	EXIT_IF(ret < 0,"Erreur a la lecture des infos sur le nombre d'entite en regard",
471 		NULL);
472 	if (nent > 0) {
473 	  if (typ_ent_local == MED_NODE) strcpy(nom_geo_ent_local,"MED_NOEUD");
474 	  else  ret = _MEDgetExternalGeometryTypeName(nom_geo_ent_local,typ_geo_local);
475 	  EXIT_IF(ret < 0,"Erreur à l'appel de _MEDgetExternalGeometryTypeName", NULL);
476 	  if (typ_ent_distant == MED_NODE) strcpy(nom_geo_ent_distant,"MED_NOEUD");
477 	  else ret = _MEDgetExternalGeometryTypeName(nom_geo_ent_distant,typ_geo_distant);
478 	  EXIT_IF(ret < 0,"Erreur à l'appel de _MEDgetExternalGeometryTypeName", NULL);
479 	  fprintf(stdout,"\n\t\t- nb de couples d'entites en regard (local,distant)=(%s,%s) : "IFORMAT" \n",
480 		  nom_geo_ent_local,nom_geo_ent_distant,  nent);
481 	  /*TODO : Supprimer la ligne suivante*/
482 /* 	  fprintf(stdout,"  %d \n",nent); */
483 	  cortab = (med_int*) malloc(sizeof(med_int)*nent*2);
484 	  if ( (ret=MEDsubdomainCorrespondenceRd(fid,nommaa,jn,_numdt,_numit,
485 						 typ_ent_local,typ_geo_local,typ_ent_distant,typ_geo_distant,
486 						 cortab)) < 0) {
487 	    fprintf(stdout,"\n\t\t- Erreur a la lecture des correspondances sur (%s,%s,%s,%s)",
488 		    MED23MESH_GET_ENTITY_TYPENAME[typ_ent_local+1],nom_geo_ent_local,
489 		    MED23MESH_GET_ENTITY_TYPENAME[typ_ent_distant+1],nom_geo_ent_distant);
490 	  } else {
491 	    if (!structure) {
492 	      for (k=0;k<nent;k++)
493 		fprintf(stdout,"\n\t\t- Correspondance %d : "IFORMAT" et "IFORMAT" ",k+1,
494 			*(cortab+2*k),*(cortab+2*k+1));
495 	    }
496 	  }
497 	  free(cortab);
498 	}
499 
500 	corit++;
501       }
502     }
503   }
504 
505   return;
506 }
507 
508 
lecture_nombre_noeuds_maillage_non_structure(const med_idt fid,const char * nommaa,const med_int numdt,const med_int numit)509 med_int lecture_nombre_noeuds_maillage_non_structure(const med_idt fid,
510 						     const char *  nommaa,
511 						     const med_int numdt,
512 						     const med_int numit)
513 {
514 
515 
516   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
517 
518   med_int nnoe = MEDmeshnEntity(fid,nommaa,numdt,numit,
519 				MED_NODE,MED_NO_GEOTYPE,
520 				MED_COORDINATE,MED_NODAL,&chgt,&trsf);
521   EXIT_IF(nnoe < 0,"lors de la lecture du nombre de noeuds",NULL);
522   fprintf(stdout,"- Nombre de noeuds : %d \n",nnoe);
523 
524   return nnoe;
525 }
526 
527 
lecture_noeuds_maillage_non_structure(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int edim,const med_int nnoe,const med_switch_mode mode_coo,const char * const nomcoo,const char * const unicoo,const med_axis_type * const rep)528 void lecture_noeuds_maillage_non_structure(const med_idt fid,
529 					   const char * const nommaa,
530 					   const med_int numdt,
531 					   const med_int numit,
532 					   const med_int mdim,
533 					   const med_int edim,
534 					   const med_int nnoe,
535 					   const med_switch_mode mode_coo,
536 					   const char * const nomcoo,
537 					   const char * const unicoo,
538 					   const med_axis_type *const rep)
539 {
540   med_float *coo;
541   char *nomnoe;
542   med_int *numnoe;
543   med_int *nufano;
544   med_bool inonoe,inunoe,ifano;
545   med_err ret = 0;
546   med_int i;
547   char str[MED_SNAME_SIZE+1];
548 
549 
550   /* Allocations memoires */
551   /* table des coordonnees
552      profil : (dimension * nombre de noeuds ) */
553   coo = (med_float*) malloc(sizeof(med_float)*nnoe*edim);
554   EXIT_IF(coo == NULL,NULL,NULL);
555   /* table  des numeros, des numeros de familles des noeuds
556      profil : (nombre de noeuds) */
557   numnoe = (med_int*) malloc(sizeof(med_int)*nnoe);
558   EXIT_IF(numnoe == NULL,NULL,NULL);
559   nufano = (med_int*) malloc(sizeof(med_int)*nnoe);
560   EXIT_IF(nufano == NULL,NULL,NULL);
561   /* table des noms des noeuds
562      profil : (nnoe*MED_SNAME_SIZE+1) */
563   nomnoe = (char*) malloc(MED_SNAME_SIZE*nnoe+1);
564   EXIT_IF(nomnoe == NULL,NULL,NULL);
565 
566   /* lecture des noeuds :
567      - coordonnees
568      - noms (optionnel dans un fichier MED)
569      - numeros (optionnel dans un fichier MED)
570      - numeros des familles */
571   ret = MEDmeshNodeRd(fid,nommaa,numdt,numit, mode_coo, coo,
572 		      &inonoe,nomnoe,&inunoe,numnoe,&ifano,nufano);
573 
574 
575   EXIT_IF(ret < 0,"lors de la lecture des noeuds du maillage \n",NULL);
576 
577   /* affichage des resultats */
578   fprintf(stdout,"\n(************************)\n");
579   fprintf(stdout,"(* NOEUDS DU MAILLAGE : *)\n");
580   fprintf(stdout,"(************************)\n");
581   fprintf(stdout,"- Type de repere des coordonnees : %d \n",*rep);
582   fprintf(stdout,"- Nom des coordonnees : \n");
583   for (i=0;i<edim;i++) {
584     strncpy(str,nomcoo+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
585     str[MED_SNAME_SIZE] = '\0';
586     fprintf(stdout," %s ",str);
587   }
588   fprintf(stdout,"\n- Unites des coordonnees : \n");
589   for (i=0;i<edim;i++) {
590     strncpy(str,unicoo+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
591     str[MED_SNAME_SIZE] = '\0';
592     fprintf(stdout," %s ",str);
593   }
594   if (!structure) {
595   fprintf(stdout,"\n- Coordonnees des noeuds : \n");
596   for (i=0;i<nnoe*edim;i++) {
597     if (mode_coo == MED_FULL_INTERLACE && !(i % edim))
598       fprintf(stdout,"\n [ %5d ] : ", (i/edim + 1) );
599     if (mode_coo == MED_NO_INTERLACE && ! (i % nnoe))
600       fprintf(stdout,"\n\n ");
601     fprintf(stdout," %-+9.6f ",*(coo+i));
602   }
603 
604   if (inonoe) {
605     fprintf(stdout,"\n- Noms des noeuds : \n");
606     for (i=0;i<nnoe;i++) {
607       strncpy(str,nomnoe+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
608       str[MED_SNAME_SIZE] = '\0';
609       fprintf(stdout," %s ",str);
610     }
611   }
612   if (inunoe) {
613     fprintf(stdout,"\n- Numeros des noeuds : \n");
614     for (i=0;i<nnoe;i++)
615       fprintf(stdout," %d ",*(numnoe+i));
616   }
617 
618   fprintf(stdout,"\n- Numeros des familles des noeuds : \n");
619   for (i=0;i<nnoe;i++) {
620     if (ifano)
621       fprintf(stdout," %d ",*(nufano+i));
622     else
623       fprintf(stdout," %d ",0);
624   }
625   fprintf(stdout,"\n");
626   }
627 
628 
629   /* liberation memoire */
630   free(coo);
631   free(nomnoe);
632   free(numnoe);
633   free(nufano);
634 
635   return;
636 }
637 
638 
lecture_nombre_mailles_standards(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_geometry_type typ_geo,const med_connectivity_mode typ_con,const int indice)639 med_int lecture_nombre_mailles_standards(const med_idt fid,
640 					 const char * const nommaa,
641 					 const med_int numdt,
642 					 const med_int numit,
643 					 const med_geometry_type typ_geo,
644 					 const med_connectivity_mode typ_con,
645 					 const int indice)
646 {
647 
648   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
649 
650   med_int nmailles = MEDmeshnEntity(fid,nommaa,numdt,numit,
651 				    MED_CELL,typ_geo,
652 				    MED_CONNECTIVITY,typ_con,&chgt,&trsf);
653   EXIT_IF(nmailles < 0," lors de la lecture du nombre de mailles",NULL);
654 
655   if ( (indice < (MED_N_CELL_GEO_FIXED_CON-5) ) ||
656        (indice >= (MED_N_CELL_GEO_FIXED_CON-5) && (nmailles > 0) ) )
657        fprintf (stdout,"- Nombre de mailles de type %s : %d \n",nommai[indice],
658 		nmailles);
659 
660   return nmailles;
661 }
662 
lecture_mailles_standards(const med_idt fid,const char * nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int * const nmailles,const med_switch_mode mode_coo,const med_connectivity_mode typ_con)663 void lecture_mailles_standards(const med_idt fid,
664 			       const char *nommaa,
665 			       const med_int numdt,
666 			       const med_int numit,
667 			       const med_int mdim,
668 			       const med_int * const nmailles,
669 			       const med_switch_mode mode_coo,
670 			       const med_connectivity_mode typ_con)
671 {
672   med_int  taille;
673   med_int *connectivite;
674   char    *nomele;
675   med_int *numele;
676   med_int *nufael;
677   med_bool       inoele=MED_FALSE, inuele=MED_FALSE, inufael=MED_FALSE;
678   med_geometry_type typgeo;
679   med_int entdim;
680   med_int nnodes;
681   med_int nndes;
682   med_int i,j;
683   med_err ret = 0;
684   char str[MED_SNAME_SIZE+1];
685 
686   fprintf(stdout,"\n(**************************)\n");
687   fprintf(stdout,"(* ELEMENTS DU MAILLAGE : *)\n");
688   fprintf(stdout,"(**************************)");
689 
690   /* Lecture des connectivites, noms, numeros des mailles */
691   for (i=0;i<MED_N_CELL_GEO_FIXED_CON;i++)
692     if (nmailles[i] > 0) {
693 
694       ret=_MEDgetGeometricParameter(MED_CELL, typmai[i],&entdim,&nnodes,&nndes);
695       EXIT_IF(ret < 0,"lors de la lecture des caractéristiques des mailles",NULL);
696 
697       switch(typ_con) {
698       case MED_NODAL :
699 	taille = nnodes;
700 	break;
701 
702       case MED_DESCENDING :
703 	taille = nndes;
704 	break;
705 
706       default :
707 	ret = -1;
708       }
709 
710       /* allocation memoire */
711       connectivite = (med_int*) malloc(sizeof(med_int)*taille*nmailles[i]);
712       EXIT_IF(connectivite == NULL,NULL,NULL);
713       nomele = (char*) malloc(sizeof(char)*MED_SNAME_SIZE*nmailles[i]+1);
714       EXIT_IF(nomele == NULL,NULL,NULL);
715       numele = (med_int*) malloc(sizeof(med_int)*nmailles[i]);
716       EXIT_IF(numele == NULL,NULL,NULL);
717       nufael = (med_int*) malloc(sizeof(med_int)*nmailles[i]);
718       EXIT_IF(nufael == NULL,NULL,NULL);
719 
720       /* lecture des données */
721       ret = MEDmeshElementRd( fid,nommaa,numdt,numit,MED_CELL,typmai[i],
722 			      typ_con, mode_coo, connectivite,
723 			      &inoele,nomele,&inuele,numele,&inufael,nufael );
724 
725       EXIT_IF(ret < 0,"lors de la lecture des mailles",NULL);
726 
727       if (!structure) {
728       /* affichage des resultats */
729       fprintf(stdout,"\n\n- Mailles de type %s : ", nommai[i]);
730       fprintf(stdout,"\n  - Connectivité : \n");
731       for (j=0;j<nmailles[i]*taille;j++) {
732 	    if (mode_coo == MED_FULL_INTERLACE && !(j % taille))
733 	      fprintf(stdout,"\n [ %5d ] : ", (j/taille +1) );
734 	    if (mode_coo == MED_NO_INTERLACE && !(j % nmailles[i]))
735 	      fprintf(stdout,"\n");
736 	    fprintf(stdout," %9d ",*(connectivite+j));
737       }
738 
739       if (inoele) {
740 	fprintf(stdout,"\n  - Noms : \n");
741 	for (j=0;j<nmailles[i];j++) {
742 	  strncpy(str,nomele+j*MED_SNAME_SIZE,MED_SNAME_SIZE);
743 	  str[MED_SNAME_SIZE] = '\0';
744 	  fprintf(stdout," %s ",str);
745 	}
746       }
747       if (inuele) {
748 	fprintf(stdout,"\n  - Numeros :\n");
749 	for (j=0;j<nmailles[i];j++)
750 	  fprintf(stdout," %d ",*(numele+j));
751       }
752       fprintf(stdout,"\n  - Numéros de familles : \n");
753       for (j=0;j<nmailles[i];j++)
754 	if (inufael)
755 	  fprintf(stdout," %d ",*(nufael+j));
756 	else
757 	  fprintf(stdout," %d ",0);
758 	  }
759 
760       /* liberation memoire */
761       free(connectivite);
762       free(nomele);
763       free(numele);
764       free(nufael);
765     }
766 
767   return;
768 }
769 
770 
lecture_nombre_mailles_polygones(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_connectivity_mode typ_con)771 med_int lecture_nombre_mailles_polygones(const med_idt fid,
772 					 const char * const nommaa,
773 					 const med_int numdt,
774 					 const med_int numit,
775 					 const med_connectivity_mode typ_con)
776 {
777 
778   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
779 
780   med_int nmpolygones = MEDmeshnEntity(fid,nommaa,numdt,numit,
781 				    MED_CELL,MED_POLYGON,
782 				    MED_INDEX_NODE,typ_con,&chgt,&trsf);
783 
784   EXIT_IF(nmpolygones < 0,"lors de la lecture du nombre de mailles polygone\n",
785 	  NULL);
786   if (nmpolygones > 0 ) nmpolygones--; else nmpolygones=0;
787   fprintf(stdout,"- Nombre de mailles de type MED_POLYGONE : %d \n",
788 	  nmpolygones);
789 
790   return nmpolygones;
791 }
792 
lecture_mailles_polygones(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int nmpolygones,const med_switch_mode mode_coo,const med_connectivity_mode typ_con)793 void lecture_mailles_polygones(const med_idt fid,
794 			       const char * const nommaa,
795 			       const med_int numdt,
796 			       const med_int numit,
797 			       const med_int nmpolygones,
798 			       const med_switch_mode mode_coo,
799 			       const med_connectivity_mode typ_con)
800 {
801   med_int i,j;
802   med_err ret = 0;
803   med_int taille;
804   med_int *connectivite;
805   char *nomele;
806   med_int *numele;
807   med_int *nufael;
808   med_int *indexp;
809   int ind1,ind2;
810   char tmp[MED_NAME_SIZE+1];
811   med_err ret1,ret2,ret3;
812   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
813 
814   /* lecture des mailles de type MED_POLYGONE */
815 
816   /* quelle taille pour  le tableau des connectivites ? */
817   taille=MEDmeshnEntity(fid,nommaa,numdt,numit,
818 			MED_CELL,MED_POLYGON,MED_CONNECTIVITY,typ_con,
819 			&chgt,&trsf);
820   EXIT_IF(taille < 0,"lors de la lecture des parametres des mailles polygones",
821 	  NULL);
822 
823   /* allocation memoire */
824   indexp = (med_int *) malloc(sizeof(med_int)*(nmpolygones+1));
825   EXIT_IF(indexp == NULL,NULL,NULL);
826   connectivite = (med_int *) malloc(sizeof(med_int)*taille);
827   EXIT_IF(connectivite == NULL,NULL,NULL);
828   numele = (med_int *) malloc(sizeof(med_int)*nmpolygones);
829   EXIT_IF(numele == NULL,NULL,NULL);
830   nufael = (med_int *) malloc(sizeof(med_int)*nmpolygones);
831   EXIT_IF(nufael == NULL,NULL,NULL);
832   nomele = (char *) malloc(sizeof(char)*MED_SNAME_SIZE*nmpolygones+1);
833   EXIT_IF(nomele == NULL,NULL,NULL);
834 
835   /* lecture de la connectivite des mailles polygones */
836   ret = MEDmeshPolygonRd(fid,nommaa,numdt,numit,MED_CELL,typ_con,
837 			 indexp,connectivite);
838 
839   EXIT_IF(ret < 0,"lors de la lecture des connectivites des mailles polygones",
840 	  NULL);
841 
842   /* lecture noms */
843   ret1 = MEDmeshEntityNameRd(fid,nommaa,numdt,numit,
844 			     MED_CELL,MED_POLYGON, nomele);
845 
846   /* lecture des numeros */
847   ret2 = (med_int) MEDmeshEntityNumberRd(fid,nommaa,numdt,numit,
848 					 MED_CELL, MED_POLYGON, numele);
849 
850   /* lecture des numeros de familles */
851   ret3 = MEDmeshEntityFamilyNumberRd(fid, nommaa, MED_NO_DT, MED_NO_IT,
852 				     MED_CELL, MED_POLYGON, nufael);
853 
854   if (!structure) {
855   /* affichage des resultats */
856   fprintf(stdout,"\n\n- Mailles de type MED_POLYGONE : ");
857     for (i=0;i<nmpolygones;i++) {
858       fprintf(stdout,"\n >> Maille MED_POLYGONE %d : \n",i+1);
859       fprintf(stdout,"\n  - Connectivité : ");
860       ind1 = *(indexp+i)-1;
861       ind2 = *(indexp+i+1)-1;
862       for (j=ind1;j<ind2;j++)
863 	printf(" %d ",*(connectivite+j));
864       if (ret1 == 0) {
865 	strncpy(tmp,nomele+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
866 	tmp[MED_SNAME_SIZE] = '\0';
867 	fprintf(stdout,"\n  - Nom : %s \n",tmp);
868       }
869       if (ret2 == 0)
870 	fprintf(stdout,"\n  - Numero : %d \n",*(numele+i));
871 
872       if ( ret3 >= 0 )
873 	fprintf(stdout,"\n  - Numéro de famille : %d \n",*(nufael+i));
874       else
875 	fprintf(stdout,"\n  - Numéro de famille : %d \n",0);
876     }
877   }
878 
879     /* on libere la memoire */
880     free(indexp);
881     free(connectivite);
882     free(numele);
883     free(nufael);
884     free(nomele);
885 
886     return;
887 }
888 
889 
lecture_nombre_mailles_polyedres(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_connectivity_mode typ_con)890 med_int lecture_nombre_mailles_polyedres(const med_idt fid,
891 					 const char * const nommaa,
892 					 const med_int numdt,
893 					 const med_int numit,
894 					 const med_connectivity_mode typ_con)
895 {
896   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
897 
898   med_int npolyedres = MEDmeshnEntity(fid,nommaa,numdt,numit,
899 				    MED_CELL,MED_POLYHEDRON,
900 				    MED_INDEX_FACE,typ_con,&chgt,&trsf);
901 
902   EXIT_IF(npolyedres < 0,"lors de la lecture du nombre de mailles polyedre \n",
903 	  NULL);
904   if ( npolyedres > 0 ) npolyedres--; else npolyedres=0;
905   fprintf(stdout,"- Nombre de mailles de type MED_POLYEDRE : %d \n",
906 	  npolyedres);
907 
908   return npolyedres;
909 }
910 
911 
lecture_mailles_polyedres(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int npolyedres,const med_switch_mode mode_coo,const med_connectivity_mode typ_con)912 void lecture_mailles_polyedres(const med_idt         fid,
913 			       const char * const    nommaa,
914 			       const med_int         numdt,
915 			       const med_int         numit,
916 			       const med_int         npolyedres,
917 			       const med_switch_mode       mode_coo,
918 			       const med_connectivity_mode typ_con)
919 {
920   med_int i,j,k;
921   med_err ret = 0;
922   med_int taille;
923   med_int *connectivite;
924   char    *nomele;
925   med_int *numele;
926   med_int *nufael;
927   med_int *indexf, *indexn;
928   int ind1,ind2;
929   char tmp[MED_SNAME_SIZE+1];
930   med_err ret1,ret2,ret3;
931   med_int nfa;
932   med_int nnoe;
933   med_int nindn;
934   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
935 
936 
937   /* lecture des parametres de base */
938   taille = MEDmeshnEntity(fid,nommaa,numdt,numit,
939 			  MED_CELL,MED_POLYHEDRON,MED_CONNECTIVITY,typ_con,
940 			  &chgt,&trsf);
941   EXIT_IF(taille < 0,"lors de la lecture des parametres des mailles polyedres",
942 	  NULL);
943 
944   nindn = MEDmeshnEntity(fid,nommaa,numdt,numit,
945 			 MED_CELL,MED_POLYHEDRON,MED_INDEX_NODE,typ_con,
946 			 &chgt,&trsf);
947   EXIT_IF(nindn < 0,"lors de la lecture des parametres des mailles polyedres",
948 	  NULL);
949 
950   /* allocation memoire */
951   /* nindf == npolyedres+1 */
952   indexf = (med_int *) malloc(sizeof(med_int)*(npolyedres+1));
953   EXIT_IF(indexf == NULL,NULL,NULL);
954   indexn = (med_int *) malloc(sizeof(med_int)*nindn);
955   EXIT_IF(indexn == NULL,NULL,NULL);
956   connectivite  = (med_int *) malloc(sizeof(med_int)*taille);
957   EXIT_IF(connectivite == NULL,NULL,NULL);
958   numele = (med_int *) malloc(sizeof(med_int)*npolyedres);
959   EXIT_IF(numele == NULL,NULL,NULL);
960   nufael = (med_int *) malloc(sizeof(med_int)*npolyedres);
961   EXIT_IF(nufael == NULL,NULL,NULL);
962   nomele = (char *) malloc(sizeof(char)*MED_SNAME_SIZE*npolyedres+1);
963   EXIT_IF(nomele == NULL,NULL,NULL);
964 
965   ret = MEDmeshPolyhedronRd(fid,nommaa,numdt,numit,MED_CELL,typ_con,
966 			    indexf,indexn,connectivite);
967   EXIT_IF(ret < 0,
968 	  "lors de la lecture de la connectivite des mailles polyedres",
969 	  NULL);
970 
971   /* lecture des noms */
972   ret1 = MEDmeshEntityNameRd(fid,nommaa,numdt,numit,MED_CELL,MED_POLYHEDRON,nomele);
973 
974   /* lecture des numeros */
975   ret2 = MEDmeshEntityNumberRd(fid,nommaa,numdt,numit,MED_CELL,MED_POLYHEDRON,numele);
976 
977   /* lecture des numeros de familles */
978   ret3 = MEDmeshEntityFamilyNumberRd(fid,nommaa,numdt,numit,MED_CELL,MED_POLYHEDRON,nufael);
979 
980   if (!structure) {
981   /* affichage des resultats */
982   fprintf(stdout,"\n\n- Mailles de type MED_POLYEDRE : ");
983   for (i=0;i<npolyedres;i++) {
984     fprintf(stdout,"\n >> Maille MED_POLYEDRE %d : \n",i+1);
985     fprintf(stdout,"\n  - Connectivité : \n");
986     nfa  = *(indexf+i+1) - *(indexf+i);
987     /* ind1 = indice dans "faces" pour acceder aux numeros des faces */
988     ind1 = *(indexf+i) - 1;
989     for (j=0;j<nfa;j++) {
990       if (typ_con == MED_NODAL) {
991 	/* ind2 = indice dans "connectivite"
992 	   pour acceder au premier noeud de la face */
993 	ind2 = *(indexn+ind1+j) - 1;
994 	nnoe = *(indexn+ind1+j+1) - *(indexn+ind1+j);
995 	fprintf(stdout,"   - Face %d : [ ", j+1);
996 	for (k=0;k<nnoe;k++)
997 	  printf(" %d ",*(connectivite+ind2+k));
998 	printf(" ] \n");
999       }
1000       else {
1001 	nfa  = *(indexf+i+1) - *(indexf+i);
1002 	/* ind1 = indice dans "connectivite"
1003 	   pour acceder aux numeros des faces */
1004 	ind1 = *(indexf+i) - 1;
1005 	for (j=0;j<nfa;j++)
1006 	  fprintf(stdout,"   - Face %d de numero : %d et de type %d \n", j+1,
1007 		  *(connectivite+ind1+j),*(indexn+ind1+j));
1008       }
1009     }
1010     if (ret1 == 0) {
1011       strncpy(tmp,nomele+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
1012       tmp[MED_SNAME_SIZE] = '\0';
1013       fprintf(stdout,"\n  - Nom : %s \n",tmp);
1014     }
1015     if (ret2 == 0)
1016       fprintf(stdout,"\n  - Numero : %d \n",*(numele+i));
1017     if (ret3 >= 0)
1018       fprintf(stdout,"\n  - Numéro de famille : %d \n",*(nufael+i));
1019     else
1020       fprintf(stdout,"\n  - Numéro de famille : %d \n",0);
1021 
1022   }
1023   }
1024 
1025   /* on libere la memoire */
1026   free(indexf);
1027   free(indexn);
1028   free(connectivite);
1029   free(numele);
1030   free(nufael);
1031   free(nomele);
1032 
1033   return;
1034 }
1035 
lecture_nombre_faces_standards(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_geometry_type typ_geo,const med_int indice)1036 med_int lecture_nombre_faces_standards(const med_idt fid,
1037 				       const char * const nommaa,
1038 				       const med_int numdt,
1039 				       const med_int numit,
1040 				       const med_geometry_type typ_geo,
1041 				       const med_int indice
1042 				       )
1043 {
1044 
1045   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
1046 
1047   med_int nfaces = MEDmeshnEntity(fid,nommaa,numdt,numit,
1048 				    MED_DESCENDING_FACE,typ_geo,
1049 				    MED_CONNECTIVITY,MED_DESCENDING,&chgt,&trsf);
1050   EXIT_IF(nfaces < 0,"lors de la lecture du nombre de faces",NULL);
1051 
1052   if ( (indice < (MED_N_FACE_GEO_FIXED_CON-2) ) ||
1053        (indice >= (MED_N_FACE_GEO_FIXED_CON-2) && (nfaces > 0) ) )
1054     fprintf (stdout,"- Nombre de faces de type %s : %d \n",
1055 	     nomfac[indice],nfaces);
1056 
1057   return nfaces;
1058 }
1059 
lecture_faces_standard(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int * const nfaces,const med_switch_mode mode_coo)1060 void lecture_faces_standard(const med_idt fid,
1061 			    const char * const nommaa,
1062 			    const med_int numdt,
1063 			    const med_int numit,
1064 			    const med_int mdim,
1065 			    const med_int *const nfaces,
1066 			    const med_switch_mode mode_coo)
1067 {
1068   med_int taille;
1069   med_int *connectivite;
1070   char *nomele;
1071   med_int *numele;
1072   med_int *nufael;
1073   med_bool inoele,inuele,inufael;
1074   med_geometry_type typgeo;
1075   med_int i,j;
1076   med_err ret = 0;
1077   char str[MED_SNAME_SIZE+1];
1078   med_int entdim;
1079   med_int nnodes;
1080 
1081   for (i=0;i<MED_N_FACE_GEO_FIXED_CON;i++)
1082     if (nfaces[i] > 0 ) {
1083 
1084       /*  taille de la description : nombre d'aretes */
1085         ret=_MEDgetGeometricParameter(MED_DESCENDING_FACE, typfac[i],&entdim,&nnodes,&taille);
1086       EXIT_IF(ret < 0,"lors de la lecture des caractéristiques des mailles",NULL);
1087 
1088       /* allocation memoire */
1089       connectivite = (med_int*)malloc(sizeof(med_int)*taille*nfaces[i]);
1090       EXIT_IF(connectivite == NULL,NULL,NULL);
1091       nomele = (char*)malloc(sizeof(char)*MED_SNAME_SIZE*nfaces[i]+1);
1092       EXIT_IF(nomele == NULL,NULL,NULL);
1093       numele = (med_int*)malloc(sizeof(med_int)*nfaces[i]);
1094       EXIT_IF(numele == NULL,NULL,NULL);
1095       nufael = (med_int*)malloc(sizeof(med_int)*nfaces[i]);
1096       EXIT_IF(nufael == NULL,NULL,NULL);
1097 
1098       /* lecture des données */
1099      ret = MEDmeshElementRd( fid,nommaa,numdt,numit,MED_DESCENDING_FACE,typmai[i],
1100 			      MED_DESCENDING, mode_coo, connectivite,
1101 			      &inoele,nomele,&inuele,numele,&inufael,nufael );
1102       EXIT_IF(ret < 0,"lors de la lecture des faces",NULL);
1103 
1104       if (!structure) {
1105       /* affichage des resultats */
1106       fprintf(stdout,"\n- Faces de type %s : ", nomfac[i]);
1107       fprintf(stdout,"\n  - Connectivité : \n");
1108       for (j=0;j<nfaces[i]*taille;j++) {
1109 	    if (mode_coo == MED_FULL_INTERLACE && !(j % taille))
1110 	      fprintf(stdout,"\n [ %5d ] : ", (j/taille+1) );
1111 	    if (mode_coo == MED_NO_INTERLACE && !(j % nfaces[i]))
1112 	      fprintf(stdout,"\n");
1113 	    fprintf(stdout," %9d ",*(connectivite+j));
1114 	  }
1115 
1116       if (inoele) {
1117 	fprintf(stdout,"\n  - Noms : \n");
1118 	for (j=0;j<nfaces[i];j++) {
1119 	  strncpy(str,nomele+j*MED_SNAME_SIZE,MED_SNAME_SIZE);
1120 	  str[MED_SNAME_SIZE] = '\0';
1121 	  fprintf(stdout," %s ",str);
1122 	}
1123       }
1124       if (inuele) {
1125 	fprintf(stdout,"\n  - Numeros :\n");
1126 	for (j=0;j<nfaces[i];j++)
1127 	  fprintf(stdout," %d ",*(numele+j));
1128       }
1129       fprintf(stdout,"\n  - Numéros de familles : \n");
1130       for (j=0;j<nfaces[i];j++)
1131 	if ( inufael )
1132 	  fprintf(stdout," %d ",*(nufael+j));
1133 	else
1134 	  fprintf(stdout," %d ",0);
1135 	  }
1136 
1137       /* liberation memoire */
1138       free(connectivite);
1139       free(nomele);
1140       free(numele);
1141       free(nufael);
1142     }
1143 
1144   return;
1145 }
1146 
lecture_nombre_faces_polygones(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit)1147 med_int lecture_nombre_faces_polygones(const med_idt fid,
1148 				       const char * const nommaa,
1149 				       const med_int numdt,
1150 				       const med_int numit)
1151 {
1152 
1153   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
1154 
1155   med_int nfpolygones = MEDmeshnEntity(fid,nommaa,numdt,numit,
1156 				       MED_CELL,MED_POLYGON,
1157 				       MED_INDEX_NODE,MED_DESCENDING,&chgt,&trsf);
1158 
1159   EXIT_IF(nfpolygones < 0,"lors de la lecture du nombre de faces polygone \n",
1160 	  NULL);
1161   nfpolygones--;
1162   fprintf(stdout,"- Nombre de faces de type MED_POLYGONE : %d \n",
1163 	  nfpolygones);
1164 
1165   return nfpolygones;
1166 }
1167 
lecture_faces_polygones(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int nfpolygones,const med_switch_mode mode_coo)1168 void lecture_faces_polygones(const med_idt fid,
1169 			     const char * const nommaa,
1170 			     const med_int numdt,
1171 			     const med_int numit,
1172 			     const med_int nfpolygones,
1173 			     const med_switch_mode mode_coo)
1174 {
1175   med_int i,j;
1176   med_err ret = 0;
1177   char *nomele;
1178   med_int *numele;
1179   med_int *nufael;
1180   med_int *connectivite;
1181   med_int taille;
1182   med_int *indexp;
1183   int ind1,ind2;
1184   char tmp[MED_NAME_SIZE+1];
1185   med_err ret1,ret2,ret3;
1186   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
1187 
1188   /* quelle taille pour  le tableau des connectivites ? */
1189   taille=MEDmeshnEntity(fid,nommaa,numdt,numit,
1190 			MED_DESCENDING_FACE,MED_POLYGON,MED_CONNECTIVITY,MED_DESCENDING,
1191 			&chgt,&trsf);
1192   EXIT_IF(taille < 0,"lors de la lecture des parametres des faces polygones",
1193 	    NULL);
1194 
1195   /* allocation memoire */
1196   indexp = (med_int *) malloc(sizeof(med_int)*(nfpolygones+1));
1197   EXIT_IF(indexp == NULL,NULL,NULL);
1198   connectivite = (med_int *) malloc(sizeof(med_int)*taille);
1199   EXIT_IF(connectivite == NULL,NULL,NULL);
1200   numele = (med_int *) malloc(sizeof(med_int)*nfpolygones);
1201   EXIT_IF(numele == NULL,NULL,NULL);
1202   nufael = (med_int *) malloc(sizeof(med_int)*nfpolygones);
1203   EXIT_IF(nufael == NULL,NULL,NULL);
1204   nomele = (char *) malloc(sizeof(char)*MED_SNAME_SIZE*nfpolygones+1);
1205   EXIT_IF(nomele == NULL,NULL,NULL);
1206 
1207   /* lecture de la connectivite des faces polygones */
1208   ret = MEDmeshPolygonRd(fid,nommaa,numdt,numit,MED_DESCENDING_FACE,MED_DESCENDING,
1209 			 indexp,connectivite);
1210   EXIT_IF(ret < 0,"lors de la lecture des connectivites des faces polygones",
1211 	  NULL);
1212 
1213   /* lecture noms */
1214   ret1 = MEDmeshEntityNameRd(fid,nommaa,numdt,numit,
1215 			     MED_DESCENDING_FACE,MED_POLYGON, nomele);
1216 
1217   /* lecture des numeros */
1218   ret2 = (med_int) MEDmeshEntityNumberRd(fid,nommaa,numdt,numit,
1219 					 MED_DESCENDING_FACE, MED_POLYGON, numele);
1220 
1221   /* lecture des numeros de familles */
1222   ret3 = MEDmeshEntityFamilyNumberRd(fid, nommaa, MED_NO_DT, MED_NO_IT,
1223 				     MED_DESCENDING_FACE, MED_POLYGON, nufael);
1224 
1225   if (!structure) {
1226   /* affichage des resultats */
1227   fprintf(stdout,"\n\n- Faces de type MED_POLYGONE : ");
1228   for (i=0;i<nfpolygones;i++) {
1229     fprintf(stdout,"\n >> Face MED_POLYGONE %d : \n",i+1);
1230     fprintf(stdout,"\n  - Connectivité : ");
1231     ind1 = *(indexp+i)-1;
1232     ind2 = *(indexp+i+1)-1;
1233     for (j=ind1;j<ind2;j++)
1234       fprintf(stdout," %d ",*(connectivite+j));
1235     if (ret1 == 0) {
1236       strncpy(tmp,nomele+j*MED_SNAME_SIZE,MED_SNAME_SIZE);
1237       tmp[MED_SNAME_SIZE] = '\0';
1238       fprintf(stdout,"\n  - Nom : %s \n",tmp);
1239     }
1240     if (ret2 == 0)
1241       fprintf(stdout,"\n  - Numero : %d \n",*(numele+j));
1242     if ( ret3 > 0 )
1243       fprintf(stdout,"\n  - Numéro de famille : %d \n",*(nufael+i));
1244     else
1245       fprintf(stdout,"\n  - Numéro de famille : %d \n",0);
1246   }
1247   }
1248 
1249   /* on libere la memoire */
1250   free(indexp);
1251   free(connectivite);
1252   free(numele);
1253   free(nufael);
1254   free(nomele);
1255 
1256   return;
1257 }
1258 
1259 
lecture_nombre_aretes_standards(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_geometry_type typ_geo,const med_int indice)1260 med_int lecture_nombre_aretes_standards(const med_idt fid,
1261 					const char *const  nommaa,
1262 					const med_int numdt,
1263 					const med_int numit,
1264 					const med_geometry_type typ_geo,
1265 					const med_int indice)
1266 {
1267 
1268   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
1269 
1270   med_int naretes = MEDmeshnEntity(fid,nommaa,numdt,numit,
1271 				   MED_DESCENDING_EDGE, typ_geo,
1272 				   MED_CONNECTIVITY,MED_DESCENDING,&chgt,&trsf);
1273   EXIT_IF(naretes < 0,"lors de la lecture du nombre d'aretes",NULL);
1274   if ( (indice < (MED_N_EDGE_GEO_FIXED_CON-1) ) ||
1275        (indice >= (MED_N_EDGE_GEO_FIXED_CON-1) && (naretes > 0) ) )
1276 
1277   fprintf (stdout,
1278 	   "- Nombre d'aretes de type %s : %d \n",nomare[indice],naretes);
1279 
1280   return naretes;
1281 }
1282 
lecture_aretes_standards(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int * const naretes,const med_switch_mode mode_coo)1283 void lecture_aretes_standards(const med_idt fid,
1284 			      const char * const nommaa,
1285 			      const med_int numdt,
1286 			      const med_int numit,
1287 			      const med_int mdim,
1288 			      const med_int * const naretes,
1289 			      const med_switch_mode mode_coo)
1290 {
1291   med_int taille;
1292   med_int *connectivite;
1293   char    *nomele;
1294   med_int *numele;
1295   med_int *nufael;
1296   med_bool inoele,inuele,inufael;
1297   med_geometry_type typgeo;
1298   med_int i,j;
1299   med_err ret = 0;
1300   char str[MED_SNAME_SIZE+1];
1301   med_int entdim;
1302   med_int nnodes;
1303 
1304   for (i=0;i<MED_N_EDGE_GEO_FIXED_CON;i++)
1305     if (naretes[i] > 0) {
1306 
1307      ret=_MEDgetGeometricParameter(MED_DESCENDING_EDGE, typare[i],&entdim,&nnodes,&taille);
1308       EXIT_IF(ret < 0,"lors de la lecture des caractéristiques des mailles",NULL);
1309 
1310       /* allocation memoire */
1311       connectivite = (med_int*)malloc(sizeof(med_int)*taille*naretes[i]);
1312       EXIT_IF(connectivite == NULL,NULL,NULL);
1313       nomele = (char*)malloc(sizeof(char)*MED_SNAME_SIZE*naretes[i]+1);
1314       EXIT_IF(nomele == NULL,NULL,NULL);
1315       numele = (med_int*)malloc(sizeof(med_int)*naretes[i]);
1316       EXIT_IF(numele == NULL,NULL,NULL);
1317       nufael = (med_int*)malloc(sizeof(med_int)*naretes[i]);
1318       EXIT_IF(nufael == NULL,NULL,NULL);
1319 
1320       /* lecture des données */
1321       ret = MEDmeshElementRd( fid,nommaa,numdt,numit,MED_DESCENDING_EDGE,typare[i],
1322 			      MED_DESCENDING, mode_coo, connectivite,
1323 			      &inoele,nomele,&inuele,numele,&inufael,nufael );
1324       EXIT_IF(ret < 0,"lors de la lecture des aretes",
1325 	      NULL);
1326 
1327       if (!structure) {
1328       /* affichage des resultats */
1329       fprintf(stdout,"\n- Aretes de type %s : ", nomare[i]);
1330       fprintf(stdout,"\n  - Connectivité : \n");
1331       for (j=0;j<naretes[i]*taille;j++) {
1332   	    if (mode_coo == MED_FULL_INTERLACE && !(j % taille))
1333 	      fprintf(stdout,"\n [ %5d ] : ", (j/taille+1) );
1334 	    if (mode_coo == MED_NO_INTERLACE && !(j % naretes[i]))
1335 	      fprintf(stdout,"\n");
1336 	    fprintf(stdout," %9d ",*(connectivite+j));
1337 	  }
1338 
1339       if (inoele) {
1340 	fprintf(stdout,"\n  - Noms : \n");
1341 	for (j=0;j<naretes[i];j++) {
1342 	  strncpy(str,nomele+j*MED_SNAME_SIZE,MED_SNAME_SIZE);
1343 	  str[MED_SNAME_SIZE] = '\0';
1344 	  fprintf(stdout," %s ",str);
1345 	}
1346       }
1347       if (inuele) {
1348 	fprintf(stdout,"\n  - Numeros :\n");
1349 	for (j=0;j<naretes[i];j++)
1350 	  fprintf(stdout," %d ",*(numele+j));
1351       }
1352       fprintf(stdout,"\n  - Numéros de familles : \n");
1353       for (j=0;j<naretes[i];j++)
1354 	if ( inufael )
1355 	  fprintf(stdout," %d ",*(nufael+j));
1356 	else
1357 	  fprintf(stdout," %d ",0);
1358 	  }
1359 
1360       /* liberation memoire */
1361       free(connectivite);
1362       free(nomele);
1363       free(numele);
1364       free(nufael);
1365     }
1366 
1367   return;
1368 }
1369 
1370 
1371 /******************************************************************************
1372  * - Nom de la fonction : lecture_maillage_non_structure
1373  * - Description : lecture et affichage d'un maillage MED_NON_STRUCTURE.
1374  * - Parametres :
1375  *     - fid                       (IN) : ID du fichier MED.
1376  *     - nommaa                    (IN) : nom du maillage a lire.
1377  *     - mdim                      (IN) : dimension du maillage.
1378  *     - mode_coo                  (IN) : mode de stockage en memoire :
1379  *                                        MED_FULL_INTERLACE : entrelace |
1380  *                                        MED_NO_INTERLACE : non entrelace.
1381  *     - typ_con                   (IN) : mode de connectivite :
1382  *                                        MED_DESCENDING : descendante |
1383  *                                        MED_NODAL : nodale.
1384  *     - lecture_en_tete_seulement (IN) : mode de lecture et d'affichage.
1385  ******************************************************************************/
1386 
lecture_maillage_non_structure(med_idt fid,const char * nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int edim,const med_switch_mode mode_coo,const med_connectivity_mode typ_con,const char * const nomcoo,const char * const unicoo,const med_axis_type * const rep,const int lecture_en_tete_seulement)1387 void lecture_maillage_non_structure(med_idt fid,
1388 				    const char *nommaa,
1389 				    const med_int numdt,
1390 				    const med_int numit,
1391 				    const med_int mdim,
1392 				    const med_int edim,
1393 				    const med_switch_mode mode_coo,
1394 				    const med_connectivity_mode typ_con,
1395 				    const char * const nomcoo,
1396 				    const char * const unicoo,
1397 				    const med_axis_type *const rep,
1398 				    const int lecture_en_tete_seulement)
1399 {
1400   med_int i;
1401   /* nombre d'objets MED : noeuds, mailles, faces, aretes , ... */
1402   med_int nnoe;
1403   med_int nmailles[MED_N_CELL_GEO_FIXED_CON];
1404   med_int nfaces[MED_N_FACE_GEO_FIXED_CON];
1405   med_int naretes[MED_N_EDGE_GEO_FIXED_CON];
1406   /* polygones et polyedres */
1407   med_int nmpolygones, npolyedres, nfpolygones;
1408   /* familles */
1409   med_int nfam;
1410   /* equivalences */
1411   med_int nequ;
1412   /* joints */
1413   med_int njnt;
1414 
1415   /* Combien de noeuds dans le maillage ? */
1416   nnoe = lecture_nombre_noeuds_maillage_non_structure(fid,nommaa,numdt,numit);
1417 
1418   /*TODO : ELEMENTS DE STRUCTURE */
1419   /*TODO : AFFICHER DT ( DTUNIT ) */
1420   /* Combien de mailles, faces ou aretes pour chaque type geometrique ? */
1421   for (i=0;i<MED_N_CELL_GEO_FIXED_CON;i++)
1422     nmailles[i] = lecture_nombre_mailles_standards(fid,nommaa,numdt,numit,typmai[i],
1423 						   typ_con,i);
1424 
1425   /* Combien de mailles polygones quelconques ? */
1426   nmpolygones = lecture_nombre_mailles_polygones(fid,nommaa,numdt,numit,typ_con);
1427 
1428   /* Combien de mailles polyedres quelconques ? */
1429   npolyedres = lecture_nombre_mailles_polyedres(fid,nommaa,numdt,numit,typ_con);
1430 
1431   /* Pour la connectivite descendante */
1432   if (typ_con == MED_DESCENDING) {
1433 
1434     /* Combien de faces : types geometriques standards ? */
1435     for (i=0;i<MED_N_FACE_GEO_FIXED_CON;i++)
1436       nfaces[i] = lecture_nombre_faces_standards(fid,nommaa,numdt,numit,typfac[i],i);
1437 
1438     /* Combien de faces polygones quelconques ? */
1439     nfpolygones = lecture_nombre_faces_polygones(fid,nommaa,numdt,numit);
1440 
1441     /* Combien d'aretes */
1442     for (i=0;i<MED_N_EDGE_GEO_FIXED_CON;i++)
1443       naretes[i] = lecture_nombre_aretes_standards(fid,nommaa,numdt,numit,typare[i],i);
1444   }
1445 
1446   /* combien de familles ? */
1447   nfam = lecture_nombre_famille(fid,nommaa);
1448 
1449   /* combien d'equivalences ? */
1450   nequ = lecture_nombre_equivalence(fid,nommaa);
1451 
1452   /* combien de joints ? */
1453   njnt = lecture_nombre_joint(fid,nommaa);
1454 
1455   /* en fonction du mode de lecture, on continue ou non */
1456   if (lecture_en_tete_seulement)
1457     return;
1458 
1459   /****************************************************************************
1460   *                       LECTURE DES NOEUDS                                  *
1461   ****************************************************************************/
1462   lecture_noeuds_maillage_non_structure(fid,nommaa,numdt,numit,mdim,edim,nnoe,mode_coo,nomcoo,unicoo,rep);
1463   /*ICI;_MEDobjetsOuverts(fid);*/
1464 
1465 
1466   /****************************************************************************
1467   *                       LECTURE DES ELEMENTS                                *
1468   * Mailles :                                                                 *
1469   * - Types geometriques classiques : MED_SEG2, MED_SEG3, MED_TRIA3, ...      *
1470   * - Polygones quelconques.                                                  *
1471   * - Polyedres quelconques.                                                  *
1472   * Faces (connectivite descendante uniquement) :                             *
1473   * - Types geometriques classiques.                                          *
1474   * - Polygones quelconques.                                                  *
1475   ****************************************************************************/
1476 
1477   /* lecture et affichage des mailles */
1478   lecture_mailles_standards(fid,nommaa,numdt,numit,mdim,nmailles,mode_coo,typ_con);
1479   /*ICI;_MEDobjetsOuverts(fid);*/
1480 
1481   if (nmpolygones > 0)
1482     lecture_mailles_polygones(fid,nommaa,numdt,numit,nmpolygones,mode_coo,typ_con);
1483   /*ICI;_MEDobjetsOuverts(fid);*/
1484 
1485   if (npolyedres > 0)
1486     lecture_mailles_polyedres(fid,nommaa,numdt,numit,npolyedres,mode_coo,typ_con);
1487   /*ICI;_MEDobjetsOuverts(fid);*/
1488 
1489   /* lecture et affichage des faces en connectivite descendante uniquement */
1490   if (typ_con == MED_DESCENDING) {
1491     lecture_faces_standard(fid,nommaa,numdt,numit,mdim,nfaces,mode_coo);
1492     if (nfpolygones > 0)
1493       lecture_faces_polygones(fid,nommaa,numdt,numit,nfpolygones,mode_coo);
1494   }
1495   /*ICI;_MEDobjetsOuverts(fid);*/
1496 
1497   /* lecture et affichage des aretes en connectivite descendante uniquement */
1498   if (typ_con == MED_DESCENDING)
1499     lecture_aretes_standards(fid,nommaa,numdt,numit,mdim,naretes,mode_coo);
1500   /*ICI;_MEDobjetsOuverts(fid);*/
1501 
1502   /****************************************************************************
1503   *                      LECTURE DES FAMILLES                                 *
1504   ****************************************************************************/
1505   lecture_famille_maillage(fid,nommaa,nfam);
1506   /*ICI;_MEDobjetsOuverts(fid);*/
1507 
1508 
1509   /****************************************************************************
1510   *                       LECTURE DES EQUIVALENCES                            *
1511   ****************************************************************************/
1512   lecture_equivalence_maillage(fid,nommaa,nequ);
1513   /*ICI;_MEDobjetsOuverts(fid);*/
1514 
1515 
1516   /****************************************************************************
1517   *                       LECTURE DES JOINTS                                  *
1518   ****************************************************************************/
1519   lecture_joint_maillage(fid,nommaa,njnt);
1520   /*ICI;_MEDobjetsOuverts(fid);*/
1521 
1522   return;
1523 }
1524 
1525 
lecture_caracteristiques_grille(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int mdim,med_int * nind,med_int * nnoe,med_int * nmai,med_grid_type * type)1526 void lecture_caracteristiques_grille(const med_idt fid,
1527 				     const char * const nommaa,
1528 				     const med_int numdt,
1529 				     const med_int numit,
1530 				     const med_int mdim,
1531 				     med_int *nind,
1532 				     med_int *nnoe,
1533 				     med_int *nmai,
1534 				     med_grid_type *type)
1535 {
1536   med_err ret = 0;
1537   med_int axe;
1538   med_int *structure_grille;
1539   med_data_type quoi;
1540   med_int j;
1541   med_bool chgt=MED_FALSE,trsf=MED_FALSE;
1542 
1543   /* lecture de la nature du maillage structure : MED_GRILLE_CARTESIENNE ,...*/
1544   ret = MEDmeshGridTypeRd(fid,nommaa,type);
1545   EXIT_IF(ret < 0,"a la lecture du type d'une grille ",NULL);
1546 
1547   switch(*type) {
1548 
1549   case MED_CARTESIAN_GRID :
1550   case MED_POLAR_GRID :
1551     if (*type == MED_CARTESIAN_GRID)
1552       fprintf(stdout,"- Type de grille : MED_GRILLE_CARTESIENNE \n");
1553     else
1554       fprintf(stdout,"- Type de grille : MED_GRILLE_POLAIRE \n");
1555     for (axe=1;axe<=mdim;axe++) {
1556       switch(axe) {
1557 
1558       case 1:
1559 	quoi = MED_COORDINATE_AXIS1;
1560 	break;
1561 
1562       case 2:
1563 	quoi = MED_COORDINATE_AXIS2;
1564 	break;
1565 
1566       case 3:
1567 	quoi = MED_COORDINATE_AXIS3;
1568 	break;
1569       }
1570       nind[axe - 1] = MEDmeshnEntity(fid,nommaa, numdt, numit,
1571 				     MED_NODE, MED_NONE, quoi, MED_NO_CMODE, &chgt, &trsf);
1572 
1573       EXIT_IF(nind[axe - 1] < 0,
1574 	      "lors de la lecture de la taille d'un indice d'une grille",
1575 	      NULL);
1576       *nnoe = nind[axe - 1] * (*nnoe);
1577       *nmai = (nind[axe - 1] - 1) * (*nmai);
1578       fprintf(stdout,
1579 	      "- Taille de l'indice de l'axe %d des coordonnees : %d \n",
1580 	      axe,nind[axe - 1]);
1581     }
1582     break;
1583 
1584   case MED_CURVILINEAR_GRID:
1585     fprintf(stdout,"- Type de grille : MED_GRILLE_DESTRUCTUREE \n");
1586     *nnoe = MEDmeshnEntity(fid, nommaa, numdt, numit,
1587 			       MED_NODE, MED_NONE, MED_COORDINATE, MED_NO_CMODE, &chgt, &trsf);
1588     EXIT_IF(*nnoe < 0,"lors de la lecture du nombre de noeuds du maillage "
1589 	    ,nommaa);
1590 
1591     /* on alloue la memoire */
1592     structure_grille = (med_int *) malloc(sizeof(med_int)*mdim);
1593     EXIT_IF(structure_grille == NULL,NULL,NULL);
1594     /* on lit la structure de la grille
1595        et on affiche le resultat */
1596     ret = MEDmeshGridStructRd(fid,nommaa,numdt, numit, structure_grille);
1597     EXIT_IF(ret < 0,"lors de la lecture de la structure de la grille",
1598 	    NULL);
1599     fprintf(stdout,"- Structure de la grille : [ ");
1600     for (j=0;j<mdim;j++) {
1601       *nmai = (*(structure_grille+j) - 1) * (*nmai);
1602       fprintf(stdout," %d ",*(structure_grille+j));
1603     }
1604     fprintf(stdout," ] \n");
1605     /* on nettoie la memoire */
1606     free(structure_grille);
1607     break;
1608 
1609   MED_UNDEF_GRID_TYPE:
1610   default:
1611     EXIT_IF(-1,"Type de grille non reconnu.",nommaa);
1612 
1613   }
1614 
1615   fprintf(stdout,"- Nombre de noeuds : %d \n",*nnoe);
1616   fprintf(stdout,"- Nombre de mailles : %d \n",*nmai);
1617 
1618   return;
1619 }
1620 
1621 
lecture_noeuds_maillage_structure(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int edim,const med_int * const nind,const med_int nnoe,const char * const comp,const char * const unit,const med_grid_type type,const med_switch_mode mode_coo)1622 void lecture_noeuds_maillage_structure(const med_idt fid,
1623 				       const char * const nommaa,
1624 				       const med_int numdt,
1625 				       const med_int numit,
1626 				       const med_int mdim,
1627 				       const med_int edim,
1628 				       const med_int * const nind,
1629 				       const med_int nnoe,
1630 				       const char * const comp,
1631 				       const char * const unit,
1632 				       const med_grid_type type,
1633 				       const med_switch_mode mode_coo)
1634 {
1635   med_err ret = 0;
1636   med_int axe,i,j;
1637   char str[MED_SNAME_SIZE+1];
1638   med_float *coo     = NULL;
1639   med_float *indices = NULL;
1640   med_int   *nufano  = NULL;
1641   med_int   *numnoe  = NULL;
1642   char      *nomnoe  = NULL;
1643   med_bool inufael=MED_FALSE;
1644 
1645   fprintf(stdout,"\n(*************************)\n");
1646   fprintf(stdout,"(* NOEUDS DE LA GRILLE : *)\n");
1647   fprintf(stdout,"(*************************)\n");
1648 
1649   switch(type) {
1650 
1651   case MED_CARTESIAN_GRID :
1652   case MED_POLAR_GRID :
1653     /* on affiche les coordonnees de chacun des axes */
1654     for (axe = 1; axe<=mdim; axe++) {
1655       /* on alloue la memoire */
1656       indices = (med_float *) malloc(sizeof(med_float)*nind[axe - 1]);
1657       EXIT_IF(indices == NULL,NULL,NULL);
1658       /* on lit le tableau des indices de coordonnees
1659          et on affiche le resultat */
1660       ret = MEDmeshGridIndexCoordinateRd(fid,nommaa,numdt,numit, axe,indices);
1661       EXIT_IF(ret < 0,"lors de la lecture d'un tableau d'indice",
1662 	      NULL);
1663       fprintf(stdout,"\n - Axe %." xstr(MED_SNAME_SIZE) "s [%." xstr(MED_SNAME_SIZE) "s] : [ ",
1664 	      &comp[MED_SNAME_SIZE*(axe-1)],&unit[MED_SNAME_SIZE*(axe-1)]);
1665       for (j=0;j<nind[axe - 1];j++)
1666 	fprintf(stdout," %f ",*(indices+j));
1667       printf(" ] \n");
1668       /* on nettoie la memoire */
1669       free(indices);
1670     }
1671     break;
1672 
1673   case MED_CURVILINEAR_GRID:
1674     /* on alloue la memoire */
1675     coo = (med_float *) malloc(sizeof(med_float)*nnoe*edim);
1676     EXIT_IF(coo == NULL,NULL,NULL);
1677     /* on va lire les coordonnees des noeuds */
1678     ret = MEDmeshNodeCoordinateRd(fid,nommaa,numdt,numit, MED_FULL_INTERLACE,coo);
1679 
1680     EXIT_IF(ret < 0,"lors de la lecture des noeuds du maillage",NULL);
1681     /* on affiche le resultat */
1682     fprintf(stdout,"- Nom des coordonnees : \n");
1683     for (i=0;i<edim;i++) {
1684       strncpy(str,comp+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
1685       str[MED_SNAME_SIZE] = '\0';
1686       fprintf(stdout," %s ",str);
1687     }
1688     fprintf(stdout,"\n- Unites des coordonnees : \n");
1689     for (i=0;i<edim;i++) {
1690       strncpy(str,unit+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
1691       str[MED_SNAME_SIZE] = '\0';
1692       fprintf(stdout," %s ",str);
1693     }
1694     if (!structure) {
1695     fprintf(stdout,"\n - Coordonnees des noeuds : [ ");
1696     for (j=0;j<nnoe*edim;j++)
1697       fprintf(stdout," %f ",*(coo+j));
1698     fprintf(stdout," ] \n");
1699     }
1700 
1701     /* on nettoie la memoire */
1702     free(coo);
1703     break;
1704 
1705   MED_UNDEF_GRID_TYPE:
1706   default:
1707     EXIT_IF(-1,"Type de grille non reconnu.",nommaa);
1708 
1709   }
1710 
1711   /* lecture et affichage des :
1712      - numeros de familles des noeuds
1713      - noms des noeuds (optionnel)
1714      - numeros des noeuds (optionnel) */
1715 
1716   /* on alloue la memoire */
1717   numnoe = (med_int *) malloc(sizeof(med_int)*nnoe);
1718   EXIT_IF(numnoe == NULL,NULL,NULL);
1719   nomnoe = (char*) malloc(MED_SNAME_SIZE*nnoe+1);
1720   EXIT_IF(nomnoe == NULL,NULL,NULL);
1721   nufano = (med_int *) malloc(sizeof(med_int)*nnoe);
1722   EXIT_IF(nufano == NULL,NULL,NULL);
1723 
1724   /* on va lire les numeros de familles des noeuds */
1725   ret = MEDmeshEntityFamilyNumberRd(fid,nommaa,numdt,numit,MED_NODE,MED_NO_GEOTYPE,nufano);
1726   if (ret < 0) ret=0; else inufael=MED_TRUE;
1727 
1728   EXIT_IF(ret < 0,"lors de la lecture des numeros de familles des noeuds",
1729 	  NULL);
1730   if (!structure) {
1731   /* on affiche le resultat */
1732   fprintf(stdout,"\n- Numeros des familles des noeuds : \n");
1733   for (i=0;i<nnoe;i++)
1734     if (inufael)
1735       fprintf(stdout," %d ",*(nufano+i));
1736     else
1737       fprintf(stdout," %d ",0);
1738   fprintf(stdout,"\n");
1739   }
1740 
1741   /* on va lire et afficher les noms des noeuds */
1742   if (MEDmeshEntityNameRd(fid,nommaa,numdt,numit,MED_NODE,MED_NO_GEOTYPE,nomnoe) == 0) {
1743     if (!structure) {
1744     fprintf(stdout,"\n- Noms des noeuds : \n");
1745     for (i=0;i<nnoe;i++) {
1746       strncpy(str,nomnoe+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
1747       str[MED_SNAME_SIZE] = '\0';
1748       fprintf(stdout," %s ",str);
1749     }
1750     }
1751   }
1752 
1753   /* on va lire et afficher les numeros des noeuds */
1754   if (MEDmeshEntityNumberRd(fid,nommaa,numdt,numit,MED_NODE,MED_NO_GEOTYPE,numnoe) == 0) {
1755     if (!structure) {
1756     fprintf(stdout,"\n- Numeros des noeuds : \n");
1757     for (i=0;i<nnoe;i++)
1758       fprintf(stdout," %d ",*(numnoe+i));
1759     }
1760   }
1761 
1762   /* on nettoie la memoire */
1763   free(nufano);
1764   free(numnoe);
1765   free(nomnoe);
1766 
1767   return;
1768 }
1769 
1770 
lecture_mailles_maillage_structure(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int nmai)1771 void lecture_mailles_maillage_structure(const med_idt fid,
1772 					const char * const nommaa,
1773 					const med_int numdt,
1774 					const med_int numit,
1775 					const med_int mdim,
1776 					const med_int nmai)
1777 
1778 {
1779   med_err ret = 0;
1780   med_int i;
1781   med_int *nufael = NULL;
1782   char    *nomele = NULL;
1783   med_int *numele = NULL;
1784   char str[MED_SNAME_SIZE+1];
1785   /* type geometrique des elements */
1786   med_geometry_type typgeo;
1787 
1788   fprintf(stdout,"\n(***************************)\n");
1789   fprintf(stdout,"(* ELEMENTS DE LA GRILLE : *)\n");
1790   fprintf(stdout,"(***************************)\n");
1791 
1792   /* type des mailles */
1793   switch(mdim) {
1794   case 0 :
1795     typgeo = MED_POINT1;
1796     break;
1797   case 1 :
1798     typgeo = MED_SEG2;
1799     break;
1800   case 2 :
1801     typgeo = MED_QUAD4;
1802     break;
1803   default :
1804     typgeo = MED_HEXA8;
1805   }
1806 
1807   /* On va lire et afficher :
1808    * - Les numeros de familles
1809    * - Les noms (optionnel)
1810    * - Les numeros (optionnel)
1811    */
1812 
1813   /* on alloue la memoire */
1814   numele = (med_int *) malloc(sizeof(med_int)*nmai);
1815   EXIT_IF(numele == NULL,NULL,NULL);
1816   nomele = (char *) malloc(sizeof(char)*MED_SNAME_SIZE*nmai+1);
1817   EXIT_IF(nomele == NULL,NULL,NULL);
1818   nufael = (med_int *) malloc(sizeof(med_int)*nmai);
1819   EXIT_IF(nufael == NULL,NULL,NULL);
1820 
1821   /* lecture des numeros de famille */
1822   ret = MEDmeshEntityFamilyNumberRd(fid,nommaa,numdt,numit,MED_CELL,typgeo,nufael);
1823   if (ret < 0)
1824     for (i=0;i<nmai;i++)
1825       *(nufael+i) = 0;
1826 
1827   if (!structure) {
1828   /* on affiche le resultat */
1829   fprintf(stdout,"\n- Numeros des familles des mailles : \n");
1830   for (i=0;i<nmai;i++)
1831     fprintf(stdout," %d ",*(nufael+i));
1832   fprintf(stdout,"\n");
1833   }
1834 
1835   /* on va lire et afficher les noms des mailles */
1836   if (MEDmeshEntityNameRd(fid,nommaa,numdt,numit,MED_CELL,typgeo,nomele) == 0) {
1837     if (!structure) {
1838     fprintf(stdout,"\n  - Noms : \n");
1839     for (i=0;i<nmai;i++) {
1840 	  strncpy(str,nomele+i*MED_SNAME_SIZE,MED_SNAME_SIZE);
1841 	  str[MED_SNAME_SIZE] = '\0';
1842 	  fprintf(stdout," %s ",str);
1843 	}
1844 	}
1845   }
1846 
1847   /* on va lire et afficher les numeros des mailles */
1848   if (MEDmeshEntityNumberRd(fid,nommaa,numdt,numit,MED_CELL,typgeo,numele) == 0) {
1849     if (!structure) {
1850     fprintf(stdout,"\n  - Numeros :\n");
1851     for (i=0;i<nmai;i++)
1852       fprintf(stdout," %d ",*(numele+i));
1853     }
1854   }
1855 
1856   /* on libere la memoire */
1857   free(nufael);
1858   free(nomele);
1859   free(numele);
1860 
1861   return;
1862 }
1863 
lecture_maillage_structure(const med_idt fid,const char * const nommaa,const med_int numdt,const med_int numit,const med_int mdim,const med_int edim,const med_switch_mode mode_coo,const char * const comp,const char * const unit,const int lecture_en_tete_seulement)1864 void lecture_maillage_structure(const med_idt fid,
1865 				const char * const nommaa,
1866 				const med_int numdt,
1867 				const med_int numit,
1868 				const med_int mdim,
1869 				const med_int edim,
1870 				const med_switch_mode mode_coo,
1871 				const char * const comp,
1872 				const char * const unit,
1873 				const int lecture_en_tete_seulement)
1874 {
1875   med_err ret = 0;
1876   /* nombre de valeurs selon les axes du repere */
1877   med_int nind[3];
1878   med_int nnoe = 1;
1879   med_int nmai = 1;
1880   /* type de la grille */
1881   med_grid_type type;
1882   /* nombre de familles */
1883   med_int nfam;
1884   /* nombre d'equivalences */
1885   med_int nequ;
1886   /* nombre de joints */
1887   med_int njnt;
1888 
1889   /* lecture selon la nature de la grille des caracteristiques
1890      du maillage :
1891      - nombre de noeuds
1892      - nombre de mailles
1893   */
1894   lecture_caracteristiques_grille(fid,nommaa,numdt,numit,mdim,nind,&nnoe,&nmai,&type);
1895 
1896   /* nombre de familles */
1897   nfam = lecture_nombre_famille(fid,nommaa);
1898 
1899   /* nombre d'equivalences  */
1900   nequ = lecture_nombre_equivalence(fid,nommaa);
1901 
1902   /* combien de joints */
1903   njnt = lecture_nombre_joint(fid,nommaa);
1904 
1905   if (lecture_en_tete_seulement)
1906     return ;
1907 
1908   /****************************************************************************
1909   *                      LECTURE DES NOEUDS                                   *
1910   ****************************************************************************/
1911   lecture_noeuds_maillage_structure(fid,nommaa,numdt,numit,mdim,edim,nind,nnoe,comp,unit,type,mode_coo);
1912 
1913   /****************************************************************************
1914   *                      LECTURE DES ELEMENTS                                 *
1915   ****************************************************************************/
1916   lecture_mailles_maillage_structure(fid,nommaa,numdt,numit,mdim,nmai);
1917 
1918   /****************************************************************************
1919   *                      LECTURE DES FAMILLES                                 *
1920   ****************************************************************************/
1921   lecture_famille_maillage(fid,nommaa,nfam);
1922 
1923   /****************************************************************************
1924   *                       LECTURE DES EQUIVALENCES                            *
1925   ****************************************************************************/
1926   lecture_equivalence_maillage(fid,nommaa,nequ);
1927 
1928   /****************************************************************************
1929   *                       LECTURE DES JOINTS                                  *
1930   ****************************************************************************/
1931   lecture_joint_maillage(fid,nommaa,njnt);
1932 
1933   return ;
1934 }
1935 
getFieldsOn(const med_idt fid,const char * const maillage,const med_int mnumdt,const med_int mnumit,const char * const nomcha,const char * const dtunit,const med_field_type typcha,const med_int ncomp,const med_entity_type entite,const med_switch_mode stockage,const med_int ncstp)1936 med_err getFieldsOn(const med_idt fid,
1937 		    const char * const maillage,
1938 		    const med_int mnumdt,
1939 		    const med_int mnumit,
1940 		    const char * const nomcha,
1941 		    const char * const dtunit,
1942 		    const med_field_type typcha,
1943 		    const med_int ncomp,
1944 		    const med_entity_type entite,
1945 		    const med_switch_mode stockage,
1946 		    const med_int ncstp) {
1947 
1948   int i,j,k,l,m,n,nb_geo=0;
1949   med_int nbpdtnor=0,pflsize,*pflval,ngauss=0,ngauss_maa_ass=0,ngroup,*vale=NULL,nval;
1950   med_int numdt=0,numo=0,_nprofile;
1951   med_int meshnumdt=0,meshnumit=0;
1952   med_float *valr=NULL,dt=0.0;
1953   med_err ret=0;
1954   char pflname [MED_NAME_SIZE+1]="";
1955   char locname [MED_NAME_SIZE+1]="";
1956   char meshname [MED_NAME_SIZE+1]="";
1957   char maa_ass [MED_NAME_SIZE+1]="";
1958   char * lien = NULL;
1959   med_bool localmesh;
1960   med_int nmesh=0;
1961   med_int lnsize=0;
1962   med_geometry_type * type_geo;
1963 
1964   const char * const * AFF;
1965   const char * const * AFF_ENT=MED23FIELD_GET_ENTITY_TYPENAME+1;
1966   switch (entite) {
1967   case MED_NODE :
1968     type_geo = MED23FIELD_GET_NODE_GEOMETRY_TYPE;
1969     nb_geo   = MED_N_NODE_FIXED_GEO;
1970     AFF      = MED23FIELD_GET_NODE_GEOMETRY_TYPENAME;
1971     break;
1972   case  MED_CELL :
1973   case  MED_NODE_ELEMENT :
1974     type_geo = MED23FIELD_GET_CELL_GEOMETRY_TYPE;
1975     nb_geo   = MED_N_CELL_FIXED_GEO;
1976     AFF      = MED23FIELD_GET_CELL_GEOMETRY_TYPENAME;
1977     break;
1978   case  MED_DESCENDING_FACE :
1979     type_geo = MED23FIELD_GET_FACE_GEOMETRY_TYPE;
1980     nb_geo   = MED_N_FACE_FIXED_GEO;
1981     AFF      = MED23FIELD_GET_FACE_GEOMETRY_TYPENAME;
1982     break;
1983   case  MED_DESCENDING_EDGE :
1984     type_geo = MED23FIELD_GET_EDGE_GEOMETRY_TYPE;
1985     nb_geo   = MED_N_EDGE_FIXED_GEO;
1986     AFF      = MED23FIELD_GET_EDGE_GEOMETRY_TYPENAME;
1987     break;
1988   }
1989 
1990   for (k=1;k<=nb_geo;k++) {
1991 
1992     /* Combien de (PDT,NOR) a lire */
1993     nbpdtnor = ncstp;
1994     if (nbpdtnor < 1 ) continue;
1995 
1996     for (j=0;j<nbpdtnor;j++) {
1997 
1998       if ( MEDfield23ComputingStepMeshInfo(fid,nomcha,j+1, &numdt, &numo, &dt,
1999 					   &nmesh, maa_ass,&localmesh, &meshnumdt, &meshnumit ) <0) {
2000 	MESSAGE("Erreur a la demande d'information sur (pdt,nor) : ");
2001 	ISCRUTE(numdt); ISCRUTE(numo);ISCRUTE(nmesh);SSCRUTE(meshname);ISCRUTE_int(localmesh);
2002 	ISCRUTE(meshnumdt);ISCRUTE(meshnumit);
2003 	ret = -1; continue;
2004       }
2005 
2006       for (i=0;i< nmesh;++i) {
2007 
2008 	if ( (_nprofile = MEDfield23nProfile(fid,nomcha,numdt,numo,entite,type_geo[k],i+1,meshname,
2009 						pflname,locname   ) ) < 0 ) {
2010 	  MESSAGE("Erreur a la demande du nombre de profils referencés par le champ : ");
2011 	  SSCRUTE(nomcha); ISCRUTE(numdt); ISCRUTE(numo);SSCRUTE(meshname);
2012 	  ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);SSCRUTE(pflname);SSCRUTE(locname);
2013 	  SSCRUTE(AFF_ENT[(int)entite]);SSCRUTE(AFF[k]);
2014 	  ret = -1; continue;
2015 	};
2016 
2017 	for (l=0;l<_nprofile;l++) {
2018 
2019 	  if ( (nval = MEDfield23nValueWithProfile(fid, nomcha, numdt, numo,  entite, type_geo[k],meshname,
2020 						   l+1,  USER_MODE, pflname,&pflsize,
2021 						   locname, &ngauss) ) < 0 ) {
2022 	    MESSAGE("Erreur a la lecture du nombre de valeurs du champ : ");
2023 	    SSCRUTE(nomcha);ISCRUTE(numdt);ISCRUTE(numo);SSCRUTE(meshname);
2024 	    ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
2025 	    ISCRUTE_int(USER_MODE);
2026 	    ret = -1; continue;
2027 	  };
2028 	  if (!strcmp(meshname,maa_ass) ) ngauss_maa_ass = ngauss;
2029 
2030 	  if (_nprofile > 1 )
2031 	    printf("\n  +Pas de Temps n."IFORMAT" (%f) [%s], n. d'ordre "IFORMAT", avec "IFORMAT" valeur(s) par entité.\n",numdt,dt,dtunit,numo,ngauss);
2032 	  else {
2033 	    printf("\n  +Pas de Temps n."IFORMAT" (%f) [%s], n. d'ordre "IFORMAT", avec "IFORMAT" pts de gauss sur le maillage par defaut.\n",numdt,dt,dtunit,numo,ngauss_maa_ass);
2034 	    printf("\tLe maillage par defaut est : |%s|, sur un total de : %i maillages associes\n",  maa_ass, nmesh);
2035 	  }
2036 
2037 	  if ( (!strcmp(meshname,maillage)) && (meshnumdt == mnumdt) && (meshnumit == mnumit) ) {
2038 
2039 	    if (_nprofile > 1 ) {
2040 	      printf("\t- Il y a "IFORMAT" entités qui portent des valeurs en mode %i. Chaque entite %s\
2041  de type geometrique %s associes au profile |%s| a "IFORMAT" valeurs associées \n",
2042 		     nval,USER_MODE,AFF_ENT[(int)entite],AFF[k],pflname,ngauss);
2043 	      printf("\t- Le maillage associé est |%s|\n",meshname);
2044 	    } else {
2045 	      /*TODO : Rétablir un affichage en nombre d'entité et pas en nombre de valeurs */
2046 	      printf("\t- Il y a %d valeurs en mode %i. Chaque entite %s\
2047  de type geometrique %s associes au maillage |%s| a %i pts de gauss \n",
2048 		     nval*ngauss,USER_MODE,AFF_ENT[(int)entite],AFF[k],
2049 		     maa_ass,ngauss);
2050 	    }
2051 
2052 	    if ( (meshnumdt != MED_NO_DT) || (meshnumit != MED_NO_IT) )
2053 	      printf("\t- La séquence de calcul utilisée dans le maillage associé |%s| est (numdt,numit) : ("IFORMAT","IFORMAT") \n",meshname,meshnumdt,meshnumit);
2054 
2055 	    /* Le maillage reference est-il porte par un autre fichier */
2056 	    if ( !localmesh ) {
2057 
2058 	      if ( (lnsize=MEDlinkInfoByName(fid,maa_ass) ) < 0 )  {
2059 	      MESSAGE("Erreur a la lecture de la taille du lien : ");
2060 	      SSCRUTE(maa_ass);
2061 	      ret = -1;
2062 	    } else {
2063 	      lien = (char *)malloc(lnsize*sizeof(char) + 1);
2064 	      EXIT_IF(lien == NULL,NULL,NULL);
2065 
2066 	      if ( MEDlinkRd(fid, maa_ass, lien) < 0 )  {
2067 		MESSAGE("Erreur a la lecture du lien : ");
2068 		SSCRUTE(maa_ass);SSCRUTE(lien);
2069 		ret = -1;
2070 	      } else {
2071 		lien[lnsize] = '\0';
2072 		printf("\tLe maillage |%s| est porte par un fichier distant |%s|\n",maa_ass,lien);
2073 	      }
2074 	      free(lien);
2075 	      }
2076 	    }
2077 
2078 	    /*Lecture des valeurs du champ */
2079 	    if (typcha == MED_FLOAT64) {
2080 
2081 	      valr = (med_float*) calloc(ncomp*nval*ngauss,sizeof(med_float));
2082 	      EXIT_IF(valr == NULL,NULL,NULL);
2083 
2084 	      if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],meshname,
2085 					       USER_MODE, pflname, stockage,MED_ALL_CONSTITUENT,
2086 					       (unsigned char*) valr) < 0 ) {
2087 		MESSAGE("Erreur a la lecture des valeurs du champ : ");
2088 		SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
2089 		ISCRUTE(numdt);ISCRUTE(numo);
2090 		ret = -1;
2091 	      }
2092 	    } else {
2093 
2094 	      vale = (med_int*) calloc(ncomp*nval*ngauss,sizeof(med_int));
2095 	      EXIT_IF(vale == NULL,NULL,NULL);
2096 
2097 	      if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],meshname,
2098 					       USER_MODE, pflname, stockage,MED_ALL_CONSTITUENT,
2099 					       (unsigned char*) vale) < 0 ) {
2100 		MESSAGE("Erreur a la lecture des valeurs du champ : ");
2101 		SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
2102 		ISCRUTE(numdt);ISCRUTE(numo);
2103 		ret = -1;
2104 	      }
2105 	    }
2106 
2107 	    if ( strlen(locname) && (_nprofile > 1) )
2108 	      printf("\t- Modèle de localisation des points de Gauss de nom |%s|\n",locname);
2109 
2110 	    if (entite == MED_NODE_ELEMENT)
2111 	      ngroup = (type_geo[k] % 100);
2112 	    else
2113 	      ngroup = ngauss;
2114 
2115 	    switch (stockage) {
2116 
2117 	    case MED_FULL_INTERLACE :
2118 	      if (!structure) {
2119 		printf("\t- Valeurs :\n\t");
2120 		for (m=0;m<(nval*ngauss)/ngroup;m++) {
2121 		  printf("|");
2122 		  for (n=0;n<ngroup*ncomp;n++)
2123 		    if (typcha == MED_FLOAT64)
2124 		      printf(" %f ",*(valr+(m*ngroup*ncomp)+n));
2125 		    else
2126 		      printf(" "IFORMAT" ",*(vale+(m*ngroup*ncomp)+n));
2127 		}
2128 	      }
2129 	      break;
2130 
2131 	      /*??? Affichage en fonction du profil à traiter ???*/
2132 	    case MED_NO_INTERLACE :
2133 	      if (!structure) {
2134 		printf("\t- Valeurs :\n\t");
2135 		for (m=0;m<ncomp;m++) {
2136 		  printf("|");
2137 		  for (n=0;n<(nval*ngauss);n++)
2138 		    if (typcha == MED_FLOAT64)
2139 		      printf(" %f ",*(valr+(m*nval)+n));
2140 		    else
2141 		      printf(" "IFORMAT" ",*(vale+(m*nval)+n));
2142 		}
2143 	      }
2144 	      break;
2145 	    }
2146 
2147 	    if (!structure) {
2148 	      printf("|\n");
2149 	    }
2150 
2151 	    if (typcha == MED_FLOAT64) {
2152 	      if ( valr ) {free(valr);valr = NULL;}}
2153 	    else
2154 	      if (vale) { free(vale);vale = NULL; }
2155 
2156 	    /*Lecture du profil associe */
2157 	    if (strcmp(pflname,MED_NO_PROFILE) == 0 ) {
2158 	      printf("\t- Profil : MED_NOPFL\n");
2159 	      /* TODO : Réactiver */
2160 /* 	      printf("\t- Profil : MED_NO_PROFILE\n"); */
2161 	    } else {
2162 	      if ( (pflsize = MEDprofileSizeByName(fid,pflname)) <0 )  {
2163 		MESSAGE("Erreur a la lecture du nombre de valeurs du profil : ");
2164 		SSCRUTE(pflname);
2165 		ret = -1; continue;
2166 	    }
2167 
2168 	      printf("\t- Profil : |%s| de taille "IFORMAT"\n",pflname,pflsize);
2169 
2170 	      pflval = (med_int*) malloc(sizeof(med_int)*pflsize);
2171 	      EXIT_IF(pflval == NULL,NULL,NULL);
2172 	      if ( MEDprofileRd(fid,pflname,pflval) <0) {
2173 		MESSAGE("Erreur a la lecture des valeurs du profil : ");
2174 		SSCRUTE(pflname);
2175 		ret = -1;
2176 	      }
2177 	      if (!structure) {
2178 		printf("\t");
2179 		for (m=0;m<pflsize;m++) printf(" "IFORMAT" ",*(pflval+m));
2180 		printf("\n");
2181 	      }
2182 	      free(pflval);
2183 	    }
2184 	  }
2185 	}
2186       }
2187     }
2188   } /* fin for sur les mailles*/
2189 
2190   return ret;
2191 }
2192 
2193 /******************************************************************************
2194  *
2195  * - Nom de la fonction : lecture_resultats
2196  * - Description : lecture et affichage des champs de resultats
2197  *                 associe a un  maillage MED.
2198  * - Parametres :
2199  *     - fid                       (IN) : ID du fichier MED.
2200  *     - maillage                  (IN) : nom du maillage maillage.
2201  *     - mode_coo                  (IN) : mode de stockage en memoire :
2202  *                                        MED_FULL_INTERLACE |
2203  *                                        MED_NO_INTERLACE.
2204  *     - lecture_en_tete_seulement (IN) : mode de lecture.
2205  ******************************************************************************/
2206 
lecture_resultats(const med_idt fid,const char * const maillage,const med_int mnumdt,const med_int mnumit,const med_switch_mode mode_coo,const int lecture_en_tete_seulement)2207 void lecture_resultats(const med_idt fid,
2208 		       const char * const    maillage,
2209 		       const med_int mnumdt,
2210 		       const med_int mnumit,
2211 		       const med_switch_mode mode_coo,
2212 		       const int lecture_en_tete_seulement)
2213 {
2214   med_err ret,lret;
2215   char pflname[MED_NAME_SIZE+1]="",nomlien[MED_NAME_SIZE+1]="";
2216   char *lien = NULL;
2217   char *comp, *unit;
2218   char nomcha  [MED_NAME_SIZE+1]="";
2219   char locname [MED_NAME_SIZE+1]="";
2220   med_int mdim,ncomp,ncha,npro,nln,pflsize,*pflval,nval,nloc,ngauss;
2221   med_field_type typcha;
2222   med_mesh_type type;
2223   int t1,t2,t3;
2224   med_geometry_type type_geo;
2225   med_float *refcoo, *gscoo, *wg;
2226   int i,j;
2227 
2228   char     nommaa[MED_NAME_SIZE+1]="";
2229   med_bool localmaa = MED_FALSE;
2230   char     dtunit[MED_SNAME_SIZE+1]="";
2231   med_int  ncstp=0;
2232 
2233   med_int locsdim=0;
2234   char    geointerpname       [MED_NAME_SIZE+1]="";
2235   char    ipointstructmeshname[MED_NAME_SIZE+1]="";
2236   med_int nsectionmeshcell = 0;
2237   med_geometry_type sectiongeotype;
2238 
2239   if (! lecture_en_tete_seulement) {
2240     fprintf(stdout,"\n(************************)\n");
2241     fprintf(stdout,"(* CHAMPS DU MAILLAGE : *)\n");
2242     fprintf(stdout,"(************************)\n");
2243   }
2244 
2245   /* combien de champs dans le fichier */
2246   ncha = MEDnField(fid);
2247   EXIT_IF(ncha < 0,"lors de la lecture du nombre de champs",NULL);
2248   fprintf(stdout,"- Nombre de champs : %d \n",ncha);
2249 
2250   if (lecture_en_tete_seulement)
2251     return;
2252 
2253   /****************************************************************************
2254   *                       LECTURE DES CHAMPS                                  *
2255   ****************************************************************************/
2256   ret = 0;
2257 
2258   /* lecture de tous les champs  pour le maillage selectionne */
2259   for (i =0;i<ncha;i++) {
2260     lret = 0;
2261     printf("\nChamp numero : |%d| \n",i+1);
2262 
2263     /* Lecture du nombre de composantes */
2264     if ((ncomp = MEDfieldnComponent(fid,i+1)) < 0) {
2265       MESSAGE("Erreur à la lecture du nombre de composantes : ");
2266       ISCRUTE(ncomp);
2267       ret = -1; continue;
2268     }
2269 
2270     /* Lecture du type du champ, des noms des composantes et du nom de
2271        l'unité*/
2272     comp = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
2273     EXIT_IF(comp == NULL,NULL,NULL);
2274     unit = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
2275     EXIT_IF(unit == NULL,NULL,NULL);
2276 
2277     if ( MEDfieldInfo(fid, i+1, nomcha, nommaa, &localmaa,
2278 		     &typcha, comp, unit, dtunit, &ncstp) < 0 ) {
2279       MESSAGE("Erreur à la demande d'information sur les champs : ");
2280       ret = -1; continue;
2281     }
2282 
2283     printf("Nom du champ : |%s| de type |%d|\n",nomcha,typcha);
2284     printf("Nom des composantes : |%s|\n",comp);
2285     printf("Unites des composantes : |%s| \n",unit);
2286     /* TODO: réactiver */
2287 /*     if (strlen(dtunit)) */
2288 /*       printf("Unité des dates : |%s|\n",dtunit); */
2289 /*     if ( ncstp > 1 ) */
2290 /*       printf("Nombre d'étapes de calcul : |"IFORMAT"| \n",ncstp); */
2291 
2292     free(comp);
2293     free(unit);
2294 
2295     /* champs aux noeuds */
2296     lret = getFieldsOn(fid, maillage, mnumdt, mnumit, nomcha, dtunit, typcha, ncomp, MED_NODE,mode_coo, ncstp);
2297 
2298     /* champs sur les elements et aux points de Gauss */
2299     if (lret == 0) lret = getFieldsOn(fid, maillage, mnumdt, mnumit , nomcha, dtunit, typcha, ncomp, MED_CELL,mode_coo, ncstp);
2300     else { MESSAGE("Erreur à la lecture des champs aux noeuds "); ret = -1; continue;}
2301 
2302     if (lret == 0) lret = getFieldsOn(fid, maillage, mnumdt, mnumit , nomcha, dtunit, typcha, ncomp, MED_DESCENDING_FACE,mode_coo, ncstp);
2303     else { MESSAGE("Erreur à la lecture des champs aux mailles "); ret = -1; continue;}
2304 
2305     if (lret == 0) lret = getFieldsOn(fid, maillage, mnumdt, mnumit , nomcha, dtunit, typcha, ncomp, MED_DESCENDING_EDGE,mode_coo, ncstp);
2306     else {MESSAGE("Erreur à la lecture des champs aux faces "); ret = -1; continue;}
2307 
2308     if (lret == 0) lret = getFieldsOn(fid, maillage, mnumdt, mnumit , nomcha, dtunit, typcha, ncomp, MED_NODE_ELEMENT,mode_coo, ncstp);
2309     else {MESSAGE("Erreur a la lecture des champs aux aretes "); ret = -1; continue;}
2310 
2311     if  (lret != 0) {MESSAGE("Erreur a la lecture des champs aux noeuds des mailles "); ret = -1;};
2312   }
2313 
2314 
2315   /* Interrogation des profils */
2316   npro = MEDnProfile(fid);
2317 
2318   printf("\nNombre de profils stockes : "IFORMAT"\n\n",npro);
2319   for (i=1 ; i <= npro ; i++ ) {
2320     if ( MEDprofileInfo(fid, i, pflname, &nval) < 0)  {
2321       MESSAGE("Erreur a la demande d'information sur le profil n° : "); ISCRUTE_int(i);
2322       ret = -1;continue;
2323     }
2324     printf("\t- Profil n°%i de nom |%s| et de taille "IFORMAT"\n",i,pflname,nval);
2325     pflval = (med_int*) malloc(sizeof(med_int)*nval);
2326     if ( MEDprofileRd(fid, pflname, pflval) < 0) {
2327       MESSAGE("Erreur a la lecture des valeurs du profil : ");
2328       SSCRUTE(pflname);
2329       ret = -1;
2330     } else {
2331       printf("\t");
2332       for (j=0;j<nval;j++) printf(" "IFORMAT" ",*(pflval+j));
2333       printf("\n\n");
2334     }
2335     free(pflval);
2336   }
2337 
2338   /* Interrogation des liens */
2339   nln = MEDnLink(fid);
2340 
2341   printf("\nNombre de liens stockes : "IFORMAT"\n\n",nln);
2342   for (i=1 ; i <= nln ; i++ ) {
2343     if ( MEDlinkInfo(fid, i, nomlien, &nval) < 0)  {
2344       MESSAGE("Erreur a la demande d'information sur le lien n° : "); ISCRUTE_int(i);
2345       ret = -1;continue;
2346     }
2347     printf("\t- Lien n°%i de nom |%s| et de taille "IFORMAT"\n",i,nomlien,nval);
2348 
2349     lien = (char * ) malloc((nval+1)*sizeof(char));
2350     EXIT_IF(lien == NULL,NULL,NULL);
2351 
2352     if ( MEDlinkRd(fid, nomlien, lien ) < 0 )  {
2353       MESSAGE("Erreur a la lecture du lien : ");
2354       SSCRUTE(nomlien);SSCRUTE(lien);
2355       ret = -1;
2356     } else {
2357       lien[nval] = '\0';
2358       printf("\t\t|%s|\n\n",lien);
2359     }
2360     free(lien);
2361   }
2362 
2363   /* Interrogation des localisations des points de GAUSS */
2364   nloc = MEDnLocalization(fid);
2365 
2366   printf("\nNombre de localisations stockees : "IFORMAT"\n\n",nloc);
2367   for (i=1 ; i <= nloc ; i++ ) {
2368     if ( MEDlocalizationInfo(fid, i, locname, &type_geo, &locsdim,&ngauss,
2369 			     geointerpname, ipointstructmeshname,&nsectionmeshcell,
2370 			     &sectiongeotype) < 0)  {
2371       MESSAGE("Erreur a la demande d'information sur la localisation n° : "); ISCRUTE_int(i);
2372       ret = -1;continue;
2373     }
2374     printf("\t- Loc. n°%i de nom |%s| de dimension "IFORMAT" avec "IFORMAT" pts de GAUSS \n",i,locname,locsdim,ngauss);
2375     t1 = (type_geo%100)*(type_geo/100);
2376     t2 = ngauss*(type_geo/100);
2377     t3 = ngauss;
2378     refcoo = (med_float *) malloc(sizeof(med_float)*t1 );
2379     gscoo  = (med_float *) malloc(sizeof(med_float)*t2 );
2380     wg     = (med_float *) malloc(sizeof(med_float)*t3 );
2381 
2382     if ( MEDlocalizationRd(fid, locname, mode_coo, refcoo, gscoo, wg  ) < 0) {
2383       MESSAGE("Erreur a la lecture des valeurs de la localisation : ");
2384       SSCRUTE(locname);
2385       ret = -1;
2386     } else {
2387       printf("\t  Coordonnees de l'element de reference de type %i :\n\t\t",type_geo);
2388       for (j=0;j<t1;j++) printf(" %f ",*(refcoo+j));
2389       printf("\n");
2390       printf("\t  Localisation des points de GAUSS : \n\t\t");
2391       for (j=0;j<t2;j++) printf(" %f ",*(gscoo+j));
2392       printf("\n");
2393       printf("\t  Poids associes aux points de GAUSS :\n\t\t");
2394       for (j=0;j<t3;j++) printf(" %f ",*(wg+j));
2395       printf("\n\n");
2396     }
2397     free(refcoo);
2398     free(gscoo);
2399     free(wg);
2400   }
2401 
2402   return;
2403 }
2404 
2405 /******************************************************************************
2406  *
2407  * - Nom de la fonction : lecture_parametres_scalaires
2408  * - Description : lecture des parametres scalaires definis
2409  *                 hors champs et maillages.
2410  * - Parametres :
2411  *     - fid                    (IN) : ID du fichier MED.
2412  *     - lecture_en_tete_seule  (IN) : mode de lecture.
2413  *
2414  ******************************************************************************/
2415 
lecture_parametres_scalaires(med_idt fid,int lecture_en_tete_seulement)2416 void lecture_parametres_scalaires(med_idt fid,
2417 				  int lecture_en_tete_seulement)
2418 {
2419   med_err ret = 0;
2420   char nom_scalaire[MED_NAME_SIZE+1];
2421   char description[MED_COMMENT_SIZE+1];
2422   med_int vali;
2423   med_float valr;
2424   med_int i,n,npdt,j;
2425   med_parameter_type  type;
2426   med_int numdt,numo;
2427   med_float dt;
2428   char dt_unit[MED_SNAME_SIZE+1];
2429 
2430   fprintf(stdout,"\n(*******************************)\n");
2431   fprintf(stdout,"(* VARIABLES SCALAIRES       : *)\n");
2432   fprintf(stdout,"(*******************************)\n");
2433 
2434   /* Combien de variables scalaire ? */
2435   n = MEDnParameter(fid);
2436   EXIT_IF(n < 0,"lors de la lecture du nombre de scalaires",NULL);
2437   fprintf(stdout,"- Nombre de variables scalaires : %d\n",n);
2438 
2439   if (lecture_en_tete_seulement)
2440     return ;
2441 
2442   for (i=1;i<=n;i++) {
2443 
2444     /* Lecture des infos (type,description) */
2445     ret = MEDparameterInfo( fid,i,nom_scalaire,&type,description,
2446 			    dt_unit, &npdt );
2447     EXIT_IF(ret < 0,"lors de la lecture des parametres d'un scalaire",NULL);
2448     fprintf(stdout,"- Scalaire n°%d de nom %s \n",i,nom_scalaire);
2449     if (type == MED_FLOAT64)
2450       fprintf(stdout,"  Type flottant. \n");
2451     else
2452       fprintf(stdout,"  Type entier. \n");
2453     printf("  Description associee : [%s] \n",description);
2454 
2455     /* Pour chaque scalaire on regarde les valeurs associees
2456        eventuellement a des pas de temps et des numeros d'ordre */
2457     EXIT_IF(npdt < 0,
2458 	    "lors de la lecture du nombre de pas de temps d'un scalaire"
2459 	    ,NULL);
2460     fprintf(stdout,"   Nombre de valeurs stockees : %d \n",npdt);
2461 
2462     for (j=1;j<=npdt;j++) {
2463 
2464       ret = MEDparameterComputationStepInfo(fid,nom_scalaire,j, &numdt,&numo,&dt);
2465       EXIT_IF(ret < 0,
2466 	      "lors de la lecture des parametres d'un pas de temps d'un scalaire",
2467 	      NULL);
2468 
2469       if (numdt == MED_NO_DT)
2470 	fprintf(stdout,"   - Aucun de pas de temps \n");
2471       else
2472 	fprintf(stdout,
2473 		"   - Pas de de temps de numero %d de valeur %f [%s] \n",numdt,
2474 	       dt,dt_unit);
2475       if (numo == MED_NO_IT)
2476 	fprintf(stdout,"   - Aucun numero d'ordre \n");
2477       else
2478 	fprintf(stdout,"   - Numero d'ordre : %d \n",numo);
2479 
2480       if (type == MED_FLOAT64) {
2481 	ret = MEDparameterValueRd(fid,nom_scalaire,numdt,numo,(unsigned char * ) &valr);
2482 	fprintf(stdout,"   - Valeur : %f \n",valr);
2483       }
2484       else {
2485 	ret = MEDparameterValueRd(fid,nom_scalaire,numdt,numo,(unsigned char * ) &vali);
2486 	fprintf(stdout,"   - Valeur : %d \n",vali);
2487       }
2488       EXIT_IF(ret < 0,"lors de la lecture de la valeur d'un scalaire",NULL);
2489 
2490     }
2491   }
2492 
2493   return ;
2494 }
2495 
ouverture_fichier_MED(char * fichier)2496 med_idt ouverture_fichier_MED(char *fichier)
2497 {
2498   med_idt fid;
2499   med_err ret = 0;
2500   med_int majeur,mineur,release;
2501   med_bool    hdfok;
2502   med_bool    medok;
2503 
2504   /* on regarde si le fichier existe */
2505   ret = (int) access(fichier,F_OK);
2506   EXIT_IF(ret < 0,"Le fichier n'est pas accessible ou n'existe pas ",
2507 	  fichier);
2508 
2509   /* on regarde s'il s'agit d'un fichier au format HDF 5 */
2510   ret = MEDfileCompatibility (fichier,&hdfok, &medok );
2511   EXIT_IF(ret < 0,"Impossible de déterminer la compatibilité de format. ",
2512 	  fichier);
2513 
2514   EXIT_IF(!hdfok,"Le fichier n'est pas dans un format HDF compatible ", fichier);
2515   EXIT_IF(!medok,"Le fichier n'est pas dans un format MED compatible ", fichier);
2516 
2517   /* Quelle version de MED est utilise par mdump ? */
2518   MEDlibraryNumVersion(&majeur,&mineur,&release);
2519   fprintf(stdout,
2520 	  "- Lecture du fichier à l'aide de la bibliotheque MED V%d.%d.%d \n",
2521 	  majeur,mineur,release);
2522 
2523   /* Ouverture du fichier MED en lecture seule */
2524   fid = MEDfileOpen(fichier,MED_ACC_RDONLY);
2525   EXIT_IF( fid < 0,"Ouverture du du fichier ",fichier);
2526 
2527   MEDfileNumVersionRd(fid, &majeur, &mineur, &release);
2528   EXIT_IF(( (majeur < 2) || ( (majeur == 2) && (mineur < 2)) ), "Le fichier est antérieur à la version 2.2", NULL);
2529 
2530   return fid;
2531 }
2532 
lecture_en_tete(med_idt fid,char * fichier)2533 void lecture_en_tete(med_idt fid,char* fichier)
2534 {
2535   char fichier_en_tete[MED_COMMENT_SIZE+1];
2536   med_err ret = 0;
2537 
2538   /* lecture de l'en-tete du fichier (optionnel) */
2539   /* on va lire dans le fichier */
2540   ret = MEDfileCommentRd(fid,fichier_en_tete);
2541 
2542   /* on affiche */
2543   if (ret >= 0)
2544     fprintf(stdout,"- En-tete du fichier : %s \n",fichier_en_tete);
2545 
2546   return;
2547 }
2548 
parametrage(med_switch_mode * mode_coo,med_connectivity_mode * typ_con)2549 void parametrage(med_switch_mode *mode_coo,
2550 		 med_connectivity_mode *typ_con)
2551 {
2552   int reponse;
2553 
2554   fprintf(stdout,"(*****************)\n");
2555   fprintf(stdout,"(* PARAMETRAGE : *)\n");
2556   fprintf(stdout,"(*****************)\n");
2557   fprintf(stdout,"- Mode d'affichage des coordonnées des noeuds ? \n");
2558   fprintf(stdout,"  1. Mode entrelacé : taper 1 \n");
2559   fprintf(stdout,"  2. Mode non entrelacé : taper 2 \n");
2560   reponse = 0;
2561   do {
2562     fprintf(stdout,"  Reponse : ");
2563     scanf("%d",&reponse);
2564   } while (reponse != 1 && reponse != 2);
2565   if (reponse == 1)
2566     *mode_coo = MED_FULL_INTERLACE;
2567   else
2568     *mode_coo = MED_NO_INTERLACE;
2569 
2570   fprintf(stdout,"- Connectivité des éléments ? \n");
2571   fprintf(stdout,"  1. Nodale : taper 1 \n");
2572   fprintf(stdout,"  2. Descendante : taper 2 \n");
2573   reponse = 0;
2574   do {
2575     fprintf(stdout,"  Reponse : ");
2576     scanf("%d",&reponse);
2577   } while (reponse != 1 && reponse != 2);
2578   if (reponse == 1)
2579     *typ_con = MED_NODAL;
2580   else
2581     *typ_con = MED_DESCENDING;
2582 
2583   return;
2584 }
2585 
2586 
lecture_information_maillage(const med_idt fid,const int numero,char * nommaa,med_int * const mdim,med_int * const edim,med_mesh_type * const type_maillage,char * const maillage_description,med_int * const nstep,char * const dtunit,char * const nomcoo,char * const unicoo,med_axis_type * const rep)2587 void lecture_information_maillage(const med_idt fid,
2588 				  const int numero,
2589 				  char *          nommaa,
2590 				  med_int * const mdim,
2591 				  med_int * const edim,
2592 				  med_mesh_type * const type_maillage,
2593 				  char * const maillage_description,
2594 				  med_int * const nstep,
2595 				  char    * const dtunit,
2596 				  char    * const nomcoo,
2597 				  char    * const unicoo,
2598 				  med_axis_type *const rep)
2599 {
2600   char nom_universel[MED_LNAME_SIZE+1];
2601   med_err ret = 0;
2602   med_sorting_type sortingtype;
2603 
2604   fprintf(stdout,"\n(********************************************)\n");
2605   fprintf(stdout,"(* INFORMATIONS GENERALES SUR LE MAILLAGE : *)\n");
2606   fprintf(stdout,"(********************************************)\n");
2607 
2608   /* lecture du nom et de la dimension du maillage */
2609   ret = MEDmeshInfo(fid, numero,nommaa,edim,mdim,type_maillage,maillage_description,
2610 		    dtunit,&sortingtype,nstep,rep,nomcoo,unicoo);
2611   EXIT_IF(ret < 0,"Lecture des informations sur le maillage",NULL);
2612 
2613   /* affichage des donnees lues */
2614   fprintf(stdout,"- Nom du maillage : <<%s>>\n",nommaa);
2615   fprintf(stdout,"- Dimension du maillage : "IFORMAT"\n",*mdim);
2616   if (*edim > *mdim)
2617     fprintf(stdout,"- La dimension de l'espace est "IFORMAT" \n",*edim);
2618   if (*type_maillage == MED_UNSTRUCTURED_MESH)
2619     fprintf(stdout,"- Type du maillage : MED_NON_STRUCTURE \n");
2620   else
2621     fprintf(stdout,"- Type du maillage : MED_STRUCTURE \n");
2622   fprintf(stdout,"- Description associee au maillage : %s\n",
2623 	  maillage_description);
2624 
2625   if ( *nstep > 1 )
2626     fprintf(stdout,"- Nombre d'étapes de calcul associées au maillage : "IFORMAT"\n",
2627 	    *nstep);
2628   if (strlen(dtunit))
2629     fprintf(stdout,"- Unité des dates d'étapes de calcul associées au maillage : %s\n",
2630 	    dtunit);
2631 
2632  /* lecture du nom universel (presence optionnelle) */
2633   ret = MEDmeshUniversalNameRd(fid,nommaa,nom_universel);
2634   if (ret == 0)
2635    fprintf(stdout,"- Nom universel du maillage : %s \n",nom_universel);
2636 
2637  return;
2638 }
2639 
2640 /******************************************************************************
2641  *
2642  * - Nom de la fonction : main
2643  * - Description : fonction "main" de l'outil de DUMP d'un fichier MED.
2644  * - Parametres :
2645  *     - argc  (IN) : nombre d'arguments sur la ligne de commande.
2646  *     - argv  (IN) : liste des arguments.
2647  *
2648  ******************************************************************************/
2649 
main(int argc,char ** argv)2650 int main (int argc, char **argv)
2651 {
2652   med_err ret = 0;
2653   med_idt fid;
2654   int numero;
2655   med_switch_mode mode_coo;
2656   med_connectivity_mode typ_con;
2657   int lecture_en_tete_seulement = 0;
2658   med_int mdim,nmaa;
2659   /* nom du maillage */
2660   char nommaa[MED_NAME_SIZE+1];
2661   char maillage_description[MED_COMMENT_SIZE+1];
2662   med_mesh_type type_maillage;
2663   med_int edim;
2664   int decalage;
2665   char nomcoo[3*MED_SNAME_SIZE+1]="";
2666   char unicoo[3*MED_SNAME_SIZE+1]="";
2667   char dtunit[MED_SNAME_SIZE+1]="";
2668   med_int   nstep=0,numdt=MED_NO_DT,numit=MED_NO_IT;
2669   int       csit=0;
2670   med_float dt=0.0;
2671   med_axis_type  rep;
2672   /****************************************************************************
2673   *                  TEST DU NOMBRE D'ARGUMENTS                               *
2674   *                  argument 1 = nom du fichier MED                          *
2675   ****************************************************************************/
2676 
2677   structure = 0;
2678   decalage = 0;
2679   if (argc > 2 && strcmp(argv[1], "--structure") == 0) {
2680     argc--;
2681     decalage = 1;
2682     structure = 1;
2683   }
2684 
2685   EXIT_IF(argc != 2 && argc != 5,"nombre de parametres incorrects\n",NULL);
2686 
2687 
2688   /****************************************************************************
2689   *                      OUVERTURE DU FICHIER EN LECTURE                      *
2690   ****************************************************************************/
2691   fid = ouverture_fichier_MED(argv[1 + decalage]);
2692 /*   ICI;_MEDobjetsOuverts(fid); */
2693 
2694   /****************************************************************************
2695    *                     QUESTIONS PRELIMINAIRES                              *
2696    *    1. Mode d'affichage des coordonnees (entrelace ou non) ?              *
2697    *    2. Connectivite des elements (nodale ou descendante) ?                *
2698    ***************************************************************************/
2699   fprintf(stdout,"\n >>>>>> DUMP DU FICHIER %s >>>>>>\n",argv[1 + decalage]);
2700 
2701   /* lecture et affichage de l'en-tete du fichier */
2702   lecture_en_tete(fid,argv[1 + decalage]);
2703 /*   ICI;_MEDobjetsOuverts(fid); */
2704 
2705   if (argc == 2)
2706     parametrage(&mode_coo,&typ_con);
2707   else {
2708     if (! strcmp(argv[3 + decalage],"NODALE"))
2709       typ_con = MED_NODAL;
2710     if (! strcmp(argv[3 + decalage],"DESCENDANTE"))
2711       typ_con = MED_DESCENDING;
2712 
2713     if (!strcmp(argv[4 + decalage],"NO_INTERLACE"))
2714       mode_coo = MED_NO_INTERLACE;
2715     if (!strcmp(argv[4 + decalage],"FULL_INTERLACE"))
2716       mode_coo = MED_FULL_INTERLACE;
2717     if (! strcmp(argv[4 + decalage],"LECTURE_EN_TETE_SEULEMENT"))
2718       lecture_en_tete_seulement = 1;
2719   }
2720 
2721 
2722   /****************************************************************************
2723    *                      QUEL MAILLAGE LIRE ?                                *
2724    ***************************************************************************/
2725   nmaa = MEDnMesh(fid);
2726 /*   ICI;_MEDobjetsOuverts(fid); */
2727 
2728   EXIT_IF(nmaa < 0,"lors de la lecture du nombre de maillages",NULL);
2729 
2730   /* Quel maillage lire ? */
2731   if (argc == 2) {
2732     fprintf(stdout,"- Il y a %d maillages dans ce fichier \n",nmaa);
2733     fprintf(stdout,"  Lequel voulez-vous lire (1|2|3|...|n) ?\n");
2734     do {
2735       fprintf(stdout,"  Reponse : ");
2736       scanf("%d",&numero);
2737     } while ( (numero > nmaa) || (numero <= 0) );
2738   }
2739   else {
2740     numero = atoi(argv[2 + decalage]);
2741     EXIT_IF(numero > nmaa || numero <= 0,"ce numero de maillage n'existe pas",
2742 	    NULL);
2743   }
2744 
2745   /****************************************************************************
2746    *                       PARAMETRES SCALAIRES                               *
2747    ****************************************************************************/
2748 
2749   /* on va lire l'ensemble des parametres scalaire */
2750   lecture_parametres_scalaires(fid,lecture_en_tete_seulement);
2751 /*   _MEDobjetsOuverts(fid); */
2752 
2753   /****************************************************************************
2754    *                       INFOS GENERALES SUR LE MAILLAGE                    *
2755    ****************************************************************************/
2756   lecture_information_maillage(fid,numero,nommaa,&mdim,&edim,&type_maillage,
2757 			       maillage_description,&nstep,dtunit,nomcoo,unicoo,&rep);
2758 /*   _MEDobjetsOuverts(fid); */
2759 
2760   for (csit=1; csit <= nstep; ++csit) {
2761 
2762     ret = MEDmeshComputationStepInfo(fid, nommaa, csit, &numdt, &numit, &dt);
2763     EXIT_IF(ret < 0,"lors de l'appel à MEDmeshComputationStepInfo",NULL);
2764 
2765  /****************************************************************************
2766   *                      LECTURE DU MAILLAGE ET DES RESULTATS ASSOCIES        *
2767   ****************************************************************************/
2768 /*   _MEDobjetsOuverts(fid); */
2769 
2770       if (type_maillage == MED_UNSTRUCTURED_MESH)
2771 	lecture_maillage_non_structure(fid,nommaa,numdt,numit,mdim,edim,mode_coo,typ_con,
2772 				       nomcoo,unicoo,&rep,lecture_en_tete_seulement);
2773       else {
2774 	lecture_maillage_structure(fid,nommaa,numdt,numit,mdim,edim,mode_coo,
2775 				   nomcoo,unicoo,lecture_en_tete_seulement);
2776 
2777       }
2778 /*   _MEDobjetsOuverts(fid); */
2779       /* on lit ensuite les resultats associes au maillage selectionne */
2780       lecture_resultats(fid,nommaa,numdt,numit,mode_coo,lecture_en_tete_seulement);
2781 /*   _MEDobjetsOuverts(fid); */
2782 
2783   }
2784 
2785  /****************************************************************************
2786  *                      FERMETURE DU FICHIER                                 *
2787  ****************************************************************************/
2788  ret = MEDfileClose(fid);
2789  EXIT_IF(ret < 0,"lors de la fermeture du fichier",argv[1 + decalage]);
2790 
2791  fprintf(stdout,"\n >>>>>> FIN DU DUMP DU FICHIER %s >>>>>>\n",argv[1 + decalage]);
2792 
2793  return EXIT_SUCCESS;
2794 }
2795