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
23 #include <stdlib.h>
24 #include <string.h>
25
26 void
_MEDfamilyInfo30(int dummy,...)27 _MEDfamilyInfo30(int dummy,...)
28 {
29 med_err _ret=-1,_err=-1;
30 med_idt _datagroup=0,_famid=0;
31 char _path [MED_FAMILY_GRP_SIZE+MED_NAME_SIZE+
32 MED_TAILLE_FAS_ENTITE+MED_NAME_SIZE+1] = MED_FAMILY_GRP;
33 med_int _n = 0;
34 med_size _tmpn = 0;
35 int _pathreflen = 0;
36 int _num = 0;
37 int _nfammai=0;
38 med_int _ngroup=0;
39 med_filter _filter=MED_FILTER_INIT;
40
41
42 MED_VARGS_DECL(const, med_idt , , fid );
43 MED_VARGS_DECL(const, char * , const , meshname );
44 MED_VARGS_DECL(const, med_int , , famit );
45 MED_VARGS_DECL(, char * , const , familyname );
46 MED_VARGS_DECL(, med_int * , const , familynumber );
47 MED_VARGS_DECL(, char * , const , groupname );
48 MED_VARGS_DECL(, med_err * , , fret );
49
50 va_list params;
51 va_start(params,dummy);
52
53 MED_VARGS_DEF(const, med_idt , , fid );
54 MED_VARGS_DEF(const, char * , const , meshname );
55 MED_VARGS_DEF(const, med_int , , famit );
56 MED_VARGS_DEF(, char * , const , familyname );
57 MED_VARGS_DEF(, med_int * , const , familynumber );
58 MED_VARGS_DEF(, char * , const , groupname );
59 MED_VARGS_DEF(, med_err * , , fret );
60
61 _num = famit-1;
62
63 /*
64 * On inhibe le gestionnaire d'erreur HDF 5
65 */
66 _MEDmodeErreurVerrouiller();
67 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
68
69 /*
70 * On recupere le nom de la famille
71 */
72
73 /* Acces a la famille :
74 * nfam = nfamnoe + 1 + nfammai
75 * Repartition selon l'indice "num" dans le datagroup :
76 * - 0..nfammai - 1 : familles des mailles/faces/aretes
77 * - nfamai : famille 0
78 * - (nfamai + 1)..(nfammai+nfamnoe) : familles de noeuds
79 */
80
81 /* Comptage des familles de mailles/faces/aretes */
82 strcat(_path,meshname);
83 _pathreflen=strlen(_path);
84
85 strncpy(&_path[_pathreflen],MED_FAS_ELEME,MED_TAILLE_FAS_ENTITE+1);
86 if ( (_err = _MEDnObjects(fid,_path,&_tmpn)) < 0 )
87 if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
88 MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,_path);
89 goto ERROR;
90 }
91
92 _nfammai = (med_int ) _tmpn;
93
94 /* SSCRUTE(_path); */
95 /* ISCRUTE(_nfammai); */
96
97 /* Pour la famille 0 */
98 /* (0<=_num<_nfammai) : famille éléments */
99 /* (_num == _nfammai) : famille 0 */
100 /* (_num > _nfammai ) : famille de noeuds */
101 if (_num == _nfammai) {
102 strcpy(familyname,FAMILLE_ZERO);
103 groupname[0]='\0';
104 *familynumber=0;
105 goto SORTIE;
106 }
107
108
109 /* C'est une _family de noeuds */
110 if (_num > _nfammai) {
111 strncpy(&_path[_pathreflen],MED_FAS_NOEUD,MED_TAILLE_FAS_ENTITE+1);
112 _num = _num - _nfammai - 1;
113 }
114
115 /* SSCRUTE(_path); */
116
117 /*
118 * Si le Data Group de la famille n'existe pas => erreur
119 */
120 if ( _MEDobjectGetName(fid, _path ,_num, familyname) < 0 ) {
121 MED_ERR_(_ret,MED_ERR_ACCESS,MED_ERR_DATAGROUP,_path);ISCRUTE_int(famit);
122 H5Eprint1(stderr);
123 goto ERROR;
124 }
125 /* SSCRUTE(familyname); */
126 strcat(_path,familyname);
127 /* SSCRUTE(_path); */
128
129 if ((_famid = _MEDdatagroupOuvrir(fid,_path)) < 0) {
130 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_FAMILY_MSG);
131 SSCRUTE(_path);
132 goto ERROR;
133 }
134
135 /*
136 * L'attribut NUM
137 */
138 if ( _MEDattrEntierLire(_famid,MED_NOM_NUM,familynumber) < 0) {
139 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FAMILY_MSG);
140 SSCRUTE(familyname);SSCRUTE(_path);
141 SSCRUTE(MED_NOM_NUM);ISCRUTE(*familynumber);goto ERROR;
142 }
143 /* ISCRUTE(*familynumber); */
144
145 /*
146 * Le Data Group "GRO"
147 */
148 if ((_datagroup = _MEDdatagroupOuvrir(_famid,MED_NOM_GRO)) >= 0) {
149
150 /*
151 * L'attribut "NBR"
152 */
153 if ( _MEDattrEntierLire(_datagroup,MED_NOM_NBR,&_ngroup) < 0) {
154 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FAMILY_MSG);
155 SSCRUTE(familyname);SSCRUTE(_path);SSCRUTE(MED_NOM_GRO);
156 SSCRUTE(MED_NOM_NBR);
157 goto ERROR;
158 }
159 /* ISCRUTE(_ngroup); */
160
161 /*
162 * Data Set des noms des groupes "NOM"
163 */
164 if ( MEDfilterEntityCr(fid, _ngroup, 1, 1, MED_ALL_CONSTITUENT,
165 MED_NO_INTERLACE,MED_UNDEF_STMODE,
166 MED_NO_PROFILE, MED_UNDEF_SIZE, NULL, &_filter) < 0 ) {
167 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_FILTER,MED_ERR_INTERNAL_MSG);
168 goto ERROR;
169 }
170
171 if ( _MEDdatasetRd(_datagroup,MED_NOM_NOM,MED_INTERNAL_LNAME,&_filter,
172 (unsigned char * const) groupname) < 0) {
173 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_DATASET,MED_NOM_NOM);
174 SSCRUTE(_path);SSCRUTE(MED_NOM_GRO);SSCRUTE(groupname);
175 goto ERROR;
176 }
177 /* SSCRUTE(groupname); */
178
179 if ( MEDfilterClose(&_filter) < 0 ) {
180 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_FILTER,MED_ERR_FAMILY_MSG);
181 SSCRUTE(familyname);SSCRUTE(_path);SSCRUTE(MED_NOM_GRO);
182 goto ERROR;
183 }
184
185 }
186
187 SORTIE:
188 _ret = 0;
189
190 ERROR:
191
192 if (_datagroup>0) if (_MEDdatagroupFermer(_datagroup) < 0) {
193 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,MED_NOM_GRO);
194 ISCRUTE_id(_datagroup);
195 }
196
197 if (_famid>0) if (_MEDdatagroupFermer(_famid) < 0) {
198 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,&_path[_pathreflen]);
199 ISCRUTE_id(_famid);
200 }
201
202 va_end(params);
203 *fret = _ret;
204 return;
205 }
206
207
208