# MAJ_236_300_fieldOnEntity.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2012  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(fid);
    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(fid);
    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 }