Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Hdf5ReaderWriter.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Hdf5ReaderWriter.h (C) 2000-2023 */
9/* */
10/* Outils de lecture/écriture dans un fichier HDF5. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_HDF5_HDF5READERWRITER_H
13#define ARCANE_HDF5_HDF5READERWRITER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/IDataReader.h"
18#include "arcane/IDataWriter.h"
19
20#include "arcane/hdf5/Hdf5Utils.h"
21#include "arcane/VariableTypes.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32/*!
33 \brief Lecture/Ecriture au format HDF5.
34
35 La version de Hdf5 utilisée est au moins la version 1.4.3.
36
37 En ce qui concerne les réels, on ne supporte que la double précision. Ils sont
38 donc stockées sur 8 octets aussi.
39
40 Pour les #Real2, #Real2x2, #Real3 et les #Real3x3, on utilise un type composé.
41
42 La structure des informations sauvées est la suivante:
43 <ul>
44 <li> * toutes les variables sont sauvées dans un groupe qui s'appelle "Variables" * .</li>
45 <li> * pour chaque variable, un sous-groupe du nom de la variable est créé. Ce
46 sous groupe contient les attributs et datasets suivants:
47 <ul>
48 <li> * Un \e attribut de nom "Dims" qui est un tableau de 1 ou 2 éléments de type #Integer
49 qui contient les informations sur les tailles et dimensions de la variable. Cet attribut
50 est \b toujours présent et sert entre autre à déterminer si les deux autres \e datasets
51 sont présents. La première valeur (indice 0) est toujours le nombre d'éléments du tableau.
52 Si la variable est un tableau à une dimension, il n'y a pas d'autres valeurs. Si le
53 tableau est bi-dimensionnel, la deuxième valeur est égale à la taille de la
54 première dimension du tableau, les tailles de la deuxième dimensions étant
55 données par l'attribut "Dim2".</li>
56 <li> * Un \e dataset de nom "Dim2". Ce \e dataset n'est présent que si la variables est du
57 genre tableau à deux dimensions, lorsque la première dimension n'est pas nulle et que
58 le nombre d'éléments n'est pas nul.
59 Dans ce cas, ce \e dataset est un tableau de type #Integer dont la taille est
60 égale à celle de la première dimension de la variable et donc chaque valeur est
61 égale à la taille de la deuxième dimension.</li>
62 <li> * Un \e dataset de nom "Values" contenant les valeurs de la variables. Ce \e dataset
63 n'est pas présent dans le cas d'une variable de genre tableau dont le nombre
64 d'éléments est nul ou lorsque la variable est temporaire (propriété IVariable::PNoDump). * </li>
65 </ul>
66 </li>
67 </ul>
68
69 \todo sauve/relit la liste des groupes d'entités du maillage.
70
71 \warning * La gestion des lecture/ecriture dans ce format est à l'heure actuelle
72 au stade expérimental et ne peut pas être utilisée pour assurer une persistence
73 à long terme des données.
74 */
76: public TraceAccessor
77, public IDataReader
78, public IDataWriter
79{
80
81 public:
82
83 enum eOpenMode
84 {
85 OpenModeRead,
86 OpenModeTruncate,
87 OpenModeAppend
88 };
89 public:
90
91 Hdf5ReaderWriter(ISubDomain* sd,const String& filename,const String& m_sub_group_name,
92 Integer fileset_size,
93 Integer write_index, Integer index_modulo,
94 eOpenMode om,bool do_verif=false);
96
97 public:
98
99 virtual void initialize();
100
101 virtual void beginWrite(const VariableCollection& vars)
102 {
103 ARCANE_UNUSED(vars);
104 }
105 virtual void endWrite();
106 virtual void beginRead(const VariableCollection& vars)
107 {
108 ARCANE_UNUSED(vars);
109 }
110 virtual void endRead() {}
111
112 virtual void setMetaData(const String& meta_data);
113 virtual String metaData();
114
115 virtual void write(IVariable* v,IData* data);
116 virtual void read(IVariable* v,IData* data);
117
118 public:
119
120 herr_t iterateMe(hid_t group_id,const char* member_name);
121
122 private:
123
124 IParallelMng* m_parallel_mng; //!< Gestionnaire du parallélisme;
125 eOpenMode m_open_mode; //!< Mode d'ouverture
126 String m_filename; //!< Nom du fichier.
127 String m_sub_group_name; //!< Nom du fichier.
128 bool m_is_initialized; //!< Vrai si déjà initialisé
129
131
132 Hdf5Utils::HFile m_file_id; //!< Identifiant HDF du fichier
133 Hdf5Utils::HGroup m_sub_group_id; //!< Identifiant HDF du groupe contenant la protection
134 Hdf5Utils::HGroup m_variable_group_id; //!< Identifiant HDF du groupe contenant les variables
135
136 StringList m_variables_name; //!< Liste des noms des variables sauvées.
137 Timer m_io_timer;
138
139 private:
140
141 //! Mode parallèle actif: ATTENTION: en cours de test uniquement
142 bool m_is_parallel;
143 Int32 m_my_rank;
144 Int32 m_send_rank;
145 Int32 m_last_recv_rank;
146
147 Integer m_fileset_size;
148 Integer m_index_write;
149 Integer m_index_modulo;
150
151 private:
152
153 void _writeVal(const String& var_group_name,
154 const String& sub_group_name,
155 const ISerializedData* sdata,
156 const Int32 from_rank=0);
157 void _writeValParallel(IVariable* v,const ISerializedData* sdata);
158 void _readVal(IVariable* var,IData* data);
159
160 Ref<ISerializedData> _readDim2(IVariable* v);
161
162 void _directReadVal(IVariable* v,IData* data);
163 void _directWriteVal(IVariable* v,IData* data);
164 void _checkValid();
165 String _variableGroupName(IVariable* var);
166
167 void _receiveRemoteVariables();
168 void _writeRemoteVariable(ISerializer* sb);
169 void _setMetaData(const String& meta_data,const String& sub_group_name);
170};
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
175} // End namespace Arcane
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
179
180#endif
Lecture/Ecriture au format HDF5.
virtual void read(IVariable *v, IData *data)
Lit les données data de la variable var.
virtual String metaData()
Méta-données.
virtual void write(IVariable *v, IData *data)
Ecrit les données data de la variable var.
virtual void setMetaData(const String &meta_data)
Positionne les infos des méta-données.
Encapsule un hid_t pour un fichier.
Definition Hdf5Utils.h:210
Encapsule un hid_t pour un groupe.
Definition Hdf5Utils.h:281
Définition des types standards Arcane pour hdf5.
Definition Hdf5Utils.h:562
Interface de lecture des données d'une variable.
Definition IDataReader.h:41
Interface d'écriture des données d'une variable.
Definition IDataWriter.h:49
Interface d'une donnée.
Definition IData.h:33
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Gestion d'un timer.
Definition Timer.h:62
Collection de variables.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-