00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
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   
00097   H5Pset_copy_object( _ocp_plist_id, H5O_COPY_EXPAND_SOFT_LINK_FLAG );
00098   
00099   H5Pset_create_intermediate_group(_lcp_plist_id, -1);
00100   
00101   H5Pset_copy_object( _ocp_plist_id, H5O_COPY_SHALLOW_HIERARCHY_FLAG);
00102 
00103 
00104 
00105 
00106   for (k=1;k<=nb_geo;k++) {
00107 
00108     
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 
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 
00134 
00135 
00136 
00137 
00138         for (l=0;l<_nprofile;l++) {
00139 
00140           
00141 
00142 
00143 
00144           if (strcmp(_meshname,meshname)) {
00145 
00146             
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             
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             
00157             _fieldname[_fieldnamelen]='_';strcpy(&_fieldname[_fieldnamelen+1],_meshname);
00158 
00159             MAJ_version(fid);
00160             
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             
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 
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 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196           
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           
00228           MAJ_version(fid);
00229           
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           
00235           if (_groupexist ) { EXIT_IF( (H5Gmove(fid, _pathf, _pathi  ) < 0) ,"Switch to ",_pathi); }
00236 
00237           
00238 
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           
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 
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273 
00274 
00275 
00276 
00277 
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315         }
00316       }
00317     }
00318   } 
00319 
00320   ret = 0;
00321 
00322  ERROR:
00323   return ret;
00324 }