1 #include "MEDMEM_MEDMEMchampLire.hxx"
3 * En attendant une correction de la gestion du mode d'accès au fichier dans MEDfichier
4 * on intègre la correction ici.
12 fprintf(stderr, "%s [%d] : " , __FILE__ , __LINE__ ) ; \
16 # define ISCRUTE(entier) { \
18 fprintf(stderr,"%s = %d\n",#entier,entier) ; \
22 # define SSCRUTE(chaine) { \
24 fprintf(stderr,"%s = \"%s\"\n",#chaine,chaine) ; \
27 # define MESSAGE(chaine) { \
29 fprintf(stderr,"%s\n",chaine) ; \
33 extern void _MEDmodeErreurVerrouiller(void);
35 /*************************************************************************
36 * COPYRIGHT (C) 1999 - 2003 EDF R&D
37 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
38 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE
39 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION;
40 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
42 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
43 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
44 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
45 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
47 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
48 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
49 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
51 *************************************************************************/
54 #include <med_outils.h>
60 * - Nom de la fonction : MEDchampLire
61 * - Description : Lecture d'un Champ Résultat
63 * - fid (IN) : ID du fichier HDF courant
64 * - maa (IN) : le nom du maillage sur lequel s'applique le champ
65 * - cha (IN) : le nom du champ
66 * - val (OUT) : valeurs du champ à lire
67 * - interlace(IN) : entrelacement voulu en mémoire {MED_FULL_INTERLACE,MED_NO_INTERLACE}
68 * - numco (IN) : n° de la composante à lire (MED_ALL si toutes)
69 * - profil (OUT) : nom du profil utilisé (MED_NOPFL si inutilisé)
70 * - pflmod (IN) : Indique comment lire les informations en mémoire { MED_COMPACT, MED_GLOBALE }.
71 * - type_ent (IN) : entité concerné par le champ {MED_NOEUD,MED_ARETE,MED_FACE,MED_MAILLE}
72 * - type_geo (IN) : type géométrique de l'entité concerné {MED_POINT,MED_SEG2 ......}
73 * - numdt (IN) : n° du pas de temps (MED_NOPDT si aucun)
74 * - numo (IN) : n° d'ordre utilisé MED_NONOR si inutile
75 * - Resultat : 0 en cas de succes, -1 sinon
78 /* REM : La taille de val allouée par l'utilisateur doit prendre en compte le nbre de points de gauss et le nbre de composantes*/
81 MEDMEMchampLire(med_idt fid,char *maa, char *cha, unsigned char *val,med_mode_switch interlace,med_int numco,
82 char * locname, char *profil, med_mode_profil pflmod,
83 med_entite_maillage type_ent, med_geometrie_element type_geo,
84 med_int numdt, med_int numo)
88 med_idt gid=0, datagroup1=0, datagroup2=0,datagroup3=0;
89 med_int ncomp=0, chtype=0, ngauss=0, i=0, pfluse=0;
90 char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="",nomdatagroup2[2*MED_MAX_PARA+1]="";
91 char tmp1[MED_TAILLE_NOM_ENTITE+1]="", pfltmp[MED_TAILLE_NOM+1]="";
92 char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1]="";
98 * On inhibe le gestionnaire d'erreur HDF 5
100 _MEDmodeErreurVerrouiller();
103 * Si le Data Group cha n'existe pas => erreur
105 strcpy(chemin,MED_CHA);
107 if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
110 /* Lecture du nbre de composantes du champ */
112 if (_MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp) < 0)
116 * Si le Data Group de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur
118 if (_MEDnomEntite(nomdatagroup1,type_ent) < 0)
120 if ((type_ent != MED_NOEUD))
122 if (_MEDnomGeometrie(tmp1,type_geo) < 0)
124 strcat(nomdatagroup1,".");
125 strcat(nomdatagroup1,tmp1);
128 if ( (datagroup1 = _MEDdatagroupOuvrir(gid,nomdatagroup1)) < 0 )
132 * Si le Data Group de niveau 2 <numdt>.<numoo> n'existe pas => erreur
134 sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo);
137 if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0)
141 * Ouvre le datagroup de niveau 3 <maa>
144 if ( ! strcmp(maa,MED_NOREF) )
145 if (_MEDattrStringLire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maa) < 0)
149 if ( (datagroup3 = _MEDdatagroupOuvrir(datagroup2,maa)) < 0 )
152 /* Gestion des profils*/
158 if (_MEDattrStringLire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,pfltmp) < 0)
161 if ( pfluse = (strcmp(pfltmp,MED_NOPFLi) && strcmp(pfltmp,"")) ) /* le test MED_NOPFLi pour des raisons de compatibilité */
163 strcpy(profil,pfltmp);
164 if ( (i = MEDnValProfil(fid,profil)) < 0 )
169 pfltabtmp = (med_int *) malloc (sizeof(med_int)*psize);
170 pfltab = (med_ssize *) malloc (sizeof(med_ssize)*psize);
171 if (MEDprofilLire(fid,pfltabtmp,profil) < 0)
173 for (i=0;i<psize;i++)
174 pfltab[i] = (med_ssize) pfltabtmp[i];
179 strcpy(profil,MED_NOPFL);
183 /* Lire le nbre des points de GAUSS*/
184 if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,&ngauss) < 0) {
185 MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NGA : ");
186 ISCRUTE(ngauss);goto ERROR;
189 /* Lire l'identificateur de localisation des points de GAUSS*/
190 if ( _MEDattrStringLire(datagroup3,MED_NOM_GAU,MED_TAILLE_NOM,locname) < 0) {
191 MESSAGE("Erreur à la lecture de l'attribut MED_NOM_GAU : ");
192 SSCRUTE(locname); goto ERROR;
199 if (_MEDattrEntierLire(gid,MED_NOM_TYP,&chtype) < 0)
205 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_FLOAT64,
206 interlace,ncomp,numco,
207 psize,pflmod,pfltab,ngauss,val)< 0)
212 #if defined(F77INT64)
213 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
214 interlace,ncomp,numco,
215 psize,pflmod,pfltab,ngauss,val)< 0)
218 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT32,
219 interlace,ncomp,numco,
220 psize,pflmod,pfltab,ngauss,val)< 0)
226 #if defined(F77INT64)
227 if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
228 interlace,ncomp,numco,
229 psize,pflmod,pfltab,ngauss,val)< 0)
248 if ( pfluse ) { free(pfltab); free(pfltabtmp);}
250 if (datagroup3>0) if (_MEDdatagroupFermer(datagroup3) < 0) {
251 MESSAGE("Impossible de fermer le datagroup : ");
252 ISCRUTE(datagroup3); ret = -1;
255 if (datagroup2>0) if (_MEDdatagroupFermer(datagroup2) < 0) {
256 MESSAGE("Impossible de fermer le datagroup : ");
257 ISCRUTE(datagroup2); ret = -1;
260 if (datagroup1>0) if (_MEDdatagroupFermer(datagroup1) < 0) {
261 MESSAGE("Impossible de fermer le datagroup : ");
262 ISCRUTE(datagroup1); ret = -1;
265 if (gid>0) if (_MEDdatagroupFermer(gid) < 0) {
266 MESSAGE("Impossible de fermer le datagroup : ");
267 ISCRUTE(gid); ret = -1;