Back to index

salome-med  6.5.0
MEDchampLire.cxx
Go to the documentation of this file.
00001 /*************************************************************************
00002 * COPYRIGHT (C) 1999 - 2002  EDF R&D
00003 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
00004 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE 
00005 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; 
00006 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
00007 *  
00008 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
00009 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
00010 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
00011 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
00012 *
00013 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
00014 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
00015 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
00016 *
00017 *************************************************************************/
00018 
00019 #include "med.hxx"
00020 #include "med_outils.hxx"
00021 
00022 #include <string.h>
00023 #include <stdlib.h>
00024 
00025  /*La taille de val allouée par l'utilisateur doit prendre en compte le nbre de points de gauss et le nbre de composantes*/
00026 
00027 namespace med_2_1{
00028 
00029 med_err 
00030 MEDchampLire(med_idt fid,char *maa, char *cha, unsigned char *val,med_mode_switch interlace,med_int numco,
00031              char *profil,med_entite_maillage type_ent, med_geometrie_element type_geo,
00032              med_int numdt, med_int numo)
00033      /* VERIFIER LA POSSIBILITE DE RELIRE L'UNITE DE PAS DE TEMPS (DS CHAMPINFO) */
00034 {
00035   med_err ret;
00036   med_idt chid, datagroup1, datagroup2;
00037   med_int ncomp, chtype, ngauss, i, locnumdt, pfluse;
00038   char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2],nomdatagroup2[2*MED_MAX_PARA+1];
00039   char tmp1[MED_TAILLE_NOM_ENTITE+1], pfltmp[MED_TAILLE_NOM+1];
00040   char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1];
00041   med_size   psize;
00042   med_int   *pfltabtmp=0;
00043   med_ssize *pfltab=0;
00044   char maatmp[MED_TAILLE_NOM+1];
00045   
00046   /*
00047    * On inhibe le gestionnaire d'erreur HDF 5
00048    */
00049   _MEDmodeErreurVerrouiller();
00050 
00051   /* 
00052    * Si le Data Group cha n'existe pas => erreur
00053    */
00054   strcpy(chemin,MED_CHA);
00055   strcat(chemin,cha);
00056   if ((chid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
00057     return -1;
00058 
00059  /* 
00060    * Si le Data Group  de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur
00061    */
00062   if ((ret = _MEDnomEntite(nomdatagroup1,type_ent)) < 0)
00063     return -1;
00064   if ((type_ent != MED_NOEUD))
00065     {
00066       if ((ret = _MEDnomGeometrie(tmp1,type_geo)) < 0)
00067         return -1;
00068       strcat(nomdatagroup1,".");
00069       strcat(nomdatagroup1,tmp1);
00070     }
00071   datagroup1 = 0;
00072   if ( (datagroup1 = _MEDdatagroupOuvrir(chid,nomdatagroup1)) < 0 )
00073     return -1;
00074 
00075   /*
00076    * Si le Data Group de niveau 2 <numdtt>.<numoo> n'existe pas => erreur
00077    */
00078   if ( numdt == MED_NOPDT) locnumdt = MED_NOPDT; else locnumdt = numdt;
00079   sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) locnumdt,MED_MAX_PARA,(long ) numo);
00080   
00081   datagroup2 = 0;   
00082   if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0)    
00083     return -1;   
00084 
00085   /* Lecture du nbre de composantes du champ */
00086 
00087   if ((ret = _MEDattrEntierLire(chid,MED_NOM_NCO,&ncomp)) < 0)
00088     return -1;
00089   
00090   /* Gestion des profils*/
00091 
00092   /*
00093    * Lire le profil demandé
00094    */
00095 
00096   if ((ret = _MEDattrStringLire(datagroup2,MED_NOM_PFL,MED_TAILLE_NOM,pfltmp)) < 0)
00097     return -1;
00098   
00099   if ( (pfluse = (strcmp(pfltmp,MED_NOPFLi) && strcmp(pfltmp,""))) ) /* le test "" pour des raisons de compatibilité */
00100     {
00101       strcpy(profil,pfltmp);
00102       if ( (i = MEDnValProfil(fid,profil)) < 0 )
00103         return -1;
00104       else
00105         psize = i;
00106 
00107       pfltabtmp = (med_int *)   malloc (sizeof(med_int)*(size_t)psize);
00108       pfltab = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)psize);
00109       if ((ret = MEDprofilLire(fid,pfltabtmp,profil)) < 0)
00110         return -1;
00111       for (i=0;i<psize;i++)
00112         pfltab[i] = (med_ssize) pfltabtmp[i];
00113        
00114     }
00115   else {
00116     psize = MED_NOPF;
00117     strcpy(profil,MED_NOPFL);
00118   }
00119   
00120   /*
00121    * Lire le nom de maillage associé au champ
00122    */
00123   if ((ret = _MEDattrStringLire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maatmp)) < 0)
00124     return -1;
00125 
00126   if (strcmp(maa,maatmp)) 
00127     return -1;
00128   
00129   /* Lit le nbre de points de Gauss  */ 
00130   /* (attribut MED_NOM_NGAU) propre au <type_ent>[.<type_geo>] pour simplifier la relecture */
00131   if ( (ret = _MEDattrEntierLire(datagroup2,MED_NOM_NGA,&ngauss)) < 0 )
00132     return -1;
00133 
00134   /*
00135    * Lecture du champ
00136    */
00137 
00138   if ((ret = _MEDattrEntierLire(chid,MED_NOM_TYP,&chtype)) < 0)
00139     return -1;
00140 
00141   switch(chtype)
00142     {
00143     case MED_REEL64 :
00144       if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_REEL64,
00145                                      interlace,ncomp,numco,
00146                                      psize,pfltab,ngauss,val))< 0)
00147         return -1;
00148       break;
00149       
00150     case MED_INT32 :
00151 #if defined(HAVE_F77INT64) 
00152      if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_INT64,
00153                                      interlace,ncomp,numco,
00154                                      psize,pfltab,ngauss,val))< 0)
00155         return -1;
00156 #else
00157      if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_INT32,
00158                                      interlace,ncomp,numco,
00159                                      psize, pfltab,ngauss,val))< 0)
00160         return -1;
00161 #endif
00162      break;
00163 
00164     case MED_INT64 :
00165 #if defined(HAVE_F77INT64) 
00166      if ((ret =  _MEDdatasetNumLire(datagroup2,MED_NOM_CO,MED_INT64,
00167                                      interlace,ncomp,numco,
00168                                      psize,pfltab,ngauss,val))< 0)
00169         return -1;
00170 #else
00171      return -1;
00172 #endif
00173       break;      
00174 
00175     default :
00176       return -1;
00177     }
00178 
00179   /*
00180    * On ferme tout 
00181    */
00182   if ( pfluse ) { free(pfltab); free(pfltabtmp);}
00183 
00184   if ((ret = _MEDdatagroupFermer(datagroup2)) < 0)
00185     return -1;
00186   if ((ret = _MEDdatagroupFermer(datagroup1)) < 0)
00187     return -1;
00188   if ((ret = _MEDdatagroupFermer(chid)) < 0)
00189     return -1;
00190     
00191   return 0;     
00192 }
00193 
00194 }