# _MEDmeshAdvancedWr.c

Aller à la documentation de ce fichier.

    00001 /*  This file is part of MED.
    00002  *
    00003  *  COPYRIGHT (C) 1999 - 2011  EDF R&D, CEA/DEN
    00004  *  MED is free software: you can redistribute it and/or modify
    00005  *  it under the terms of the GNU Lesser General Public License as published by
    00006  *  the Free Software Foundation, either version 3 of the License, or
    00007  *  (at your option) any later version.
    00008  *
    00009  *  MED is distributed in the hope that it will be useful,
    00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00012  *  GNU Lesser General Public License for more details.
    00013  *
    00014  *  You should have received a copy of the GNU Lesser General Public License
    00015  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
    00016  */
    00017
    00018
    00019 #include <med.h>
    00020 #include <med_config.h>
    00021 #include <med_outils.h>
    00022 #include <string.h>
    00023 #include <stdlib.h>
    00024
    00025 med_err _MEDmeshAdvancedWr(const med_idt               fid,
    00026                            const char*  const          meshname,
    00027                            const med_data_type         meddatatype,
    00028                            const char*  const          datasetname,
    00029                            const med_internal_type     datatype,
    00030                            const med_int               numdt,
    00031                            const med_int               numit,
    00032                            const med_float             dt,
    00033                            const med_entity_type       entitytype,
    00034                            const med_geometry_type     geotype,
    00035                            const med_connectivity_mode cmode,
    00036                            const med_storage_mode      storagemode,
    00037                            const char * const          profilename,
    00038                            const med_switch_mode       switchmode,
    00039                            const med_int               dimselect,
    00040                            const med_filter * const    filter,
    00041                            const med_int               nbofentity,
    00042                            const void * const          value)
    00043 {
    00044   med_access_mode       _MED_ACCESS_MODE;
    00045   med_err               _ret=-1;
    00046   med_idt               _meshid=0, _elemid=0;
    00047   med_idt               _datagroup=0,_fdatagroup=0,_dataset=0;
    00048   med_idt               _datagroup1=0,_datagroup2=0,_datagroup3=0,_datagroup4=0;
    00049 /*   char                  __meshpath        [MED_TAILLE_MAA+MED_NAME_SIZE+1]=MED_MAA; */
    00050 /*   char                  __supmeshpath     [MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1]=MED_SUP_MAA; */
    00051 /*   char*                 _meshpath         =__meshpath; */
    00052   char                  _meshpath        [MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1]="";
    00053   char                  _strpath          [MED_TAILLE_STRCT+MED_NAME_SIZE+1]=MED_STRCT;
    00054   char                  _datagroupname1   [2*MED_MAX_PARA+1]="";
    00055   char                  _datagroupname2   [MED_TAILLE_NOM_ENTITE+1]="";
    00056   char                  _datagroupname3   [MED_TAILLE_NOM_ENTITE+1]="";
    00057   char                  _datagroupname4   [MED_NAME_SIZE+1]="";
    00058   char                  _profilename      [MED_NAME_SIZE+1]="";
    00059   char                  _geotypename      [MED_TAILLE_NOM_ENTITE+1]="";
    00060   char                  _datasetname[MED_TAILLE_NOM_ENTITE+1]="";
    00061   char                  _MED_NOM_COO[]=MED_NOM_COO, _MED_NOM_NOD[]=MED_NOM_NOD,_MED_NOM_DES[]=MED_NOM_DES;
    00062   med_bool              _profilehaschanged=MED_TRUE,_mustnothaveprofile=MED_FALSE;
    00063   med_bool              _filterparameterexist=MED_FALSE,copyfromprevious=MED_FALSE;
    00064   med_bool              _create_dataset = MED_TRUE;
    00065   /*   int                   _entitydim=0,_entitynnodes=0,_entityndes=0; */
    00066   med_filter *          _filter           = NULL;
    00067   med_filter            _tmpfilter        = MED_FILTER_INIT;
    00068   med_filter            _paramfilter      = MED_FILTER_INIT;
    00069   med_int               _nbofconstituentpervalue=0,_spacedim=0;
    00070   med_sorting_type      _sortingtype=0;
    00071   med_int               _intsortingtype=0;
    00072   med_int               _false=0,_true=1,_not_the_first_cstp=_false;
    00073   /*   med_int               _profilearraysize=0; */
    00074   med_internal_type     _datatype=datatype;
    00075   med_int               _nbofvalueperentity=0;
    00076   med_int               _nbofentity=0;
    00077   med_int               _intmeshtype=0;
    00078   med_int               _medintgeotype = geotype;
    00079   med_geometry_type     _sgeotype      = MED_NONE;
    00080   med_int               _medintsgeotype= MED_NONE;
    00081   med_bool              _chgt=MED_FALSE,_trsf=MED_FALSE;
    00082   med_bool              _isasupportmesh=MED_FALSE;
    00083   char                  _supportmeshname[MED_NAME_SIZE+1]="";
    00084   med_bool              _attributeexist=MED_FALSE;
    00085
    00086 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
    00087
    00088   if (filter) {
    00089     _filter=(med_filter*)(filter); _filterparameterexist=MED_TRUE;
    00090   }
    00091   else {
    00092     _filter=&_tmpfilter;
    00093     (*_filter).nbofentity              = nbofentity;
    00094     (*_filter).nbofvaluesperentity     = 1;
    00095     /*   (*_filter).nbofconstituentpervalue = nbofconstituentpervalue; */
    00096     (*_filter).constituentselect       = dimselect;
    00097     (*_filter).switchmode              = switchmode;
    00098     (*_filter).storagemode             = storagemode;
    00099     strcpy((*_filter).profilename,profilename);
    00100     /*   (*_filter).profilearraysize        = profilearraysize; */
    00101   }
    00102
    00103   /*
    00104    * On inhibe le gestionnaire d'erreur HDF 5
    00105    */
    00106   _MEDmodeErreurVerrouiller();
    00107
    00108   if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
    00109     MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
    00110     goto ERROR;
    00111   }
    00112
    00113   if ( _MED_ACCESS_MODE == MED_ACC_RDONLY) {
    00114     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
    00115     ISCRUTE_int(_MED_ACCESS_MODE);
    00116     goto ERROR;
    00117   }
    00118
    00119   /*
    00120    * Si le DataGroup MED_MAA n'existe pas => erreur
    00121    */
    00122 /*   NOFINALBLANK(meshname,ERROR); */
    00123
    00124   if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
    00125     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00126     SSCRUTE(_meshpath); goto ERROR;
    00127   }
    00128
    00129   /* Lecture de l'attribut MED_NOM_ESP  */
    00130   if (_MEDattrEntierLire(_meshid,MED_NOM_ESP,&_spacedim) < 0) {
    00131     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00132     SSCRUTE(meshname);SSCRUTE(MED_NOM_ESP);ISCRUTE(_spacedim);goto ERROR;
    00133   }
    00134
    00135   /* Lecture de l'attribut MED_NOM_TYP  */
    00136   if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
    00137     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00138     SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
    00139   }
    00140
    00141   /* L'utilisation de profils pour les maillages structurés est interdite */
    00142   if ( ( (med_mesh_type) _intmeshtype ) != MED_UNSTRUCTURED_MESH ) _mustnothaveprofile=MED_TRUE;
    00143
    00144
    00145   /* TODO : Externaliser ce traitement lié  aux éléments de structures */
    00146   if ( entitytype == MED_STRUCT_ELEMENT ) {
    00147     if ( MEDstructElementName(fid, geotype,_geotypename) < 0 ) {
    00148       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementName");
    00149       ISCRUTE_int(geotype);goto ERROR;
    00150     }
    00151
    00152     if (meddatatype != MED_VARIABLE_ATTRIBUTE) {
    00153
    00154       strcat(_strpath,_geotypename);
    00155
    00156       /*
    00157        * Si le DataGroup /STRUCT/<elementname> n'existe pas => erreur
    00158        */
    00159       if ((_elemid = _MEDdatagroupOpen(fid,_strpath)) < 0)  {
    00160         MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_strpath);
    00161         goto ERROR;
    00162       }
    00163
    00164       /*
    00165        * Lecture de l'attribut MED_NOM_NOM (nom du maillage support)
    00166        */
    00167       /* Chercher plutôt ds le maillage support et supprimer les attributs NBM et NBN */
    00168       if ( _MEDattrStringLire(_elemid,MED_NOM_NOM,MED_NAME_SIZE,_supportmeshname) < 0) {
    00169         MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_strpath);
    00170         SSCRUTE(MED_NOM_NOM);SSCRUTE(_supportmeshname);
    00171         goto ERROR;
    00172       }
    00173
    00174       /*
    00175        * Lecture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
    00176        */
    00177       if ( _MEDattrEntierLire(_elemid,MED_NOM_GEO,&_medintsgeotype) < 0 ) {
    00178         MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_strpath);
    00179         SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintsgeotype);
    00180         goto ERROR;
    00181       }
    00182       _sgeotype = _medintsgeotype;
    00183
    00184       if (strlen(_supportmeshname) )
    00185         if ( (_nbofvalueperentity = MEDmeshnEntity(fid,_supportmeshname,MED_NO_DT,MED_NO_IT,
    00186                                                    MED_CELL,_sgeotype,MED_CONNECTIVITY,MED_NODAL,
    00187                                                    &_chgt,&_trsf) )  < 0) {
    00188           MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDmeshnEntity");
    00189           ISCRUTE(_nbofvalueperentity);goto ERROR;
    00190         }
    00191
    00192       if (_nbofvalueperentity ) {
    00193         if (!_nbofconstituentpervalue) _nbofconstituentpervalue=_sgeotype%100;
    00194       } else {
    00195         _nbofvalueperentity=1;
    00196         if (!_nbofconstituentpervalue) _nbofconstituentpervalue=1;
    00197       }
    00198
    00199     }
    00200   }
    00201
    00202   if (meddatatype == MED_VARIABLE_ATTRIBUTE) {
    00203     if ( MEDstructElementVarAttInfoByName(fid,
    00204                                           _geotypename,
    00205                                           datasetname,
    00206                                           (med_attribute_type* const) &_datatype,
    00207                                           &_nbofconstituentpervalue
    00208                                           ) < 0) {
    00209       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementVarAttInfoByName");
    00210       ISCRUTE_int(geotype);SSCRUTE(datasetname);
    00211       ISCRUTE_int(_datatype);ISCRUTE(_nbofconstituentpervalue);goto ERROR;
    00212     }
    00213     _nbofvalueperentity=1;
    00214   }
    00215
    00216   /* FIN TODO structelem*/
    00217
    00218
    00219   /* Si un nom de dataset est précisé, il est prioritaire sur la detection automatique en
    00220      fonction des paramètres meddatatype et cmode */
    00221   if ( !strlen(datasetname) ) {
    00222     if ( _MEDgetDatasetName( _datasetname, meddatatype, cmode ) < 0 ) {
    00223       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetname");
    00224       ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);SSCRUTE( _datasetname);goto ERROR;
    00225     }
    00226   } else
    00227     strncpy(_datasetname,datasetname,MED_TAILLE_NOM_ENTITE+1);
    00228
    00229
    00230   /* Si un type de dataset est précisé, il est prioritaire sur la détection
    00231      automatique du nom en fonction des paramètres meddatatype et cmode */
    00232   /* TODO : renommer datatype en idatatype (internal) */
    00233   if ( _datatype == MED_INTERNAL_UNDEF)
    00234     if ( _MEDgetDatatype( &_datatype, meddatatype, cmode ) < 0 ) {
    00235       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatatype");
    00236       ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);ISCRUTE_int(_datatype);goto ERROR;
    00237     }
    00238
    00239   /* Vérification :
    00240      Le type de données MED traitées sont-elles compatibles avec le type de maillage ?
    00241   */
    00242   /* REM : Si datasetname ou datatype ne sont pas précisés, meddatatype doit l'être */
    00243   if ( meddatatype != MED_UNDEF_DATATYPE )
    00244     if ( _MEDmeshtypeCompatibility(meddatatype, _intmeshtype) < 0) {
    00245       MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_MEDDATATYPE,MED_ERR_VALUE_MSG);
    00246       ISCRUTE_int(meddatatype);ISCRUTE(_intmeshtype);goto ERROR;
    00247     }
    00248
    00249   if ( ! (_nbofvalueperentity && _nbofconstituentpervalue) )
    00250     if ( _MEDgetDatasetParameter( meddatatype, _spacedim, entitytype, geotype, cmode,
    00251                                   &_nbofvalueperentity,&_nbofconstituentpervalue) < 0 ) {
    00252       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetParameter");
    00253       ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);ISCRUTE(_nbofvalueperentity);
    00254       ISCRUTE(_nbofconstituentpervalue);goto ERROR;
    00255     }
    00256
    00257   /*     ISCRUTE(_nbofconstituentpervalue); */
    00258
    00259   if (_filterparameterexist) {
    00260     if ((*_filter).nbofconstituentpervalue != _nbofconstituentpervalue ) {
    00261       MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
    00262       ISCRUTE((*_filter).nbofconstituentpervalue); ISCRUTE(_nbofconstituentpervalue );
    00263       goto ERROR;
    00264     }
    00265     if ((*_filter).nbofvaluesperentity != _nbofvalueperentity ) {
    00266       MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
    00267       ISCRUTE((*_filter).nbofvaluesperentity); ISCRUTE(_nbofvalueperentity );
    00268       goto ERROR;
    00269     }
    00270   } else {
    00271     (*_filter).nbofconstituentpervalue = _nbofconstituentpervalue;
    00272     (*_filter).nbofvaluesperentity     = _nbofvalueperentity;
    00273   }
    00274
    00275
    00276   /*
    00277    * Creation/Ouverture du datagroup de niveau 2 <numdt>.<numit>
    00278    */
    00279   if ( _MEDattrEntierLire(_meshid,MED_NOM_SRT,&_intsortingtype) < 0) {
    00280     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00281     SSCRUTE(meshname);SSCRUTE(MED_NOM_SRT);ISCRUTE(_intsortingtype);goto ERROR;
    00282   }
    00283   _sortingtype = (med_sorting_type) (_intsortingtype);
    00284
    00285   _MEDgetComputationStepName(_sortingtype,numdt,numit,_datagroupname1);
    00286
    00287   if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
    00288     if ( MEDmeshComputationStepCr(fid,meshname,numdt,numit,numdt,numit,dt) < 0 ) {
    00289       MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_COMPUTINGSTEP,MED_ERR_MESH_MSG);
    00290       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
    00291     } else {
    00292       /*       SSCRUTE(_datagroupname1);ISCRUTE(_datagroup1); */
    00293       if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
    00294         MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00295         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00296         SSCRUTE(_datagroupname1);ISCRUTE_id(_datagroup1);goto ERROR;
    00297       }
    00298
    00299       if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) copyfromprevious=MED_TRUE;
    00300     }
    00301   }
    00302
    00303
    00304
    00305   /*
    00306    *  Creation/Ouverture du datagroup de niveau 3 <entitytype>
    00307    */
    00308   if (_MEDgetEntityTypeName(_datagroupname2,entitytype) < 0) {
    00309     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
    00310     ISCRUTE_int(entitytype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
    00311   }
    00312
    00313   if ((_datagroup2 = _MEDdatagroupOuvrir(_datagroup1,_datagroupname2)) < 0) {
    00314     if ( copyfromprevious) {
    00315       MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00316       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00317       goto ERROR;
    00318     } else {
    00319       if ((_datagroup2 = _MEDdatagroupCreer(_datagroup1,_datagroupname2)) < 0 ) {
    00320         MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00321         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00322         goto ERROR;
    00323       }
    00324     }
    00325   }
    00326
    00327
    00328   /*
    00329    *  Creation/Ouverture du datagroup de niveau 4 [.<geotype>]
    00330    */
    00331
    00332   if ( entitytype != MED_NODE ) {
    00333
    00334     if (strlen(_geotypename))
    00335       strncpy(_datagroupname3,_geotypename,MED_NAME_SIZE+1);
    00336     else
    00337       if ( _MEDgetInternalGeometryTypeName(_datagroupname3,geotype) < 0) {
    00338         MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_GEOMETRIC,MED_ERR_VALUE_MSG);
    00339         ISCRUTE_int(geotype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00340         SSCRUTE(_datagroupname2);goto ERROR;
    00341       }
    00342
    00343     if ((_datagroup3 = _MEDdatagroupOuvrir(_datagroup2,_datagroupname3)) < 0) {
    00344       if ( copyfromprevious) {
    00345         MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00346         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00347         SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
    00348       } else {
    00349         if ((_datagroup3 = _MEDdatagroupCreer(_datagroup2,_datagroupname3)) < 0 ) {
    00350           MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00351           SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00352           SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
    00353         }
    00354       }
    00355     }
    00356   }
    00357
    00358   if (_datagroup3) _datagroup=_datagroup3; else _datagroup=_datagroup2;
    00359
    00360   /*
    00361    *  Creation/Ouverture du datagroup de niveau 5 [VARATR]
    00362    */
    00363   /*Problème d'activation du profil */
    00364   if ( (meddatatype == MED_VARIABLE_ATTRIBUTE) || (meddatatype == MED_COORDINATE_TRSF) ) {
    00365     /* TODO : Pour simplifier et systématiser la procédure il faut
    00366        créer une routine spécifique qui donne le nom du datagroup  supplémentaire optionnel.
    00367        Si le retour est "" ne pas créer le datagroup. */
    00368     if (meddatatype == MED_VARIABLE_ATTRIBUTE)
    00369       strcpy(_datagroupname4,MED_VARATR_NOM);
    00370     else
    00371       strcpy(_datagroupname4,MED_COOTRF_NOM);
    00372     if ((_datagroup4 = _MEDdatagroupOuvrir(_datagroup,_datagroupname4)) < 0) {
    00373       if ( copyfromprevious) {
    00374         MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00375         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00376         SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);goto ERROR;
    00377       } else {
    00378         if ((_datagroup4 = _MEDdatagroupCreer(_datagroup,_datagroupname4)) < 0 ) {
    00379           MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00380           SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00381           SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);goto ERROR;
    00382         }
    00383       }
    00384     }
    00385   }
    00386   if (_datagroup4) _fdatagroup=_datagroup4; else _fdatagroup=_datagroup;
    00387
    00388   /*
    00389    * Attribut PFL
    00390    */
    00391
    00392   if ( !strncmp((*_filter).profilename,MED_SAME_PROFILE_INTERNAL,MED_NAME_SIZE+1) ) {
    00393     if ( _MEDattrStringLire(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
    00394       MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00395       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00396       SSCRUTE(_datagroupname3); SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR;
    00397     }
    00398     if ( strncmp(_profilename,MED_NO_PROFILE_INTERNAL,MED_NAME_SIZE+1) )
    00399       strncpy((*_filter).profilename,_profilename,MED_NAME_SIZE+1);
    00400     else
    00401       (*_filter).profilename[0]='\0';
    00402
    00403     _profilehaschanged = MED_FALSE;
    00404   }
    00405
    00406   if ( _mustnothaveprofile && strlen((*_filter).profilename) ) {
    00407     MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_PROFILE,MED_ERR_MESH_MSG);
    00408     SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);
    00409     SSCRUTE((*_filter).profilename);goto ERROR;
    00410   }
    00411
    00412   if ( strlen((*_filter).profilename) == 0 ) {  /* idem MED_NOPFL*/
    00413     strncpy(_profilename,MED_NO_PROFILE_INTERNAL,MED_NAME_SIZE+1);
    00414   } else {
    00415     strncpy(_profilename,(*_filter).profilename,MED_NAME_SIZE+1);
    00416     _profilename[MED_NAME_SIZE]='\0'; /*On tronque les eventuels noms trop long*/
    00417   }
    00418
    00419
    00420   if (!_filterparameterexist) {
    00421
    00422 #ifdef _DEBUG_
    00423     ISCRUTE((*_filter).nbofentity              );
    00424     ISCRUTE((*_filter).nbofvaluesperentity     );
    00425     ISCRUTE((*_filter).nbofconstituentpervalue );
    00426     ISCRUTE((*_filter).constituentselect       );
    00427     ISCRUTE_int((*_filter).switchmode              );
    00428     ISCRUTE((*_filter).filterarraysize         );
    00429     ISCRUTE((*_filter).profilearraysize        );
    00430     ISCRUTE_int((*_filter).storagemode             );
    00431     SSCRUTE((*_filter).profilename             );
    00432 #endif
    00433
    00434     if ( MEDfilterEntityCr(fid, (*_filter).nbofentity,         (*_filter).nbofvaluesperentity,
    00435                            (*_filter).nbofconstituentpervalue, (*_filter).constituentselect,
    00436                            (*_filter).switchmode,              (*_filter).storagemode,
    00437                            (*_filter).profilename, MED_UNDEF_SIZE, NULL, &_paramfilter) < 0 ) {
    00438       MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_FILTER,MED_ERR_INTERNAL_MSG);
    00439       goto ERROR;
    00440     }
    00441     _filter = &_paramfilter;
    00442   }
    00443
    00444 #ifdef _DEBUG_
    00445   ISCRUTE((*_filter).nbofentity              );
    00446   ISCRUTE((*_filter).nbofvaluesperentity     );
    00447   ISCRUTE((*_filter).nbofconstituentpervalue );
    00448   ISCRUTE((*_filter).constituentselect       );
    00449   ISCRUTE_int((*_filter).switchmode              );
    00450   ISCRUTE((*_filter).filterarraysize         );
    00451   ISCRUTE((*_filter).profilearraysize        );
    00452   ISCRUTE_int((*_filter).storagemode             );
    00453   SSCRUTE((*_filter).profilename             );
    00454 #endif
    00455
    00456 /*   if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) _not_the_first_cstp=_true; */
    00457   _not_the_first_cstp=_true;
    00458
    00459   /* Pour le bon fonctionnement de MEDmeshnEntity sur la connectivité des MED_PARTICLE :
    00460      Obtenir le nbre de particules
    00461   TODO : A remonter dans MEDmeshConne.. avec nentity==0 */
    00462   if ( ( meddatatype == MED_CONNECTIVITY) && (!strcmp(_geotypename,"MED_PARTICLE")) ) {
    00463     _nbofentity = (*_filter).nbofentity;
    00464     (*_filter).nbofentity= 0;
    00465   }
    00466
    00467   /* Externaliser le choix d'écriture effective du dataset */
    00468 /*   if ( ( meddatatype == MED_COORDINATE_TRSF) & ( !_not_the_first_cstp ) ) */
    00469 /*     _create_dataset=MED_FALSE; */
    00470
    00471   if (_create_dataset)
    00472     if ( _MEDdatasetWr(_fdatagroup,_datasetname,_datatype,_filter,value) < 0) {
    00473       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_DATASET,_datasetname);
    00474       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
    00475       SSCRUTE(_profilename);goto ERROR;
    00476     }
    00477
    00478   if (  ( meddatatype == MED_CONNECTIVITY) && (!strcmp(_geotypename,"MED_PARTICLE")) ) {
    00479     (*_filter).nbofentity= _nbofentity;
    00480   }
    00481
    00482
    00483   /*
    00484    * Attribut PFL
    00485    */
    00486   if (_profilehaschanged)
    00487     if ( _MEDattributeStringWr(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
    00488       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00489       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
    00490       SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR;
    00491     }
    00492
    00493   /*
    00494    * Creation/Ecriture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
    00495    */
    00496   if ( entitytype != MED_NODE ) {
    00497     if ( _MEDattributeExist(_datagroup, ".",MED_NOM_GEO, &_attributeexist ) < 0 ) {
    00498       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDattributeExist"); goto ERROR;
    00499     }
    00500
    00501     if (!_attributeexist) /* MED_ACC_RDEXT */
    00502       if ( _MEDattributeIntWr(_datagroup,MED_NOM_GEO,&_medintgeotype) < 0 ) {
    00503         MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00504         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
    00505         SSCRUTE(MED_NOM_PFL);SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintgeotype);
    00506         goto ERROR;
    00507       }
    00508   }
    00509
    00510   /*
    00511    * Attribut NBR (nombre de noeuds ou d'elements) sur le dataset
    00512    */
    00513   if (_create_dataset) {
    00514
    00515     if ((_dataset = _MEDdatasetOuvrir(_fdatagroup,_datasetname)) < 0) {
    00516       MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATASET,_datasetname);
    00517       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00518       SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
    00519     }
    00520
    00521     if ( _MEDattributeIntWr(_dataset,MED_NOM_NBR,&((*_filter).nbofentity)) < 0) {
    00522       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00523       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
    00524       SSCRUTE(MED_NOM_NBR);ISCRUTE((*_filter).nbofentity);goto ERROR;
    00525     }
    00526   }
    00527
    00528   /*
    00529    * Attribut CGTs (un changement a eu lieu depuis l'étape de calcul précédente)
    00530    */
    00531   if ( _MEDattributeIntWr(_datagroup1,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
    00532     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00533     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(MED_NOM_CGT);
    00534     goto ERROR;
    00535   }
    00536
    00537   if ( _MEDattributeIntWr(_datagroup2,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
    00538     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00539     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00540     SSCRUTE(MED_NOM_CGT);goto ERROR;
    00541   }
    00542
    00543   if (_datagroup3)
    00544     if ( _MEDattributeIntWr(_datagroup3,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
    00545       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00546       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00547       SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);goto ERROR;
    00548     }
    00549
    00550   /*Un changement complémentaire à l'information principale a changé*/
    00551   if ( ( meddatatype != MED_CONNECTIVITY) && ( meddatatype != MED_COORDINATE )
    00552        &&(meddatatype != MED_COORDINATE_AXIS1)&&(meddatatype != MED_COORDINATE_AXIS2)
    00553        &&(meddatatype != MED_COORDINATE_AXIS3)&&(meddatatype != MED_INDEX_FACE)
    00554        && (meddatatype != MED_INDEX_NODE)
    00555        ) {
    00556     if ( _MEDattributeIntWr(_datagroup,MED_NOM_CGS,&_not_the_first_cstp) < 0) {
    00557       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00558       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00559       SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
    00560     }
    00561   } else
    00562     if ( _MEDattributeIntWr(_datagroup,MED_NOM_CGS,&_false) < 0) {
    00563       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00564       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00565       SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
    00566     }
    00567
    00568   if (_datagroup4)
    00569     if ( _MEDattributeIntWr(_datagroup4,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
    00570       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00571       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00572       SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);SSCRUTE(MED_NOM_CGT);
    00573       goto ERROR;
    00574     }
    00575
    00576   if (_create_dataset)
    00577     if ( _MEDattributeIntWr(_dataset,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
    00578       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00579       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00580       SSCRUTE(_datagroupname3);SSCRUTE(datasetname);SSCRUTE(MED_NOM_CGT);goto ERROR;
    00581     }
    00582
    00583   _ret = 0;
    00584
    00585  ERROR:
    00586
    00587   if (!_filterparameterexist) {
    00588    if ( MEDfilterClose(_filter) < 0 ) {
    00589       MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_FILTER,MED_ERR_MESH_MSG);
    00590       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
    00591       SSCRUTE(_profilename);goto ERROR;
    00592     }
    00593   }
    00594
    00595   if (_dataset>0)     if (_MEDdatasetFermer(_dataset) < 0) {
    00596     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATASET,MED_NOM_COO);
    00597     ISCRUTE_id(_dataset);
    00598   }
    00599
    00600   if (_datagroup4>0)     if (_MEDdatagroupFermer(_datagroup4) < 0) {
    00601     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,MED_VARATR_NOM);
    00602     ISCRUTE_id(_datagroup4);
    00603   }
    00604
    00605   if (_datagroup3>0)     if (_MEDdatagroupFermer(_datagroup3) < 0) {
    00606     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_profilename);
    00607     ISCRUTE_id(_datagroup3);
    00608   }
    00609
    00610   if (_datagroup2>0)     if (_MEDdatagroupFermer(_datagroup2) < 0) {
    00611     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
    00612     ISCRUTE_id(_datagroup2);
    00613   }
    00614
    00615   if (_datagroup1>0)     if (_MEDdatagroupFermer(_datagroup1) < 0) {
    00616     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname1);
    00617     ISCRUTE_id(_datagroup1);
    00618   }
    00619
    00620   if (_meshid>0)            if (_MEDdatagroupFermer(_meshid) < 0) {
    00621     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
    00622     ISCRUTE_id(_meshid);
    00623   }
    00624
    00625   if (_elemid>0)            if (_MEDdatagroupFermer(_elemid) < 0) {
    00626     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_geotypename);
    00627     ISCRUTE_id(_elemid);
    00628   }
    00629
    00630
    00631   return _ret;
    00632 }
    00633