# MEDmeshComputationStepCr.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2011  EDF R&D, CEA/DEN
    00004  *  MED is free software: you can redistribute it and/or modify
    00005  *  it under the terms of the GNU Lesser General Public License as published by
    00006  *  the Free Software Foundation, either version 3 of the License, or
    00007  *  (at your option) any later version.
    00008  *
    00009  *  MED is distributed in the hope that it will be useful,
    00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00012  *  GNU Lesser General Public License for more details.
    00013  *
    00014  *  You should have received a copy of the GNU Lesser General Public License
    00015  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
    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    * On inhibe le gestionnaire d'erreur
    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 /*   strcat( _meshpath, meshname); */
    00088 /*   strcat( _pathsrc , meshname);strcat( _pathsrc , "/"); */
    00089 /*   strcat( _pathdst , meshname);strcat( _pathdst , "/"); */
    00090 /*   if ((_meshid = _MEDdatagroupOuvrir(fid,_meshpath)) < 0) { */
    00091 /*     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_meshpath); */
    00092 /*     SSCRUTE(_meshid);goto ERROR; */
    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 /*     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG); */
    00104 /*     SSCRUTE(meshname);SSCRUTE(_meshpath);SSCRUTE(MED_NOM_NXT); */
    00105 /*     goto ERROR; */
    00106     _lastnumdt = MED_NO_DT;
    00107   }
    00108
    00109   if ( _MEDattrEntierLire(_meshid,MED_NOM_NXI,&_lastnumit) < 0) {
    00110 /*     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG); */
    00111 /*     SSCRUTE(meshname);SSCRUTE(_meshpath);SSCRUTE(MED_NOM_NXI); */
    00112 /*     goto ERROR; */
    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   /*Vérifie que le _datagroupname2 est bien postérieur au _datagroupname1
    00133    REM: _datagroupname1 peut être la dernière séquence de calcul.*/
    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   /*L'étape de calcul à créer ne doit pas déjà exister*/
    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     /*Lecture NEXT et PREV du datagroup1 */
    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     /* On vérifie que la nouvelle étape de calcul s'insère correctement :
    00173        < au next du datagroup1 */
    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     /*On crée la nouvelle étape de calcul (au plus tard, après vérifs...)*/
    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     /*On crée les datagroups, attributs et liens sur les datatsets et les liens symboliques
    00190       pour avoir une image de l'étape de calcul précedente.*/
    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     /*Ecriture NEXT et PREV du nouveau datagroup2 */
    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     /*Modification du NEXT du datagroup1 */
    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     /*Modification de PREV du ( NEXT de datagroup1 )*/
    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 { /* Première étape de calcul */
    00278
    00279     /*On crée la nouvelle étape de calcul (au plus tard, après vérifs...) */
    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     /* Ecriture de MED_NO_IT, MED_NO_DT pour NEXT et PREV de la première
    00286        étape de calcul */
    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   /*Cree ou ouvre l'attribut MED_NOM_NDT pour écriture */
    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   /*Cree ou ouvre l'attribut MED_NOM_PDT pour écriture */
    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   /*Cree ou ouvre l'attribut MED_NOM_NOR pour écriture */
    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   /* Ecriture de NEXT et PREV  au niveau meshid (dernière étape de calcul créée */
    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 }