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_num(fid,3,0,8);
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_num(fid,3,0,8);
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 }