MEDpasdetempsInfo.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 
00024 /*
00025  * - Nom de la fonction : MEDpasdetempsInfo
00026  * - Description : Itérateur renvoyant (n°pdt,n°or), le nbre de point de GAUSS pour le type d'élément,
00027  *                 et le  maillage par défaut avec son eventuel lien à un autre fichier. 
00028  * - Parametres :
00029  *     - fid        (IN) : ID du fichier HDF courant
00030  *     - cha        (IN) : le nom du champ 
00031  *     - type_ent   (IN) : entité du champ concernée  {MED_NOEUD,MED_ARETE,MED_FACE,MED_MAILLE}
00032  *      - type_geo  (IN) : type géométrique de l'entité concerné {MED_POINT,MED_SEG2 ......}
00033  *       - indice   (IN) : itérateur commançant à 1.
00034  *       - ngauss  (OUT) : nbre de point de gauss utilisé (MED_NOPG si aucun)
00035  *       - numdt   (OUT) : n° du pas de temps (MED_NOPDT si aucun)
00036  *       - numo    (OUT) : n° d'ordre utilisé (MED_NONOR si aucun)
00037  *       - dt_unit (OUT) : chaine de taille MED_NOMP indiquant l'unité du champ
00038  *       - dt      (OUT) : valeur du pas de temps 
00039  *        - maa   (OUT)  : le nom du  maillage par défaut sur lequel le champ résultat s'applique au couple (numdt,numo) donné.
00040  *        - local (OUT)  : MED_VRAI si le lien est local, MED_FAUX sinon.
00041  *        - nmaa (OUT)  : le nombre de maillages référencés
00042  * - Resultat : 0 en cas de succes, -1 sinon
00043  */ 
00044 
00045 med_err
00046 MEDpasdetempsInfo(med_idt fid,char *champ,
00047                   med_entite_maillage type_ent, med_geometrie_element type_geo,
00048                   int indice, med_int * ngauss, med_int * numdt, med_int * numo,
00049                   char * dt_unit, med_float * dt,  char * maa, med_booleen * local, med_int *nmaa)
00050 
00051 {
00052   med_err ret=-1;
00053   med_idt gid=0,datagroup3=0,gid_maa=0,gid_lien=0;
00054   char chemin      [(MED_TAILLE_CHA+MED_TAILLE_NOM+1)+(2*MED_TAILLE_NOM_ENTITE+2)+2*MED_MAX_PARA+1]="";
00055   char chemin_maa  [MED_TAILLE_MAA+MED_TAILLE_NOM+1]="";
00056   char chemin_lien [MED_TAILLE_LIENS+MED_TAILLE_NOM+1]=""; 
00057   int nmaa_i=0;
00058   int num=0;
00059   char tmp1         [MED_TAILLE_NOM_ENTITE+1]="";
00060   char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="";
00061   char nomdatagroup2[2*MED_MAX_PARA+1]="";
00062 
00063   /*
00064    * On inhibe le gestionnaire d'erreur HDF 5
00065    */
00066   _MEDmodeErreurVerrouiller();
00067 if (MEDcheckVersion(fid) < 0) return -1;
00068 
00069 
00070   /*
00071    * On construit le nom du datagroup
00072    */
00073   strcpy(chemin,MED_CHA);
00074   strcat(chemin,champ);
00075   strcat(chemin,"/");
00076 
00077   /* 
00078    * Si le Data Group  de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur
00079    */
00080 
00081   /* modif pour la version 2.3.3 */
00082   
00083   if (_MEDnomEntite(nomdatagroup1,type_ent) < 0) {
00084     MESSAGE("L'entité demandée n'est pas une entité <med_entite_maillage> : ");
00085     SSCRUTE(chemin); ISCRUTE(type_ent); goto ERROR;
00086   };
00087 
00088   if ((type_ent != MED_NOEUD)) {
00089     if (_MEDnomGeometrie30(tmp1,type_geo) < 0) {
00090       MESSAGE("Le type géométrique demandé n'est pas un <med_geometrie_element> : ");
00091       SSCRUTE(chemin); ISCRUTE(type_geo); goto ERROR;
00092     };
00093     strcat(nomdatagroup1,".");
00094     strcat(nomdatagroup1,tmp1);
00095   }
00096   strcat(chemin,nomdatagroup1);
00097   strcat(chemin,"/");
00098 
00099   /*
00100    * Ouvre le datagroup  <numdtt>.<numoo> correspondant à l'indice num
00101    */
00102   num = indice - 1;
00103   if (_MEDobjetIdentifier(fid,chemin,num,nomdatagroup2) < 0) {
00104     MESSAGE("Impossible de trouver un groupe à l'indice spécifié : ");
00105     SSCRUTE(chemin); ISCRUTE(num); goto ERROR;
00106   };
00107   
00108   strcat(chemin,nomdatagroup2);
00109   if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0) {
00110     MESSAGE("Erreur d'ouverture du datagroup  : ");
00111     SSCRUTE(chemin); goto ERROR;
00112   };
00113   
00114   /*
00115    * Calcul du nombre de maillages
00116    */
00117   nmaa_i = 0;
00118   if ( _MEDnObjets(fid,chemin,&nmaa_i) < 0) {
00119     MESSAGE("Impossible d'itérer dans le groupe : ");
00120     SSCRUTE(chemin); goto ERROR;
00121   };
00122   *nmaa = nmaa_i;
00123 
00124   /*
00125    * Lecture des attributs
00126    */
00127   
00128 
00129   if (_MEDattrEntierLire(gid,MED_NOM_NDT,(med_int*) numdt) < 0) {
00130     MESSAGE("Erreur d'ouverture de l'attribut numdt : ");
00131     SSCRUTE(chemin); goto ERROR;
00132   };
00133   
00134   if (_MEDattrFloatLire(gid,MED_NOM_PDT,(med_float*) dt) < 0) {
00135     MESSAGE("Erreur d'ouverture de l'attribut dt : ");
00136     SSCRUTE(chemin); goto ERROR;
00137   };
00138 
00139   if (_MEDattrStringLire(gid,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit) < 0) {
00140     MESSAGE("Erreur d'ouverture de l'attribut dt_unit : ");
00141     SSCRUTE(chemin); goto ERROR;
00142   };
00143   
00144   if (_MEDattrEntierLire(gid,MED_NOM_NOR,(med_int*) numo) < 0) {
00145     MESSAGE("Erreur d'ouverture de l'attribut numo : ");
00146     SSCRUTE(chemin); goto ERROR;
00147   };
00148 
00149 
00150   /* Lecture du nom du maillage par défaut  */
00151   
00152   if (_MEDattrStringLire(gid,MED_NOM_MAI,MED_TAILLE_NOM,maa) < 0) {
00153     MESSAGE("Erreur d'ouverture de l'attribut maa : ");
00154     SSCRUTE(chemin);  goto ERROR;
00155   };
00156 
00157   /*
00158    * Si le Data Group de niveau 3 <nom de maillage> n'existe pas => erreur
00159    */
00160  
00161   if ((datagroup3 = _MEDdatagroupOuvrir(gid,maa)) < 0) {
00162     MESSAGE("Erreur d'ouverture du datagroup lien au maillage : ");
00163     SSCRUTE(chemin); SSCRUTE(maa); goto ERROR;
00164   };
00165   
00166   /* Maillage local ou distant */
00167   strcpy(chemin_maa,MED_MAA);
00168   strcat(chemin_maa,maa);
00169   /* Le maillage est il distant */
00170   if ( (gid_maa = _MEDdatagroupOuvrir(fid,chemin_maa)) < 0)  {
00171     
00172     /* Verifie que le maillage est bien référencé comme distant */  
00173     strcpy(chemin_lien,MED_LIENS);
00174     strcat(chemin_lien,maa); 
00175     if ((gid_lien = _MEDdatagroupOuvrir(fid,chemin_lien)) < 0) {
00176 /*       MESSAGE("Le maillage n'est ni local, ni distant : "); */
00177 /*       SSCRUTE(chemin_maa);SSCRUTE(chemin_lien); goto ERROR; */
00178       *local = MED_FAUX;
00179     }
00180   
00181     *local = MED_FAUX;
00182     
00183   } else
00184     
00185     *local = MED_VRAI;
00186     
00187   /* Lire le nbre des points de GAUSS*/
00188   if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,ngauss) < 0) {
00189     MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NGA : ");
00190     ISCRUTE(*ngauss);goto ERROR;
00191   };
00192 
00193 
00194   /*
00195    * On ferme tout 
00196    */
00197 
00198   ret = 0;
00199 
00200  ERROR:
00201   
00202 
00203   if (gid_lien>0) if (_MEDdatagroupFermer(gid_lien) < 0) {
00204       MESSAGE("Impossible de fermer le datagroup : ");
00205       SSCRUTE(chemin_lien); ret = -1; 
00206   }
00207 
00208   if (gid_maa>0)  if (_MEDdatagroupFermer(gid_maa) < 0) {
00209       MESSAGE("Impossible de fermer le datagroup : ");
00210       ISCRUTE_id(gid_maa); ret = -1; 
00211   }
00212     
00213  
00214   if (datagroup3>0)     if (_MEDdatagroupFermer(datagroup3) < 0) {
00215       MESSAGE("Impossible de fermer le datagroup : ");
00216       ISCRUTE_int(datagroup3); ret = -1; 
00217   }
00218 
00219   if (gid>0)     if (_MEDdatagroupFermer(gid) < 0) {
00220       MESSAGE("Impossible de fermer le datagroup : ");
00221       ISCRUTE_id(gid); ret = -1; 
00222   }
00223   
00224   return ret; 
00225 
00226 
00227 }

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