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 }