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