_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 
00085 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
00086 
00087   if (filter) {
00088     _filter=(med_filter*)(filter); _filterparameterexist=MED_TRUE;
00089   }
00090   else {
00091     _filter=&_tmpfilter;
00092     (*_filter).nbofentity              = nbofentity;
00093     (*_filter).nbofvaluesperentity     = 1;
00094     /*   (*_filter).nbofconstituentpervalue = nbofconstituentpervalue; */
00095     (*_filter).constituentselect       = dimselect;
00096     (*_filter).switchmode              = switchmode;
00097     (*_filter).storagemode             = storagemode;
00098     strcpy((*_filter).profilename,profilename);
00099     /*   (*_filter).profilearraysize        = profilearraysize; */
00100   }
00101 
00102   /*
00103    * On inhibe le gestionnaire d'erreur HDF 5
00104    */
00105   _MEDmodeErreurVerrouiller();
00106 
00107   if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
00108     MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
00109     goto ERROR;
00110   }
00111 
00112   if ( _MED_ACCESS_MODE == MED_ACC_RDONLY) {
00113     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
00114     ISCRUTE_int(_MED_ACCESS_MODE);
00115     goto ERROR;
00116   }
00117 
00118   /*
00119    * Si le DataGroup MED_MAA n'existe pas => erreur
00120    */
00121 /*   NOFINALBLANK(meshname,ERROR); */
00122 
00123   if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
00124     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00125     SSCRUTE(_meshpath); goto ERROR;
00126   }
00127 
00128   /* Lecture de l'attribut MED_NOM_ESP  */
00129   if (_MEDattrEntierLire(_meshid,MED_NOM_ESP,&_spacedim) < 0) {
00130     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00131     SSCRUTE(meshname);SSCRUTE(MED_NOM_ESP);ISCRUTE(_spacedim);goto ERROR;
00132   }
00133 
00134   /* Lecture de l'attribut MED_NOM_TYP  */
00135   if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
00136     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00137     SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
00138   }
00139 
00140   /* L'utilisation de profils pour les maillages structurés est interdite */
00141   if ( ( (med_mesh_type) _intmeshtype ) != MED_UNSTRUCTURED_MESH ) _mustnothaveprofile=MED_TRUE;
00142 
00143 
00144   /* TODO : Externaliser ce traitement lié  aux éléments de structures */
00145   if ( entitytype == MED_STRUCT_ELEMENT ) {
00146     if ( MEDstructElementName(fid, geotype,_geotypename) < 0 ) {
00147       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementName");
00148       ISCRUTE_int(geotype);goto ERROR;
00149     }
00150 
00151     if (meddatatype != MED_VARIABLE_ATTRIBUTE) {
00152 
00153       strcat(_strpath,_geotypename);
00154 
00155       /*
00156        * Si le DataGroup /STRUCT/<elementname> n'existe pas => erreur
00157        */
00158       if ((_elemid = _MEDdatagroupOpen(fid,_strpath)) < 0)  {
00159         MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_strpath);
00160         goto ERROR;
00161       }
00162 
00163       /*
00164        * Lecture de l'attribut MED_NOM_NOM (nom du maillage support)
00165        */
00166       /* Chercher plutôt ds le maillage support et supprimer les attributs NBM et NBN */
00167       if ( _MEDattrStringLire(_elemid,MED_NOM_NOM,MED_NAME_SIZE,_supportmeshname) < 0) {
00168         MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_strpath);
00169         SSCRUTE(MED_NOM_NOM);SSCRUTE(_supportmeshname);
00170         goto ERROR;
00171       }
00172 
00173       /*
00174        * Lecture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
00175        */
00176       if ( _MEDattrEntierLire(_elemid,MED_NOM_GEO,&_medintsgeotype) < 0 ) {
00177         MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_strpath);
00178         SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintsgeotype);
00179         goto ERROR;
00180       }
00181       _sgeotype = _medintsgeotype;
00182 
00183       if (strlen(_supportmeshname) )
00184         if ( (_nbofvalueperentity = MEDmeshnEntity(fid,_supportmeshname,MED_NO_DT,MED_NO_IT,
00185                                                    MED_CELL,_sgeotype,MED_CONNECTIVITY,MED_NODAL,
00186                                                    &_chgt,&_trsf) )  < 0) {
00187           MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDmeshnEntity");
00188           ISCRUTE(_nbofvalueperentity);goto ERROR;
00189         }
00190 
00191       if (!_nbofvalueperentity) _nbofvalueperentity=1;
00192 
00193       /*
00194        * REM : Les routines ayant besoin du nombre de noeuds sont implémentées
00195        spécifiquement.
00196       */
00197 
00198       if (!_nbofconstituentpervalue) _nbofconstituentpervalue=1;
00199 
00200     }
00201   }
00202 
00203   if (meddatatype == MED_VARIABLE_ATTRIBUTE) {
00204     if ( MEDstructElementVarAttInfoByName(fid,
00205                                           _geotypename,
00206                                           datasetname,
00207                                           (med_attribute_type* const) &_datatype,
00208                                           &_nbofconstituentpervalue
00209                                           ) < 0) {
00210       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementVarAttInfoByName");
00211       ISCRUTE_int(geotype);SSCRUTE(datasetname);
00212       ISCRUTE_int(_datatype);ISCRUTE(_nbofconstituentpervalue);goto ERROR;
00213     }
00214     _nbofvalueperentity=1;
00215   }
00216 
00217   /* FIN TODO structelem*/
00218 
00219 
00220   /* Si un nom de dataset est précisé, il est prioritaire sur la detection automatique en
00221      fonction des paramètres meddatatype et cmode */
00222   if ( !strlen(datasetname) ) {
00223     if ( _MEDgetDatasetName( _datasetname, meddatatype, cmode ) < 0 ) {
00224       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetname");
00225       ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);SSCRUTE( _datasetname);goto ERROR;
00226     }
00227   } else
00228     strncpy(_datasetname,datasetname,MED_TAILLE_NOM_ENTITE+1);
00229 
00230 
00231   /* Si un type de dataset est précisé, il est prioritaire sur la détection 
00232      automatique du nom en fonction des paramètres meddatatype et cmode */
00233   /* TODO : renommer datatype en idatatype (internal) */
00234   if ( _datatype == MED_INTERNAL_UNDEF)
00235     if ( _MEDgetDatatype( &_datatype, meddatatype, cmode ) < 0 ) {
00236       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatatype");
00237       ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);ISCRUTE_int(_datatype);goto ERROR;
00238     }
00239 
00240   /* Vérification :
00241      Le type de données MED traitées sont-elles compatibles avec le type de maillage ?
00242   */
00243   /* REM : Si datasetname ou datatype ne sont pas précisés, meddatatype doit l'être */
00244   if ( meddatatype != MED_UNDEF_DATATYPE )
00245     if ( _MEDmeshtypeCompatibility(meddatatype, _intmeshtype) < 0) {
00246       MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_MEDDATATYPE,MED_ERR_VALUE_MSG);
00247       ISCRUTE_int(meddatatype);ISCRUTE(_intmeshtype);goto ERROR;
00248     }
00249 
00250   if ( ! (_nbofvalueperentity && _nbofconstituentpervalue) )
00251     if ( _MEDgetDatasetParameter( meddatatype, _spacedim, entitytype, geotype, cmode,
00252                                   &_nbofvalueperentity,&_nbofconstituentpervalue) < 0 ) {
00253       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetParameter");
00254       ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);ISCRUTE(_nbofvalueperentity);
00255       ISCRUTE(_nbofconstituentpervalue);goto ERROR;
00256     }
00257 
00258   /*     ISCRUTE(_nbofconstituentpervalue); */
00259 
00260   if (_filterparameterexist) {
00261     if ((*_filter).nbofconstituentpervalue != _nbofconstituentpervalue ) {
00262       MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
00263       ISCRUTE((*_filter).nbofconstituentpervalue); ISCRUTE(_nbofconstituentpervalue );
00264       goto ERROR;
00265     }
00266     if ((*_filter).nbofvaluesperentity != _nbofvalueperentity ) {
00267       MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
00268       ISCRUTE((*_filter).nbofvaluesperentity); ISCRUTE(_nbofvalueperentity );
00269       goto ERROR;
00270     }
00271   } else {
00272     (*_filter).nbofconstituentpervalue = _nbofconstituentpervalue;
00273     (*_filter).nbofvaluesperentity     = _nbofvalueperentity;
00274   }
00275 
00276 
00277   /*
00278    * Creation/Ouverture du datagroup de niveau 2 <numdt>.<numit>
00279    */
00280   if ( _MEDattrEntierLire(_meshid,MED_NOM_SRT,&_intsortingtype) < 0) {
00281     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00282     SSCRUTE(meshname);SSCRUTE(MED_NOM_SRT);ISCRUTE(_intsortingtype);goto ERROR;
00283   }
00284   _sortingtype = (med_sorting_type) (_intsortingtype);
00285 
00286   _MEDgetComputationStepName(_sortingtype,numdt,numit,_datagroupname1);
00287 
00288   if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
00289     if ( MEDmeshComputationStepCr(fid,meshname,numdt,numit,numdt,numit,dt) < 0 ) {
00290       MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_COMPUTINGSTEP,MED_ERR_MESH_MSG);
00291       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
00292     } else {
00293       /*       SSCRUTE(_datagroupname1);ISCRUTE(_datagroup1); */
00294       if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
00295         MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00296         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
00297         SSCRUTE(_datagroupname1);ISCRUTE_id(_datagroup1);goto ERROR;
00298       }
00299 
00300       if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) copyfromprevious=MED_TRUE;
00301     }
00302   }
00303 
00304 
00305 
00306   /*
00307    *  Creation/Ouverture du datagroup de niveau 3 <entitytype>
00308    */
00309   if (_MEDgetEntityTypeName(_datagroupname2,entitytype) < 0) {
00310     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
00311     ISCRUTE_int(entitytype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
00312   }
00313 
00314   if ((_datagroup2 = _MEDdatagroupOuvrir(_datagroup1,_datagroupname2)) < 0) {
00315     if ( copyfromprevious) {
00316       MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00317       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00318       goto ERROR;
00319     } else {
00320       if ((_datagroup2 = _MEDdatagroupCreer(_datagroup1,_datagroupname2)) < 0 ) {
00321         MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00322         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00323         goto ERROR;
00324       }
00325     }
00326   }
00327 
00328 
00329   /*
00330    *  Creation/Ouverture du datagroup de niveau 4 [.<geotype>]
00331    */
00332 
00333   if ( entitytype != MED_NODE ) {
00334 
00335     if (strlen(_geotypename))
00336       strncpy(_datagroupname3,_geotypename,MED_NAME_SIZE+1);
00337     else
00338       if ( _MEDgetGeometryTypeName(_datagroupname3,geotype) < 0) {
00339         MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_GEOMETRIC,MED_ERR_VALUE_MSG);
00340         ISCRUTE_int(geotype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
00341         SSCRUTE(_datagroupname2);goto ERROR;
00342       }
00343 
00344     if ((_datagroup3 = _MEDdatagroupOuvrir(_datagroup2,_datagroupname3)) < 0) {
00345       if ( copyfromprevious) {
00346         MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00347         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
00348         SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
00349       } else {
00350         if ((_datagroup3 = _MEDdatagroupCreer(_datagroup2,_datagroupname3)) < 0 ) {
00351           MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00352           SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
00353           SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
00354         }
00355       }
00356     }
00357   }
00358 
00359   if (_datagroup3) _datagroup=_datagroup3; else _datagroup=_datagroup2;
00360 
00361   /*
00362    *  Creation/Ouverture du datagroup de niveau 5 [VARATR]
00363    */
00364   /*Problème d'activation du profil */
00365   if ( (meddatatype == MED_VARIABLE_ATTRIBUTE) || (meddatatype == MED_COORDINATE_TRSF) ) {
00366     /* TODO : Pour simplifier et systématiser la procédure il faut
00367        créer une routine spécifique qui donne le nom du datagroup  supplémentaire optionnel.
00368        Si le retour est "" ne pas créer le datagroup. */
00369     if (meddatatype == MED_VARIABLE_ATTRIBUTE)
00370       strcpy(_datagroupname4,MED_VARATR_NOM);
00371     else
00372       strcpy(_datagroupname4,MED_COOTRF_NOM);
00373     if ((_datagroup4 = _MEDdatagroupOuvrir(_datagroup,_datagroupname4)) < 0) {
00374       if ( copyfromprevious) {
00375         MED_ERR_(_ret,MED_ERR_DOESNTEXIST,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00376         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
00377         SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);goto ERROR;
00378       } else {
00379         if ((_datagroup4 = _MEDdatagroupCreer(_datagroup,_datagroupname4)) < 0 ) {
00380           MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00381           SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
00382           SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);goto ERROR;
00383         }
00384       }
00385     }
00386   }
00387   if (_datagroup4) _fdatagroup=_datagroup4; else _fdatagroup=_datagroup;
00388 
00389   /*
00390    * Attribut PFL
00391    */
00392 
00393   if ( !strncmp((*_filter).profilename,MED_SAME_PROFILE_INTERNAL,MED_NAME_SIZE+1) ) {
00394     if ( _MEDattrStringLire(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
00395       MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00396       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00397       SSCRUTE(_datagroupname3); SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR;
00398     }
00399     if ( strncmp(_profilename,MED_NO_PROFILE_INTERNAL,MED_NAME_SIZE+1) )
00400       strncpy((*_filter).profilename,_profilename,MED_NAME_SIZE+1);
00401     else
00402       (*_filter).profilename[0]='\0';
00403 
00404     _profilehaschanged = MED_FALSE;
00405   }
00406 
00407   if ( _mustnothaveprofile && strlen((*_filter).profilename) ) {
00408     MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_PROFILE,MED_ERR_MESH_MSG);
00409     SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);
00410     SSCRUTE((*_filter).profilename);goto ERROR;
00411   }
00412 
00413   if ( strlen((*_filter).profilename) == 0 ) {  /* idem MED_NOPFL*/
00414     strncpy(_profilename,MED_NO_PROFILE_INTERNAL,MED_NAME_SIZE+1);
00415   } else {
00416     strncpy(_profilename,(*_filter).profilename,MED_NAME_SIZE+1);
00417     _profilename[MED_NAME_SIZE]='\0'; /*On tronque les eventuels noms trop long*/
00418   }
00419 
00420 
00421   if (!_filterparameterexist) {
00422 
00423 #ifdef _DEBUG_
00424     ISCRUTE((*_filter).nbofentity              );
00425     ISCRUTE((*_filter).nbofvaluesperentity     );
00426     ISCRUTE((*_filter).nbofconstituentpervalue );
00427     ISCRUTE((*_filter).constituentselect       );
00428     ISCRUTE_int((*_filter).switchmode              );
00429     ISCRUTE((*_filter).filterarraysize         );
00430     ISCRUTE((*_filter).profilearraysize        );
00431     ISCRUTE_int((*_filter).storagemode             );
00432     SSCRUTE((*_filter).profilename             );
00433 #endif
00434 
00435     if ( MEDfilterEntityCr(fid, (*_filter).nbofentity,         (*_filter).nbofvaluesperentity,
00436                            (*_filter).nbofconstituentpervalue, (*_filter).constituentselect,
00437                            (*_filter).switchmode,              (*_filter).storagemode,
00438                            (*_filter).profilename, MED_UNDEF_SIZE, NULL, &_paramfilter) < 0 ) {
00439       MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_FILTER,MED_ERR_INTERNAL_MSG);
00440       goto ERROR;
00441     }
00442     _filter = &_paramfilter;
00443   }
00444 
00445 #ifdef _DEBUG_
00446   ISCRUTE((*_filter).nbofentity              );
00447   ISCRUTE((*_filter).nbofvaluesperentity     );
00448   ISCRUTE((*_filter).nbofconstituentpervalue );
00449   ISCRUTE((*_filter).constituentselect       );
00450   ISCRUTE_int((*_filter).switchmode              );
00451   ISCRUTE((*_filter).filterarraysize         );
00452   ISCRUTE((*_filter).profilearraysize        );
00453   ISCRUTE_int((*_filter).storagemode             );
00454   SSCRUTE((*_filter).profilename             );
00455 #endif
00456 
00457 /*   if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) _not_the_first_cstp=_true; */
00458   _not_the_first_cstp=_true;
00459 
00460   /* Pour le bon fonctionnement de MEDmeshnEntity sur la connectivité des MED_PARTICLE :
00461      Obtenir le nbre de particules
00462   TODO : A remonter dans MEDmeshConne.. avec nentity==0 */
00463   if ( ( meddatatype == MED_CONNECTIVITY) && (!strcmp(_geotypename,"MED_PARTICLE")) ) {
00464     _nbofentity = (*_filter).nbofentity;
00465     (*_filter).nbofentity= 0;
00466   }
00467 
00468   /* Externaliser le choix d'écriture effective du dataset */
00469 /*   if ( ( meddatatype == MED_COORDINATE_TRSF) & ( !_not_the_first_cstp ) ) */
00470 /*     _create_dataset=MED_FALSE; */
00471 
00472   if (_create_dataset)
00473     if ( _MEDdatasetWr(_fdatagroup,_datasetname,_datatype,_filter,value) < 0) {
00474       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_DATASET,_datasetname);
00475       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
00476       SSCRUTE(_profilename);goto ERROR;
00477     }
00478 
00479   if (  ( meddatatype == MED_CONNECTIVITY) && (!strcmp(_geotypename,"MED_PARTICLE")) ) {
00480     (*_filter).nbofentity= _nbofentity;
00481   }
00482 
00483 
00484   /*
00485    * Attribut PFL
00486    */
00487   if (_profilehaschanged)
00488     if ( _MEDattributeStringWr(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
00489       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00490       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
00491       SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR;
00492     }
00493 
00494   /*
00495    * Creation/Ecriture de l'attribut MED_NOM_GEO (type géométrique des mailles support)
00496    */
00497   if ( entitytype != MED_NODE )
00498     if ( _MEDattributeIntWr(_datagroup,MED_NOM_GEO,&_medintgeotype) < 0 ) {
00499       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00500       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
00501       SSCRUTE(MED_NOM_PFL);SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintgeotype);
00502       goto ERROR;
00503     }
00504 
00505   /*
00506    * Attribut NBR (nombre de noeuds ou d'elements) sur le dataset
00507    */
00508   if (_create_dataset) {
00509 
00510     if ((_dataset = _MEDdatasetOuvrir(_fdatagroup,_datasetname)) < 0) {
00511       MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATASET,_datasetname);
00512       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
00513       SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);goto ERROR;
00514     }
00515 
00516     if ( _MEDattributeIntWr(_dataset,MED_NOM_NBR,&((*_filter).nbofentity)) < 0) {
00517       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00518       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
00519       SSCRUTE(MED_NOM_NBR);ISCRUTE((*_filter).nbofentity);goto ERROR;
00520     }
00521   }
00522 
00523   /*
00524    * Attribut CGTs (un changement a eu lieu depuis l'étape de calcul précédente)
00525    */
00526   if ( _MEDattributeIntWr(_datagroup1,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
00527     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00528     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(MED_NOM_CGT);
00529     goto ERROR;
00530   }
00531 
00532   if ( _MEDattributeIntWr(_datagroup2,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
00533     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00534     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00535     SSCRUTE(MED_NOM_CGT);goto ERROR;
00536   }
00537 
00538   if (_datagroup3)
00539     if ( _MEDattributeIntWr(_datagroup3,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
00540       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00541       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00542       SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);goto ERROR;
00543     }
00544 
00545   /*Un changement complémentaire à l'information principale a changé*/
00546   if ( ( meddatatype != MED_CONNECTIVITY) && ( meddatatype != MED_COORDINATE )
00547        &&(meddatatype != MED_COORDINATE_AXIS1)&&(meddatatype != MED_COORDINATE_AXIS2)
00548        &&(meddatatype != MED_COORDINATE_AXIS3)&&(meddatatype != MED_INDEX_FACE)
00549        && (meddatatype != MED_INDEX_NODE)
00550        ) {
00551     if ( _MEDattributeIntWr(_datagroup,MED_NOM_CGS,&_not_the_first_cstp) < 0) {
00552       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00553       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00554       SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
00555     }
00556   } else
00557     if ( _MEDattributeIntWr(_datagroup,MED_NOM_CGS,&_false) < 0) {
00558       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00559       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00560       SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
00561     }
00562 
00563   if (_datagroup4)
00564     if ( _MEDattributeIntWr(_datagroup4,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
00565       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00566       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00567       SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);SSCRUTE(MED_NOM_CGT);
00568       goto ERROR;
00569     }
00570 
00571   if (_create_dataset)
00572     if ( _MEDattributeIntWr(_dataset,MED_NOM_CGT,&_not_the_first_cstp) < 0) {
00573       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00574       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00575       SSCRUTE(_datagroupname3);SSCRUTE(datasetname);SSCRUTE(MED_NOM_CGT);goto ERROR;
00576     }
00577 
00578   _ret = 0;
00579 
00580  ERROR:
00581 
00582   if (!_filterparameterexist) {
00583     if ( MEDfilterClose(_filter) < 0 ) {
00584       MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_FILTER,MED_ERR_MESH_MSG);
00585       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
00586       SSCRUTE(_profilename);goto ERROR;
00587     }
00588   }
00589 
00590   if (_dataset>0)     if (_MEDdatasetFermer(_dataset) < 0) {
00591     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATASET,MED_NOM_COO);
00592     ISCRUTE_id(_dataset);
00593   }
00594 
00595   if (_datagroup4>0)     if (_MEDdatagroupFermer(_datagroup4) < 0) {
00596     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,MED_VARATR_NOM);
00597     ISCRUTE_id(_datagroup4);
00598   }
00599 
00600   if (_datagroup3>0)     if (_MEDdatagroupFermer(_datagroup3) < 0) {
00601     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_profilename);
00602     ISCRUTE_id(_datagroup3);
00603   }
00604 
00605   if (_datagroup2>0)     if (_MEDdatagroupFermer(_datagroup2) < 0) {
00606     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
00607     ISCRUTE_id(_datagroup2);
00608   }
00609 
00610   if (_datagroup1>0)     if (_MEDdatagroupFermer(_datagroup1) < 0) {
00611     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname1);
00612     ISCRUTE_id(_datagroup1);
00613   }
00614 
00615   if (_meshid>0)            if (_MEDdatagroupFermer(_meshid) < 0) {
00616     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
00617     ISCRUTE_id(_meshid);
00618   }
00619 
00620   if (_elemid>0)            if (_MEDdatagroupFermer(_elemid) < 0) {
00621     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_geotypename);
00622     ISCRUTE_id(_elemid);
00623   }
00624 
00625 
00626   return _ret;
00627 }
00628 

Généré le Mon May 16 17:10:22 2011 pour MED fichier par  doxygen 1.6.1