# _MEDmeshnEntity30.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 <string.h>
    00022 #include <stdlib.h>
    00023 #include <med_outils.h>
    00024
    00025
    00026 void
    00027 _MEDmeshnEntity30(int dummy, ...)
    00028 {
    00029
    00030
    00031   med_access_mode       _MED_ACCESS_MODE;
    00032   med_int               _ret=-1,_err=-1;
    00033   med_idt               _meshid=0, _datagroup=0,_datagroupf=0,_datagroup1=0;
    00034   med_idt               _datagroup2=0,_datagroup3=0,_datagroup4=0,_dataset=0;
    00035   char                  _meshpath         [MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1]="";
    00036   char                  _datagroupname1   [2*MED_MAX_PARA+1]       ="";
    00037   char                  _datagroupname2   [MED_TAILLE_NOM_ENTITE+1]="";
    00038   char                  _datagroupname3   [MED_TAILLE_NOM_ENTITE+1]="";
    00039   char                  _datagroupname4   [MAX(MED_TAILLE_VARATR,MED_TAILLE_COOTRF)]="";
    00040   char                  _datasetconame    [3 + 1 + 3 + 1 ]         ="";
    00041   char                  _profilename      [MED_NAME_SIZE+1]        ="";
    00042   char                  _geotypename      [MED_TAILLE_NOM_ENTITE+1]="";
    00043   char                  _datasetname      [MED_TAILLE_NOM_ENTITE+1]="";
    00044   med_sorting_type      _sortingtype       = 0;
    00045   med_int               _intsortingtype    = 0;
    00046   med_int               _profilearraysize  = 0;
    00047   med_int               _changement=0, _changement_s=0, _transformation=0;
    00048   med_bool              _changement_co     = MED_FALSE;
    00049   med_size              _n=0;
    00050   med_int               _intn=0;
    00051   med_bool              _isasupportmesh    = MED_FALSE;
    00052   med_bool              _isasoftlink       = MED_FALSE;
    00053   med_bool              _datasetexist      = MED_FALSE;
    00054   med_int               _ntmpmeddatatype   = 1;
    00055   med_data_type         _tmpmeddatatype[3] = {MED_UNDEF_DATATYPE,MED_UNDEF_DATATYPE,MED_UNDEF_DATATYPE};
    00056   med_grid_type         _gridtype          = MED_UNDEF_GRID_TYPE;
    00057   med_int               _intgridtype       = 0;
    00058   med_int               _intmeshtype       = 0;
    00059   med_int               _meshdim           = 0;
    00060   int                   _i                 = 0;
    00061   med_connectivity_mode _cmode                ;
    00062
    00063
    00064   MED_VARGS_DECL(const, med_idt                , , fid           );
    00065   MED_VARGS_DECL(const, char * , const           , meshname      );
    00066   MED_VARGS_DECL(const, med_int                , , numdt         );
    00067   MED_VARGS_DECL(const, med_int                , , numit         );
    00068   MED_VARGS_DECL(const, med_entity_type        , , entitytype    );
    00069   MED_VARGS_DECL(const, med_geometry_type      , , geotype       );
    00070   MED_VARGS_DECL(const, med_data_type          , , meddatatype   );
    00071   MED_VARGS_DECL(const, med_connectivity_mode  , , cmode         );
    00072   MED_VARGS_DECL(const, med_storage_mode       , , storagemode   );
    00073   MED_VARGS_DECL(, char     *, const       , profilename         );
    00074   MED_VARGS_DECL(, med_int  *, const       , profilesize         );
    00075   MED_VARGS_DECL(, med_bool *, const       , changement          );
    00076   MED_VARGS_DECL(, med_bool *, const       , transformation      );
    00077   MED_VARGS_DECL(, med_int  *             ,, fret                );
    00078
    00079   va_list params;
    00080   va_start(params,dummy);
    00081
    00082   MED_VARGS_DEF(const, med_idt                , , fid           );
    00083   MED_VARGS_DEF(const, char * , const           , meshname      );
    00084   MED_VARGS_DEF(const, med_int                , , numdt         );
    00085   MED_VARGS_DEF(const, med_int                , , numit         );
    00086   MED_VARGS_DEF(const, med_entity_type        , , entitytype    );
    00087   MED_VARGS_DEF(const, med_geometry_type      , , geotype       );
    00088   MED_VARGS_DEF(const, med_data_type          , , meddatatype   );
    00089   MED_VARGS_DEF(const, med_connectivity_mode  , , cmode         );
    00090   MED_VARGS_DEF(const, med_storage_mode       , , storagemode   );
    00091   MED_VARGS_DEF(, char     *, const       , profilename         );
    00092   MED_VARGS_DEF(, med_int  *, const       , profilesize         );
    00093   MED_VARGS_DEF(, med_bool *, const       , changement          );
    00094   MED_VARGS_DEF(, med_bool *, const       , transformation      );
    00095   MED_VARGS_DEF(, med_int  *             ,, fret                );
    00096
    00097   _cmode = cmode;
    00098
    00099   /*
    00100    * On inhibe le gestionnaire d'erreur HDF 5
    00101    */
    00102   _MEDmodeErreurVerrouiller();
    00103
    00104   if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
    00105     MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
    00106     goto ERROR;
    00107   }
    00108
    00109   /*
    00110    * Ouverture du datagroup de niveau 1 <_meshpath>/<meshname>
    00111    */
    00112   NOFINALBLANK(meshname,ERROR);
    00113
    00114   if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
    00115     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00116     SSCRUTE(_meshpath); goto ERROR;
    00117   }
    00118
    00119   /* Lecture de la dimension du maillage  */
    00120   if (_MEDattrEntierLire(_meshid,MED_NOM_DIM,&_meshdim) < 0) {
    00121     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00122     SSCRUTE(meshname);SSCRUTE(MED_NOM_DIM);ISCRUTE(_meshdim);goto ERROR;
    00123   }
    00124
    00125   /* Lecture du type de maillage (attribut MED_NOM_TYP)  */
    00126   if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
    00127     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00128     SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
    00129   }
    00130
    00131   if ( ( (med_mesh_type) _intmeshtype ) != MED_UNSTRUCTURED_MESH ) {
    00132
    00133     /* Lecture de l'attribut MED_NOM_GTY  */
    00134     if (_MEDattrEntierLire(_meshid,MED_NOM_GTY,&_intgridtype) < 0) {
    00135       MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00136       SSCRUTE(meshname);SSCRUTE(MED_NOM_GTY);ISCRUTE(_intgridtype);goto ERROR;
    00137     }
    00138     _gridtype= (med_grid_type) _intgridtype;
    00139   }
    00140
    00141   /*
    00142    * Ouverture du datagroup de niveau 2 <numdt>.<numit>
    00143    */
    00144   if ( _MEDattrEntierLire(_meshid,MED_NOM_SRT,&_intsortingtype) < 0) {
    00145     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00146     SSCRUTE(meshname);SSCRUTE(MED_NOM_SRT);ISCRUTE(_intsortingtype);goto ERROR;
    00147   }
    00148   _sortingtype = (med_sorting_type) (_intsortingtype);
    00149
    00150   _MEDgetComputationStepName(_sortingtype,numdt,numit,_datagroupname1);
    00151   if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
    00152     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    00153     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00154     SSCRUTE(_datagroupname1);ISCRUTE_id(_datagroup1);goto ERROR;
    00155   }
    00156
    00157
    00158   /*
    00159    * Attribut CGT (un changement a eu lieu depuis l'étape de calcul précédente)
    00160    */
    00161   if ( _MEDattrEntierLire(_datagroup1,MED_NOM_CGT,&_changement) < 0) {
    00162     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00163     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00164     SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_CGT);goto ERROR;
    00165   }
    00166
    00167   *changement     = (med_bool) _changement;
    00168   *transformation = MED_FALSE;
    00169   /*
    00170    * Gestion entitytype == MED_NONE
    00171    */
    00172   if ( entitytype == MED_UNDEF_ENTITY_TYPE ) {
    00173     _n=0; goto SORTIE;
    00174   }
    00175
    00176   /*
    00177    * Gestion entitytype == MED_ALL_ENTITY_TYPE
    00178    */
    00179   if ( entitytype == MED_ALL_ENTITY_TYPE ) {
    00180     _err=_MEDnObjects(_datagroup1,".",&_n);
    00181     if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
    00182       MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,_datagroupname1);
    00183       goto ERROR;
    00184     }
    00185     goto SORTIE;
    00186   }
    00187
    00188
    00189   /*
    00190    *  Ouverture du datagroup de niveau 3 <entitytype>
    00191    */
    00192   if (_MEDgetEntityTypeName(_datagroupname2,entitytype) < 0) {
    00193     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
    00194     ISCRUTE_int(entitytype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
    00195   }
    00196
    00197   if ((_datagroup2 = _MEDdatagroupOuvrir(_datagroup1,_datagroupname2)) < 0) {
    00198     *changement     = (med_bool) MED_FALSE;
    00199     _n=0;_datagroup2=0;
    00200     goto SORTIE;
    00201   }
    00202
    00203   /*  MAJ du changement pour le type d'entité <entitytype>
    00204    *   ( annulant eventuellement le changement global précédent concernant tous les types d'entités)
    00205    *  Attribut CGT (un changement a eu lieu depuis l'étape de calcul précédente)
    00206    */
    00207   if ( _MEDattrEntierLire(_datagroup2,MED_NOM_CGT,&_changement) < 0) {
    00208     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00209     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00210     SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_CGT);
    00211     goto ERROR;
    00212   }
    00213   *changement = (med_bool) _changement;
    00214
    00215   /*
    00216    *  Ouverture du datagroup de niveau 4 <geotype>
    00217    */
    00218
    00219   /* Pas Utilisation pour MED_NODE  */
    00220   if ( geotype == MED_GEO_ALL ) {
    00221
    00222     _err=_MEDnObjects(_datagroup2,".",&_n);
    00223     if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
    00224       MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,_datagroupname2);
    00225       goto ERROR;
    00226     }
    00227     if ( ( entitytype == MED_NODE ) && (_n > 0) ) _n=1;
    00228     goto SORTIE;
    00229   }
    00230
    00231   if ( entitytype != MED_NODE ) {
    00232
    00233     /* Lecture du nom de type géométrique */
    00234     /*TODO : Remplacer les deux appels suivants par un seul gérant les geotype dynamiques et statiques*/
    00235     if ( entitytype == MED_STRUCT_ELEMENT ) {
    00236       if ( MEDstructElementName(fid, geotype,_datagroupname3) < 0 ) {
    00237         MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementName");
    00238         ISCRUTE_int(geotype);goto ERROR;
    00239       }
    00240     } else
    00241       if ( _MEDgetInternalGeometryTypeName(_datagroupname3,geotype) < 0) {
    00242         MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_GEOMETRIC,MED_ERR_VALUE_MSG);
    00243         ISCRUTE_int(geotype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00244         SSCRUTE(_datagroupname2);goto ERROR;
    00245       }
    00246
    00247     if ((_datagroup3 = _MEDdatagroupOuvrir(_datagroup2,_datagroupname3)) < 0) {
    00248       _n=0;
    00249       *changement = MED_FALSE;
    00250       goto SORTIE;
    00251     }
    00252   }
    00253
    00254   if (_datagroup3) _datagroup=_datagroup3; else _datagroup=_datagroup2;
    00255
    00256   /*  MAJ du changement pour le type géométrique d'entité <geotype>
    00257    *   ( annulant eventuellement le changement global précédent concernant tous les types d'entités)
    00258    *  Attribut CGT (un changement a eu lieu depuis l'étape de calcul précédente)
    00259    * Prend en charge le cas d'un dataset vide écrit pour un typegeo donné (CHGT==1)
    00260    */
    00261   if (_datagroup3) {
    00262     if ( _MEDattrEntierLire(_datagroup3,MED_NOM_CGT,&_changement) < 0) {
    00263       MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00264       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00265       SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);
    00266       goto ERROR;
    00267     }
    00268     *changement = (med_bool) _changement;
    00269   }
    00270
    00271   /*
    00272    * Lecture du flag de modification sur autre chose que MED_CONNECTIVITY,MED_COORDINATE,MED_COORDINATE_AXIS<i>
    00273    *
    00274    */
    00275   if ( _MEDattrEntierLire(_datagroup,MED_NOM_CGS,&_changement_s) < 0) {
    00276     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00277     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00278     SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
    00279   }
    00280
    00281   /* 1)
    00282    * Si un changement est présent sur MED_CONNECTIVITY,MED_COORDINATE
    00283    *    &&(meddatatype != MED_COORDINATE_AXIS1)&&(meddatatype != MED_COORDINATE_AXIS2)
    00284    *    &&(meddatatype != MED_COORDINATE_AXIS3) ) {
    00285    * le flag chgt doit être positionné à vrai si on interroge autre chose
    00286    * que MED_CONNECTIVITY,MED_COORDINATE
    00287    *  <=> modification des datasets COO(si NOE)| NOD|DES(si !NOE)
    00288    */
    00289   /* 2)
    00290    * Positionne un mode de connectivité _cmode si le meddatatype demandé
    00291    * est autre chose que des coordonnées ou des connectivités et le cmode non
    00292    * positionné.
    00293    * Cette Information est necessaire pour construire le nom du dataset.
    00294    */
    00295   if (    (meddatatype != MED_CONNECTIVITY) && ( meddatatype != MED_COORDINATE )
    00296        && (meddatatype != MED_COORDINATE_AXIS1)
    00297        && (meddatatype != MED_COORDINATE_AXIS2)
    00298        && (meddatatype != MED_COORDINATE_AXIS3)
    00299        && (meddatatype != MED_INDEX_FACE)
    00300        && (meddatatype != MED_INDEX_NODE)) {
    00301
    00302     if (entitytype == MED_NODE) {
    00303       if ( ( (med_mesh_type) _intmeshtype ) != MED_UNSTRUCTURED_MESH ) {
    00304         if (_gridtype == MED_CARTESIAN_GRID ) {
    00305           _ntmpmeddatatype=_meshdim;
    00306           _tmpmeddatatype[0] = MED_COORDINATE_AXIS1;
    00307           _tmpmeddatatype[1] = MED_COORDINATE_AXIS2;
    00308           _tmpmeddatatype[2] = MED_COORDINATE_AXIS3;
    00309       } else {
    00310         MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_GRIDTYPE,MED_ERR_MESH_MSG);
    00311         SSCRUTE(meshname);ISCRUTE_int(_gridtype);goto ERROR;
    00312         }
    00313       } else
    00314         _tmpmeddatatype[0] = MED_COORDINATE;
    00315     } else {
    00316       switch (geotype) {
    00317       case MED_POLYHEDRON:
    00318         _ntmpmeddatatype=3;
    00319         _tmpmeddatatype[2] = MED_CONNECTIVITY;
    00320         _tmpmeddatatype[1] = MED_INDEX_FACE;
    00321         _tmpmeddatatype[0] = MED_INDEX_NODE;
    00322         break;
    00323       case MED_POLYGON:
    00324         _ntmpmeddatatype=2;
    00325         _tmpmeddatatype[1] = MED_CONNECTIVITY;
    00326         _tmpmeddatatype[0] = MED_INDEX_NODE;
    00327         break;
    00328       default:
    00329         if ( ( (med_mesh_type) _intmeshtype ) == MED_STRUCTURED_MESH ) {
    00330           _ntmpmeddatatype=0;
    00331           break;
    00332         }
    00333         _tmpmeddatatype[0] = MED_CONNECTIVITY;
    00334         if ( cmode == MED_NO_CMODE ) {
    00335           if ( _MEDdatasetExistByMedtype(_datagroup,MED_CONNECTIVITY,MED_NODAL,
    00336                                 &_datasetexist, &_isasoftlink) < 0) {
    00337             MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDdatasetExistByMedtype");
    00338             SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00339             SSCRUTE(_datagroupname3);goto ERROR;
    00340           }
    00341
    00342           if ( _datasetexist ) _cmode= MED_NODAL;
    00343           else
    00344             if ( _MEDdatasetExistByMedtype(_datagroup,MED_CONNECTIVITY,MED_DESCENDING,
    00345                                   &_datasetexist, &_isasoftlink)  < 0) {
    00346               MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDdatasetExistByMedtype");
    00347               SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00348               SSCRUTE(_datagroupname3);goto ERROR;
    00349             } else
    00350               _cmode = MED_DESCENDING;
    00351         }
    00352       }
    00353     }
    00354
    00355     *changement = MED_FALSE;
    00356     for (_i=0; _i < _ntmpmeddatatype ;++_i) {
    00357       if ( _MEDgetDatasetChgt( _datagroup, _tmpmeddatatype[_i], _cmode,
    00358                                &_isasoftlink, &_changement_co ) < 0) {
    00359         MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"getDatasetChgt");
    00360         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00361         SSCRUTE(_datagroupname3);goto ERROR;
    00362       }
    00363       *changement |= _changement_co;
    00364     }
    00365   }
    00366
    00367
    00368   /*
    00369    * Niveau de datagroup 5 supplémentaire pour les éléments de structure ou les transformations.
    00370    */
    00371   if (  (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF ) ) {
    00372     if (meddatatype == MED_VARIABLE_ATTRIBUTE)
    00373       strcpy(_datagroupname4,MED_VARATR_NOM);
    00374     else
    00375       strcpy(_datagroupname4,MED_COOTRF_NOM);
    00376
    00377     if ((_datagroup4 = _MEDdatagroupOuvrir(_datagroup,_datagroupname4)) < 0) {
    00378       _n=0;
    00379       goto SORTIE;
    00380     }
    00381   }
    00382   if ( (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF ) )
    00383     _datagroupf=_datagroup4;
    00384   else
    00385     _datagroupf=_datagroup;
    00386
    00387
    00388   /*
    00389    * Construction du nom du dataset à lire
    00390    */
    00391   if (  _MEDgetDatasetName(_datasetname,meddatatype,cmode) < 0) {
    00392     MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetName");
    00393     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00394     SSCRUTE(_datagroupname3);goto ERROR;
    00395   }
    00396
    00397   /*
    00398    *  MAJ du champ transformation pour le (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF)
    00399    */
    00400   if (_datagroup4) {
    00401     if ( _MEDattrEntierLire(_datagroup4,MED_NOM_CGT,&_transformation) < 0) {
    00402       MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00403       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00404       SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);SSCRUTE(MED_NOM_CGT);
    00405       goto ERROR;
    00406     }
    00407   }
    00408
    00409   if ( (_dataset = _MEDdatasetOuvrir(_datagroupf,_datasetname)) < 0) {
    00410     _n=0;_dataset=0;*transformation = (med_bool) MED_FALSE;
    00411 /*     if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) { */
    00412 /*       MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATASET,_datasetname); */
    00413 /*       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt); */
    00414 /*       SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4); */
    00415 /*       ISCRUTE_size(_n); */
    00416 /*       goto ERROR; */
    00417 /*     } */
    00418     goto SORTIE;
    00419   }
    00420
    00421
    00422   if (!_datagroup4) {
    00423
    00424     /*
    00425      * Lire l'attribut CGT pour savoir si le dataset a changé
    00426      * n'a pas de sens si le dataset est en fait un lien vers le dataset précedent.
    00427      * En testant si le dataset est un lien on détermine si un changement a eu lieu
    00428      * depuis la séquence de calcul précédente.
    00429      * Ce traitement ne doit pas être effectué pour le pas de temps initial et pour
    00430      * (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF)
    00431      */
    00432
    00433     if ( _MEDisasoftlink(_datagroupf, _datasetname,MED_TRUE, &_isasoftlink ) < 0) {
    00434       MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_LINK,_datasetname);
    00435       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00436       SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);
    00437       ISCRUTE_size(_n);goto ERROR;
    00438     }
    00439
    00440     if (_isasoftlink)
    00441       _transformation = MED_FALSE;
    00442     else {
    00443
    00444       if ( _MEDattrEntierLire(_dataset,MED_NOM_CGT,&_transformation) < 0) {
    00445         MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00446         SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00447         SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);
    00448         goto ERROR;
    00449       }
    00450     }
    00451
    00452   }
    00453
    00454   *transformation = (med_bool) _transformation;
    00455
    00456   if ( ( meddatatype == MED_CONNECTIVITY) && ( meddatatype == MED_COORDINATE ) ) {
    00457     *transformation &= (med_bool) !_changement_s;
    00458   }
    00459
    00460   /*
    00461    * Attribut PFL (nombre de noeuds ou d'elements)
    00462    * la lecture est faite sur le datagroup _datagroup et non sur _datagroupf
    00463    * pour (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF)
    00464    */
    00465   _profilearraysize = 0;
    00466   profilename[0]='\0';
    00467
    00468   if ( _MEDattrStringLire(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
    00469     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00470     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00471     SSCRUTE(_datagroupname3); SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR;
    00472   }
    00473
    00474   if ( strcmp(_profilename,MED_NO_PROFILE_INTERNAL) ) {
    00475     strncpy(profilename,_profilename,MED_NAME_SIZE+1);
    00476     profilename[MED_NAME_SIZE]='\0';
    00477
    00478     if ( ( _profilearraysize = MEDprofileSizeByName( fid,_profilename) ) < 0 ) {
    00479       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,MED_ERR_MESH_MSG);
    00480       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    00481       SSCRUTE(_profilename);SSCRUTE("MEDprofileSizeByName");goto ERROR;
    00482     }
    00483   }
    00484   *profilesize=(med_int) _profilearraysize;
    00485
    00486
    00487   /*
    00488    * Attribut NBR (nombre d'entité)
    00489    */
    00490   if ( _MEDattrEntierLire(_dataset,MED_NOM_NBR,&_intn) < 0) {
    00491     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    00492     SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    00493     SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);
    00494     SSCRUTE(_datasetname);SSCRUTE(MED_NOM_NBR);ISCRUTE_size(_n);goto ERROR;
    00495   }
    00496   _n = _intn;
    00497
    00498   if (_profilearraysize)
    00499     switch(storagemode) {
    00500
    00501     case MED_GLOBAL_PFLMODE :
    00502       break;
    00503
    00504     case MED_COMPACT_PFLMODE :
    00505       if ( meddatatype!=MED_COORDINATE_TRSF )
    00506         _n=_profilearraysize;
    00507
    00508       break;
    00509
    00510     default :
    00511       MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_STORAGEMODE,MED_ERR_VALUE_MSG);
    00512       ISCRUTE_int(storagemode);goto ERROR;
    00513       break;
    00514
    00515     }
    00516
    00517  SORTIE:
    00518
    00519   _ret = _n;
    00520
    00521  ERROR:
    00522
    00523
    00524   if (_dataset>0)     if (_MEDdatasetFermer(_dataset) < 0) {
    00525     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATASET,MED_NOM_COO);
    00526     ISCRUTE_id(_dataset);
    00527   }
    00528
    00529   if (_datagroup4>0)     if (_MEDdatagroupFermer(_datagroup4) < 0) {
    00530     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname4);
    00531     ISCRUTE_id(_datagroup4);
    00532   }
    00533
    00534   if (_datagroup3>0)     if (_MEDdatagroupFermer(_datagroup3) < 0) {
    00535     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname3);
    00536     ISCRUTE_id(_datagroup3);
    00537   }
    00538
    00539   if (_datagroup2>0)     if (_MEDdatagroupFermer(_datagroup2) < 0) {
    00540     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
    00541     ISCRUTE_id(_datagroup2);
    00542   }
    00543
    00544   if (_datagroup1>0)     if (_MEDdatagroupFermer(_datagroup1) < 0) {
    00545     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname1);
    00546     ISCRUTE_id(_datagroup1);
    00547   }
    00548
    00549   if (_meshid>0)            if (_MEDdatagroupFermer(_meshid) < 0) {
    00550     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
    00551     ISCRUTE_id(_meshid);
    00552   }
    00553
    00554 /*   _MEDobjetsOuverts(fid); */
    00555
    00556   *fret = _ret;
    00557   va_end(params);
    00558   return;
    00559 }