1 /*  This file is part of MED.
2  *
3  *  COPYRIGHT (C) 1999 - 2019  EDF R&D, CEA/DEN
4  *  MED is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU Lesser General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  MED is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 
19 #include <med.h>
20 #include <med_config.h>
21 #include <med_outils.h>
22 #include <string.h>
23 
24 /*
25  * - Nom de la fonction : MEDpasdetempsInfo
26  * - Description : Itérateur renvoyant (n°pdt,n°or), le nbre de point de GAUSS pour le type d'élément,
27  *                 et le  maillage par défaut avec son eventuel lien à un autre fichier.
28  * - Parametres :
29  *     - fid        (IN) : ID du fichier HDF courant
30  *     - cha        (IN) : le nom du champ
31  *     - type_ent   (IN) : entité du champ concernée  {MED_NOEUD,MED_ARETE,MED_FACE,MED_MAILLE}
32  *      - type_geo  (IN) : type géométrique de l'entité concerné {MED_POINT,MED_SEG2 ......}
33  *       - indice   (IN) : itérateur commançant à 1.
34  *       - ngauss  (OUT) : nbre de point de gauss utilisé (MED_NOPG si aucun)
35  *       - numdt   (OUT) : n° du pas de temps (MED_NOPDT si aucun)
36  *       - numo    (OUT) : n° d'ordre utilisé (MED_NONOR si aucun)
37  *       - dt_unit (OUT) : chaine de taille MED_NOMP indiquant l'unité du champ
38  *       - dt      (OUT) : valeur du pas de temps
39  *        - maa   (OUT)  : le nom du  maillage par défaut sur lequel le champ résultat s'applique au couple (numdt,numo) donné.
40  *        - local (OUT)  : MED_VRAI si le lien est local, MED_FAUX sinon.
41  *        - nmaa (OUT)  : le nombre de maillages référencés
42  * - Resultat : 0 en cas de succes, -1 sinon
43  */
44 
45 med_err
MEDpasdetempsInfo(med_idt fid,char * champ,med_entite_maillage type_ent,med_geometrie_element type_geo,int indice,med_int * ngauss,med_int * numdt,med_int * numo,char * dt_unit,med_float * dt,char * maa,med_booleen * local,med_int * nmaa)46 MEDpasdetempsInfo(med_idt fid,char *champ,
47 		  med_entite_maillage type_ent, med_geometrie_element type_geo,
48 		  int indice, med_int * ngauss, med_int * numdt, med_int * numo,
49                   char * dt_unit, med_float * dt,  char * maa, med_booleen * local, med_int *nmaa)
50 
51 {
52   med_err ret=-1;
53   med_idt gid=0,datagroup3=0,gid_maa=0,gid_lien=0;
54   char chemin      [(MED_TAILLE_CHA+MED_TAILLE_NOM+1)+(2*MED_TAILLE_NOM_ENTITE+2)+2*MED_MAX_PARA+1]="";
55   char chemin_maa  [MED_TAILLE_MAA+MED_TAILLE_NOM+1]="";
56   char chemin_lien [MED_TAILLE_LIENS+MED_TAILLE_NOM+1]="";
57   int nmaa_i=0;
58   int num=0;
59   char tmp1         [MED_TAILLE_NOM_ENTITE+1]="";
60   char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2]="";
61   char nomdatagroup2[2*MED_MAX_PARA+1]="";
62 
63   /*
64    * On inhibe le gestionnaire d'erreur HDF 5
65    */
66   _MEDmodeErreurVerrouiller();
67 if (MEDcheckVersion(fid) < 0) return -1;
68 
69 
70   /*
71    * On construit le nom du datagroup
72    */
73   strcpy(chemin,MED_CHA);
74   strcat(chemin,champ);
75   strcat(chemin,"/");
76 
77   /*
78    * Si le Data Group  de niveau 1 <type_ent>[.<type_geo>] n'existe pas => erreur
79    */
80 
81   /* modif pour la version 2.3.3 */
82 
83   if (_MEDnomEntite(nomdatagroup1,type_ent) < 0) {
84     MESSAGE("L'entité demandée n'est pas une entité <med_entite_maillage> : ");
85     SSCRUTE(chemin); ISCRUTE(type_ent); goto ERROR;
86   };
87 
88   if ((type_ent != MED_NOEUD)) {
89     if (_MEDnomGeometrie30(tmp1,type_geo) < 0) {
90       MESSAGE("Le type géométrique demandé n'est pas un <med_geometrie_element> : ");
91       SSCRUTE(chemin); ISCRUTE(type_geo); goto ERROR;
92     };
93     strcat(nomdatagroup1,".");
94     strcat(nomdatagroup1,tmp1);
95   }
96   strcat(chemin,nomdatagroup1);
97   strcat(chemin,"/");
98 
99   /*
100    * Ouvre le datagroup  <numdtt>.<numoo> correspondant à l'indice num
101    */
102   num = indice - 1;
103   if (_MEDobjetIdentifier(fid,chemin,num,nomdatagroup2) < 0) {
104     MESSAGE("Impossible de trouver un groupe à l'indice spécifié : ");
105     SSCRUTE(chemin); ISCRUTE(num); goto ERROR;
106   };
107 
108   strcat(chemin,nomdatagroup2);
109   if ((gid = _MEDdatagroupOuvrir(fid,chemin)) < 0) {
110     MESSAGE("Erreur d'ouverture du datagroup  : ");
111     SSCRUTE(chemin); goto ERROR;
112   };
113 
114   /*
115    * Calcul du nombre de maillages
116    */
117   nmaa_i = 0;
118   if ( _MEDnObjets(fid,chemin,&nmaa_i) < 0) {
119     MESSAGE("Impossible d'itérer dans le groupe : ");
120     SSCRUTE(chemin); goto ERROR;
121   };
122   *nmaa = nmaa_i;
123 
124   /*
125    * Lecture des attributs
126    */
127 
128 
129   if (_MEDattrEntierLire(gid,MED_NOM_NDT,(med_int*) numdt) < 0) {
130     MESSAGE("Erreur d'ouverture de l'attribut numdt : ");
131     SSCRUTE(chemin); goto ERROR;
132   };
133 
134   if (_MEDattrFloatLire(gid,MED_NOM_PDT,(med_float*) dt) < 0) {
135     MESSAGE("Erreur d'ouverture de l'attribut dt : ");
136     SSCRUTE(chemin); goto ERROR;
137   };
138 
139   if (_MEDattrStringLire(gid,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit) < 0) {
140     MESSAGE("Erreur d'ouverture de l'attribut dt_unit : ");
141     SSCRUTE(chemin); goto ERROR;
142   };
143 
144   if (_MEDattrEntierLire(gid,MED_NOM_NOR,(med_int*) numo) < 0) {
145     MESSAGE("Erreur d'ouverture de l'attribut numo : ");
146     SSCRUTE(chemin); goto ERROR;
147   };
148 
149 
150   /* Lecture du nom du maillage par défaut  */
151 
152   if (_MEDattrStringLire(gid,MED_NOM_MAI,MED_TAILLE_NOM,maa) < 0) {
153     MESSAGE("Erreur d'ouverture de l'attribut maa : ");
154     SSCRUTE(chemin);  goto ERROR;
155   };
156 
157   /*
158    * Si le Data Group de niveau 3 <nom de maillage> n'existe pas => erreur
159    */
160 
161   if ((datagroup3 = _MEDdatagroupOuvrir(gid,maa)) < 0) {
162     MESSAGE("Erreur d'ouverture du datagroup lien au maillage : ");
163     SSCRUTE(chemin); SSCRUTE(maa); goto ERROR;
164   };
165 
166   /* Maillage local ou distant */
167   strcpy(chemin_maa,MED_MAA);
168   strcat(chemin_maa,maa);
169   /* Le maillage est il distant */
170   if ( (gid_maa = _MEDdatagroupOuvrir(fid,chemin_maa)) < 0)  {
171 
172     /* Verifie que le maillage est bien référencé comme distant */
173     strcpy(chemin_lien,MED_LIENS);
174     strcat(chemin_lien,maa);
175     if ((gid_lien = _MEDdatagroupOuvrir(fid,chemin_lien)) < 0) {
176 /*       MESSAGE("Le maillage n'est ni local, ni distant : "); */
177 /*       SSCRUTE(chemin_maa);SSCRUTE(chemin_lien); goto ERROR; */
178       *local = MED_FAUX;
179     }
180 
181     *local = MED_FAUX;
182 
183   } else
184 
185     *local = MED_VRAI;
186 
187   /* Lire le nbre des points de GAUSS*/
188   if (_MEDattrEntierLire(datagroup3,MED_NOM_NGA,ngauss) < 0) {
189     MESSAGE("Erreur à la lecture de l'attribut MED_NOM_NGA : ");
190     ISCRUTE(*ngauss);goto ERROR;
191   };
192 
193 
194   /*
195    * On ferme tout
196    */
197 
198   ret = 0;
199 
200  ERROR:
201 
202 
203   if (gid_lien>0) if (_MEDdatagroupFermer(gid_lien) < 0) {
204       MESSAGE("Impossible de fermer le datagroup : ");
205       SSCRUTE(chemin_lien); ret = -1;
206   }
207 
208   if (gid_maa>0)  if (_MEDdatagroupFermer(gid_maa) < 0) {
209       MESSAGE("Impossible de fermer le datagroup : ");
210       ISCRUTE_id(gid_maa); ret = -1;
211   }
212 
213 
214   if (datagroup3>0)     if (_MEDdatagroupFermer(datagroup3) < 0) {
215       MESSAGE("Impossible de fermer le datagroup : ");
216       ISCRUTE_int(datagroup3); ret = -1;
217   }
218 
219   if (gid>0)     if (_MEDdatagroupFermer(gid) < 0) {
220       MESSAGE("Impossible de fermer le datagroup : ");
221       ISCRUTE_id(gid); ret = -1;
222   }
223 
224   return ret;
225 
226 
227 }
228