00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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 med_geometry_type * type_geo;
00059
00060 const char * const * AFF;
00061 const char * const * AFF_ENT=MED_GET_ENTITY_TYPENAME+1;
00062 switch (entite) {
00063 case MED_NODE :
00064 type_geo = MED_GET_NODE_GEOMETRY_TYPE;
00065 nb_geo = MED_N_NODE_FIXED_GEO;
00066 AFF = MED_GET_NODE_GEOMETRY_TYPENAME;
00067 break;
00068 case MED_CELL :
00069 case MED_NODE_ELEMENT :
00070 type_geo = MED_GET_CELL_GEOMETRY_TYPE;
00071 nb_geo = MED_N_CELL_FIXED_GEO;
00072 AFF = MED_GET_CELL_GEOMETRY_TYPENAME;
00073 break;
00074 case MED_DESCENDING_FACE :
00075 type_geo = MED_GET_FACE_GEOMETRY_TYPE;
00076 nb_geo = MED_N_FACE_FIXED_GEO;
00077 AFF = MED_GET_FACE_GEOMETRY_TYPENAME;
00078 break;
00079 case MED_DESCENDING_EDGE :
00080 type_geo = MED_GET_EDGE_GEOMETRY_TYPE;
00081 nb_geo = MED_N_EDGE_FIXED_GEO;
00082 AFF = MED_GET_EDGE_GEOMETRY_TYPENAME;
00083 break;
00084 }
00085
00086 strcpy(_fieldname,nomcha);
00087 _isavlen=strlen(_pathi);
00088 _fsavlen=strlen(_pathf);
00089 _fieldnamelen=strlen(_fieldname);
00090
00091 _ocp_plist_id = H5Pcreate( H5P_OBJECT_COPY );
00092 _lcp_plist_id = H5Pcreate( H5P_LINK_CREATE );
00093
00094
00095 H5Pset_copy_object( _ocp_plist_id, H5O_COPY_EXPAND_SOFT_LINK_FLAG );
00096
00097 H5Pset_create_intermediate_group(_lcp_plist_id, -1);
00098
00099 H5Pset_copy_object( _ocp_plist_id, H5O_COPY_SHALLOW_HIERARCHY_FLAG);
00100
00101
00102
00103
00104 for (k=1;k<=nb_geo;k++) {
00105
00106
00107 nbpdtnor = ncstp;
00108 if (nbpdtnor < 1 ) continue;
00109
00110 for (j=0;j<nbpdtnor;j++) {
00111
00112 if ( MEDfield23ComputingStepMeshInfo(fid,nomcha,j+1, &numdt, &numo, &dt,
00113 &nmesh, _meshname,&localmesh, &meshnumdt, &meshnumit ) <0) {
00114 MESSAGE("Erreur a la demande d'information sur (pdt,nor) : ");
00115 ISCRUTE(numdt); ISCRUTE(numo);ISCRUTE(nmesh);SSCRUTE(_meshname);ISCRUTE_int(localmesh);
00116 ISCRUTE(meshnumdt);ISCRUTE(meshnumit);
00117 ret = -1; continue;
00118 }
00119
00120 for (i=0;i< nmesh;++i) {
00121
00122 if ( (_nbofprofile = MEDfield23nProfile(fid,nomcha,numdt,numo,entite,type_geo[k],i+1,_meshname,
00123 pflname,locname ) ) < 0 ) {
00124 MESSAGE("Erreur a la demande du nombre de profils referencés par le champ : ");
00125 SSCRUTE(nomcha); ISCRUTE(numdt); ISCRUTE(numo);SSCRUTE(_meshname);
00126 ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);SSCRUTE(pflname);SSCRUTE(locname);
00127 SSCRUTE(AFF_ENT[(int)entite]);SSCRUTE(AFF[k]);
00128 ret = -1; continue;
00129 };
00130
00131
00132
00133
00134
00135 for (l=0;l<_nbofprofile;l++) {
00136
00137 if (strcmp(_meshname,meshname) ) {
00138 _fieldname[_fieldnamelen]='_';strcpy(&_fieldname[_fieldnamelen+1],_meshname);
00139 strcpy(&_pathfb[_fsavlen],nomcha);
00140 strcpy(&_pathf[_fsavlen],_fieldname);
00141
00142
00143 _groupexist=H5Lexists(fid, _pathf, H5P_DEFAULT );
00144 if (! _groupexist ) {
00145 if ( H5Ocopy(fid,_pathfb,fid,_pathf,_ocp_plist_id,_lcp_plist_id) < 0 ) {
00146 MED_ERR_(ret,MED_ERR_COPY,MED_ERR_DATAGROUP,_pathf);
00147 H5Eprint(stderr);
00148 goto ERROR;
00149 }
00150
00151 H5Adelete_by_name( fid, _pathf, MED_NOM_MAI, H5P_DEFAULT );
00152 if ( _MEDattributeStringWrByName(fid,_pathf,MED_NOM_MAI,MED_NAME_SIZE,_meshname) < 0) {
00153 MED_ERR_(ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_NOM_MAI);
00154 SSCRUTE(_meshname);
00155 goto ERROR;
00156 }
00157 }
00158 _pathfb[_fsavlen]='\0';
00159 _pathf[_fsavlen]='\0';
00160 } else {
00161 strcpy(_fieldname,nomcha);
00162 }
00163
00164
00165 if ( (nval = MEDfield23nValueWithProfile(fid, nomcha, numdt, numo, entite, type_geo[k],_meshname,
00166 l+1, MED_COMPACT_PFLMODE, pflname,&pflsize,
00167 locname, &ngauss) ) < 0 ) {
00168 MESSAGE("Erreur a la lecture du nombre de valeurs du champ : ");
00169 SSCRUTE(nomcha);ISCRUTE(numdt);ISCRUTE(numo);SSCRUTE(_meshname);
00170 ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00171 ret = -1; continue;
00172 };
00173
00174
00175
00176
00177
00178
00179
00180
00181 if (typcha == MED_FLOAT64) {
00182
00183 valr = (med_float*) calloc(ncomp*nval*ngauss,sizeof(med_float));
00184 EXIT_IF(valr == NULL,NULL,NULL);
00185
00186 if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],_meshname,
00187 MED_COMPACT_PFLMODE, pflname, MED_NO_INTERLACE,MED_ALL_CONSTITUENT,
00188 (unsigned char*) valr) < 0 ) {
00189 MESSAGE("Erreur a la lecture des valeurs du champ : ");
00190 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00191 ISCRUTE(numdt);ISCRUTE(numo);
00192 ret = -1;
00193 }
00194 _val = (unsigned char*) valr;
00195 } else {
00196
00197 vale = (med_int*) calloc(ncomp*nval*ngauss,sizeof(med_int));
00198 EXIT_IF(vale == NULL,NULL,NULL);
00199
00200 if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],_meshname,
00201 MED_COMPACT_PFLMODE, pflname, MED_NO_INTERLACE,MED_ALL_CONSTITUENT,
00202 (unsigned char*) vale) < 0 ) {
00203 MESSAGE("Erreur a la lecture des valeurs du champ : ");
00204 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
00205 ISCRUTE(numdt);ISCRUTE(numo);
00206 ret = -1;
00207 }
00208 _val = (unsigned char*) vale;
00209 }
00210
00211
00212 MAJ_version(fid);
00213
00214 EXIT_IF( H5Gmove(fid, _pathi, _pathtmp ) < 0,"Switch to ",_pathtmp);
00215
00216 _groupexist=H5Lexists( fid, _pathf, H5P_DEFAULT );
00217 EXIT_IF(!_groupexist,"Le champ devrait déjà existé",_pathf)
00218 if (_groupexist ) { EXIT_IF( (H5Gmove(fid, _pathf, _pathi ) < 0) ,"Switch to ",_pathi); }
00219
00220 MED_ERR_EXIT_IF( MEDfieldValueWithProfileWr(fid, _fieldname, numdt, numo, dt, entite,type_geo[k],
00221 MED_COMPACT_PFLMODE, pflname, locname, MED_NO_INTERLACE, MED_ALL_CONSTITUENT,
00222 nval, _val) < 0,
00223 MED_ERR_WRITE,MED_ERR_FIELD,_fieldname);
00224 EXIT_IF( H5Gmove(fid, _pathi , _pathf ) < 0,"Switch to ",_pathf);
00225 EXIT_IF( H5Gmove(fid, _pathtmp, _pathi ) < 0,"Switch to ",_pathi);
00226
00227 MAJ_version_num(fid,2,3,6);
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
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 ret = 0;
00300
00301 ERROR:
00302 return ret;
00303 }