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 \MEDstructElementConstAttWithProfileWrBrief
28   \param fid \fid
29   \param modelname \modelname
30   \param constattname \constattname
31   \param constatttype \constatttype
32   \param ncomponent \ncomponent
33   \param sentitytype \sentitytype
34   \param profilename \profilename
35   \param value \value
36   \retval med_err \error
37   \details \MEDstructElementConstAttWithProfileWrDetails
38   \remarks \MEDstructElementConstAttswitchCm
39   \see      MEDstructElementConstAttWr
40  */
41 
42 
43 med_err
MEDstructElementConstAttWithProfileWr(const med_idt fid,const char * const modelname,const char * const constattname,const med_attribute_type constatttype,const med_int ncomponent,const med_entity_type sentitytype,const char * const profilename,const void * const value)44 MEDstructElementConstAttWithProfileWr(const med_idt                  fid,
45 				      const char*              const modelname,
46 				      const char*              const constattname,
47 				      const med_attribute_type       constatttype,
48 				      const med_int                  ncomponent,
49 				      const med_entity_type          sentitytype,
50 				      const char*              const profilename,
51 				      const void*              const value
52 				      )
53 {
54   med_access_mode   _MED_ACCESS_MODE;
55   med_err           _ret=-1;
56   med_idt           _attid=0, _elemid=0, _cstid=0;
57   char              _path[MED_ELSTRUCT_GRP_SIZE+MED_NAME_SIZE+1+MED_TAILLE_CSTATR+MED_NAME_SIZE+1]=MED_ELSTRUCT_GRP;
58   char              _supportmeshname[MED_NAME_SIZE+1]="";
59   med_int           _intentitytype                   = sentitytype;
60   med_int           _nentity                         = 0;
61   med_filter        _filter                          = MED_FILTER_INIT;
62   med_int           _false=0,_true=1,_true_or_false  = _false;
63   med_bool          _chgt=MED_FALSE,_trsf=MED_FALSE;
64   med_int           _medintsgeotype                  =MED_NONE;
65   med_geometry_type _sgeotype                        =MED_NONE;
66   med_int           _medintconstatttype= (med_int) constatttype;
67 
68 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
69 
70   if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
71     MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
72     goto ERROR;
73   }
74 
75   if ( _MED_ACCESS_MODE == MED_ACC_RDONLY) {
76     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
77     ISCRUTE_int(_MED_ACCESS_MODE);
78     goto ERROR;
79   }
80 
81   NOFINALBLANK(modelname,ERROR);
82   NOFINALBLANK(constattname,ERROR);
83   NOFINALBLANK(profilename,ERROR);
84 
85   strcat(_path,modelname);
86 
87   /*
88    * Si le DataGroup /STRUCT/<modelname> n'existe pas => erreur
89    */
90   if ((_elemid = _MEDdatagroupOpen(fid,_path)) < 0)  {
91     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_path);
92     goto ERROR;
93   }
94 
95   /*
96    * Lecture de l'attribut MED_NOM_NOM (nom du maillage support)
97    */
98   if ( _MEDattrStringLire(_elemid,MED_NOM_NOM,MED_NAME_SIZE,_supportmeshname) < 0) {
99     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
100     SSCRUTE(MED_NOM_NOM);SSCRUTE(_supportmeshname);
101     goto ERROR;
102   }
103 
104   if (strlen(_supportmeshname) ) {
105 
106     if (sentitytype == MED_CELL ) {
107       /*
108        * Lecture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
109        */
110       if ( _MEDattrEntierLire(_elemid,MED_NOM_GEO,&_medintsgeotype) < 0 ) {
111 	MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
112 	SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintsgeotype);
113 	goto ERROR;
114       }
115 
116       _sgeotype= (med_geometry_type) _medintsgeotype;
117     }
118 
119     if ( (_nentity = MEDmeshnEntity(fid,_supportmeshname,MED_NO_DT,MED_NO_IT,
120 				    MED_CELL,_sgeotype,MED_CONNECTIVITY,MED_NODAL,
121 				    &_chgt,&_trsf) )  < 0) {
122       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDmeshnEntity");
123       ISCRUTE(_nentity);goto ERROR;
124     }
125 
126     if (sentitytype == MED_NODE )
127       if ( (_nentity = MEDmeshnEntity(fid,_supportmeshname,MED_NO_DT,MED_NO_IT,
128 				      MED_NODE,MED_NONE,MED_COORDINATE,MED_NO_CMODE,
129 				      &_chgt,&_trsf) )  <= 0) {
130 	MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDmeshnEntity");
131 	ISCRUTE(_nentity);goto ERROR;
132       }
133   } else
134     _nentity = 1;
135 
136   /*
137    * Si le DataGroup /STRUCT/<modelname>/CSTATR/ n'existe pas on le crée
138    */
139   if ((_cstid = _MEDdatagroupOpen(_elemid,MED_CSTATR_NOM)) < 0)
140     if ((_cstid = _MEDdatagroupCreer(_elemid,MED_CSTATR_NOM)) < 0) {
141       MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_CSTATR_NOM);
142       SSCRUTE(_path);goto ERROR;
143     }
144   strcat(_path,MED_CSTATR);
145 
146   /*
147    * Si le DataGroup /STRUCT/<modelname>/CSTATR/<constattname> n'existe pas on le crée
148    */
149   if ((_attid = _MEDdatagroupOpen(_cstid,constattname)) < 0)
150     if ((_attid = _MEDdatagroupCreer(_cstid,constattname)) < 0) {
151       MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,constattname);
152       SSCRUTE(_path);goto ERROR;
153     }
154   strcat(_path,constattname);
155 
156   /*
157    * Creation/Ecriture de l'attribut MED_NOM_ATT (type des valeurs de l'attribut.)
158    */
159   if ( _MEDattributeIntWr(_attid,MED_NOM_ATT,&_medintconstatttype) < 0 ) {
160     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,_path);
161     SSCRUTE(MED_NOM_ATT);ISCRUTE(_medintconstatttype);
162     goto ERROR;
163   }
164 
165   /*
166    * Creation/Ecriture de l'attribut MED_NOM_NCO (nombre de composantes des valeurs de l'attribut.)
167    */
168   if ( _MEDattributeIntWr(_attid,MED_NOM_NCO,&ncomponent) < 0 ) {
169     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,_path);
170     SSCRUTE(MED_NOM_NCO);ISCRUTE(ncomponent);
171     goto ERROR;
172   }
173 
174   /*
175    * Creation/Ecriture de l'attribut MED_NOM_ENT (type d'entité support concerné par l'attribut)
176    */
177   if ( _MEDattributeIntWr(_attid,MED_NOM_ENT,&_intentitytype) < 0 ) {
178     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,_path);
179     SSCRUTE(MED_NOM_ENT);ISCRUTE(_intentitytype);
180     goto ERROR;
181   }
182 
183   /*
184    * Creation/Ecriture de l'attribut MED_NOM_PFL (nom de profil sur le maillage support)
185    */
186   if ( strlen(profilename) ) {
187 /*     _profilename=(const char *)profilename; */
188     _true_or_false=_true;
189   }
190 
191   if ( _MEDattributeIntWr(_cstid,MED_NOM_PFU,&_true_or_false) < 0) {
192     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_STRUCT_MSG);
193     SSCRUTE(modelname);;SSCRUTE(MED_NOM_PFU);
194     goto ERROR;
195   }
196 
197   if ( _MEDattributeStringWr(_attid,MED_NOM_PFL,MED_NAME_SIZE,profilename) < 0) {
198     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,_path);
199     SSCRUTE(MED_NOM_PFL);SSCRUTE(profilename);
200     goto ERROR;
201   }
202 
203   if ( MEDfilterEntityCr(fid, _nentity, 1, ncomponent, MED_ALL_CONSTITUENT,
204 			 MED_FULL_INTERLACE,MED_COMPACT_STMODE,
205 			 profilename, MED_UNDEF_SIZE, NULL, &_filter) < 0 ) {
206     MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_FILTER,MED_ERR_INTERNAL_MSG);
207     goto ERROR;
208   }
209 
210   if ( _MEDdatasetWr(_attid,MED_NOM_COR,constatttype,&_filter, value) < 0) {
211     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_DATASET,MED_NOM_COR);
212     SSCRUTE(_path);
213     goto ERROR;
214   }
215 
216   if ( MEDfilterClose(&_filter) < 0 ) {
217     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_FILTER,MED_ERR_STRUCT_ELEMENT_MSG);
218     SSCRUTE(_path);
219     goto ERROR;
220   }
221 
222   /* ??? */
223 /*   if ((_dataset = _MEDdatasetOuvrir(_datagroup2,MED_NOM_COR)) < 0) { */
224 /*     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATASET,MED_NOM_COR); */
225 /*     SSCRUTE(_path);ISCRUTE(numdt);ISCRUTE(numit);SSCRUTE(_datagroupname2); */
226 /*     goto ERROR; */
227 /*   } */
228 
229 /*   if ( _MEDattributeIntWr(_dataset,MED_NOM_NBR,&nentity) < 0) { */
230 /*     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_EQUIVALENCE_MSG); */
231 /*     SSCRUTE(_path);ISCRUTE(numdt);ISCRUTE(numit);SSCRUTE(_datagroupname2); */
232 /*     SSCRUTE(MED_NOM_NBR);ISCRUTE(nentity);goto ERROR; */
233 /*   } */
234   /* ??? */
235 
236 
237   _ret=0;
238  ERROR:
239 
240   if (_attid>0)            if (_MEDdatagroupFermer(_attid) < 0) {
241     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_path);
242     ISCRUTE_id(_attid);
243   }
244 
245   if (_cstid>0)            if (_MEDdatagroupFermer(_cstid) < 0) {
246     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,MED_CSTATR_NOM);
247     ISCRUTE_id(_cstid);
248   }
249 
250   if (_elemid>0)            if (_MEDdatagroupFermer(_elemid) < 0) {
251     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,modelname);
252     ISCRUTE_id(_elemid);
253   }
254 
255   return _ret;
256 }
257