00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <med.h>
00020 #include <med_config.h>
00021 #include <med_outils.h>
00022 #include <string.h>
00023 #include <stdlib.h>
00024
00039 med_err
00040 MEDmeshComputationStepCr(const med_idt fid,
00041 const char * const meshname,
00042 const med_int numdt1,
00043 const med_int numit1,
00044 const med_int numdt2,
00045 const med_int numit2,
00046 const med_float dt2 )
00047 {
00048
00049 med_access_mode _MED_ACCESS_MODE;
00050 med_err _ret=-1;
00051 med_idt _meshid=0,_datagroup1=0,_datagroup2=0,_datagroup3=0;
00052 char _meshpath [MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1]="";
00053 char _datagroupname [2*MED_MAX_PARA+1]="";
00054 char _datagroupname2[2*MED_MAX_PARA+1]="";
00055 char _datagroupname1bis[2*MED_MAX_PARA+1]="";
00056 char _latestcpstname[2*MED_MAX_PARA+1]="";
00057 char* _datagroupname1=_datagroupname;
00058 char _datagroupname3[2*MED_MAX_PARA+1]="";
00059 char _prevcpstname[2*MED_MAX_PARA+1]="";
00060 char _pathsrc[MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1+2*MED_MAX_PARA+1+1]="";
00061 char _pathdst[MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1+2*MED_MAX_PARA+1+1]="";
00062 med_bool _datagroup1exist = MED_TRUE;
00063 med_bool _isasupportmesh = MED_FALSE;
00064 med_int _nextdt=MED_NO_DT, _nextit=MED_NO_IT,_pvdt=MED_NO_DT, _pvit=MED_NO_IT;
00065 med_int _lastnumdt=MED_NO_DT, _lastnumit=MED_NO_IT;
00066 med_int _numdt1=numdt1,_numit1=numit1;
00067 med_int _false = 0;
00068 med_sorting_type _sortingtype;
00069 med_int _intsortingtype;
00070
00071
00072
00073 _MEDmodeErreurVerrouiller();
00074 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
00075
00076 if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
00077 MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
00078 goto ERROR;
00079 }
00080
00081 if ( _MED_ACCESS_MODE == MED_ACC_RDONLY) {
00082 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
00083 ISCRUTE_int(_MED_ACCESS_MODE);
00084 goto ERROR;
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
00096 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00097 SSCRUTE(_meshpath); goto ERROR;
00098 }
00099 strcat( _pathsrc , _meshpath);strcat( _pathsrc , "/");
00100 strcat( _pathdst , _meshpath);strcat( _pathdst , "/");
00101
00102 if ( _MEDattrEntierLire(_meshid,MED_NOM_NXT,&_lastnumdt) < 0) {
00103
00104
00105
00106 _lastnumdt = MED_NO_DT;
00107 }
00108
00109 if ( _MEDattrEntierLire(_meshid,MED_NOM_NXI,&_lastnumit) < 0) {
00110
00111
00112
00113 _lastnumit = MED_NO_IT;
00114 }
00115
00116 if ( _MEDattrEntierLire(_meshid,MED_NOM_SRT,&_intsortingtype) < 0) {
00117 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00118 SSCRUTE(meshname);SSCRUTE(MED_NOM_SRT);
00119 ISCRUTE(_intsortingtype);goto ERROR;
00120 }
00121 _sortingtype = (med_sorting_type) (_intsortingtype);
00122
00123 _MEDgetComputationStepName(_sortingtype,numdt1,numit1,_datagroupname);
00124 _MEDgetComputationStepName(_sortingtype,numdt2,numit2,_datagroupname2);
00125 _MEDgetComputationStepName(_sortingtype,_lastnumdt,_lastnumit,_latestcpstname);
00126
00127 if ( (numdt1 == numdt2) && (numit1 == numit2) ) {
00128 _numdt1 = _lastnumdt;
00129 _numit1 = _lastnumit;
00130 _datagroupname1 = _latestcpstname;
00131 }
00132
00133
00134 if ( strncmp(_datagroupname2,_datagroupname1,2*MED_MAX_PARA+2) < 0) {
00135 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_COMPUTINGSTEP,_datagroupname2);
00136 SSCRUTE(meshname);SSCRUTE(_datagroupname1);goto ERROR;
00137 }
00138
00139 strcat( _pathsrc , _datagroupname1 );strcat( _pathsrc , "/");
00140 strcat( _pathdst , _datagroupname2 );strcat( _pathdst , "/");
00141
00142 if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
00143 if ( (numdt2 != MED_NO_DT ) || (numit2 != MED_NO_IT) ) {
00144 MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_COMPUTINGSTEP,_datagroupname1);
00145 SSCRUTE(meshname);goto ERROR;
00146 }
00147 }
00148
00149
00150 if ( (_datagroup2 = _MEDdatagroupOuvrir(_meshid,_datagroupname2)) >= 0 ) {
00151 MED_ERR_(_ret,MED_ERR_EXIST,MED_ERR_COMPUTINGSTEP,_datagroupname2);
00152 SSCRUTE(meshname);goto ERROR;
00153 }
00154
00155
00156 if ( _datagroup1 > 0 ) {
00157
00158
00159
00160 if ( _MEDattrEntierLire(_datagroup1,MED_NOM_NXT,&_nextdt) < 0) {
00161 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00162 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXT);
00163 goto ERROR;
00164 }
00165
00166 if ( _MEDattrEntierLire(_datagroup1,MED_NOM_NXI,&_nextit) < 0) {
00167 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00168 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXI);
00169 goto ERROR;
00170 }
00171
00172
00173
00174 if ( (_nextdt != MED_NO_DT) && (_nextit != MED_NO_IT) ) {
00175 _MEDgetComputationStepName(_sortingtype,_nextdt,_nextit,_datagroupname3);
00176
00177 if ( strncmp(_datagroupname3,_datagroupname2,2*MED_MAX_PARA+2) <= 0) {
00178 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_COMPUTINGSTEP,_datagroupname2);
00179 SSCRUTE(meshname);SSCRUTE(_datagroupname3);goto ERROR;
00180 }
00181 }
00182
00183
00184 if ((_datagroup2 = _MEDdatagroupCreer(_meshid,_datagroupname2)) < 0 ) {
00185 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,_datagroupname2);
00186 SSCRUTE(meshname);goto ERROR;
00187 }
00188
00189
00190
00191 if ( _MEDvisit(fid,_pathsrc,_pathdst,(medvisitorfunc) _MEDlinkobjs ) < 0 ) {
00192 MED_ERR_(_ret,MED_ERR_VISIT,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00193 SSCRUTE(meshname);SSCRUTE(_pathsrc);SSCRUTE(_pathdst);
00194 goto ERROR;
00195 }
00196
00197
00198 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXT,&_nextdt) < 0) {
00199 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00200 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXT);
00201 goto ERROR;
00202 }
00203
00204 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXI,&_nextit) < 0) {
00205 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00206 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXI);
00207 goto ERROR;
00208 }
00209
00210
00211 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVT,&_numdt1) < 0) {
00212 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00213 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVT);
00214 goto ERROR;
00215 }
00216
00217 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVI,&_numit1) < 0) {
00218 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00219 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVI);
00220 goto ERROR;
00221 }
00222
00223
00224
00225 if ( _MEDattributeIntWr(_datagroup1,MED_NOM_NXT,&numdt2) < 0) {
00226 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00227 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXT);
00228 goto ERROR;
00229 }
00230
00231 if ( _MEDattributeIntWr(_datagroup1,MED_NOM_NXI,&numit2) < 0) {
00232 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00233 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXI);
00234 goto ERROR;
00235 }
00236
00237
00238 if (strlen(_datagroupname3) ) {
00239
00240 if ( (_datagroup3 = _MEDdatagroupOuvrir(_meshid,_datagroupname3)) < 0 ) {
00241 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_COMPUTINGSTEP,_datagroupname3);
00242 SSCRUTE(meshname);goto ERROR;
00243 }
00244
00245 if ( _MEDattrEntierLire(_datagroup3,MED_NOM_PVT,&_pvdt) < 0) {
00246 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00247 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVT);
00248 goto ERROR;
00249 }
00250
00251 if ( _MEDattrEntierLire(_datagroup3,MED_NOM_PVI,&_pvit) < 0) {
00252 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00253 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVI);
00254 goto ERROR;
00255 }
00256 _MEDgetComputationStepName(_sortingtype,_pvdt,_pvit,_datagroupname1bis);
00257
00258 if ( strncmp(_datagroupname1,_datagroupname1bis,2*MED_MAX_PARA+2) != 0) {
00259 MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_COMPUTINGSTEP,_datagroupname1);
00260 SSCRUTE(meshname);SSCRUTE(_datagroupname1bis);goto ERROR;
00261 }
00262
00263 if ( _MEDattributeIntWr(_datagroup3,MED_NOM_PVT,&numdt2) < 0) {
00264 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00265 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVT);
00266 goto ERROR;
00267 }
00268
00269 if ( _MEDattributeIntWr(_datagroup3,MED_NOM_PVI,&numit2) < 0) {
00270 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00271 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVI);
00272 goto ERROR;
00273 }
00274
00275 }
00276
00277 } else {
00278
00279
00280 if ((_datagroup2 = _MEDdatagroupCreer(_meshid,_datagroupname2)) < 0 ) {
00281 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,_datagroupname2);
00282 SSCRUTE(meshname);goto ERROR;
00283 }
00284
00285
00286
00287 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXT,&numdt2) < 0) {
00288 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00289 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXT);
00290 goto ERROR;
00291 }
00292
00293 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXI,&numit2) < 0) {
00294 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00295 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXI);
00296 goto ERROR;
00297 }
00298
00299 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVT,&numdt2) < 0) {
00300 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00301 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVT);
00302 goto ERROR;
00303 }
00304
00305 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVI,&numit2) < 0) {
00306 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00307 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVI);
00308 goto ERROR;
00309 }
00310
00311 }
00312
00313
00314 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NDT,&numdt2) < 0) {
00315 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00316 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NDT);
00317 ISCRUTE(numdt2);goto ERROR;
00318 }
00319
00320
00321 if ( _MEDattrFloatEcrire(_datagroup2,MED_NOM_PDT,&dt2) < 0) {
00322 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00323 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PDT);
00324 RSCRUTE(dt2);goto ERROR;
00325 }
00326
00327
00328 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NOR,&numit2) < 0) {
00329 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00330 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NOR);
00331 ISCRUTE(numit2); goto ERROR;
00332 }
00333
00334 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_CGT,&_false) < 0) {
00335 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00336 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);
00337 goto ERROR;
00338 }
00339
00340
00341
00342 if ( strncmp(_datagroupname2,_latestcpstname,2*MED_MAX_PARA+2) >= 0) {
00343
00344 if ( _MEDattributeIntWr(_meshid,MED_NOM_NXT,&numdt2) < 0) {
00345 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00346 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXT);
00347 goto ERROR;
00348 }
00349
00350 if ( _MEDattributeIntWr(_meshid,MED_NOM_NXI,&numit2) < 0) {
00351 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00352 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXI);
00353 goto ERROR;
00354 }
00355 }
00356
00357 _ret = 0;
00358 ERROR:
00359
00360 if (_datagroup3>0) if (_MEDdatagroupFermer(_datagroup3) < 0) {
00361 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname3);
00362 ISCRUTE_id(_datagroup3);
00363 }
00364
00365 if (_datagroup2>0) if (_MEDdatagroupFermer(_datagroup2) < 0) {
00366 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
00367 ISCRUTE_id(_datagroup2);
00368 }
00369
00370 if (_datagroup1>0) if (_MEDdatagroupFermer(_datagroup1) < 0) {
00371 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname1);
00372 ISCRUTE_id(_datagroup1);
00373 }
00374
00375 if (_meshid>0) if (_MEDdatagroupFermer(_meshid) < 0) {
00376 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
00377 ISCRUTE_id(_meshid);
00378 }
00379
00380 return _ret;
00381 }