# MAJ_236_300_fieldOnEntity.c

Aller à la documentation de ce fichier.

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