# MEDpasdetempsInfo.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2012  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 }