14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/Array.h"
18#include "arcane/utils/StringBuilder.h"
19#include "arcane/utils/NotImplementedException.h"
20#include "arcane/utils/StringBuilder.h"
22#include "arcane/AbstractService.h"
23#include "arcane/IRessourceMng.h"
24#include "arcane/BasicTimeLoopService.h"
25#include "arcane/IVariableWriter.h"
26#include "arcane/IXmlDocumentHolder.h"
27#include "arcane/IIOMng.h"
28#include "arcane/IMesh.h"
29#include "arcane/PostProcessorWriterBase.h"
30#include "arcane/IDataWriter.h"
31#include "arcane/IParallelMng.h"
32#include "arcane/Directory.h"
33#include "arcane/VariableCollection.h"
34#include "arcane/IMeshMng.h"
36#include "arcane/utils/Collection.h"
38#include "arcane/hdf5/Hdf5VariableWriter_axl.h"
39#include "arcane/hdf5/Hdf5VariableInfoBase.h"
51using namespace Hdf5Utils;
67 virtual void notifyRestore(){}
68 virtual void writeOnExit();
82void Hdf5VariableWriterHelper::
86 m_xml_document_holder =
io_mng->parseXmlFile(m_xml_file_name);
87 if (!m_xml_document_holder.get())
88 fatal() <<
"Can not read file '" << m_xml_file_name <<
"'";
91 m_hdf5_file_name =
root_element.attrValue(
"file-name",
true);
112void Hdf5VariableWriterHelper::
118 if (m_mesh->parallelMng()->isMasterIO()){
119 hfile.openTruncate(m_hdf5_file_name);
122 std::set<ItemGroup> groups_to_write;
123 for( Integer iz=0, izs=m_exit_variables.size(); iz<izs; ++iz ){
124 Hdf5VariableInfoBase* vi = m_exit_variables[iz];
125 groups_to_write.insert(vi->variable()->itemGroup());
126 vi->writeVariable(hfile,m_types);
146 void onTimeLoopStartInit()
override
149 for( Integer i=0, is=options()->write.size(); i<is; ++i ){
152 info() <<
"Hdf5VariableWriter: FILE_INFO: mesh=" <<
mesh_name <<
" file_name=" <<
file_name;
159 info() <<
"Hdf5VariableWriter: Nb writer =" << m_writers.size();
160 for( Integer i=0, is=m_writers.size(); i<is; ++i ){
161 m_writers[i]->open();
164 void onTimeLoopExit()
override
166 info() <<
"Hdf5VariableWriter: End loop";
167 for( Integer i=0, is=m_writers.size(); i<is; ++i ){
168 m_writers[i]->writeOnExit();
171 void onTimeLoopRestore()
override
173 for( Integer i=0, is=m_writers.size(); i<is; ++i ){
174 m_writers[i]->notifyRestore();
177 void onTimeLoopBeginLoop()
override {}
179 UniqueArray<Hdf5VariableWriterHelper*> m_writers;
186Hdf5VariableWriter(
const ServiceBuildInfo& sbi)
187: ArcaneHdf5VariableWriterObject(sbi)
197 for( Integer i=0, is=m_writers.size(); i<is; ++i )
209 typedef std::set<ItemGroup> ItemGroupSet;
221 info(4) <<
"BEGIN WRITE N=" <<
vars.count() <<
" INDEX=" << m_index <<
" directory=" << m_directory_name;
224 info(4) <<
"OUT FILE_NAME=" << full_filename;
227 m_hdf_file.openTruncate(full_filename);
230 m_hdf_file.openAppend(full_filename);
232 m_saved_groups.clear();
234 virtual void endWrite()
244 info(4) <<
"WRITE VAR name=" <<
var->fullName();
247 path +=
"/Variables/";
248 path +=
var->fullName();
252 var_info->writeVariable(m_hdf_file,m_hdf5_types);
257 if (!group.
null() && m_saved_groups.find(group)==m_saved_groups.end()){
258 Integer
save_type = Hdf5VariableInfoBase::SAVE_IDS + Hdf5VariableInfoBase::SAVE_COORDS;
262 m_saved_groups.insert(group);
269 v.write(m_hdf5_types,bytes);
273 Hdf5Utils::StandardTypes m_hdf5_types;
274 IParallelMng* m_parallel_mng;
276 String m_directory_name;
279 std::set<ItemGroup> m_saved_groups;
309 Integer index =
times().size();
310 info() <<
"Hdf5VariableWriter: nb_vars=" <<
variables.count() <<
" index=" << index;
318 bool is_master = subDomain()->parallelMng()->isMasterIO();
335 for( Integer i=0, n=
my_times.size(); i<n; ++i ){
336 XmlNode tx = x.createAndAppendElement(
"time-value");
339 tx.setAttrValue(
"global-time",String::fromNumber(
my_times[i]));
346 app->ioMng()->writeXmlFile(
info_doc.get(),
"toto.xml");
375ManualHdf5VariableWriter::
376ManualHdf5VariableWriter(
const ServiceBuildInfo& sbi)
377: PostProcessorWriterBase(sbi)
385ManualHdf5VariableWriter::
386~ManualHdf5VariableWriter()
394ARCANE_REGISTER_SERVICE_HDF5VARIABLEWRITER(Hdf5VariableWriter,
398 IPostProcessorWriter,
#define ARCANE_REGISTER_SUB_DOMAIN_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Generation de la classe de base du Service.
Classe gérant un répertoire.
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.
Classe de base pour lire ou écrire une variables.
HFile m_file_id
Identifiant HDF du fichier.
Ecriture de variables au format HDF5.
void build() override
Construction de niveau build du service.
Interface de l'application.
Interface d'écriture des données d'une variable.
Interface du gestionnaire des entrées sorties.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
Interface du gestionnaire des maillages.
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.
Interface d'une variable.
Groupe d'entités de maillage.
const String & name() const
Nom du groupe.
bool null() const
true is le groupe est le groupe nul
Lecteur des fichiers de maillage via la bibliothèque LIMA.
virtual void setMetaData(const String &meta_data)
Positionne les infos des méta-données.
virtual void write(IVariable *var, IData *data)
Ecrit les données data de la variable var.
Ecriture de variables au format HDF5.
virtual void notifyEndWrite()
Notifie qu'une sortie vient d'être effectuée.
virtual void close()
Ferme l'écrivain. Après fermeture, il ne peut plus être utilisé
virtual void notifyBeginWrite()
Notifie qu'une sortie va être effectuée avec les paramètres courants.
virtual void build()
Construction de niveau build du service.
virtual IDataWriter * dataWriter()
Retourne l'écrivain associé à ce post-processeur.
Classe de base d'un écrivain pour les informations de post-traitement.
virtual const String & baseFileName()
Nom du fichier contenant les sorties.
virtual RealConstArrayView times()
Liste des temps sauvés.
virtual const String & baseDirectoryName()
Nom du répertoire de sortie des fichiers.
virtual VariableCollection variables()
Liste des variables à sauver.
Structure contenant les informations pour créer un service.
Liste de noeuds d'un arbre DOM.
void setAttrValue(const String &name, const String &value)
Positionne l'attribut name à la valeur value.
Vue constante d'un tableau de type T.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé