示例#1
0
void
_MEDmeshnEntity30(int dummy, ...)
{


  med_access_mode       _MED_ACCESS_MODE;
  med_int               _ret=-1,_err=-1;
  med_idt               _meshid=0, _datagroup=0,_datagroupf=0,_datagroup1=0;
  med_idt               _datagroup2=0,_datagroup3=0,_datagroup4=0,_dataset=0;
  char                  _meshpath         [MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1]="";
  char                  _datagroupname1   [2*MED_MAX_PARA+1]       ="";
  char                  _datagroupname2   [MED_TAILLE_NOM_ENTITE+1]="";
  char                  _datagroupname3   [MED_TAILLE_NOM_ENTITE+1]="";
  char                  _datagroupname4   [MAX(MED_TAILLE_VARATR,MED_TAILLE_COOTRF)]="";
  char                  _datasetconame    [3 + 1 + 3 + 1 ]         ="";
  char                  _profilename      [MED_NAME_SIZE+1]        ="";
  char                  _geotypename      [MED_TAILLE_NOM_ENTITE+1]="";
  char                  _datasetname      [MED_TAILLE_NOM_ENTITE+1]="";
  med_sorting_type      _sortingtype       = 0;
  med_int               _intsortingtype    = 0;
  med_int               _profilearraysize  = 0;
  med_int               _changement=0, _changement_s=0, _transformation=0;
  med_bool              _changement_co     = MED_FALSE;
  med_size              _n=0;
  med_int               _intn=0;
  med_bool              _isasupportmesh    = MED_FALSE;
  med_bool              _isasoftlink       = MED_FALSE;
  med_bool              _datasetexist      = MED_FALSE;
  med_int               _ntmpmeddatatype   = 1;
  med_data_type         _tmpmeddatatype[4] = {MED_UNDEF_DATATYPE,MED_UNDEF_DATATYPE,MED_UNDEF_DATATYPE,MED_UNDEF_DATATYPE};
  med_grid_type         _gridtype          = MED_UNDEF_GRID_TYPE;
  med_int               _intgridtype       = 0;
  med_int               _intmeshtype       = 0;
  med_int               _meshdim           = 0;
  int                   _i                 = 0;
  med_connectivity_mode _cmode                ;


  MED_VARGS_DECL(const, med_idt                , , fid           );
  MED_VARGS_DECL(const, char * , const           , meshname      );
  MED_VARGS_DECL(const, med_int                , , numdt         );
  MED_VARGS_DECL(const, med_int                , , numit         );
  MED_VARGS_DECL(const, med_entity_type        , , entitytype    );
  MED_VARGS_DECL(const, med_geometry_type      , , geotype       );
  MED_VARGS_DECL(const, med_data_type          , , meddatatype   );
  MED_VARGS_DECL(const, med_connectivity_mode  , , cmode         );
  MED_VARGS_DECL(const, med_storage_mode       , , storagemode   );
  MED_VARGS_DECL(, char     *, const       , profilename         );
  MED_VARGS_DECL(, med_int  *, const       , profilesize         );
  MED_VARGS_DECL(, med_bool *, const       , changement          );
  MED_VARGS_DECL(, med_bool *, const       , transformation      );
  MED_VARGS_DECL(, med_int  *             ,, fret                );

  va_list params;
  va_start(params,dummy);

  MED_VARGS_DEF(const, med_idt                , , fid           );
  MED_VARGS_DEF(const, char * , const           , meshname      );
  MED_VARGS_DEF(const, med_int                , , numdt         );
  MED_VARGS_DEF(const, med_int                , , numit         );
  MED_VARGS_DEF(const, med_entity_type        , , entitytype    );
  MED_VARGS_DEF(const, med_geometry_type      , , geotype       );
  MED_VARGS_DEF(const, med_data_type          , , meddatatype   );
  MED_VARGS_DEF(const, med_connectivity_mode  , , cmode         );
  MED_VARGS_DEF(const, med_storage_mode       , , storagemode   );
  MED_VARGS_DEF(, char     *, const       , profilename         );
  MED_VARGS_DEF(, med_int  *, const       , profilesize         );
  MED_VARGS_DEF(, med_bool *, const       , changement          );
  MED_VARGS_DEF(, med_bool *, const       , transformation      );
  MED_VARGS_DEF(, med_int  *             ,, fret                );

  _cmode = cmode;

  /*
   * On inhibe le gestionnaire d'erreur HDF 5
   */
  _MEDmodeErreurVerrouiller();

  if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
    MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
    goto ERROR;
  }

  /*
   * Ouverture du datagroup de niveau 1 <_meshpath>/<meshname>
   */
  NOFINALBLANK(meshname,ERROR);

  if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
    MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    SSCRUTE(_meshpath); goto ERROR;
  }

  /* Lecture de la dimension du maillage  */
  if (_MEDattrEntierLire(_meshid,MED_NOM_DIM,&_meshdim) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);SSCRUTE(MED_NOM_DIM);ISCRUTE(_meshdim);goto ERROR;
  }

  /* Lecture du type de maillage (attribut MED_NOM_TYP)  */
  if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
  }

  if ( ( (med_mesh_type) _intmeshtype ) != MED_UNSTRUCTURED_MESH ) {

    /* Lecture de l'attribut MED_NOM_GTY  */
    if (_MEDattrEntierLire(_meshid,MED_NOM_GTY,&_intgridtype) < 0) {
      MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
      SSCRUTE(meshname);SSCRUTE(MED_NOM_GTY);ISCRUTE(_intgridtype);goto ERROR;
    }
    _gridtype= (med_grid_type) _intgridtype;
  }

  /*
   * Ouverture du datagroup de niveau 2 <numdt>.<numit>
   */
  if ( _MEDattrEntierLire(_meshid,MED_NOM_SRT,&_intsortingtype) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);SSCRUTE(MED_NOM_SRT);ISCRUTE(_intsortingtype);goto ERROR;
  }
  _sortingtype = (med_sorting_type) (_intsortingtype);

  _MEDgetComputationStepName(_sortingtype,numdt,numit,_datagroupname1);
  if ( (_datagroup1 = _MEDdatagroupOuvrir(_meshid,_datagroupname1)) < 0 ) {
    MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    SSCRUTE(_datagroupname1);ISCRUTE_id(_datagroup1);goto ERROR;
  }


  /*
   * Attribut CGT (un changement a eu lieu depuis l'étape de calcul précédente)
   */
  if ( _MEDattrEntierLire(_datagroup1,MED_NOM_CGT,&_changement) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    SSCRUTE(_datagroupname1);SSCRUTE(MED_NOM_CGT);goto ERROR;
  }

  *changement     = (med_bool) _changement;
  *transformation = MED_FALSE;
  /*
   * Gestion entitytype == MED_UNDEF_ENTITY_TYPE
   */
  if ( entitytype == MED_UNDEF_ENTITY_TYPE ) {
    _n=0; goto SORTIE;
  }

  /*
   * Gestion entitytype == MED_ALL_ENTITY_TYPE
   */
  if ( entitytype == MED_ALL_ENTITY_TYPE ) {
    _err=_MEDnObjects(_datagroup1,".",&_n);
    if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
      MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,_datagroupname1);
      goto ERROR;
    }
    goto SORTIE;
  }


  /*
   *  Ouverture du datagroup de niveau 3 <entitytype>
   */
  if (_MEDgetEntityTypeName(_datagroupname2,entitytype) < 0) {
    MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
    ISCRUTE_int(entitytype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
  }

  if ((_datagroup2 = _MEDdatagroupOuvrir(_datagroup1,_datagroupname2)) < 0) {
    *changement     = (med_bool) MED_FALSE;
    _n=0;_datagroup2=0;
    goto SORTIE;
  }

  /*  MAJ du changement pour le type d'entité <entitytype>
   *   ( annulant eventuellement le changement global précédent concernant tous les types d'entités)
   *  Attribut CGT (un changement a eu lieu depuis l'étape de calcul précédente)
   */
  if ( _MEDattrEntierLire(_datagroup2,MED_NOM_CGT,&_changement) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    SSCRUTE(_datagroupname2);SSCRUTE(MED_NOM_CGT);
    goto ERROR;
  }
  *changement = (med_bool) _changement;

  /*
   *  Ouverture du datagroup de niveau 4 <geotype>
   */

  /* Pas Utilisation pour MED_NODE  */
  if ( geotype == MED_GEO_ALL ) {

    _err=_MEDnObjects(_datagroup2,".",&_n);
    if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
      MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,_datagroupname2);
      goto ERROR;
    }
    /*Par construction du modèle, le tableau de coordonnées preexiste aux autres */
    if ( ( entitytype == MED_NODE ) && (_n > 0) ) _n=1;
    goto SORTIE;
  }

  if ( entitytype != MED_NODE ) {

    /* Lecture du nom de type géométrique */
    /*TODO : Remplacer les deux appels suivants par un seul gérant les geotype dynamiques et statiques*/
    if ( entitytype == MED_STRUCT_ELEMENT ) {
      if ( MEDstructElementName(fid, geotype,_datagroupname3) < 0 ) {
	MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDstructElementName");
	ISCRUTE_int(geotype);goto ERROR;
      }
    } else
      if ( _MEDgetInternalGeometryTypeName(_datagroupname3,geotype) < 0) {
	MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_GEOMETRIC,MED_ERR_VALUE_MSG);
	ISCRUTE_int(geotype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
	SSCRUTE(_datagroupname2);goto ERROR;
      }

    if ((_datagroup3 = _MEDdatagroupOuvrir(_datagroup2,_datagroupname3)) < 0) {
      _n=0;
      *changement = MED_FALSE;
      goto SORTIE;
    }
  }

  if (_datagroup3) _datagroup=_datagroup3; else _datagroup=_datagroup2;

  /*  MAJ du changement pour le type géométrique d'entité <geotype>
   *   ( annulant eventuellement le changement global précédent concernant tous les types d'entités)
   *  Attribut CGT (un changement a eu lieu depuis l'étape de calcul précédente)
   * Prend en charge le cas d'un dataset vide écrit pour un typegeo donné (CHGT==1)
   */
  if (_datagroup3) {
    if ( _MEDattrEntierLire(_datagroup3,MED_NOM_CGT,&_changement) < 0) {
      MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
      SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
      SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);
      goto ERROR;
    }
    *changement = (med_bool) _changement;
  }

  /*
   * Lecture du flag de modification sur autre chose que MED_CONNECTIVITY,MED_COORDINATE,MED_COORDINATE_AXIS<i>
   *
   */
  if ( _MEDattrEntierLire(_datagroup,MED_NOM_CGS,&_changement_s) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGS);goto ERROR;
  }

  /* 1) Lorsque l'utilisateur interroge un <meddatatype> qui est relatif a des coordonnées (famille,....) il faut mettre
   * le flag chgt à jour par rapport à des modifications potentiellement effectuées sur ces coordonnées
   * <=>
   * Si on interroge autre chose que MED_CONNECTIVITY,MED_COORDINATE
   * et qu'un changement est présent sur MED_CONNECTIVITY,MED_COORDINATE
   * le flag chgt doit être positionné à vrai
   * Une demande entitype==MED_NODE && (meddatatype == MED_COORDINATE_AXIS1)||(meddatatype == MED_COORDINATE_AXIS2)
   *    ||(meddatatype === MED_COORDINATE_AXIS3) est assimilée à une demande concernant des coordonnées
   * <=>
   * Y-a-t'il une modification des datasets COO(si NOE)| NOD|DES(si !NOE)
   */
  /* 2)
   * Positionne un mode de connectivité _cmode si le meddatatype demandé
   * est autre chose que des coordonnées ou des connectivités et que le cmode n'a pas été
   * spécifié par l'utilisateur.
   * Cette Information est necessaire pour construire le nom du dataset.
   */
  if (    (meddatatype != MED_CONNECTIVITY) && ( meddatatype != MED_COORDINATE )
       && (meddatatype != MED_COORDINATE_AXIS1)
       && (meddatatype != MED_COORDINATE_AXIS2)
       && (meddatatype != MED_COORDINATE_AXIS3)
       && (meddatatype != MED_INDEX_FACE)
       && (meddatatype != MED_INDEX_NODE)) {

    if (entitytype == MED_NODE) {
      if ( ( (med_mesh_type) _intmeshtype ) != MED_UNSTRUCTURED_MESH ) {
	if ( (_gridtype == MED_CARTESIAN_GRID) ||
	     (_gridtype == MED_CURVILINEAR_GRID) ) {
	  _ntmpmeddatatype=_meshdim;
	  _tmpmeddatatype[0] = MED_COORDINATE_AXIS1;
	  _tmpmeddatatype[1] = MED_COORDINATE_AXIS2;
	  _tmpmeddatatype[2] = MED_COORDINATE_AXIS3;
	} else  if (_gridtype == MED_CURVILINEAR_GRID ) {
/*Les grilles curvilinéaires utilisent MED_COORDINATE_AXISx pour stocker la structure et le tableau MED_COORDINATE pour stocker les coordonnées des noeuds */
	  ++_ntmpmeddatatype;
	  _tmpmeddatatype[3] = MED_COORDINATE;
	} else {
	MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_GRIDTYPE,MED_ERR_MESH_MSG);
	SSCRUTE(meshname);ISCRUTE_int(_gridtype);goto ERROR;
	}
      } else
	_tmpmeddatatype[0] = MED_COORDINATE;
    } else {
      switch (geotype) {
      case MED_POLYHEDRON:
	_ntmpmeddatatype=3;
	_tmpmeddatatype[2] = MED_CONNECTIVITY;
	_tmpmeddatatype[1] = MED_INDEX_FACE;
	_tmpmeddatatype[0] = MED_INDEX_NODE;
	break;
      case MED_POLYGON:
	_ntmpmeddatatype=2;
	_tmpmeddatatype[1] = MED_CONNECTIVITY;
	_tmpmeddatatype[0] = MED_INDEX_NODE;
	break;
      default:
	if ( ( (med_mesh_type) _intmeshtype ) == MED_STRUCTURED_MESH ) {
	  _ntmpmeddatatype=0;
	  break;
	}
	_tmpmeddatatype[0] = MED_CONNECTIVITY;
	if ( cmode == MED_NO_CMODE ) {
	  if ( _MEDdatasetExistByMedtype(_datagroup,MED_CONNECTIVITY,MED_NODAL,
				&_datasetexist, &_isasoftlink) < 0) {
	    MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDdatasetExistByMedtype");
	    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
	    SSCRUTE(_datagroupname3);goto ERROR;
	  }

	  if ( _datasetexist ) _cmode= MED_NODAL;
	  else
	    if ( _MEDdatasetExistByMedtype(_datagroup,MED_CONNECTIVITY,MED_DESCENDING,
				  &_datasetexist, &_isasoftlink)  < 0) {
	      MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDdatasetExistByMedtype");
	      SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
	      SSCRUTE(_datagroupname3);goto ERROR;
	    } else
	      _cmode = MED_DESCENDING;
	}
      }
    }

    *changement = MED_FALSE;
    for (_i=0; _i < _ntmpmeddatatype ;++_i) {
      if ( _MEDgetDatasetChgt( _datagroup, _tmpmeddatatype[_i], _cmode,
			       &_isasoftlink, &_changement_co ) < 0) {
	MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"getDatasetChgt");
	SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
	SSCRUTE(_datagroupname3);goto ERROR;
      }
      *changement |= _changement_co;
    }
  }


  /*
   * Niveau de datagroup 5 supplémentaire pour les éléments de structure ou les transformations.
   */
  if (  (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF ) ) {
    if (meddatatype == MED_VARIABLE_ATTRIBUTE)
      strcpy(_datagroupname4,MED_VARATR_NOM);
    else
      strcpy(_datagroupname4,MED_COOTRF_NOM);

    if ((_datagroup4 = _MEDdatagroupOuvrir(_datagroup,_datagroupname4)) < 0) {
      _n=0;
      goto SORTIE;
    }
  }
  if ( (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF ) )
    _datagroupf=_datagroup4;
  else
    _datagroupf=_datagroup;


  /*
   * Construction du nom du dataset à lire
   */
  if (  _MEDgetDatasetName(_datasetname,meddatatype,cmode) < 0) {
    MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetName");
    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    SSCRUTE(_datagroupname3);goto ERROR;
  }

  /*
   *  MAJ du champ transformation pour le (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF)
   */
  if (_datagroup4) {
    if ( _MEDattrEntierLire(_datagroup4,MED_NOM_CGT,&_transformation) < 0) {
      MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
      SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
      SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);SSCRUTE(MED_NOM_CGT);
      goto ERROR;
    }
  }

  if ( (_dataset = _MEDdatasetOuvrir(_datagroupf,_datasetname)) < 0) {
    _n=0;_dataset=0;*transformation = (med_bool) MED_FALSE;
/*     if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) { */
/*       MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATASET,_datasetname); */
/*       SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt); */
/*       SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4); */
/*       ISCRUTE_size(_n); */
/*       goto ERROR; */
/*     } */
    goto SORTIE;
  }


  if (!_datagroup4) {

    /*
     * Lire l'attribut CGT pour savoir si le dataset a changé
     * n'a pas de sens si le dataset est en fait un lien vers le dataset précedent.
     * En testant si le dataset est un lien on détermine si un changement a eu lieu
     * depuis la séquence de calcul précédente.
     * Ce traitement ne doit pas être effectué pour le pas de temps initial et pour
     * (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF)
     */

    if ( _MEDisasoftlink(_datagroupf, _datasetname,MED_TRUE, &_isasoftlink ) < 0) {
      MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_LINK,_datasetname);
      SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
      SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);
      ISCRUTE_size(_n);goto ERROR;
    }

    if (_isasoftlink)
      _transformation = MED_FALSE;
    else {

      if ( _MEDattrEntierLire(_dataset,MED_NOM_CGT,&_transformation) < 0) {
	MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
	SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
	SSCRUTE(_datagroupname3);SSCRUTE(MED_NOM_CGT);
	goto ERROR;
      }
    }

  }

  *transformation = (med_bool) _transformation;

  if ( ( meddatatype == MED_CONNECTIVITY) && ( meddatatype == MED_COORDINATE ) ) {
    *transformation &= (med_bool) !_changement_s;
  }

  /*
   * Attribut PFL (nombre de noeuds ou d'elements)
   * la lecture est faite sur le datagroup _datagroup et non sur _datagroupf
   * pour (meddatatype==MED_VARIABLE_ATTRIBUTE) || (meddatatype==MED_COORDINATE_TRSF)
   */
  _profilearraysize = 0;
  profilename[0]='\0';

  if ( _MEDattrStringLire(_datagroup,MED_NOM_PFL,MED_NAME_SIZE,_profilename) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
    SSCRUTE(_datagroupname3); SSCRUTE(MED_NOM_PFL);SSCRUTE(_profilename);goto ERROR;
  }

  if ( strcmp(_profilename,MED_NO_PROFILE_INTERNAL) ) {
    strncpy(profilename,_profilename,MED_NAME_SIZE+1);
    profilename[MED_NAME_SIZE]='\0';

    if ( ( _profilearraysize = MEDprofileSizeByName( fid,_profilename) ) < 0 ) {
      MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,MED_ERR_MESH_MSG);
      SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
      SSCRUTE(_profilename);SSCRUTE("MEDprofileSizeByName");goto ERROR;
    }
  }
  *profilesize=(med_int) _profilearraysize;
  

  /*
   * Attribut NBR (nombre d'entité)
   */
  if ( _MEDattrEntierLire(_dataset,MED_NOM_NBR,&_intn) < 0) {
    MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
    SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);
    SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);SSCRUTE(_datagroupname4);
    SSCRUTE(_datasetname);SSCRUTE(MED_NOM_NBR);ISCRUTE_size(_n);goto ERROR;
  }
  _n = _intn;

  if (_profilearraysize)
    switch(storagemode) {

    case MED_GLOBAL_PFLMODE :
      break;

    case MED_COMPACT_PFLMODE :
      if ( meddatatype!=MED_COORDINATE_TRSF )
	_n=_profilearraysize;

      break;

    default :
      MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_STORAGEMODE,MED_ERR_VALUE_MSG);
      ISCRUTE_int(storagemode);goto ERROR;
      break;

    }

 SORTIE:

  _ret = _n;

 ERROR:


  if (_dataset>0)     if (_MEDdatasetFermer(_dataset) < 0) {
    MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATASET,MED_NOM_COO);
    ISCRUTE_id(_dataset);
  }

  if (_datagroup4>0)     if (_MEDdatagroupFermer(_datagroup4) < 0) {
    MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname4);
    ISCRUTE_id(_datagroup4);
  }

  if (_datagroup3>0)     if (_MEDdatagroupFermer(_datagroup3) < 0) {
    MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname3);
    ISCRUTE_id(_datagroup3);
  }

  if (_datagroup2>0)     if (_MEDdatagroupFermer(_datagroup2) < 0) {
    MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
    ISCRUTE_id(_datagroup2);
  }

  if (_datagroup1>0)     if (_MEDdatagroupFermer(_datagroup1) < 0) {
    MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname1);
    ISCRUTE_id(_datagroup1);
  }

  if (_meshid>0)            if (_MEDdatagroupFermer(_meshid) < 0) {
    MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
    ISCRUTE_id(_meshid);
  }

/*   _MEDobjetsOuverts(fid); */

  *fret = _ret;
  va_end(params);
  return;
}
示例#2
0
void
_MEDfieldnValue236(int dummy, ...)
{


  med_int               _ret                 =-1;
  med_int               _nprofile         = 0;
  med_int               _n                   = 0;
  med_int               _profilearraysize    = 0,_nvaluesperentity=0;
  med_int               _nintegrationpoint= 0;
  med_bool              _anyprofile          = MED_FALSE;
  med_geometrie_element _locgeotype          = 0;
  med_int               _intlocgeotype       = 0;
  med_int               _nvaluesperentityfromloc=0;
  int                   _dummy                     =0;
  char     _localizationname  [MED_TAILLE_NOM+1]                 = "";
  char     _tmpprofilename    [MED_NAME_SIZE+1]                  = "", *_profilename=0;
  char     _path              [MED_LOCALIZATION_GRP_SIZE+MED_TAILLE_NOM+1]= MED_LOCALIZATION_GRP;
  char     _geotype           [MED_TAILLE_NOM_ENTITE+1]          = "";


  MED_VARGS_DECL(const, med_idt           , , fid                        );
  MED_VARGS_DECL(const, char * , const      , fieldname                  );
  MED_VARGS_DECL(const, med_int           , , numdt                      );
  MED_VARGS_DECL(const, med_int           , , numit                      );
  MED_VARGS_DECL(const, med_entity_type   , , entitytype                 );
  MED_VARGS_DECL(const, med_geometry_type , , geotype                    );
  MED_VARGS_DECL(, char *, const      , profilename                      );
  MED_VARGS_DECL(const, int               , , profileit                  );
  MED_VARGS_DECL(const, med_storage_mode  , , storagemode                );
  MED_VARGS_DECL(, med_int *, const   , profilesize                      );
  MED_VARGS_DECL(, char *, const      , localizationname                 );
  MED_VARGS_DECL(, med_int *, const   , nintegrationpoint             );
  MED_VARGS_DECL(, med_int *         ,, fret                             );

  va_list params;
  va_start(params,dummy);

  MED_VARGS_DEF(const, med_idt           , , fid                        );
  MED_VARGS_DEF(const, char * , const      , fieldname                  );
  MED_VARGS_DEF(const, med_int           , , numdt                      );
  MED_VARGS_DEF(const, med_int           , , numit                      );
  MED_VARGS_DEF(const, med_entity_type   , , entitytype                 );
  MED_VARGS_DEF(const, med_geometry_type , , geotype                    );
  MED_VARGS_DEF(, char *, const      , profilename                      );
  MED_VARGS_DEF(const, int               , , profileit                  );
  MED_VARGS_DEF(const, med_storage_mode  , , storagemode                );
  MED_VARGS_DEF(, med_int *, const   , profilesize                      );
  MED_VARGS_DEF(, char *, const      , localizationname                 );
  MED_VARGS_DEF(, med_int *, const   , nintegrationpoint             );
  MED_VARGS_DEF(, med_int *         ,, fret                             );

  /*
   * On inhibe le gestionnaire d'erreur HDF 5
   */
  _MEDmodeErreurVerrouiller();

  NOFINALBLANK(fieldname,ERROR);

  if ( (profileit != 1) &&  
       (profileit != -1)) {
    MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_PARAMETER,MED_ERR_VALUE_MSG);
    ISCRUTE_int(profileit);goto ERROR;
  }

  /*
   * Cette appel effectue l'appel à _MEDfieldComputingStepCheck236
   */
  _MEDfieldnProfile236(_dummy,fid,fieldname,numdt,numit,entitytype,geotype,
		       &_tmpprofilename,&_localizationname,&_nprofile );


  if ( _nprofile  < 0 ) {
    MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDfieldnProfile236");
    goto ERROR;
  }

  /* REM: MEDnVal prend en compte le nombre de points de Gauss, ce qui n'est pas le cas
     de MEDfieldnValue */
  if ( (_n = MEDnVal(fid, (char *) fieldname,entitytype,geotype,
		     numdt,numit,MED_NOREF,(med_mode_profil) storagemode) ) < 0 ) {
    MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"MEDnVal");
    goto ERROR;
  }

  /*
   * Lecture de la taille du profil (eventuellement MED_ALLENTITIES_PROFILE)
   */

  /* REM:  (profileit < 0 ) signifie que l'on nous a fourni <profilename> */
  if ( profileit < 0 ) {
      if ( !strlen(profilename)) {
	_profilename = MED_NOPFL;
      }  else {
	if ( strcmp(_tmpprofilename,profilename) ) {
	  MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_PARAMETER,profilename);
	  SSCRUTE(_tmpprofilename); goto ERROR;
	}
	_profilename=profilename;
	_anyprofile=MED_TRUE;
      }
  } else {
    strncpy(profilename,_tmpprofilename,MED_TAILLE_NOM+1);
    profilename[MED_TAILLE_NOM]='\0';
    _profilename=profilename;
    if ( strlen(profilename)) _anyprofile=MED_TRUE;
  }

  if ( _anyprofile ) {
    if ( (_profilearraysize=MEDprofileSizeByName(fid, _profilename)) < 0)  {
      MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,MED_ERR_FIELD_MSG);
      SSCRUTE(fieldname); SSCRUTE(_profilename);
      SSCRUTE("MEDprofileSizeByName");goto ERROR;
    }
  }

  /*
   * Lecture du nombre de points d'intégration.
   */

  strncpy(localizationname,_localizationname,MED_TAILLE_NOM+1);
  localizationname[MED_TAILLE_NOM]='\0';

  /* Vérification de la cohérence du  nombre de valeurs pas entité */
  if (entitytype == MED_NODE_ELEMENT ) {
    if ( strlen( _localizationname) ) {
	MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_PARAMETER,_localizationname);
	SSCRUTE(MED_NO_LOCALIZATION);ISCRUTE_int(entitytype);goto ERROR;
    }
    _nvaluesperentityfromloc = geotype % 100;
  } else if (! strcmp(_localizationname,MED_GAUSS_ELNO)) {
    /* Les points de Gauss sont d"finis sur les noeuds de l'element (mot cle) */
    /* le nombre de points de Gauss est egal au nombre de noeuds de l'element */
    _nvaluesperentityfromloc = geotype % 100;
  } else if ( strlen(_localizationname) ) {

    strcat(_path,_localizationname);

    if ( _MEDattributeNumRdByName(fid, _path, MED_NOM_NBR,MED_INTERNAL_INT,(unsigned char *) &_nvaluesperentityfromloc) < 0 ) {
      MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE, MED_ERR_NAME_MSG );
      SSCRUTE(MED_NOM_NBR);SSCRUTE(_path); ISCRUTE(_nvaluesperentityfromloc);goto ERROR;
    }

    if ( _MEDattributeNumRdByName(fid, _path, MED_NOM_GEO, MED_INTERNAL_INT,(unsigned char *) &_intlocgeotype) < 0 ) {
      MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE, MED_ERR_NAME_MSG );
      SSCRUTE(MED_NOM_GEO);SSCRUTE(_path); ISCRUTE(_intlocgeotype);goto ERROR;
    }

    _locgeotype = (med_geometry_type) _intlocgeotype;

    if ( _locgeotype != geotype ) {
      MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_LOCALIZATION_MSG);
      SSCRUTE(_localizationname);SSCRUTE(MED_NOM_GEO);ISCRUTE_int(_locgeotype);ISCRUTE_int(geotype);
      goto ERROR;
    }

  } else {
    _nvaluesperentityfromloc = 1;
  }

  /* Pour effectuer la vérification suivante (incohérence dans le fichier suite à une 
     maj de la localisation ou du champ  sans prise en compte d'un nombre de points d'intégration différent),
     il faudrait lire l'attribut MED_NOM_NGA sur le maillage par défaut du champ*/
  /* Pour celà il faut soit developper une nouvelle routine soit utiliser MEDpasdetempsInfo mais qui
     est itérative*/
/*   if ( _nvaluesperentityfromloc != _nvaluesperentity ) { */
/*     MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_LOCALIZATION_MSG); */
/*     SSCRUTE(_localizationname);SSCRUTE(MED_NOM_GEO);ISCRUTE(_nvaluesperentityfromloc); */
/*     ISCRUTE(_nvaluesperentity);goto ERROR; */
/*   } */

  *nintegrationpoint = _nvaluesperentityfromloc;

  _n/=_nvaluesperentityfromloc;

  /*Rectification de la valeur 2.3.6 qui prend en compte le nombre de points d'intégration*/
  if (_anyprofile)
    *profilesize=_profilearraysize;
  else
    *profilesize=_n;


  _ret = _n;
 ERROR:

  va_end(params);
  *fret = _ret;

  return;
}
med_err _MEDfilterBlockOfEntityNoICompactCr(const med_idt          fid,
					    const med_int          nentity,
					    const med_int          nvaluesperentity,
					    const med_int          nconstituentpervalue,
					    const med_int          constituentselect,
					    const med_storage_mode storagemode,
					    const char * const     profilename,
					    const med_size  start,
					    const med_size  stride,
					    const med_size  count,
					    const med_size  blocksize,
					    const med_size  lastblocksize,
					    med_filter*    const   filter) {

  med_size   _start=start-1,_count=count;
  med_size   _1[1]={1};
  med_idt    _memspace [MED_MAX_FILTER_SPACES]= MED_MAX_FILTER_SPACES_INIT;
  med_idt    _filespace[MED_MAX_FILTER_SPACES]= MED_MAX_FILTER_SPACES_INIT;
  med_size   _memspacesize[1]={0},_filespacesize[1]={0};
  med_size   _startmem[1]={0},_startfile[1]={0},_filelastblocksize[1]={0};
  med_size   _stridemem[1]={0},_countmem[1]={0},_countfilelastblock[1]={0};
  med_size   _startfile_lastblock[1]={0},_stridefile[1]={0},_blocksize[1]={0},_memblocksize[1]={0};
  med_size   _onedimallvaluesfileoffset=0,_onedimallvaluesmemoffset=0;
  med_err    _ret=-1;
  int        _dim=0, _firstdim=0, _dimutil=0, _lastdim=0,_index=0 ;
  int        _anyprofil=0,_anylastblock=0;
  med_int    _profilearraysize=0,profilearraysize=0;

  if ( constituentselect != MED_ALL_CONSTITUENT) {
    _firstdim = constituentselect-1;
    _lastdim  = constituentselect;
    _dimutil  = 1;
  } else {
    _firstdim = 0;
    _lastdim  = nconstituentpervalue;
    _dimutil  = nconstituentpervalue;
  }

  if ( (count < 1 ) || ( blocksize < 1 ) ) {
    _index=0;
    for (_dim=_firstdim; _dim < _lastdim; _dim++) {
      if ( (_memspace[_index]=H5Screate(H5S_NULL)) < 0 ) {
	MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_MEMSPACE,MED_ERR_ID_MSG);
	ISCRUTE_id(_memspace[_index]);
	goto ERROR;
      }
      if ( (_filespace[_index]=H5Screate(H5S_NULL)) < 0 ) {
	MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_FILESPACE,MED_ERR_ID_MSG);
	ISCRUTE_int(_filespace[_index]);
	goto ERROR;
      }
      ++_index;
    }
    goto SAVEFILTER;
  }

  if ( (count > 1) && (lastblocksize != blocksize) && lastblocksize ) /*Tester ou non si lastblocksize est bien > blocksize */
    {--_count;_anylastblock=1;_countfilelastblock[0]=1;_filelastblocksize[0]=1;}
/*   ISCRUTE(_start); */
/*   ISCRUTE(_count); */
/*   ISCRUTE(_countfilelastblock[0]); */

  /* Conditionne les traitements à l'existence d'un profil */
  if ( _anyprofil=(strlen(profilename)) ) {
    profilearraysize = MEDprofileSizeByName(fid,profilename);
    _profilearraysize=profilearraysize;
  } else {
    _profilearraysize = nentity;
  }

  _blocksize             [0] = blocksize*nvaluesperentity; /*!*nconstituentpervalue car on sélectionne par constituent*/
  _onedimallvaluesmemoffset  = _blocksize[0]*_count+ _anylastblock*lastblocksize*nvaluesperentity;
  _memspacesize          [0] = _onedimallvaluesmemoffset*nconstituentpervalue;
  _stridemem             [0] = 1;
  _countmem              [0] = 1;
  _memblocksize          [0] = _onedimallvaluesmemoffset;

  _onedimallvaluesfileoffset = _profilearraysize*nvaluesperentity;
  _filespacesize     [0]     = _onedimallvaluesfileoffset*nconstituentpervalue;
  _stridefile        [0]     = stride*nvaluesperentity;
  _filelastblocksize [0]     *= lastblocksize*nvaluesperentity;

/*   ISCRUTE(_blocksize             [0] ); */
/*   ISCRUTE(_onedimallvaluesmemoffset  ); */
/*   ISCRUTE_id(_memspacesize          [0] ); */
/*   ISCRUTE(_stridemem             [0] ); */
/*   ISCRUTE(_countmem              [0] ); */
/*   ISCRUTE(_memblocksize          [0] ); */

/*   ISCRUTE(_onedimallvaluesfileoffset ); */
/*   ISCRUTE_int(_filespacesize     [0]     ); */
/*   ISCRUTE(_stridefile        [0]     ); */
/*   ISCRUTE(_filelastblocksize [0]     ); */


  if ( _memspacesize[0] > _filespacesize[0] ) {
    MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_MEMSPACE,MED_ERR_SIZE_MSG);
    ISCRUTE_size(_memspacesize[0]);
    ISCRUTE_size(_filespacesize[0]);
    goto ERROR;
  }

  _index=0;
  for (_dim=_firstdim; _dim < _lastdim; _dim++) {

    if ( (_memspace[_index] = H5Screate_simple (1, _memspacesize, NULL)) <0) {
      MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_MEMSPACE,MED_ERR_ID_MSG);
      ISCRUTE_id(_memspace[_index]);
      MESSAGE(MED_ERR_SIZE_MSG);
      ISCRUTE_size(_memspacesize[0]);
      goto ERROR;
    }

    _startmem      [0] = _dim*_onedimallvaluesmemoffset;
    if ( H5Sselect_hyperslab (_memspace[_index], H5S_SELECT_SET, _startmem, _stridemem,
			      _countmem, _memblocksize) <0 ) {
      MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_MEMSPACE,MED_ERR_ID_MSG);
      ISCRUTE_id(_memspace[_index]);
      goto ERROR;
    }
/*     ISCRUTE_id(_memspace[_index]); */

    if ( (_filespace[_index] = H5Screate_simple(1,_filespacesize,NULL)) < 0) {
      MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_FILESPACE,MED_ERR_ID_MSG);
      ISCRUTE_id(_filespace[_index]);
      MESSAGE(MED_ERR_SIZE_MSG);
      ISCRUTE_size(_filespacesize[0]);
      goto ERROR;
    }
    _startfile[0] = _dim*_onedimallvaluesfileoffset+_start*nvaluesperentity;
    if ( H5Sselect_hyperslab (_filespace[_index], H5S_SELECT_SET, _startfile, _stridefile,
			      &_count, _blocksize ) <0) {
      MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_FILESPACE,MED_ERR_ID_MSG);
      ISCRUTE_int(_filespace[_index]);
      goto ERROR;
    }

    /*File: Conditionally (_count) add a specific lastblock selection */
    _startfile_lastblock[0] = _startfile[0]+_stridefile[0]*_count;
/*     ISCRUTE(_startfile_lastblock[0]); */
    if ( H5Sselect_hyperslab (_filespace[_index], H5S_SELECT_OR, _startfile_lastblock,_1 ,
			      _countfilelastblock, _filelastblocksize ) <0) {
      MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_FILESPACE,MED_ERR_ID_MSG);
      ISCRUTE_int(_filespace[_index]);
      goto ERROR;
    }

/*     ISCRUTE_int(_filespace[_index]); */

    if (_index > MED_MAX_FILTER_SPACES) {
      MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_PARAMETER,"");
      ISCRUTE_int(_index);
      ISCRUTE(nconstituentpervalue);
      ISCRUTE_int(MED_MAX_FILTER_SPACES);
      goto ERROR;
    } else
      ++_index;
  }

 SAVEFILTER:
  if (  _MEDsetFilter(_dimutil,_memspace, _filespace, nentity,
		      nvaluesperentity, nconstituentpervalue,
		      constituentselect, MED_NO_INTERLACE,
		      MED_NO_FILTER_SIZE,profilearraysize,
		      storagemode, profilename, filter ) <0) {
    MED_ERR_(_ret,MED_ERR_INIT,MED_ERR_FILTER,"");
    goto ERROR;
  }

  _ret = 0;

 ERROR:

  return _ret;
}
示例#4
0
文件: test11.c 项目: mndjinga/CDMATH
med_err getFieldsOn(med_idt fid, char * nomcha, med_field_type typcha, med_int ncomp,
		    med_entity_type entite, med_switch_mode stockage, med_int ncstp) {

  int j,k,l,m,n,nb_geo=0;
  med_int nbpdtnor=0,pflsize,*pflval,ngauss=0,ngroup,*vale=NULL,nval;
  med_int numdt=0,numo=0,_nprofile;
  med_float *valr=NULL,dt=0.0;
  med_err ret=0;
  char pflname [MED_NAME_SIZE+1]="";
  char locname [MED_NAME_SIZE+1]="";
  char * lien = NULL;
  char dt_unit [MED_SNAME_SIZE+1]="unknown";


  med_geometry_type * type_geo;

  const char * const * AFF;
  const char * const * AFF_ENT=MED_GET_ENTITY_TYPENAME+1;
  switch (entite) {
  case MED_NODE :
    type_geo = MED_GET_NODE_GEOMETRY_TYPE;
    nb_geo   = MED_N_NODE_FIXED_GEO;
    AFF      = MED_GET_NODE_GEOMETRY_TYPENAME;
    break;
  case  MED_CELL :
  case  MED_NODE_ELEMENT :
    type_geo = MED_GET_CELL_GEOMETRY_TYPE;
    nb_geo   = MED_N_CELL_FIXED_GEO;
    AFF      = MED_GET_CELL_GEOMETRY_TYPENAME;
    break;
  case  MED_DESCENDING_FACE :
    type_geo = MED_GET_FACE_GEOMETRY_TYPE;
    nb_geo   = MED_N_FACE_FIXED_GEO;
    AFF      = MED_GET_FACE_GEOMETRY_TYPENAME;
    break;
  case  MED_DESCENDING_EDGE :
    type_geo = MED_GET_EDGE_GEOMETRY_TYPE;
    nb_geo   = MED_N_EDGE_FIXED_GEO;
    AFF      = MED_GET_EDGE_GEOMETRY_TYPENAME;
    break;
  }

  for (k=1;k<=nb_geo;k++) {

    /* Combien de (PDT,NOR) a lire */
    nbpdtnor = ncstp;
    if (nbpdtnor < 1 ) continue;

    for (j=0;j<nbpdtnor;j++) {

      if ( MEDfieldComputingStepInfo(fid,nomcha,j+1, &numdt, &numo, &dt ) <0) {
	MESSAGE("Erreur a la demande d'information sur (pdt,nor) : ");
	ISCRUTE(numdt); ISCRUTE(numo);
	ret = -1; continue;
      }

      if ( (_nprofile = MEDfieldnProfile(fid,nomcha,numdt,numo,entite,type_geo[k],
					    pflname,locname   ) ) < 0 ) {
	MESSAGE("Erreur a la demande du nombre de profils referencés par le champ : ");
	SSCRUTE(nomcha);
	ISCRUTE(numdt); ISCRUTE(numo);
	ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
	SSCRUTE(AFF_ENT[(int)entite]);SSCRUTE(AFF[k]);
	ret = -1; continue;
      };

      for (l=0;l<_nprofile;l++) {


	if ( (nval = MEDfieldnValueWithProfile(fid, nomcha, numdt, numo, entite, type_geo[k],
					       l+1,  USER_MODE, pflname,&pflsize,
					       locname, &ngauss) ) < 0 ) {
	  MESSAGE("Erreur a la lecture du nombre de valeurs du champ : ");
	  SSCRUTE(nomcha);ISCRUTE(numdt);ISCRUTE(numo);
	  ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
	  ISCRUTE_int(USER_MODE);
	  ret = -1; continue;
	};

	printf("\n  +Pas de Temps n."IFORMAT" (%f) [%s], n. d'ordre "IFORMAT", avec "IFORMAT" valeur(s) par entité.\n",numdt,dt,dt_unit,numo,ngauss);
	printf("\t- Il y a "IFORMAT" entités qui portent des valeurs en mode %i. Chaque entite %s\
 de type geometrique %s associes au profile |%s| a "IFORMAT" valeurs associées \n",
	       nval,USER_MODE,AFF_ENT[(int)entite],AFF[k],pflname,ngauss);

	/*Lecture des valeurs du champ */
	if (typcha == MED_FLOAT64) {


	  valr = (med_float*) calloc(ncomp*nval*ngauss,sizeof(med_float));
	  EXIT_IF(valr == NULL,NULL,NULL);

	  if (MEDfieldValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],
					 USER_MODE, pflname, stockage,MED_ALL_CONSTITUENT,
					 (unsigned char*) valr) < 0 ) {
	    MESSAGE("Erreur a la lecture des valeurs du champ : ");
	    SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
	    ISCRUTE(numdt);ISCRUTE(numo);
	    ret = -1;
	  }

	} else {

	  vale = (med_int*) calloc(ncomp*nval*ngauss,sizeof(med_int));
	  EXIT_IF(vale == NULL,NULL,NULL);

	  if (MEDfieldValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],
					 USER_MODE, pflname, stockage,MED_ALL_CONSTITUENT,
					 (unsigned char*) vale) < 0 ) {
	    MESSAGE("Erreur a la lecture des valeurs du champ : ");
	    SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
	    ISCRUTE(numdt);ISCRUTE(numo);
	    ret = -1;
	  };


	}

	if ( strlen(locname) )
	  printf("\t- Modèle de localisation des points de Gauss de nom |%s|\n",locname);

	if (entite == MED_NODE_ELEMENT)
	  ngroup = (type_geo[k] % 100);
	else
	  ngroup = ngauss;

	switch (stockage) {

	case MED_FULL_INTERLACE :
	  printf("\t- Valeurs :\n\t");
	  for (m=0;m<(nval*ngauss)/ngroup;m++) {
	    printf("|");
	    for (n=0;n<ngroup*ncomp;n++)
	      if (typcha == MED_FLOAT64)
		printf(" %f ",*(valr+(m*ngroup*ncomp)+n));
	      else
		printf(" "IFORMAT" ",*(vale+(m*ngroup*ncomp)+n));

	  }
	  break;

	  /*Affichage en fonction du profil à traiter*/
	case MED_NO_INTERLACE :
	  printf("\t- Valeurs :\n\t");
	  for (m=0;m<ncomp;m++) {
	    printf("|");
	    for (n=0;n<(nval*ngauss);n++)
	      if (typcha == MED_FLOAT64)
		printf(" %f ",*(valr+(m*nval)+n));
	      else
		printf(" "IFORMAT" ",*(vale+(m*nval)+n));
	  }
	  break;
	}

	printf("|\n");
	if (typcha == MED_FLOAT64) {
	  if ( valr ) {free(valr);valr = NULL;}}
	else
	  if (vale) { free(vale);vale = NULL; }

	/*Lecture du profil associe */
	if (strcmp(pflname,MED_NO_PROFILE) == 0 )
	  printf("\t- Profil : MED_NO_PROFILE\n");
	else {

	  if ( (pflsize = MEDprofileSizeByName(fid,pflname)) <0 )  {
	    MESSAGE("Erreur a la lecture du nombre de valeurs du profil : ");
	    SSCRUTE(pflname);
	    ret = -1; continue;
	  }

	  printf("\t- Profil : |%s| de taille "IFORMAT"\n",pflname,pflsize);

	  pflval = (med_int*) malloc(sizeof(med_int)*pflsize);
	  EXIT_IF(pflval == NULL,NULL,NULL);
	  if ( MEDprofileRd(fid,pflname,pflval) <0) {
	    MESSAGE("Erreur a la lecture des valeurs du profil : ");
	    SSCRUTE(pflname);
	    ret = -1;
	  }
	  printf("\t");
	  for (m=0;m<pflsize;m++) printf(" "IFORMAT" ",*(pflval+m));
	  printf("\n");
	  free(pflval);

	}

      }
    }
  } /* fin for sur les mailles*/

  return ret;
}
med_err _MEDfilterEntityFullIGlobalCr(const med_idt          fid,
				      const med_int          nentity,
				      const med_int          nvaluesperentity,
				      const med_int          nconstituentpervalue,
				      const med_int          constituentselect,
				      const med_storage_mode storagemode,
				      const char * const     profilename,
				      const med_int          filterarraysize,
				      const med_int* const   filterarray,
				      med_filter*    const   filter) {

  med_idt    _memspace[1]={0},_diskspace[1]={0};
  med_size   _memspacesize[1]={0},_diskspacesize[1]={0};
  med_int    profilearraysize=0;
  med_int    _profilearraysize=0, *_profilearray=0, (*_profilearrayfunc)(const med_int * const,int)=0;
  med_int    _filterarraysize=0,(*_filterarrayfunc)(const med_int * const,int)=0;
  med_size   *_fltmem=NULL,*_pfldisk=NULL;
  med_size   _fltmemsize[1],_pfldisksize[1];
  med_size   _onedimallvaluesdiskoffset=0;
  med_err    _ret=-1;
  int        _i=0,_j=0,_index=0;
  int        _dim=0, _firstdim=0, _dimutil=0, _lastdim=0 ;

  if ( constituentselect != MED_ALL_CONSTITUENT) {
    _firstdim = constituentselect-1;
    _lastdim  = constituentselect;
    _dimutil  = 1;
  } else {
    _firstdim = 0;
    _lastdim  = nconstituentpervalue;
    _dimutil  = nconstituentpervalue;
  }


  /* Conditionne les traitements à l'existence d'un profil */
  if ( strlen(profilename) ) {
    profilearraysize = MEDprofileSizeByName(fid,profilename);
    _profilearraysize = profilearraysize;
    _profilearray     = (med_int *) malloc (sizeof(med_int)*_profilearraysize);
    if ( MEDprofileRd(fid,profilename, _profilearray) <0) {
      MED_ERR_(_ret,MED_ERR_READ,MED_ERR_PROFILE,profilename);
      goto ERROR;
    }
    _profilearrayfunc = _withprofilearray;
  } else {
    _profilearrayfunc = _identity;
    _profilearraysize = nentity;
  }

  /* Conditionne les traitements à l'existence d'un filtre */
  if ( (filterarraysize <= 0) ) {
    _filterarrayfunc = _identity;
    _filterarraysize = _profilearraysize;
  } else {
    _filterarrayfunc = _withfilterarray;
    _filterarraysize = filterarraysize;
  }

  _fltmemsize[0] = _filterarraysize*nvaluesperentity*_dimutil;
  _fltmem        = (med_size *) malloc (sizeof(med_size)*_fltmemsize[0]);

  _memspacesize[0] = nentity*nvaluesperentity*nconstituentpervalue;

  if ( (_memspace[0] = H5Screate_simple (1,_memspacesize, NULL)) <0) {
    MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_MEMSPACE,MED_ERR_SIZE_MSG);
    ISCRUTE_size(*_memspacesize);
    goto ERROR;
  }


  /*Dimensionement profil interne et diskspace */
  _pfldisksize[0] = _fltmemsize[0];
  _pfldisk        = (med_size *) malloc (sizeof(med_size)*_pfldisksize[0]);

  _onedimallvaluesdiskoffset = _profilearraysize*nvaluesperentity;
  _diskspacesize[0]          = _onedimallvaluesdiskoffset*nconstituentpervalue;

  if ( (_diskspace[0] = H5Screate_simple (1,_diskspacesize, NULL)) <0) {
    MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DISKSPACE,MED_ERR_SIZE_MSG);
    ISCRUTE_size(*_diskspacesize);
    goto ERROR;
  }

  _index=0;
  for (_dim=_firstdim; _dim < _lastdim; ++_dim) {
    for (_i=0; _i < _filterarraysize; _i++) {
      for (_j=0; _j < nvaluesperentity; _j++) {
/* 	ISCRUTE(_filterarrayfunc(_i));ISCRUTE(_profilearrayfunc(_filterarrayfunc(_i))); */
/* 	ISCRUTE(_profilearrayfunc(_filterarrayfunc(_i))*nvaluesperentity*nconstituentpervalue); */
	_fltmem[_index] =
	  _profilearrayfunc(_profilearray,_filterarrayfunc(filterarray,_i))*nvaluesperentity*nconstituentpervalue
	  + _j*nconstituentpervalue+_dim;
	_pfldisk[_index] = _dim*_onedimallvaluesdiskoffset + _filterarrayfunc(filterarray,_i)*nvaluesperentity+_j;
#ifdef _DEBUG_
	printf("FullGlb :_fltmem[%d]=%llu -- _pfldisk[%d]=%llu \n",_index,_fltmem[_index],_index,_pfldisk[_index]);
#endif
	++_index;
      }
    }
  }

  if ( H5Sselect_elements(_memspace[0],H5S_SELECT_SET, _fltmemsize[0], HDF5_SELECT_BUG _fltmem ) <0) {
    MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_MEMSPACE,MED_ERR_ID_MSG);
    ISCRUTE_id(_memspace[0]);
    goto ERROR;
  }

  /*Ce type de sélection n'est pas utilisable en parallélisme*/
  if ( H5Sselect_elements(_diskspace[0] ,H5S_SELECT_SET,_pfldisksize[0], HDF5_SELECT_BUG _pfldisk ) <0) {
    MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_DISKSPACE,MED_ERR_ID_MSG);
    ISCRUTE_id(_diskspace[0]);
    goto ERROR;
  }

  free(_fltmem);       _fltmem=NULL;
  free(_pfldisk);      _pfldisk=NULL;
  free(_profilearray); _profilearray=NULL;

  if (  _MEDsetFilter(1,_memspace, _diskspace, nentity,
		      nvaluesperentity, nconstituentpervalue,
		      constituentselect, MED_FULL_INTERLACE,
		      filterarraysize,profilearraysize,
		      storagemode, profilename, filter ) <0) {
    MED_ERR_(_ret,MED_ERR_INIT,MED_ERR_FILTER,"");
    goto ERROR;
  }

  _ret = 0;

 ERROR:

  if (_fltmem)       free(_fltmem);
  if (_pfldisk)      free(_pfldisk);
  if (_profilearray) free(_profilearray);

  return _ret;
}