MAJ_236_300_fieldOnEntity.c

Aller à la documentation de ce fichier.
00001 /*  This file is part of MED.
00002  *
00003  *  COPYRIGHT (C) 1999 - 2015  EDF R&D, CEA/DEN
00004  *  MED is free software: you can redistribute it and/or modify
00005  *  it under the terms of the GNU Lesser General Public License as published by
00006  *  the Free Software Foundation, either version 3 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  MED is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU Lesser General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU Lesser General Public License
00015  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
00016  */
00017 
00018 
00019 #include "med_config.h"
00020 #include "med_outils.h"
00021 #include <string.h>
00022 
00023 #include "MAJ_236_300.h"
00024 #include "MAJ_version.h"
00025 
00026 med_err MAJ_236_300_fieldOnEntity(med_idt fid, const char * const nomcha, const char * const meshname,
00027                                   med_field_type typcha, med_int ncomp, med_entity_type entite, med_int ncstp,
00028                                   char * const _pathi, char * const _pathf) {
00029 
00030   med_err ret=-1;
00031   int i,j,k,l,m,n,nb_geo=0;
00032   med_int nbpdtnor=0,pflsize,*pflval,ngauss=0,ngroup,*vale=NULL,nval;
00033   med_int numdt=0,numo=0,_nprofile;
00034   med_int meshnumdt=0,meshnumit=0;
00035   med_float *valr=NULL,dt=0.0;
00036   unsigned char * _val=NULL;
00037   char pflname [MED_NAME_SIZE+1]="";
00038   char locname [MED_NAME_SIZE+1]="";
00039   char _meshname [MED_NAME_SIZE+1]="";
00040   char _fieldname [MED_NAME_SIZE+1]="";
00041   char _pathtmp[MED_TAILLE_CHA+3]="/CHA__/";
00042   char _pathfb[MED_TAILLE_CHA+2+MED_NAME_SIZE+1]="/CHA_/";
00043   char * lien = NULL;
00044   char dt_unit [MED_SNAME_SIZE+1]="unknown";
00045   med_bool localmesh;
00046   med_int nmesh=0;
00047   hid_t   _ocp_plist_id ;
00048   hid_t   _lcp_plist_id ;
00049   int     _isavlen=0;
00050   int     _fsavlen=0;
00051   int     _fieldnamelen=0;
00052   htri_t  _groupexist;
00053 
00054   char            _tmpmeshname[MED_NAME_SIZE+1]="";
00055   med_bool        _tmplocal=MED_FALSE;
00056   med_field_type  _tmptypcha;
00057   char           *_tmpcomp=NULL,*_tmpunit=NULL,_tmpdtunit[MED_SNAME_SIZE+1]="";
00058   med_int         _tmpncstp=0;
00059 
00060   med_geometry_type * type_geo;
00061 
00062   const char * const * AFF;
00063   const char * const * AFF_ENT=MED_GET_ENTITY_TYPENAME+1;
00064   switch (entite) {
00065   case MED_NODE :
00066     type_geo = MED_GET_NODE_GEOMETRY_TYPE;
00067     nb_geo   = MED_N_NODE_FIXED_GEO;
00068     AFF      = MED_GET_NODE_GEOMETRY_TYPENAME;
00069     break;
00070   case  MED_CELL :
00071   case  MED_NODE_ELEMENT :
00072     type_geo = MED_GET_CELL_GEOMETRY_TYPE;
00073     nb_geo   = MED_N_CELL_FIXED_GEO;
00074     AFF      = MED_GET_CELL_GEOMETRY_TYPENAME;
00075     break;
00076   case  MED_DESCENDING_FACE :
00077     type_geo = MED_GET_FACE_GEOMETRY_TYPE;
00078     nb_geo   = MED_N_FACE_FIXED_GEO;
00079     AFF      = MED_GET_FACE_GEOMETRY_TYPENAME;
00080     break;
00081   case  MED_DESCENDING_EDGE :
00082     type_geo = MED_GET_EDGE_GEOMETRY_TYPE;
00083     nb_geo   = MED_N_EDGE_FIXED_GEO;
00084     AFF      = MED_GET_EDGE_GEOMETRY_TYPENAME;
00085     break;
00086   }
00087 
00088   strcpy(_fieldname,nomcha);
00089   _isavlen=strlen(_pathi);
00090   _fsavlen=strlen(_pathf);
00091   _fieldnamelen=strlen(_fieldname);
00092 
00093   _ocp_plist_id = H5Pcreate( H5P_OBJECT_COPY );
00094   _lcp_plist_id = H5Pcreate( H5P_LINK_CREATE );
00095 
00096   /* Reconstruit les objets pointés par un lien symbolique */
00097   H5Pset_copy_object( _ocp_plist_id, H5O_COPY_EXPAND_SOFT_LINK_FLAG );
00098   /*Ne crée pas les liens intermédiaires */
00099   H5Pset_create_intermediate_group(_lcp_plist_id, -1);
00100   /* Ne recopie pas en profondeur*/
00101   H5Pset_copy_object( _ocp_plist_id, H5O_COPY_SHALLOW_HIERARCHY_FLAG);
00102 
00103 /*   ISCRUTE(nbpdtnor); */
00104 /*   SSCRUTE(_fieldname); */
00105 
00106   for (k=1;k<=nb_geo;k++) {
00107 
00108     /* Combien de (PDT,NOR) a lire */
00109     nbpdtnor = ncstp;
00110     if (nbpdtnor < 1 ) continue;
00111 
00112     for (j=0;j<nbpdtnor;j++) {
00113 
00114       if ( MEDfield23ComputingStepMeshInfo(fid,nomcha,j+1, &numdt, &numo, &dt,
00115                                            &nmesh, _meshname,&localmesh, &meshnumdt, &meshnumit ) <0) {
00116         MESSAGE("Erreur a la demande d'information sur (pdt,nor) : ");
00117         ISCRUTE(numdt); ISCRUTE(numo);ISCRUTE(nmesh);SSCRUTE(_meshname);ISCRUTE_int(localmesh);
00118         ISCRUTE(meshnumdt);ISCRUTE(meshnumit);
00119         ret = -1; continue;
00120       }
00121 /* SSCRUTE(_meshname);SSCRUTE(AFF_ENT[(int)entite]);SSCRUTE(AFF[k]);ISCRUTE(nmesh); */
00122       for (i=0;i< nmesh;++i) {
00123 
00124         if ( (_nprofile = MEDfield23nProfile(fid,nomcha,numdt,numo,entite,type_geo[k],i+1,_meshname,
00125                                                 pflname,locname   ) ) < 0 ) {
00126           MESSAGE("Erreur a la demande du nombre de profils referencés par le champ : ");
00127           SSCRUTE(nomcha); ISCRUTE(numdt); ISCRUTE(numo);SSCRUTE(_meshname);
00128           ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);SSCRUTE(pflname);SSCRUTE(locname);
00129           SSCRUTE(AFF_ENT[(int)entite]);SSCRUTE(AFF[k]);
00130           ret = -1; continue;
00131         };
00132 
00133 /* ISCRUTE(_nprofile); */
00134 /* SSCRUTE(_meshname); */
00135 /* SSCRUTE(meshname); */
00136 /* SSCRUTE(pflname); */
00137 
00138         for (l=0;l<_nprofile;l++) {
00139 
00140           /* Si le maillage traité dans ce profil n'est pas celui par défaut :
00141              - Vérifie que le nom du champ pour ce maillage secondaire existe.
00142              - Initialise _fieldname au nom du champ qu'il faut traiter par la suite
00143           */
00144           if (strcmp(_meshname,meshname)) {
00145 
00146             /* Lecture du type du champ, des noms des composantes et du nom de l'unité*/
00147             _tmpcomp = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
00148             EXIT_IF(_tmpcomp == NULL,NULL,NULL);
00149             _tmpunit = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
00150             EXIT_IF(_tmpunit == NULL,NULL,NULL);
00151 
00152             /* Evite de passer les paramètres _tmpcomp,_tmpunit,_tmpdtunit,&_tmpncstp dans la fct MAJ_236...*/
00153             ret = MEDfieldInfoByName(fid,nomcha,
00154                                      _tmpmeshname,&_tmplocal,&_tmptypcha,_tmpcomp,_tmpunit,_tmpdtunit,&_tmpncstp);
00155             MED_ERR_EXIT_IF(ret,MED_ERR_ACCESS,MED_ERR_FIELD,nomcha);
00156             /*Ne pose pas de problème de taille de chaîne car MED_NAME_SIZE a doublé en 3.0 */
00157             _fieldname[_fieldnamelen]='_';strcpy(&_fieldname[_fieldnamelen+1],_meshname);
00158 
00159             MAJ_version_num(fid,3,0,8);
00160             /*Sauvegarde du champ initial dans _pathtmp*/
00161             EXIT_IF( H5Gmove(fid, _pathi, _pathtmp  ) < 0,"Switch to ",_pathtmp);
00162             EXIT_IF( H5Gmove(fid, _pathf, _pathi  ) < 0  ,"Switch to ",_pathi);
00163             MED_ERR_EXIT_IF( MEDfieldCr(fid,_fieldname,
00164                                         _tmptypcha,ncomp,_tmpcomp,_tmpunit,_tmpdtunit,_meshname ) < 0,
00165                              MED_ERR_CREATE,MED_ERR_FIELD,_fieldname);
00166 
00167             /*Rétablissement des chemins d'accès au champ initial et au champ cible temporaire*/
00168             EXIT_IF( H5Gmove(fid, _pathi  , _pathf  ) < 0,"Switch to ",_pathf);
00169             EXIT_IF( H5Gmove(fid, _pathtmp, _pathi  ) < 0,"Switch to ",_pathi);
00170 
00171             MAJ_version_num(fid,2,3,6);
00172 
00173             free(_tmpcomp);
00174             free(_tmpunit);
00175           } else {
00176             strcpy(_fieldname,nomcha);
00177           }
00178 /* SSCRUTE(_fieldname); */
00179 
00180           if ( (nval = MEDfield23nValueWithProfile(fid, nomcha, numdt, numo,  entite, type_geo[k],_meshname,
00181                                                    l+1,  MED_COMPACT_PFLMODE, pflname,&pflsize,
00182                                                    locname, &ngauss) ) < 0 ) {
00183             MESSAGE("Erreur a la lecture du nombre de valeurs du champ : ");
00184             SSCRUTE(nomcha);ISCRUTE(numdt);ISCRUTE(numo);SSCRUTE(_meshname);
00185             ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00186             ret = -1; continue;
00187           };
00188 /* ISCRUTE(nval); */
00189 
00190 /*        printf("\n  +Pas de Temps n."IFORMAT" (%f) [%s], n. d'ordre "IFORMAT", avec "IFORMAT" valeur(s) par entité.\n",numdt,dt,dt_unit,numo,ngauss); */
00191 /*        printf("\t- Il y a "IFORMAT" entités qui portent des valeurs en mode %i. Chaque entite %s\ */
00192 /*  de type geometrique %s associes au profile |%s| a "IFORMAT" valeurs associées \n", */
00193 /*               nval,MED_COMPACT_PFLMODE,AFF_ENT[(int)entite],AFF[k],pflname,ngauss); */
00194 /*        printf("\t- Le maillage associé est |%s|\n",_meshname); */
00195 
00196           /*Lecture des valeurs du champ */
00197           if (typcha == MED_FLOAT64) {
00198 
00199             valr = (med_float*) calloc(ncomp*nval*ngauss,sizeof(med_float));
00200             EXIT_IF(valr == NULL,NULL,NULL);
00201 
00202             if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],_meshname,
00203                                              MED_COMPACT_PFLMODE, pflname, MED_NO_INTERLACE,MED_ALL_CONSTITUENT,
00204                                              (unsigned char*) valr) < 0 ) {
00205               MESSAGE("Erreur a la lecture des valeurs du champ : ");
00206               SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00207               ISCRUTE(numdt);ISCRUTE(numo);
00208               ret = -1;
00209             }
00210             _val = (unsigned char*) valr;
00211           } else {
00212 
00213             vale = (med_int*) calloc(ncomp*nval*ngauss,sizeof(med_int));
00214             EXIT_IF(vale == NULL,NULL,NULL);
00215 
00216             if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],_meshname,
00217                                              MED_COMPACT_PFLMODE, pflname, MED_NO_INTERLACE,MED_ALL_CONSTITUENT,
00218                                              (unsigned char*) vale) < 0 ) {
00219               MESSAGE("Erreur a la lecture des valeurs du champ : ");
00220               SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00221               ISCRUTE(numdt);ISCRUTE(numo);
00222               ret = -1;
00223             }
00224             _val = (unsigned char*) vale;
00225           }
00226 
00227           /* Ecriture du champ destination */
00228           MAJ_version_num(fid,3,0,8);
00229           /*Sauvegarde du champ initial dans _pathtmp*/
00230           EXIT_IF( H5Gmove(fid, _pathi, _pathtmp  ) < 0,"Switch to ",_pathtmp);
00231         
00232           _groupexist=H5Lexists( fid, _pathf, H5P_DEFAULT );
00233           EXIT_IF(!_groupexist,"Le champ devrait déjà existé",_pathf);
00234           /*Déplacement du champ cible temporaire au chemin des champs écrits par MED */
00235           if (_groupexist ) { EXIT_IF( (H5Gmove(fid, _pathf, _pathi  ) < 0) ,"Switch to ",_pathi); }
00236 
00237           /*Ecriture du champ cible au nouveau format*/
00238 /*        ISCRUTE(nval); */
00239           MED_ERR_EXIT_IF( MEDfieldValueWithProfileWr(fid, _fieldname, numdt, numo, dt, entite,type_geo[k],
00240                                                       MED_COMPACT_PFLMODE, pflname, locname, MED_NO_INTERLACE, MED_ALL_CONSTITUENT,
00241                                                       nval, _val) < 0,
00242                            MED_ERR_WRITE,MED_ERR_FIELD,_fieldname);
00243           free(_val);
00244           /*Rétablissement des chemins d'accès au champ initial et au champ cible temporaire*/
00245           EXIT_IF( H5Gmove(fid, _pathi  , _pathf  ) < 0,"Switch to ",_pathf);
00246           EXIT_IF( H5Gmove(fid, _pathtmp, _pathi  ) < 0,"Switch to ",_pathi);
00247 
00248           MAJ_version_num(fid,2,3,6);
00249 
00250 /*        if ( strlen(locname) ) */
00251 /*          printf("\t- Modèle de localisation des points de Gauss de nom |%s|\n",locname); */
00252 
00253 /*        if (entite == MED_NODE_ELEMENT) */
00254 /*          ngroup = (type_geo[k] % 100); */
00255 /*        else */
00256 /*          ngroup = ngauss; */
00257 
00258 /*        switch (MED_NO_INTERLACE) { */
00259 
00260 /*        case MED_FULL_INTERLACE : */
00261 /*          printf("\t- Valeurs :\n\t"); */
00262 /*          for (m=0;m<(nval*ngauss)/ngroup;m++) { */
00263 /*            printf("|"); */
00264 /*            for (n=0;n<ngroup*ncomp;n++) */
00265 /*              if (typcha == MED_FLOAT64) */
00266 /*                printf(" %f ",*(valr+(m*ngroup*ncomp)+n)); */
00267 /*              else */
00268 /*                printf(" "IFORMAT" ",*(vale+(m*ngroup*ncomp)+n)); */
00269 
00270 /*          } */
00271 /*          break; */
00272 
00273 /*        case MED_NO_INTERLACE : */
00274 /*          printf("\t- Valeurs :\n\t"); */
00275 /*          for (m=0;m<ncomp;m++) { */
00276 /*            printf("|"); */
00277 /*            for (n=0;n<(nval*ngauss);n++) */
00278 /*              if (typcha == MED_FLOAT64) */
00279 /*                printf(" %f ",*(valr+(m*nval)+n)); */
00280 /*              else */
00281 /*                printf(" "IFORMAT" ",*(vale+(m*nval)+n)); */
00282 /*          } */
00283 /*          break; */
00284 /*        } */
00285 
00286 /*        printf("|\n"); */
00287 /*        if (typcha == MED_FLOAT64) { */
00288 /*          if ( valr ) {free(valr);valr = NULL;}} */
00289 /*        else */
00290 /*          if (vale) { free(vale);vale = NULL; } */
00291 
00292 /*        if (strcmp(pflname,MED_NO_PROFILE) == 0 ) */
00293 /*          printf("\t- Profil : MED_NO_PROFILE\n"); */
00294 /*        else { */
00295 /*          if ( (pflsize = MEDprofileSizeByName(fid,pflname)) <0 )  { */
00296 /*            MESSAGE("Erreur a la lecture du nombre de valeurs du profil : "); */
00297 /*            SSCRUTE(pflname); */
00298 /*            ret = -1; continue; */
00299 /*          } */
00300 
00301 /*          printf("\t- Profil : |%s| de taille "IFORMAT"\n",pflname,pflsize); */
00302 
00303 /*          pflval = (med_int*) malloc(sizeof(med_int)*pflsize); */
00304 /*          EXIT_IF(pflval == NULL,NULL,NULL); */
00305 /*          if ( MEDprofileRd(fid,pflname,pflval) <0) { */
00306 /*            MESSAGE("Erreur a la lecture des valeurs du profil : "); */
00307 /*            SSCRUTE(pflname); */
00308 /*            ret = -1; */
00309 /*          } */
00310 /*          printf("\t"); */
00311 /*          for (m=0;m<pflsize;m++) printf(" "IFORMAT" ",*(pflval+m)); */
00312 /*          printf("\n"); */
00313 /*          free(pflval); */
00314 /*        } */
00315         }
00316       }
00317     }
00318   } /* fin for sur les mailles*/
00319 
00320   ret = 0;
00321 
00322  ERROR:
00323   return ret;
00324 }

Généré le Thu Oct 8 14:26:16 2015 pour MED fichier par  doxygen 1.6.1