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