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