14#include "arcane/utils/ITraceMng.h" 
   15#include "arcane/utils/StringBuilder.h" 
   16#include "arcane/utils/HashTableMap.h" 
   17#include "arcane/utils/NotImplementedException.h" 
   18#include "arcane/utils/NotSupportedException.h" 
   19#include "arcane/utils/ArgumentException.h" 
   21#include "arcane/hdf5/Hdf5VariableInfoBase.h" 
   23#include "arcane/core/MeshVariable.h" 
   24#include "arcane/core/IItemFamily.h" 
   25#include "arcane/core/IMesh.h" 
   26#include "arcane/core/IMeshSubMeshTransition.h" 
   27#include "arcane/core/IVariable.h" 
   28#include "arcane/core/IVariableMng.h" 
   29#include "arcane/core/IParallelMng.h" 
   42template<
typename VariableType,
typename DataType>
 
   43class Hdf5ItemVariableInfo
 
   44: 
public Hdf5VariableInfoBase
 
   49  VariableType& trueVariable() { 
return m_variable; }
 
   50  virtual IVariable* variable()
 const { 
return m_variable.variable(); }
 
   61  VariableType m_variable;
 
 
   67template<
typename VariableType,
typename DataType>
 
   68class Hdf5ScalarVariableInfo
 
   69: 
public Hdf5VariableInfoBase
 
   74  VariableType& trueVariable() { 
return m_variable; }
 
   75  virtual IVariable* variable()
 const { 
return m_variable.variable(); }
 
   87  VariableType m_variable;
 
 
   96  IItemFamily* family = mesh->findItemFamily(family_name,
true);
 
   98  return Hdf5VariableInfoBase::create(var);
 
  104Hdf5VariableInfoBase* Hdf5VariableInfoBase::
 
  107  _checkValidVariable(var);
 
  108  Hdf5VariableInfoBase* var_info = 0;
 
  210                                String::format(
"IData for variable '{0}'",var->
fullName()));
 
 
  217void Hdf5VariableInfoBase::
 
  230  ARCANE_FATAL(
"Bad variable '{0}'. Variable has to be an item variable and have dimension" 
  231               "'1' or be a scalar variable",var->
fullName());
 
  255      unique_ids[index] = (*iitem).uniqueId();
 
  260  if (save_type & SAVE_IDS){
 
  262    ids_writer.parallelWrite(pm,st,unique_ids,unique_ids);
 
  273  if (save_type & SAVE_COORDS){
 
  282      const Real nan_value = std::numeric_limits<Real>::quiet_NaN();
 
  283      const Real3 real3_nan = 
Real3(nan_value,nan_value,nan_value);
 
  285        ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
 
  288          if (nb_node>max_nb_node)
 
  289            max_nb_node = nb_node;
 
  294      ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
 
  298        for( NodeLocalId inode : item.
nodeIds() ){
 
  299          coords.
add(nodes_coords[inode]);
 
  300          item_center += nodes_coords[inode];
 
  302        item_center /= nb_node;
 
  304        for( 
Integer k=nb_node; k<max_nb_node; ++k )
 
  305          coords.
add(real3_nan);
 
  306        centers.
add(item_center);
 
  311      coords_writer.parallelWrite(pm,st,coords,unique_ids);
 
  313      centers_writer.parallelWrite(pm,st,centers,unique_ids);
 
  315      types_writer.parallelWrite(pm,st,items_type,unique_ids);
 
  320        coords.
add(nodes_coords[iitem]);
 
  323      coords_writer.parallelWrite(pm,st,coords,unique_ids);
 
  326      tm->
pwarning() << 
"Can not save coordinates for family name=" 
 
  335void Hdf5VariableInfoBase::
 
  352    ids_reader.readDim();
 
  354    tm->
info() << 
"NB_OLD_ITEM nb=" << nb_old_item;
 
  355    saved_unique_ids.
resize(nb_old_item);
 
  356    dummy_uids.
resize(nb_old_item);
 
  358  ids_reader.parallelRead(pm,st,saved_unique_ids,dummy_uids);
 
  361  Hdf5Utils::StandardArrayT<Real3> centers_reader(hfile.id(),hdf_path+
"_Center");
 
  363    centers_reader.readDim();
 
  364  centers_reader.parallelRead(pm,st,saved_centers,dummy_uids);
 
  365  tm->
info() << 
"READ SAVED CENTERS nb=" << saved_centers.size();
 
  367  uids.
copy(saved_unique_ids);
 
  368  centers.
copy(saved_centers);
 
  377template<
typename VariableType,
typename DataType>
 
  389template<
typename VariableType,
typename DataType> 
void 
  394  ARCANE_UNUSED(ids_hpath);
 
  397    var_data = variable()->data();
 
  403    const char* n = 
typeid(var_data).name();
 
  415      hfile.openRead(filename);
 
  419  _readStandardArray(buffer,unique_ids,ids_hpath,hfile.id(),st);
 
  421  Integer buf_size = buffer.size();
 
  423  Integer nb_var_value = var_value.size();
 
  424  if (var->isPartial()){
 
  430    for( 
Integer z=0; z<buf_size; ++z ){
 
  431      values_from_uid.add(unique_ids[z],buffer[z]);
 
  433    ItemGroup var_group = m_variable.itemGroup();
 
  436      Int64 uid = item.uniqueId();
 
  437      if (m_correspondance_functor){
 
  438        uid = m_correspondance_functor->getOldUniqueId(uid,iitem.index());
 
  443                                  String::format(
"Can not find item uid='{0}' reading variable '{1}'",
 
  444                                                 uid,var->fullName()));
 
  445      DataType value = data->value();
 
  446      var_value[iitem.index()] = value;
 
  451    var->itemFamily()->itemsUniqueIdToLocalId(local_ids,unique_ids,
false);
 
  452    for( 
Integer z=0; z<buf_size; ++z ){
 
  454      if (lid==NULL_ITEM_LOCAL_ID)
 
  456      if (lid>nb_var_value)
 
  457        throw FatalErrorException(A_FUNCINFO,String::format(
"Bad item index '{0}' max={1}",lid,nb_var_value));
 
  458      var_value[lid] = buffer[z];
 
  461  tm->info(4) << 
"End of read for variable '" << var->fullName() << 
"'";
 
  467template<
typename VariableType,
typename DataType> 
void 
  470                   const String& ids_hpath,hid_t file_id,
 
  473  ARCANE_UNUSED(ids_hpath);
 
  484    if (!ids_hpath.null())
 
  485      values.setIdsPath(ids_hpath);
 
  490      tm->fatal() << 
"Only one-dimension array are allowed " 
  491                  << 
" dim=" << nb_dim << 
" var_name=" << var->fullName() << 
" path=" << path();
 
  493    tm->info(4) << 
"NB_ITEM: nb_item=" << nb_item;
 
  494    buffer.resize(nb_item);
 
  495    unique_ids.resize(nb_item);
 
  497  values.parallelRead(pm,st,buffer,unique_ids);
 
  501    Integer nb_item = buffer.size();
 
  502    for( 
Integer i=0; i<nb_item; ++i ){
 
  504      tm->info() << 
" VAR_VAL i=" << i << 
" value=" << buffer[i] << 
" uid=" << unique_ids[i];
 
  515template<
typename VariableType,
typename DataType> 
void 
  522  values.write(st,buffer);
 
  528template<
typename VariableType,
typename DataType> 
void 
  537  ItemGroup group = m_variable.itemGroup();
 
  540    enumerate_group = group;
 
  546  tm->
info(4) << 
"WRITE VARIABLE name=" << m_variable.name()
 
  547              << 
" is_partial=" << m_variable.variable()->isPartial();
 
  553        values[index] = m_variable[iitem];
 
  554        unique_ids[index] = iitem->uniqueId();
 
  568    values_writer.parallelWrite(pm,st,values,unique_ids);
 
 
  578template<
typename VariableType,
typename DataType>
 
  589template<
typename VariableType,
typename DataType> 
void 
  590Hdf5ScalarVariableInfo<VariableType,DataType>::
 
  591readVariable(Hdf5Utils::HFile& hfile,
const String& filename,
 
  592             Hdf5Utils::StandardTypes& st,
const String& ids_hpath,IData* data)
 
  594  ARCANE_UNUSED(ids_hpath);
 
  596  UniqueArray<DataType> buffer;
 
  597  IVariable* var = m_variable.variable();
 
  598  IVariableMng* vm = var->variableMng();
 
  599  ITraceMng* tm = vm->traceMng();
 
  600  IParallelMng* pm = vm->parallelMng();
 
  601  bool is_master = pm->isMasterIO();
 
  605      hfile.openRead(filename);
 
  609  _readStandardArray(buffer,hfile.id(),st);
 
  611  Integer buf_size = buffer.size();
 
  613    data = m_variable.variable()->data();
 
  618  for( 
Integer z=0; z<buf_size; ++z )
 
  619    var_value[z] = buffer[z];
 
  620  tm->info(4) << 
"End of read for variable '" << var->fullName() << 
"'";
 
  626template<
typename VariableType,
typename DataType> 
void 
  643      tm->fatal() << 
"Only one-dimension array are allowed " 
  644                  << 
" dim=" << nb_dim << 
" var_name=" << var->fullName() << 
" path=" << path();
 
  646    tm->info(4) << 
"NB_ITEM: nb_item=" << nb_item;
 
  647    buffer.resize(nb_item);
 
  649  values.read(st,buffer);
 
  653    Integer nb_item = buffer.size();
 
  654    for( 
Integer i=0; i<nb_item; ++i ){
 
  656      tm->info() << 
" VAR_VAL i=" << i << 
" value=" << buffer[i];
 
  667template<
typename VariableType,
typename DataType> 
void 
  672  values.write(st,buffer);
 
  678template<
typename VariableType,
typename DataType> 
void 
  686  bool is_master = pm->isMasterIO();
 
  689  Integer size = var_values.size();
 
  691  for( 
Integer i=0; i<size; ++i )
 
  692    values[i] = var_values[i];
 
  701    tm->info(4) << 
"WRITE SCALAR VARIABLE name=" << m_variable.variable()->fullName();
 
  702    values_writer.write(st,values);
 
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Exception lorsqu'une erreur fatale est survenue.
virtual void writeVariable(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st)
Encapsule un hid_t pour un fichier.
Encapsule un dataset simple d'un fichier HDF5 qui représente un tableau.
Définition des types standards Arcane pour hdf5.
void writeGroup(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st, const String &hdf_path, Integer save_type)
const String & path() const
Chemin dans le fichier Hdf5 contenant la valeur de la variable.
Interface d'une famille d'entités.
virtual String name() const =0
Nom de la famille.
virtual IVariable * findVariable(const String &name, bool throw_exception=false)=0
Recherche la variable de nom name associée à cette famille.
virtual IMesh * mesh() const =0
Maillage associé
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface du gestionnaire de traces.
virtual TraceMessage pwarning()=0
Flot pour un message d'avertissement parallèle.
virtual TraceMessage info()=0
Flot pour un message d'information.
Interface du gestionnaire de variables.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual ITraceMng * traceMng()=0
Gestionnaire de messages.
Interface d'une variable.
virtual eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual bool isPartial() const =0
Indique si la variable est partielle.
virtual Integer dimension() const =0
Dimension de la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual IItemFamily * itemFamily() const =0
Famille d'entité associée.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à la variable.
Groupe d'entités de maillage.
Integer size() const
Nombre d'éléments du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Int16 typeId() const
Numéro du type.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Int32 nbNode() const
Nombre de noeuds de l'entité
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Classe de base d'un élément de maillage.
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Classe gérant un vecteur de réel de dimension 3.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
@ ReduceMax
Maximum des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
UniqueArray< Real3 > Real3UniqueArray
Tableau dynamique à une dimension de vecteurs de rang 3.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
double Real
Type représentant un réel.
@ DT_Real2x2
Donnée de type tenseur 3x3.
@ DT_Real3x3
Donnée de type tenseur 3x3.
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Real3
Donnée de type vecteur 3.
@ DT_Int64
Donnée de type entier 64 bits.
@ DT_Real2
Donnée de type vecteur 2.
@ DT_Real
Donnée de type réel.
@ DT_Byte
Donnée de type octet.
Array< Real3 > Real3Array
Tableau dynamique à une dimension de vecteurs de rang 3.