00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #include <med.h>
00020 #include <med_config.h>
00021 #include <med_outils.h>
00022 
00023 #include <string.h>
00024 #include <stdlib.h>
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046  
00047 
00048 
00049 
00050 med_err
00051 MEDchampLire(med_idt fid,char *maa, char *cha, unsigned char *val,med_mode_switch interlace,med_int numco,
00052              char * locname, char *profil, med_mode_profil pflmod,
00053              med_entite_maillage type_ent, med_geometrie_element type_geo,
00054              med_int numdt, med_int numo)
00055 
00056 {
00057   med_err ret=-1;
00058   med_idt gid=0, datagroup1=0, datagroup2=0,datagroup3=0;
00059   med_int ncomp=0, chtype=0, ngauss=0, i=0, pfluse=0, nbelem = 0;
00060   char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="",nomdatagroup2[2*MED_MAX_PARA+1]="";
00061   char tmp1[MED_TAILLE_NOM_ENTITE+1]="", pfltmp[MED_TAILLE_NOM+1]="";
00062   char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1]="";
00063   med_size   psize=0;
00064   med_int   *pfltabtmp=0;
00065   med_size  *pfltab=0;
00066   char       _tmpmaa[MED_TAILLE_NOM+1]="";
00067   char      *_maa=maa;
00068   
00069 
00070 
00071   _MEDmodeErreurVerrouiller();
00072 if (MEDcheckVersion(fid) < 0) return -1;
00073 
00074 
00075   
00076 
00077 
00078   strcpy(chemin,MED_CHA);
00079   strcat(chemin,cha);
00080   if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
00081     goto ERROR;
00082 
00083   
00084 
00085   if (_MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp) < 0)
00086     goto ERROR;
00087   
00088   
00089 
00090 
00091   
00092   if (_MEDnomEntite(nomdatagroup1,type_ent) < 0)
00093     goto ERROR;
00094   if ( type_ent != MED_NOEUD ) {
00095     if (_MEDnomGeometrie30(tmp1,type_geo) < 0)
00096       goto ERROR;
00097     strcat(nomdatagroup1,".");
00098     strcat(nomdatagroup1,tmp1);
00099   }
00100   datagroup1 = 0;
00101   if ( (datagroup1 = _MEDdatagroupOuvrir(gid,nomdatagroup1)) < 0 )
00102     goto ERROR;
00103 
00104   
00105 
00106 
00107   sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo);
00108 
00109   datagroup2 = 0;
00110   if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0)
00111     goto ERROR;
00112 
00113   
00114 
00115 
00116 
00117   if ( ! strcmp(maa,MED_NOREF) ) {
00118     if (_MEDattrStringLire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,_tmpmaa) < 0)
00119       goto ERROR;
00120     _maa=_tmpmaa;
00121   }
00122   datagroup3 = 0;
00123   if ( (datagroup3 = _MEDdatagroupOuvrir(datagroup2,_maa)) < 0 )
00124     goto ERROR;
00125 
00126   
00127 
00128   
00129 
00130 
00131 
00132   if (_MEDattrStringLire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,pfltmp) < 0)
00133     goto ERROR;
00134 
00135   if ( (pfluse = (strcmp(pfltmp,MED_NOPFLi) && strcmp(pfltmp,""))) ) 
00136     {
00137       strcpy(profil,pfltmp);
00138       if ( (i = MEDnValProfil(fid,profil)) < 0 )
00139         goto ERROR;
00140       else
00141         psize = i;
00142 
00143       pfltabtmp = (med_int *)   malloc (sizeof(med_int)*psize);
00144       pfltab = (med_size *) malloc (sizeof(med_size)*psize);
00145       if (MEDprofilLire(fid,pfltabtmp,profil) < 0)
00146         goto ERROR;
00147       for (i=0;i<psize;i++)
00148         pfltab[i] = (med_size) pfltabtmp[i];
00149        
00150     }
00151   else {
00152     psize = MED_NOPF;
00153     strcpy(profil,MED_NOPFL);
00154   }
00155   
00156   
00157   
00158   if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,&ngauss) < 0) {
00159     MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NGA : ");
00160     ISCRUTE(ngauss);goto ERROR;
00161   };
00162 
00163   
00164   if ( _MEDattrStringLire(datagroup3,MED_NOM_GAU,MED_TAILLE_NOM,locname) < 0) {
00165     MESSAGE("Erreur à la lecture de l'attribut MED_NOM_GAU : ");
00166     SSCRUTE(locname); goto ERROR;
00167   }
00168 
00169   
00170   if ( ! strcmp(locname,MED_NOGAUSSi))
00171     strcpy(locname,MED_NOGAUSS);
00172 
00173   
00174   if (_MEDattrEntierLire(datagroup3,MED_NOM_NBR,&nbelem) < 0) {
00175     MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NBR : ");
00176     ISCRUTE(nbelem);goto ERROR;
00177   };
00178 
00179   
00180 
00181 
00182 
00183 
00184   if (_MEDattrEntierLire(gid,MED_NOM_TYP,&chtype) < 0)
00185     goto ERROR;
00186 
00187   switch(chtype)
00188     {
00189     case MED_FLOAT64 :
00190       if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_FLOAT64,
00191                                      interlace,ncomp,numco,
00192                                      psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00193         goto ERROR;
00194       break;
00195 
00196     case MED_INT32 :
00197 #if defined(HAVE_F77INT64) 
00198      if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
00199                                      interlace,ncomp,numco,
00200                                      psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00201         goto ERROR;
00202 #else
00203      if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT32,
00204                                      interlace,ncomp,numco,
00205                                      psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00206         goto ERROR;
00207 #endif
00208      break;
00209 
00210     case MED_INT64 :
00211 #if defined(HAVE_F77INT64) 
00212      if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
00213                                      interlace,ncomp,numco,
00214                                      psize,pflmod,MED_PFL_COMPACT,pfltab,ngauss,nbelem,val)< 0)
00215         goto ERROR;
00216 #else
00217      goto ERROR;
00218 #endif
00219       break;      
00220 
00221     default :
00222       goto ERROR;
00223     }
00224 
00225   
00226 
00227 
00228 
00229   ret = 0;
00230 
00231  ERROR:
00232   
00233   if ( pfluse ) { free(pfltab); free(pfltabtmp);}
00234  
00235   if (datagroup3>0)     if (_MEDdatagroupFermer(datagroup3) < 0) {
00236     MESSAGE("Impossible de fermer le datagroup : ");
00237     ISCRUTE_int(datagroup3); ret = -1; 
00238   }
00239   
00240   if (datagroup2>0)     if (_MEDdatagroupFermer(datagroup2) < 0) {
00241     MESSAGE("Impossible de fermer le datagroup : ");
00242     ISCRUTE_int(datagroup2); ret = -1; 
00243   }
00244 
00245   if (datagroup1>0)     if (_MEDdatagroupFermer(datagroup1) < 0) {
00246     MESSAGE("Impossible de fermer le datagroup : ");
00247     ISCRUTE_int(datagroup1); ret = -1; 
00248   }
00249   
00250   if (gid>0)     if (_MEDdatagroupFermer(gid) < 0) {
00251     MESSAGE("Impossible de fermer le datagroup : ");
00252     ISCRUTE_id(gid); ret = -1; 
00253   }
00254 
00255   return ret; 
00256 }
00257 
00258 
00259 
00260