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 }

Généré le Mon May 16 17:10:23 2011 pour MED fichier par  doxygen 1.6.1