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
00128
00129
00130
00131
00132
00133 if ( (numdt1 == numdt2) && (numit1 == numit2) ) {
00134 _numdt1 = _lastnumdt;
00135 _numit1 = _lastnumit;
00136 _datagroupname1 = _latestcpstname;
00137 }
00138
00139
00140
00141 if ( strncmp(_datagroupname2,_datagroupname1,2*MED_MAX_PARA+2) < 0) {
00142 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_COMPUTINGSTEP,_datagroupname2);
00143 SSCRUTE(meshname);SSCRUTE(_datagroupname1);goto ERROR;
00144 }
00145
00146 strcat( _pathsrc , _datagroupname1 );strcat( _pathsrc , "/");
00147 strcat( _pathdst , _datagroupname2 );strcat( _pathdst , "/");
00148
00149
00150
00151 if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
00152 if ( (numdt2 != MED_NO_DT ) || (numit2 != MED_NO_IT) ) {
00153 MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_COMPUTINGSTEP,_datagroupname1);
00154 SSCRUTE(meshname);goto ERROR;
00155 }
00156 }
00157
00158
00159 if ( (_datagroup2 = _MEDdatagroupOuvrir(_meshid,_datagroupname2)) >= 0 ) {
00160 MED_ERR_(_ret,MED_ERR_EXIST,MED_ERR_COMPUTINGSTEP,_datagroupname2);
00161 SSCRUTE(meshname);goto ERROR;
00162 }
00163
00164
00165 if ( _datagroup1 > 0 ) {
00166
00167
00168
00169 if ( _MEDattrEntierLire(_datagroup1,MED_NOM_NXT,&_nextdt) < 0) {
00170 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00171 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXT);
00172 goto ERROR;
00173 }
00174
00175 if ( _MEDattrEntierLire(_datagroup1,MED_NOM_NXI,&_nextit) < 0) {
00176 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00177 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXI);
00178 goto ERROR;
00179 }
00180
00181
00182
00183
00184 if ( (_nextdt != MED_NO_DT) || (_nextit != MED_NO_IT) ) {
00185 _MEDgetComputationStepName(_sortingtype,_nextdt,_nextit,_datagroupname3);
00186
00187 if ( strncmp(_datagroupname3,_datagroupname2,2*MED_MAX_PARA+2) <= 0) {
00188 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_COMPUTINGSTEP,_datagroupname2);
00189 SSCRUTE(meshname);SSCRUTE(_datagroupname3);goto ERROR;
00190 }
00191 }
00192
00193
00194 if ((_datagroup2 = _MEDdatagroupCreer(_meshid,_datagroupname2)) < 0 ) {
00195 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,_datagroupname2);
00196 SSCRUTE(meshname);goto ERROR;
00197 }
00198
00199
00200
00201 if ( _MEDvisit(fid,_pathsrc,_pathdst,(medvisitorfunc) _MEDlinkobjs ) < 0 ) {
00202 MED_ERR_(_ret,MED_ERR_VISIT,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00203 SSCRUTE(meshname);SSCRUTE(_pathsrc);SSCRUTE(_pathdst);
00204 goto ERROR;
00205 }
00206
00207
00208 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXT,&_nextdt) < 0) {
00209 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00210 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXT);
00211 goto ERROR;
00212 }
00213
00214 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXI,&_nextit) < 0) {
00215 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00216 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXI);
00217 goto ERROR;
00218 }
00219
00220
00221 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVT,&_numdt1) < 0) {
00222 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00223 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVT);
00224 goto ERROR;
00225 }
00226
00227 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVI,&_numit1) < 0) {
00228 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00229 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVI);
00230 goto ERROR;
00231 }
00232
00233
00234
00235 if ( _MEDattributeIntWr(_datagroup1,MED_NOM_NXT,&numdt2) < 0) {
00236 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00237 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXT);
00238 goto ERROR;
00239 }
00240
00241 if ( _MEDattributeIntWr(_datagroup1,MED_NOM_NXI,&numit2) < 0) {
00242 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00243 SSCRUTE(meshname);SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_NXI);
00244 goto ERROR;
00245 }
00246
00247
00248 if (strlen(_datagroupname3) ) {
00249
00250 if ( (_datagroup3 = _MEDdatagroupOuvrir(_meshid,_datagroupname3)) < 0 ) {
00251 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_COMPUTINGSTEP,_datagroupname3);
00252 SSCRUTE(meshname);goto ERROR;
00253 }
00254
00255 if ( _MEDattrEntierLire(_datagroup3,MED_NOM_PVT,&_pvdt) < 0) {
00256 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00257 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVT);
00258 goto ERROR;
00259 }
00260
00261 if ( _MEDattrEntierLire(_datagroup3,MED_NOM_PVI,&_pvit) < 0) {
00262 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00263 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVI);
00264 goto ERROR;
00265 }
00266 _MEDgetComputationStepName(_sortingtype,_pvdt,_pvit,_datagroupname1bis);
00267
00268 if ( strncmp(_datagroupname1,_datagroupname1bis,2*MED_MAX_PARA+2) != 0) {
00269 MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_COMPUTINGSTEP,_datagroupname1);
00270 SSCRUTE(meshname);SSCRUTE(_datagroupname1bis);goto ERROR;
00271 }
00272
00273 if ( _MEDattributeIntWr(_datagroup3,MED_NOM_PVT,&numdt2) < 0) {
00274 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00275 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVT);
00276 goto ERROR;
00277 }
00278
00279 if ( _MEDattributeIntWr(_datagroup3,MED_NOM_PVI,&numit2) < 0) {
00280 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00281 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_PVI);
00282 goto ERROR;
00283 }
00284
00285 }
00286
00287 } else {
00288
00289
00290 if ((_datagroup2 = _MEDdatagroupCreer(_meshid,_datagroupname2)) < 0 ) {
00291 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,_datagroupname2);
00292 SSCRUTE(meshname);goto ERROR;
00293 }
00294
00295
00296
00297 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXT,&numdt2) < 0) {
00298 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00299 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXT);
00300 goto ERROR;
00301 }
00302
00303 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NXI,&numit2) < 0) {
00304 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00305 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXI);
00306 goto ERROR;
00307 }
00308
00309 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVT,&numdt2) < 0) {
00310 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00311 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVT);
00312 goto ERROR;
00313 }
00314
00315 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_PVI,&numit2) < 0) {
00316 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00317 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PVI);
00318 goto ERROR;
00319 }
00320
00321 }
00322
00323
00324 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NDT,&numdt2) < 0) {
00325 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00326 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NDT);
00327 ISCRUTE(numdt2);goto ERROR;
00328 }
00329
00330
00331 if ( _MEDattrFloatEcrire(_datagroup2,MED_NOM_PDT,&dt2) < 0) {
00332 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00333 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_PDT);
00334 RSCRUTE(dt2);goto ERROR;
00335 }
00336
00337
00338 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_NOR,&numit2) < 0) {
00339 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00340 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NOR);
00341 ISCRUTE(numit2); goto ERROR;
00342 }
00343
00344
00345 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_CGT,&_false) < 0) {
00346 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00347 SSCRUTE(meshname);SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);
00348 goto ERROR;
00349 }
00350
00351
00352
00353 if ( strncmp(_datagroupname2,_latestcpstname,2*MED_MAX_PARA+2) >= 0) {
00354
00355 if ( _MEDattributeIntWr(_meshid,MED_NOM_NXT,&numdt2) < 0) {
00356 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00357 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXT);
00358 goto ERROR;
00359 }
00360
00361 if ( _MEDattributeIntWr(_meshid,MED_NOM_NXI,&numit2) < 0) {
00362 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00363 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_NXI);
00364 goto ERROR;
00365 }
00366 }
00367
00368 _ret = 0;
00369 ERROR:
00370
00371 if (_datagroup3>0) if (_MEDdatagroupFermer(_datagroup3) < 0) {
00372 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname3);
00373 ISCRUTE_id(_datagroup3);
00374 }
00375
00376 if (_datagroup2>0) if (_MEDdatagroupFermer(_datagroup2) < 0) {
00377 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
00378 ISCRUTE_id(_datagroup2);
00379 }
00380
00381 if (_datagroup1>0) if (_MEDdatagroupFermer(_datagroup1) < 0) {
00382 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname1);
00383 ISCRUTE_id(_datagroup1);
00384 }
00385
00386 if (_meshid>0) if (_MEDdatagroupFermer(_meshid) < 0) {
00387 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
00388 ISCRUTE_id(_meshid);
00389 }
00390
00391 return _ret;
00392 }