Back to index

salome-med  6.5.0
MEDMEM_MEDMEMchampLire.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 #include "MEDMEM_MEDMEMchampLire.hxx"
00024 /*
00025  * En attendant une correction de la gestion du mode d'accès au fichier dans MEDfichier
00026  * on intègre la correction ici.
00027  */
00028 
00029 namespace med_2_3 {
00030   extern "C" {
00031 
00032 # define ICI                    {                                       \
00033       fflush(stdout);                                                   \
00034       fprintf(stderr, "%s [%d] : " , __FILE__ , __LINE__ ) ;            \
00035       fflush(stderr) ;                                                  \
00036     }
00037 
00038 # define ISCRUTE_MED(entier)        {                                   \
00039       ICI ;                                                             \
00040       fprintf(stderr,"%s = %d\n",#entier,entier) ;                      \
00041       fflush(stderr) ;                                                  \
00042     }
00043 
00044 # define SSCRUTE_MED(chaine)        {                                   \
00045       ICI ;                                                             \
00046       fprintf(stderr,"%s = \"%s\"\n",#chaine,chaine) ;                  \
00047       fflush(stderr) ;                                                  \
00048     }
00049 # define MESSAGE_MED(chaine)        {                                   \
00050       ICI ;                                                             \
00051       fprintf(stderr,"%s\n",chaine) ;                                   \
00052       fflush(stderr) ;                                                  \
00053     }
00054 
00055     extern void _MEDmodeErreurVerrouiller(void);
00056 
00057 #include <med.h>
00058 #include <med_outils.h>
00059 
00060 #include <string.h>
00061 #include <stdlib.h>
00062 
00063     /*
00064      * - Nom de la fonction : MEDchampLire
00065      * - Description : Lecture d'un Champ Résultat
00066      * - Parametres :
00067      *     - fid      (IN)  : ID du fichier HDF courant
00068      *     - maa      (IN)  : le nom du maillage sur lequel s'applique le champ
00069      *     - cha      (IN)  : le nom du champ
00070      *     - val      (OUT) : valeurs du champ à lire
00071      *     - interlace(IN)  : entrelacement voulu en mémoire {MED_FULL_INTERLACE,MED_NO_INTERLACE}
00072      *     - numco    (IN)  : n° de la composante à lire (MED_ALL si toutes)
00073      *     - profil   (OUT) : nom du profil utilisé (MED_NOPFL si inutilisé)
00074      *     - pflmod   (IN)  : Indique comment lire les informations en mémoire { MED_COMPACT, MED_GLOBALE }.
00075      *     - type_ent (IN)  : entité concerné par le champ {MED_NOEUD,MED_ARETE,MED_FACE,MED_MAILLE}
00076      *     - type_geo (IN)  : type géométrique de l'entité concerné {MED_POINT,MED_SEG2 ......}
00077      *     - numdt    (IN)  : n° du pas de temps (MED_NOPDT si aucun)
00078      *     - numo     (IN)  : n° d'ordre utilisé MED_NONOR si inutile
00079      * - Resultat : 0 en cas de succes, -1 sinon
00080      */
00081 
00082     /* 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*/
00083 
00084     med_err
00085     MEDMEMchampLire(med_idt fid,char *maa, char *cha, unsigned char *val,med_mode_switch interlace,med_int numco,
00086                  char * locname, char *profil, med_mode_profil pflmod,
00087                  med_entite_maillage type_ent, med_geometrie_element type_geo,
00088                  med_int numdt, med_int numo)
00089 
00090     {
00091       med_err ret=-1;
00092       med_idt gid=0, datagroup1=0, datagroup2=0,datagroup3=0;
00093       med_int ncomp=0, chtype=0, ngauss=0, i=0, pfluse=0;
00094       char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="",nomdatagroup2[2*MED_MAX_PARA+1]="";
00095       char tmp1[MED_TAILLE_NOM_ENTITE+1]="", pfltmp[MED_TAILLE_NOM+1]="";
00096       char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1]="";
00097       med_size   psize=0;
00098       med_int   *pfltabtmp=0;
00099       med_ssize *pfltab=0;
00100 
00101       /*
00102        * On inhibe le gestionnaire d'erreur HDF 5
00103        */
00104       _MEDmodeErreurVerrouiller();
00105 
00106       /*
00107        * Si le Data Group cha n'existe pas => erreur
00108        */
00109       strcpy(chemin,MED_CHA);
00110       strcat(chemin,cha);
00111       if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
00112         goto ERROR;
00113 
00114       /* Lecture du nbre de composantes du champ */
00115 
00116       if (_MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp) < 0)
00117         goto ERROR;
00118 
00119       /*
00120        * Si le Data Group  de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur
00121        */
00122       if (_MEDnomEntite(nomdatagroup1,type_ent) < 0)
00123         goto ERROR;
00124       if ((type_ent != MED_NOEUD))
00125         {
00126           if (_MEDnomGeometrie(tmp1,type_geo) < 0)
00127             goto ERROR;
00128           strcat(nomdatagroup1,".");
00129           strcat(nomdatagroup1,tmp1);
00130         }
00131       datagroup1 = 0;
00132       if ( (datagroup1 = _MEDdatagroupOuvrir(gid,nomdatagroup1)) < 0 )
00133         goto ERROR;
00134 
00135       /*
00136        * Si le Data Group de niveau 2 <numdt>.<numoo> n'existe pas => erreur
00137        */
00138       sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) numdt,MED_MAX_PARA,(long ) numo);
00139 
00140       datagroup2 = 0;
00141       if ( (datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) < 0)
00142         goto ERROR;
00143 
00144       /*
00145        * Ouvre le datagroup de niveau 3 <maa>
00146        */
00147 
00148       if ( ! strcmp(maa,MED_NOREF) )
00149         if (_MEDattrStringLire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maa) < 0)
00150           goto ERROR;
00151 
00152       datagroup3 = 0;
00153       if ( (datagroup3 = _MEDdatagroupOuvrir(datagroup2,maa)) < 0 )
00154         goto ERROR;
00155 
00156       /* Gestion des profils*/
00157 
00158       /*
00159        * Lire le profil
00160        */
00161 
00162       if (_MEDattrStringLire(datagroup3,MED_NOM_PFL,MED_TAILLE_NOM,pfltmp) < 0)
00163         goto ERROR;
00164 
00165       if ( pfluse = (strcmp(pfltmp,MED_NOPFLi) && strcmp(pfltmp,"")) ) /* le test MED_NOPFLi pour des raisons de compatibilité */
00166         {
00167           strcpy(profil,pfltmp);
00168           if ( (i = MEDnValProfil(fid,profil)) < 0 )
00169             goto ERROR;
00170           else
00171             psize = i;
00172 
00173           pfltabtmp = (med_int *)   malloc (sizeof(med_int)*psize);
00174           pfltab = (med_ssize *) malloc (sizeof(med_ssize)*psize);
00175           if (MEDprofilLire(fid,pfltabtmp,profil) < 0)
00176             goto ERROR;
00177           for (i=0;i<psize;i++)
00178             pfltab[i] = (med_ssize) pfltabtmp[i];
00179 
00180         }
00181       else {
00182         psize = MED_NOPF;
00183         strcpy(profil,MED_NOPFL);
00184       }
00185 
00186 
00187       /* Lire le nbre des points de GAUSS*/
00188       if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,&ngauss) < 0) {
00189         MESSAGE_MED("Erreur à la lecture de l'attribut MED_NOM_NGA : ");
00190         ISCRUTE_MED(ngauss);goto ERROR;
00191       };
00192 
00193       /* Lire l'identificateur de localisation des points de GAUSS*/
00194       if ( _MEDattrStringLire(datagroup3,MED_NOM_GAU,MED_TAILLE_NOM,locname) < 0) {
00195         MESSAGE_MED("Erreur à la lecture de l'attribut MED_NOM_GAU : ");
00196         SSCRUTE_MED(locname); goto ERROR;
00197       }
00198 
00199       /*
00200        * Lecture du champ
00201        */
00202 
00203       if (_MEDattrEntierLire(gid,MED_NOM_TYP,&chtype) < 0)
00204         goto ERROR;
00205 
00206       switch(chtype)
00207         {
00208         case MED_FLOAT64 :
00209           if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_FLOAT64,
00210                                   interlace,ncomp,numco,
00211                                   psize,pflmod,pfltab,ngauss,val)< 0)
00212             goto ERROR;
00213           break;
00214 
00215         case MED_INT32 :
00216 #if defined(F77INT64)
00217           if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
00218                                   interlace,ncomp,numco,
00219                                   psize,pflmod,pfltab,ngauss,val)< 0)
00220             goto ERROR;
00221 #else
00222           if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT32,
00223                                   interlace,ncomp,numco,
00224                                   psize,pflmod,pfltab,ngauss,val)< 0)
00225             goto ERROR;
00226 #endif
00227           break;
00228 
00229         case MED_INT64 :
00230 #if defined(F77INT64)
00231           if ( _MEDdatasetNumLire(datagroup3,MED_NOM_CO,MED_INT64,
00232                                   interlace,ncomp,numco,
00233                                   psize,pflmod,pfltab,ngauss,val)< 0)
00234             goto ERROR;
00235 #else
00236           goto ERROR;
00237 #endif
00238           break;
00239 
00240         default :
00241           goto ERROR;
00242         }
00243 
00244       /*
00245        * On ferme tout
00246        */
00247 
00248       ret = 0;
00249 
00250     ERROR:
00251 
00252       if ( pfluse ) { free(pfltab); free(pfltabtmp);}
00253 
00254       if (datagroup3>0)     if (_MEDdatagroupFermer(datagroup3) < 0) {
00255         MESSAGE_MED("Impossible de fermer le datagroup : ");
00256         ISCRUTE_MED(datagroup3); ret = -1;
00257       }
00258 
00259       if (datagroup2>0)     if (_MEDdatagroupFermer(datagroup2) < 0) {
00260         MESSAGE_MED("Impossible de fermer le datagroup : ");
00261         ISCRUTE_MED(datagroup2); ret = -1;
00262       }
00263 
00264       if (datagroup1>0)     if (_MEDdatagroupFermer(datagroup1) < 0) {
00265         MESSAGE_MED("Impossible de fermer le datagroup : ");
00266         ISCRUTE_MED(datagroup1); ret = -1;
00267       }
00268 
00269       if (gid>0)     if (_MEDdatagroupFermer(gid) < 0) {
00270         MESSAGE_MED("Impossible de fermer le datagroup : ");
00271         ISCRUTE_MED(gid); ret = -1;
00272       }
00273 
00274       return ret;
00275     }
00276 
00277 
00278 #undef MESSAGE_MED
00279 #undef SSCRUTE_MED
00280 #undef ISCRUTE_MED
00281 
00282   }
00283 }
00284 
00285