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 <string.h>
24 #include <stdlib.h>
25
26 /**\ingroup MEDstructElement
27 \brief \MEDstructElementConstAttRdBrief
28 \param fid \fid
29 \param modelname \modelname
30 \param constattname \constattname
31 \param value \value
32
33 \return \error
34
35 \details \MEDstructElementConstAttRdDetails
36 \remarks \MEDstructElementConstAttswitchCm
37 \see MEDstructElementConstAttWithProfileWr
38 \see MEDstructElementConstAttWr
39 */
40
41 med_err
MEDstructElementConstAttRd(const med_idt fid,const char * const modelname,const char * const constattname,void * const value)42 MEDstructElementConstAttRd(
43 const med_idt fid,
44 const char* const modelname,
45 const char* const constattname,
46 void* const value
47 )
48 {
49 med_err _ret=-1;
50 med_idt _attid=0, _elemid=0 ;
51 char _path[MED_ELSTRUCT_GRP_SIZE+MED_NAME_SIZE+1+MED_TAILLE_CSTATR+MED_NAME_SIZE+1]=MED_ELSTRUCT_GRP;
52 med_int _intentitytype = 0;
53 med_int _nentity = 0;
54 med_attribute_type _constatttype = MED_ATT_UNDEF;
55 med_int _ncomponent = 0;
56 med_entity_type _entitytype = MED_UNDEF_ENTITY_TYPE;
57 char _supportmeshname[MED_NAME_SIZE+1]="";
58 char _profilename [MED_NAME_SIZE+1]="";
59 med_int _profilesize = 0;
60 med_filter _filter = MED_FILTER_INIT;
61 med_int _medintsgeotype = MED_NONE;
62 med_bool _chgt=MED_FALSE,_trsf=MED_FALSE;
63
64 NOFINALBLANK(modelname,ERROR);
65 NOFINALBLANK(constattname,ERROR);
66
67 strcat(_path,modelname);
68
69
70 /*
71 * Si le DataGroup /STRUCT/<modelname> n'existe pas => erreur
72 */
73 if ((_elemid = _MEDdatagroupOpen(fid,_path)) < 0) {
74 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_path);
75 goto ERROR;
76 }
77
78 strcat(_path,MED_CSTATR);
79 strcat(_path,constattname);
80
81 /*
82 * Si le DataGroup /STRUCT/<modelname>/CSTATT/<constattributename> n'existe pas => erreur
83 */
84 if ((_attid = _MEDdatagroupOpen(fid,_path)) < 0) {
85 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_path);
86 goto ERROR;
87 }
88
89
90 /*
91 * Lecture de l'attribut MED_NOM_NOM (nom du maillage support)
92 */
93 /* Chercher plutôt ds le maillage support et supprimer les attributs NBM et NBN */
94 if ( _MEDattrStringLire(_elemid,MED_NOM_NOM,MED_NAME_SIZE,_supportmeshname) < 0) {
95 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
96 SSCRUTE(MED_NOM_NOM);SSCRUTE(_supportmeshname);
97 goto ERROR;
98 }
99
100 if (
101 MEDstructElementConstAttInfoByName(fid,
102 modelname,
103 constattname,
104 &_constatttype,
105 &_ncomponent,
106 &_entitytype,
107 _profilename,
108 &_profilesize
109 ) < 0 ) {
110 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,MED_ERR_STRUCT_MSG);
111 SSCRUTE(modelname);SSCRUTE(_path);SSCRUTE("MEDstructElementConstAttInfoByName");
112 goto ERROR;
113 }
114
115
116 if (strlen(_supportmeshname) ) {
117
118 if (_entitytype == MED_CELL )
119
120 /*
121 * Lecture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
122 */
123 if ( _MEDattrEntierLire(_elemid,MED_NOM_GEO,&_medintsgeotype) < 0 ) {
124 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
125 SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintsgeotype);
126 goto ERROR;
127 }
128
129 if ( (_nentity = MEDmeshnEntity(fid,_supportmeshname,MED_NO_DT,MED_NO_IT,
130 MED_CELL,(med_geometry_type) _medintsgeotype,
131 MED_CONNECTIVITY,MED_NODAL,
132 &_chgt,&_trsf) ) < 0) {
133 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDmeshnEntity");
134 ISCRUTE(_nentity);goto ERROR;
135 }
136
137 if (_entitytype == MED_NODE )
138 if ( (_nentity = MEDmeshnEntity(fid,_supportmeshname,MED_NO_DT,MED_NO_IT,
139 MED_NODE,MED_NONE,MED_COORDINATE,MED_NO_CMODE,
140 &_chgt,&_trsf) ) <= 0) {
141 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDmeshnEntity");
142 ISCRUTE(_nentity);goto ERROR;
143 }
144 } else
145 _nentity = 1;
146
147 if ( MEDfilterEntityCr(fid, _nentity, 1, _ncomponent, MED_ALL_CONSTITUENT,
148 MED_FULL_INTERLACE,MED_COMPACT_STMODE,
149 _profilename, MED_UNDEF_SIZE, NULL, &_filter) < 0 ) {
150 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_FILTER,MED_ERR_INTERNAL_MSG);
151 goto ERROR;
152 }
153
154 if ( _MEDdatasetRd(_attid,MED_NOM_COR,_constatttype,&_filter, (unsigned char * ) value) < 0) {
155 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_DATASET,MED_NOM_COR);
156 SSCRUTE(_path);
157 goto ERROR;
158 }
159
160 if ( MEDfilterClose(&_filter) < 0 ) {
161 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_FILTER,MED_ERR_STRUCT_ELEMENT_MSG);
162 SSCRUTE(_path);
163 goto ERROR;
164 }
165
166 _ret=0;
167 ERROR:
168
169 if (_attid>0) if (_MEDdatagroupFermer(_attid) < 0) {
170 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,modelname);
171 ISCRUTE_id(_attid);
172 }
173
174 if (_elemid>0) if (_MEDdatagroupFermer(_elemid) < 0) {
175 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,modelname);
176 ISCRUTE_id(_elemid);
177 }
178
179 return _ret;
180 }
181
182