MEDmeshComputationStepCr.c

Aller à la documentation de ce fichier.
00001 /*  This file is part of MED.
00002  *
00003  *  COPYRIGHT (C) 1999 - 2015  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   /*
00128     L'utilisateur peut demander la création d'une nouvelle étape de calcul postérieure
00129     à toutes les autres en indiquant (numdt1 == numdt2) && (numit1 == numit2)
00130     Celà fonctionne aussi pour MED_NO_DT, NED_NO_IT
00131   */
00132 
00133   if ( (numdt1 == numdt2) && (numit1 == numit2) ) {
00134     _numdt1         = _lastnumdt;
00135     _numit1         = _lastnumit;
00136     _datagroupname1 = _latestcpstname;
00137   }
00138   /*Vérifie que le _datagroupname2 est bien postérieur ou égal au _datagroupname1
00139    REM: _datagroupname1 peut être la première/dernière séquence de calcul 
00140    ou une séquence intermédiaire */
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   /* On accepte l'absence de _datagroupname1 uniquement si
00150      numdt2 == MED_NO_DT && numit2 == MED_NO_IT */
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   /*L'étape de calcul à créer ne doit pas déjà exister*/
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     /*Lecture NEXT et PREV du datagroup1 */
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     /* On vérifie que la nouvelle étape de calcul s'insère correctement :
00182        < au next du datagroup1 */
00183 /*     if ( !((_nextdt == MED_NO_DT) && (_nextit == MED_NO_IT) )) { */
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     /*On crée la nouvelle étape de calcul (au plus tard, après vérifs...)*/
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     /*On crée les datagroups, attributs et liens sur les datatsets et les liens symboliques
00200       pour avoir une image de l'étape de calcul précedente.*/
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     /*Ecriture NEXT et PREV du nouveau datagroup2 */
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     /*Modification du NEXT du datagroup1 */
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     /*Modification de PREV du ( NEXT de datagroup1 ) s'il existe*/
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 { /* Création de la première étape de calcul  */
00288 
00289     /*On crée la nouvelle étape de calcul (au plus tard, après vérifs...) */
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     /* Ecriture de MED_NO_IT, MED_NO_DT pour NEXT et PREV de la première
00296        étape de calcul */
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   /*Cree ou ouvre l'attribut MED_NOM_NDT pour écriture */
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   /*Cree ou ouvre l'attribut MED_NOM_PDT pour écriture */
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   /*Cree ou ouvre l'attribut MED_NOM_NOR pour écriture */
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   /* Une nouvelle étape de calcul est vierge de toute modifiation*/
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   /* Ecriture de NEXT et PREV  au niveau meshid (dernière étape de calcul créée */
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 }

Généré le Thu Oct 8 14:26:16 2015 pour MED fichier par  doxygen 1.6.1