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 #include <stdlib.h>
24
_MEDmeshAdvancedWr(const med_idt fid,const char * const meshname,const med_data_type meddatatype,const char * const datasetname,const med_internal_type datatype,const med_int numdt,const med_int numit,const med_float dt,const med_entity_type entitytype,const med_geometry_type geotype,const med_connectivity_mode cmode,const med_storage_mode storagemode,const char * const profilename,const med_switch_mode switchmode,const med_int dimselect,const med_filter * const filter,const med_int nentity,const void * const value)25 med_err _MEDmeshAdvancedWr(const med_idt fid,
26 const char* const meshname,
27 const med_data_type meddatatype,
28 const char* const datasetname,
29 const med_internal_type datatype,
30 const med_int numdt,
31 const med_int numit,
32 const med_float dt,
33 const med_entity_type entitytype,
34 const med_geometry_type geotype,
35 const med_connectivity_mode cmode,
36 const med_storage_mode storagemode,
37 const char * const profilename,
38 const med_switch_mode switchmode,
39 const med_int dimselect,
40 const med_filter * const filter,
41 const med_int nentity,
42 const void * const value)
43 {
44 med_access_mode _MED_ACCESS_MODE;
45 med_err _ret=-1;
46 med_idt _meshid=0, _elemid=0;
47 med_idt _datagroup=0,_fdatagroup=0,_dataset=0;
48 med_idt _datagroup1=0,_datagroup2=0,_datagroup3=0,_datagroup4=0;
49 /* char __meshpath [MED_MESH_GRP_SIZE+MED_NAME_SIZE+1]=MED_MESH_GRP; */
50 /* char __supmeshpath [MED_MESH_SUPPORT_GRP_SIZE+MED_NAME_SIZE+1]=MED_MESH_SUPPORT_GRP; */
51 /* char* _meshpath =__meshpath; */
52 char _meshpath [MED_MESH_SUPPORT_GRP_SIZE+MED_NAME_SIZE+1]="";
53 char _strpath [MED_ELSTRUCT_GRP_SIZE+MED_NAME_SIZE+1]=MED_ELSTRUCT_GRP;
54 char _datagroupname1 [2*MED_MAX_PARA+1]="";
55 char _datagroupname2 [MED_TAILLE_NOM_ENTITE+1]="";
56 char _datagroupname3 [MED_TAILLE_NOM_ENTITE+1]="";
57 char _datagroupname4 [MED_NAME_SIZE+1]="";
58 char _profilename [MED_NAME_SIZE+1]="";
59 char _geotypename [MED_TAILLE_NOM_ENTITE+1]="";
60 char _datasetname[MED_TAILLE_NOM_ENTITE+1]="";
61 char _MED_NOM_COO[]=MED_NOM_COO, _MED_NOM_NOD[]=MED_NOM_NOD,_MED_NOM_DES[]=MED_NOM_DES;
62 med_bool _profilehaschanged=MED_TRUE,_mustnothaveprofile=MED_FALSE;
63 med_bool _filterparameterexist=MED_FALSE,copyfromprevious=MED_FALSE;
64 med_bool _create_dataset = MED_TRUE;
65 /* int _entitydim=0,_entitynnodes=0,_entityndes=0; */
66 med_filter * _filter = NULL;
67 med_filter _tmpfilter = MED_FILTER_INIT;
68 med_filter _paramfilter = MED_FILTER_INIT;
69 med_int _nconstituentpervalue=0,_spacedim=0;
70 med_sorting_type _sortingtype=0;
71 med_int _intsortingtype=0;
72 med_int _false=0,_true=1,_not_the_first_cstp=_false;
73 /* med_int _profilearraysize=0; */
74 med_internal_type _datatype=datatype;
75 med_int _nvalueperentity=0;
76 med_int _nentity=0;
77 med_int _intmeshtype=0;
78 med_int _medintgeotype = geotype;
79 med_geometry_type _sgeotype = MED_NONE;
80 med_int _medintsgeotype= MED_NONE;
81 med_bool _chgt=MED_FALSE,_trsf=MED_FALSE;
82 med_bool _isasupportmesh=MED_FALSE;
83 char _supportmeshname[MED_NAME_SIZE+1]="";
84 med_bool _attributeexist=MED_FALSE;
85
86 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
87
88 if (filter) {
89 _filter=(med_filter*)(filter); _filterparameterexist=MED_TRUE;
90 }
91 else {
92 _filter=&_tmpfilter;
93 (*_filter).nentity = nentity;
94 (*_filter).nvaluesperentity = 1;
95 /* (*_filter).nconstituentpervalue = nconstituentpervalue; */
96 (*_filter).constituentselect = dimselect;
97 (*_filter).switchmode = switchmode;
98 (*_filter).storagemode = storagemode;
99 strcpy((*_filter).profilename,profilename);
100 /* (*_filter).profilearraysize = profilearraysize; */
101 }
102
103 /*
104 * On inhibe le gestionnaire d'erreur HDF 5
105 */
106 _MEDmodeErreurVerrouiller();
107
108 if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
109 MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
110 goto ERROR;
111 }
112
113 if ( _MED_ACCESS_MODE == MED_ACC_RDONLY) {
114 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
115 ISCRUTE_int(_MED_ACCESS_MODE);
116 goto ERROR;
117 }
118
119 /*
120 * Si le DataGroup MED_MESH_GRP n'existe pas => erreur
121 */
122 /* NOFINALBLANK(meshname,ERROR); */
123
124 if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
125 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
126 SSCRUTE(_meshpath); goto ERROR;
127 }
128
129 /* Lecture de l'attribut MED_NOM_ESP */
130 if (_MEDattrEntierLire(_meshid,MED_NOM_ESP,&_spacedim) < 0) {
131 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
132 SSCRUTE(meshname);SSCRUTE(MED_NOM_ESP);ISCRUTE(_spacedim);goto ERROR;
133 }
134
135 /* Lecture de l'attribut MED_NOM_TYP */
136 if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
137 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
138 SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
139 }
140
141 /* L'utilisation de profils pour les maillages structurés est interdite */
142 if ( ( (med_mesh_type) _intmeshtype ) != MED_UNSTRUCTURED_MESH ) _mustnothaveprofile=MED_TRUE;
143
144
145 /* TODO : Externaliser ce traitement lié aux éléments de structures */
146 if ( entitytype == MED_STRUCT_ELEMENT ) {
147 if ( MEDstructElementName(fid, geotype,_geotypename) < 0 ) {
148 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementName");
149 ISCRUTE_int(geotype);goto ERROR;
150 }
151
152 if (meddatatype != MED_VARIABLE_ATTRIBUTE) {
153
154 strcat(_strpath,_geotypename);
155
156 /*
157 * Si le DataGroup /STRUCT/<elementname> n'existe pas => erreur
158 */
159 if ((_elemid = _MEDdatagroupOpen(fid,_strpath)) < 0) {
160 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_strpath);
161 goto ERROR;
162 }
163
164 /*
165 * Lecture de l'attribut MED_NOM_NOM (nom du maillage support)
166 */
167 /* Chercher plutôt ds le maillage support et supprimer les attributs NBM et NBN */
168 if ( _MEDattrStringLire(_elemid,MED_NOM_NOM,MED_NAME_SIZE,_supportmeshname) < 0) {
169 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_strpath);
170 SSCRUTE(MED_NOM_NOM);SSCRUTE(_supportmeshname);
171 goto ERROR;
172 }
173
174 /*
175 * Lecture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
176 */
177 if ( _MEDattrEntierLire(_elemid,MED_NOM_GEO,&_medintsgeotype) < 0 ) {
178 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_strpath);
179 SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintsgeotype);
180 goto ERROR;
181 }
182 _sgeotype = _medintsgeotype;
183
184 if (strlen(_supportmeshname) )
185 if ( (_nvalueperentity = MEDmeshnEntity(fid,_supportmeshname,MED_NO_DT,MED_NO_IT,
186 MED_CELL,_sgeotype,MED_CONNECTIVITY,MED_NODAL,
187 &_chgt,&_trsf) ) < 0) {
188 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDmeshnEntity");
189 ISCRUTE(_nvalueperentity);goto ERROR;
190 }
191
192 if (_nvalueperentity ) {
193 if (!_nconstituentpervalue) _nconstituentpervalue=_sgeotype%100;
194 } else {
195 _nvalueperentity=1;
196 if (!_nconstituentpervalue) _nconstituentpervalue=1;
197 }
198
199 }
200 }
201
202 if (meddatatype == MED_VARIABLE_ATTRIBUTE) {
203 if ( MEDstructElementVarAttInfoByName(fid,
204 _geotypename,
205 datasetname,
206 (med_attribute_type* const) &_datatype,
207 &_nconstituentpervalue
208 ) < 0) {
209 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementVarAttInfoByName");
210 ISCRUTE_int(geotype);SSCRUTE(datasetname);
211 ISCRUTE_int(_datatype);ISCRUTE(_nconstituentpervalue);goto ERROR;
212 }
213 _nvalueperentity=1;
214 }
215
216 /* FIN TODO structelem*/
217
218
219 /* Si un nom de dataset est précisé, il est prioritaire sur la detection automatique en
220 fonction des paramètres meddatatype et cmode */
221 if ( !strlen(datasetname) ) {
222 if ( _MEDgetDatasetName( _datasetname, meddatatype, cmode ) < 0 ) {
223 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetname");
224 ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);SSCRUTE( _datasetname);goto ERROR;
225 }
226 } else
227 strncpy(_datasetname,datasetname,MED_TAILLE_NOM_ENTITE+1);
228
229
230 /* Si un type de dataset est précisé, il est prioritaire sur la détection
231 automatique du nom en fonction des paramètres meddatatype et cmode */
232 /* TODO : renommer datatype en idatatype (internal) */
233 if ( _datatype == MED_INTERNAL_UNDEF)
234 if ( _MEDgetDatatype( &_datatype, meddatatype, cmode ) < 0 ) {
235 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatatype");
236 ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);ISCRUTE_int(_datatype);goto ERROR;
237 }
238
239 /* Vérification :
240 Le type de données MED traitées sont-elles compatibles avec le type de maillage ?
241 */
242 /* REM : Si datasetname ou datatype ne sont pas précisés, meddatatype doit l'être */
243 if ( meddatatype != MED_UNDEF_DATATYPE )
244 if ( _MEDmeshtypeCompatibility(meddatatype, _intmeshtype) < 0) {
245 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_MEDDATATYPE,MED_ERR_VALUE_MSG);
246 ISCRUTE_int(meddatatype);ISCRUTE(_intmeshtype);goto ERROR;
247 }
248
249 if ( ! (_nvalueperentity && _nconstituentpervalue) )
250 if ( _MEDgetDatasetParameter( meddatatype, _spacedim, entitytype, geotype, cmode,
251 &_nvalueperentity,&_nconstituentpervalue) < 0 ) {
252 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetParameter");
253 ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);ISCRUTE(_nvalueperentity);
254 ISCRUTE(_nconstituentpervalue);goto ERROR;
255 }
256
257 /* ISCRUTE(_nconstituentpervalue); */
258
259 if (_filterparameterexist) {
260 if ((*_filter).nconstituentpervalue != _nconstituentpervalue ) {
261 MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
262 ISCRUTE((*_filter).nconstituentpervalue); ISCRUTE(_nconstituentpervalue );
263 goto ERROR;
264 }
265 if ((*_filter).nvaluesperentity != _nvalueperentity ) {
266 MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
267 ISCRUTE((*_filter).nvaluesperentity); ISCRUTE(_nvalueperentity );
268 goto ERROR;
269 }
270 } else {
271 (*_filter).nconstituentpervalue = _nconstituentpervalue;
272 (*_filter).nvaluesperentity = _nvalueperentity;
273 }
274
275
276 /*
277 * Creation/Ouverture du datagroup de niveau 2 <numdt>.<numit>
278 */
279 if ( _MEDattrEntierLire(_meshid,MED_NOM_SRT,&_intsortingtype) < 0) {
280 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
281 SSCRUTE(meshname);SSCRUTE(MED_NOM_SRT);ISCRUTE(_intsortingtype);goto ERROR;
282 }
283 _sortingtype = (med_sorting_type) (_intsortingtype);
284
285 _MEDgetComputationStepName(_sortingtype,numdt,numit,_datagroupname1);
286
287 if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
288 if ( MEDmeshComputationStepCr(fid,meshname,numdt,numit,numdt,numit,dt) < 0 ) {
289 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_COMPUTINGSTEP,MED_ERR_MESH_MSG);
290 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
291 } else {
292 /* SSCRUTE(_datagroupname1);ISCRUTE(_datagroup1); */
293 if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
294 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
295 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
296 SSCRUTE(_datagroupname1);ISCRUTE_id(_datagroup1);goto ERROR;
297 }
298
299 if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) copyfromprevious=MED_TRUE;
300 }
301 }
302
303
304
305 /*
306 * Creation/Ouverture du datagroup de niveau 3 <entitytype>
307 */
308 if (_MEDgetEntityTypeName(_datagroupname2,entitytype) < 0) {
309 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
310 ISCRUTE_int(entitytype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
311 }
312
313 if ((_datagroup2 = _MEDdatagroupOuvrir(_datagroup1,_datagroupname2)) < 0) {
314 if ( copyfromprevious) {
315 MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
316 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
317 goto ERROR;
318 } else {
319 if ((_datagroup2 = _MEDdatagroupCreer(_datagroup1,_datagroupname2)) < 0 ) {
320 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
321 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
322 goto ERROR;
323 }
324 }
325 }
326
327
328 /*
329 * Creation/Ouverture du datagroup de niveau 4 [.<geotype>]
330 */
331
332 if ( entitytype != MED_NODE ) {
333
334 if (strlen(_geotypename))
335 strncpy(_datagroupname3,_geotypename,MED_NAME_SIZE+1);
336 else
337 if ( _MEDgetInternalGeometryTypeName(fid,_datagroupname3,geotype) < 0) {
338 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_GEOMETRIC,MED_ERR_VALUE_MSG);
339 ISCRUTE_int(geotype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
340 SSCRUTE(_datagroupname2);goto ERROR;
341 }
342
343 if ((_datagroup3 = _MEDdatagroupOuvrir(_datagroup2,_datagroupname3)) < 0) {
344 if ( copyfromprevious) {
345 MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
346 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
347 SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
348 } else {
349 if ((_datagroup3 = _MEDdatagroupCreer(_datagroup2,_datagroupname3)) < 0 ) {
350 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
351 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
352 SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
353 }
354 }
355 }
356 }
357
358 if (_datagroup3) _datagroup=_datagroup3; else _datagroup=_datagroup2;
359
360 /*
361 * Creation/Ouverture du datagroup de niveau 5 [VARATR]
362 */
363 /*Problème d'activation du profil */
364 if ( (meddatatype == MED_VARIABLE_ATTRIBUTE) || (meddatatype == MED_COORDINATE_TRSF) ) {
365 /* TODO : Pour simplifier et systématiser la procédure il faut
366 créer une routine spécifique qui donne le nom du datagroup supplémentaire optionnel.
367 Si le retour est "" ne pas créer le datagroup. */
368 if (meddatatype == MED_VARIABLE_ATTRIBUTE)
369 strcpy(_datagroupname4,MED_VARATR_NOM);
370 else
371 strcpy(_datagroupname4,MED_COOTRF_NOM);
372 if ((_datagroup4 = _MEDdatagroupOuvrir(_datagroup,_datagroupname4)) < 0) {
373 if ( copyfromprevious) {
374 MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
375 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
376 SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);goto ERROR;
377 } else {
378 if ((_datagroup4 = _MEDdatagroupCreer(_datagroup,_datagroupname4)) < 0 ) {
379 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
380 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
381 SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);goto ERROR;
382 }
383 }
384 }
385 }
386 if (_datagroup4) _fdatagroup=_datagroup4; else _fdatagroup=_datagroup;
387
388 /*
389 * Attribut PFL
390 */
391
392 if ( !strncmp((*_filter).profilename,MED_SAME_PROFILE_INTERNAL,MED_NAME_SIZE+1) ) {
393 if ( _MEDattrStringLire(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
394 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
395 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
396 SSCRUTE(_datagroupname3); SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR;
397 }
398 if ( strncmp(_profilename,MED_NO_PROFILE_INTERNAL,MED_NAME_SIZE+1) )
399 strncpy((*_filter).profilename,_profilename,MED_NAME_SIZE+1);
400 else
401 (*_filter).profilename[0]='\0';
402
403 _profilehaschanged = MED_FALSE;
404 }
405
406 if ( _mustnothaveprofile && strlen((*_filter).profilename) ) {
407 MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_PROFILE,MED_ERR_MESH_MSG);
408 SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);
409 SSCRUTE((*_filter).profilename);goto ERROR;
410 }
411
412 if ( strlen((*_filter).profilename) == 0 ) { /* idem MED_NOPFL*/
413 strncpy(_profilename,MED_NO_PROFILE_INTERNAL,MED_NAME_SIZE+1);
414 } else {
415 strncpy(_profilename,(*_filter).profilename,MED_NAME_SIZE+1);
416 _profilename[MED_NAME_SIZE]='\0'; /*On tronque les eventuels noms trop long*/
417 }
418
419
420 if (!_filterparameterexist) {
421
422 #ifdef _DEBUG_
423 ISCRUTE((*_filter).nentity );
424 ISCRUTE((*_filter).nvaluesperentity );
425 ISCRUTE((*_filter).nconstituentpervalue );
426 ISCRUTE((*_filter).constituentselect );
427 ISCRUTE_int((*_filter).switchmode );
428 ISCRUTE((*_filter).filterarraysize );
429 ISCRUTE((*_filter).profilearraysize );
430 ISCRUTE_int((*_filter).storagemode );
431 SSCRUTE((*_filter).profilename );
432 #endif
433
434 if ( MEDfilterEntityCr(fid, (*_filter).nentity, (*_filter).nvaluesperentity,
435 (*_filter).nconstituentpervalue, (*_filter).constituentselect,
436 (*_filter).switchmode, (*_filter).storagemode,
437 (*_filter).profilename, MED_UNDEF_SIZE, NULL, &_paramfilter) < 0 ) {
438 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_FILTER,MED_ERR_INTERNAL_MSG);
439 goto ERROR;
440 }
441 _filter = &_paramfilter;
442 }
443
444 #ifdef _DEBUG_
445 ISCRUTE((*_filter).nentity );
446 ISCRUTE((*_filter).nvaluesperentity );
447 ISCRUTE((*_filter).nconstituentpervalue );
448 ISCRUTE((*_filter).constituentselect );
449 ISCRUTE_int((*_filter).switchmode );
450 ISCRUTE((*_filter).filterarraysize );
451 ISCRUTE((*_filter).profilearraysize );
452 ISCRUTE_int((*_filter).storagemode );
453 SSCRUTE((*_filter).profilename );
454 #endif
455
456 /* if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) _not_the_first_cstp=_true; */
457 _not_the_first_cstp=_true;
458
459 /* Pour le bon fonctionnement de MEDmeshnEntity sur la connectivité des MED_PARTICLE :
460 Obtenir le nbre de particules
461 TODO : A remonter dans MEDmeshConne.. avec nentity==0 */
462 if ( ( meddatatype == MED_CONNECTIVITY) && (!strcmp(_geotypename,"MED_PARTICLE")) ) {
463 _nentity = (*_filter).nentity;
464 (*_filter).nentity= 0;
465 }
466
467 /* Externaliser le choix d'écriture effective du dataset */
468 /* if ( ( meddatatype == MED_COORDINATE_TRSF) & ( !_not_the_first_cstp ) ) */
469 /* _create_dataset=MED_FALSE; */
470
471 if (_create_dataset)
472 if ( _MEDdatasetWr(_fdatagroup,_datasetname,_datatype,_filter,value) < 0) {
473 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_DATASET,_datasetname);
474 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
475 SSCRUTE(_profilename);goto ERROR;
476 }
477
478 if ( ( meddatatype == MED_CONNECTIVITY) && (!strcmp(_geotypename,"MED_PARTICLE")) ) {
479 (*_filter).nentity= _nentity;
480 }
481
482
483 /*
484 * Attribut PFL
485 */
486 if (_profilehaschanged)
487 if ( _MEDattributeStringWr(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
488 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
489 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
490 SSCRUTE(_profilename);goto ERROR;
491 }
492
493 /*
494 * Creation/Ecriture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
495 */
496 if ( entitytype != MED_NODE ) {
497 if ( _MEDattributeExist(_datagroup, ".",MED_NOM_GEO, &_attributeexist ) < 0 ) {
498 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDattributeExist"); goto ERROR;
499 }
500
501 if (!_attributeexist) /* MED_ACC_RDEXT */
502 if ( _MEDattributeIntWr(_datagroup,MED_NOM_GEO,&_medintgeotype) < 0 ) {
503 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
504 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
505 SSCRUTE(MED_NOM_PFL);SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintgeotype);
506 goto ERROR;
507 }
508 }
509
510 /*
511 * Attribut NBR (nombre de noeuds ou d'elements) sur le dataset
512 */
513 if (_create_dataset) {
514
515 if ((_dataset = _MEDdatasetOuvrir(_fdatagroup,_datasetname)) < 0) {
516 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATASET,_datasetname);
517 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
518 SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
519 }
520
521 if ( _MEDattributeIntWr(_dataset,MED_NOM_NBR,&((*_filter).nentity)) < 0) {
522 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
523 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
524 SSCRUTE(MED_NOM_NBR);ISCRUTE((*_filter).nentity);goto ERROR;
525 }
526 }
527
528 /*
529 * Attribut CGTs (un changement a eu lieu depuis l'étape de calcul précédente)
530 */
531 if ( _MEDattributeIntWr(_datagroup1,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
532 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
533 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(MED_NOM_CGT);
534 goto ERROR;
535 }
536
537 if ( _MEDattributeIntWr(_datagroup2,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
538 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
539 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
540 SSCRUTE(MED_NOM_CGT);goto ERROR;
541 }
542
543 if (_datagroup3)
544 if ( _MEDattributeIntWr(_datagroup3,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
545 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
546 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
547 SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);goto ERROR;
548 }
549
550 /*Un changement complémentaire à l'information principale a changé*/
551 if ( ( meddatatype != MED_CONNECTIVITY) && ( meddatatype != MED_COORDINATE )
552 &&(meddatatype != MED_COORDINATE_AXIS1)&&(meddatatype != MED_COORDINATE_AXIS2)
553 &&(meddatatype != MED_COORDINATE_AXIS3)&&(meddatatype != MED_INDEX_FACE)
554 && (meddatatype != MED_INDEX_NODE)
555 ) {
556 if ( _MEDattributeIntWr(_datagroup,MED_NOM_CGS,&_not_the_first_cstp) < 0) {
557 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
558 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
559 SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
560 }
561 } else
562 if ( _MEDattributeIntWr(_datagroup,MED_NOM_CGS,&_false) < 0) {
563 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
564 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
565 SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
566 }
567
568 if (_datagroup4)
569 if ( _MEDattributeIntWr(_datagroup4,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
570 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
571 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
572 SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);SSCRUTE(MED_NOM_CGT);
573 goto ERROR;
574 }
575
576 if (_create_dataset)
577 if ( _MEDattributeIntWr(_dataset,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
578 MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
579 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
580 SSCRUTE(_datagroupname3);SSCRUTE(datasetname);SSCRUTE(MED_NOM_CGT);goto ERROR;
581 }
582
583 _ret = 0;
584
585 ERROR:
586
587 if (!_filterparameterexist) {
588 if ( MEDfilterClose(_filter) < 0 ) {
589 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_FILTER,MED_ERR_MESH_MSG);
590 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
591 SSCRUTE(_profilename);goto ERROR;
592 }
593 }
594
595 if (_dataset>0) if (_MEDdatasetFermer(_dataset) < 0) {
596 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATASET,MED_NOM_COO);
597 ISCRUTE_id(_dataset);
598 }
599
600 if (_datagroup4>0) if (_MEDdatagroupFermer(_datagroup4) < 0) {
601 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,MED_VARATR_NOM);
602 ISCRUTE_id(_datagroup4);
603 }
604
605 if (_datagroup3>0) if (_MEDdatagroupFermer(_datagroup3) < 0) {
606 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_profilename);
607 ISCRUTE_id(_datagroup3);
608 }
609
610 if (_datagroup2>0) if (_MEDdatagroupFermer(_datagroup2) < 0) {
611 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
612 ISCRUTE_id(_datagroup2);
613 }
614
615 if (_datagroup1>0) if (_MEDdatagroupFermer(_datagroup1) < 0) {
616 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname1);
617 ISCRUTE_id(_datagroup1);
618 }
619
620 if (_meshid>0) if (_MEDdatagroupFermer(_meshid) < 0) {
621 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
622 ISCRUTE_id(_meshid);
623 }
624
625 if (_elemid>0) if (_MEDdatagroupFermer(_elemid) < 0) {
626 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_geotypename);
627 ISCRUTE_id(_elemid);
628 }
629
630
631 return _ret;
632 }
633
634