Salome HOME
update with the version in the OCC branch OCC_development_generic_2006.
[modules/med.git] / src / MEDWrapper / V2_1 / Core / MEDchampLire.cxx
1 /*************************************************************************
2 * COPYRIGHT (C) 1999 - 2002  EDF R&D
3 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
4 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE 
5 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; 
6 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
7 *  
8 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
9 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
11 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
12 *
13 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
14 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
15 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
16 *
17 *************************************************************************/
18
19 #include "med.hxx"
20 #include "med_outils.hxx"
21
22 #include <string.h>
23 #include <stdlib.h>
24
25  /*La taille de val allouée par l'utilisateur doit prendre en compte le nbre de points de gauss et le nbre de composantes*/
26
27 namespace med_2_1{
28
29 med_err 
30 MEDchampLire(med_idt fid,char *maa, char *cha, unsigned char *val,med_mode_switch interlace,med_int numco,
31              char *profil,med_entite_maillage type_ent, med_geometrie_element type_geo,
32              med_int numdt, med_int numo)
33      /* VERIFIER LA POSSIBILITE DE RELIRE L'UNITE DE PAS DE TEMPS (DS CHAMPINFO) */
34 {
35   med_err ret;
36   med_idt chid, datagroup1, datagroup2;
37   med_int ncomp, chtype, ngauss, i, locnumdt, pfluse;
38   char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2],nomdatagroup2[2*MED_MAX_PARA+1];
39   char tmp1[MED_TAILLE_NOM_ENTITE+1], pfltmp[MED_TAILLE_NOM+1];
40   char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1];
41   med_size   psize;
42   med_int   *pfltabtmp=0;
43   med_ssize *pfltab=0;
44   char maatmp[MED_TAILLE_NOM+1];
45   
46   /*
47    * On inhibe le gestionnaire d'erreur HDF 5
48    */
49   _MEDmodeErreurVerrouiller();
50
51   /* 
52    * Si le Data Group cha n'existe pas => erreur
53    */
54   strcpy(chemin,MED_CHA);
55   strcat(chemin,cha);
56   if ((chid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
57     return -1;
58
59  /* 
60    * Si le Data Group  de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur
61    */
62   if ((ret = _MEDnomEntite(nomdatagroup1,type_ent)) < 0)
63     return -1;
64   if ((type_ent != MED_NOEUD))
65     {
66       if ((ret = _MEDnomGeometrie(tmp1,type_geo)) < 0)
67         return -1;
68       strcat(nomdatagroup1,".");
69       strcat(nomdatagroup1,tmp1);
70     }
71   datagroup1 = 0;
72   if ( (datagroup1 = _MEDdatagroupOuvrir(chid,nomdatagroup1)) < 0 )
73     return -1;
74
75   /*
76    * Si le Data Group de niveau 2 <numdtt>.<numoo> n'existe pas => erreur
77    */
78   if ( numdt == MED_NOPDT) locnumdt = MED_NOPDT; else locnumdt = numdt;
79   sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) locnumdt,MED_MAX_PARA,(long ) numo);
80   
81   datagroup2 = 0;   
82   if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0)    
83     return -1;   
84
85   /* Lecture du nbre de composantes du champ */
86
87   if ((ret = _MEDattrEntierLire(chid,MED_NOM_NCO,&ncomp)) < 0)
88     return -1;
89   
90   /* Gestion des profils*/
91
92   /*
93    * Lire le profil demandé
94    */
95
96   if ((ret = _MEDattrStringLire(datagroup2,MED_NOM_PFL,MED_TAILLE_NOM,pfltmp)) < 0)
97     return -1;
98   
99   if ( pfluse = (strcmp(pfltmp,MED_NOPFLi) && strcmp(pfltmp,"")) ) /* le test "" pour des raisons de compatibilité */
100     {
101       strcpy(profil,pfltmp);
102       if ( (i = MEDnValProfil(fid,profil)) < 0 )
103         return -1;
104       else
105         psize = i;
106
107       pfltabtmp = (med_int *)   malloc (sizeof(med_int)*psize);
108       pfltab = (med_ssize *) malloc (sizeof(med_ssize)*psize);
109       if ((ret = MEDprofilLire(fid,pfltabtmp,profil)) < 0)
110         return -1;
111       for (i=0;i<psize;i++)
112         pfltab[i] = (med_ssize) pfltabtmp[i];
113        
114     }
115   else {
116     psize = MED_NOPF;
117     strcpy(profil,MED_NOPFL);
118   }
119   
120   /*
121    * Lire le nom de maillage associé au champ
122    */
123   if ((ret = _MEDattrStringLire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maatmp)) < 0)
124     return -1;
125
126   if (strcmp(maa,maatmp)) 
127     return -1;
128   
129   /* Lit le nbre de points de Gauss  */ 
130   /* (attribut MED_NOM_NGAU) propre au <type_ent>[.<type_geo>] pour simplifier la relecture */
131   if ( (ret = _MEDattrEntierLire(datagroup2,MED_NOM_NGA,&ngauss)) < 0 )
132     return -1;
133
134   /*
135    * Lecture du champ
136    */
137
138   if ((ret = _MEDattrEntierLire(chid,MED_NOM_TYP,&chtype)) < 0)
139     return -1;
140
141   switch(chtype)
142     {
143     case MED_REEL64 :
144       if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_REEL64,
145                                      interlace,ncomp,numco,
146                                      psize,pfltab,ngauss,val))< 0)
147         return -1;
148       break;
149
150     case MED_INT32 :
151 #if defined(IRIX64)||defined(OSF1) 
152      if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_INT64,
153                                      interlace,ncomp,numco,
154                                      psize,pfltab,ngauss,val))< 0)
155         return -1;
156 #else
157      if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_INT32,
158                                      interlace,ncomp,numco,
159                                      psize, pfltab,ngauss,val))< 0)
160         return -1;
161 #endif
162      break;
163
164     case MED_INT64 :
165 #if defined(IRIX64)||defined(OSF1) 
166      if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_INT64,
167                                      interlace,ncomp,numco,
168                                      psize,pfltab,ngauss,val))< 0)
169         return -1;
170 #else
171      return -1;
172 #endif
173       break;      
174
175     default :
176       return -1;
177     }
178
179   /*
180    * On ferme tout 
181    */
182   if ( pfluse ) { free(pfltab); free(pfltabtmp);}
183
184   if ((ret = _MEDdatagroupFermer(datagroup2)) < 0)
185     return -1;
186   if ((ret = _MEDdatagroupFermer(datagroup1)) < 0)
187     return -1;
188   if ((ret = _MEDdatagroupFermer(chid)) < 0)
189     return -1;
190     
191   return 0;     
192 }
193
194 }