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::
85 IIOMng* io_mng = m_mesh->parallelMng()->ioMng();
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);
96 for(
XmlNode elem : variables_elem ){
97 String var_name = elem.attrValue(
"name",
true);
98 String var_family = elem.attrValue(
"family",
true);
99 String var_path = elem.attrValue(
"path",
true);
100 info() <<
"VARIABLE: name=" << var_name <<
" path=" << var_path
101 <<
" family=" << var_family;
104 m_exit_variables.add(var_info);
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);
136:
public ArcaneHdf5VariableWriterObject
145 void build()
override {}
146 void onTimeLoopStartInit()
override
148 IMeshMng* mm = subDomain()->meshMng();
149 for( Integer i=0, is=options()->write.size(); i<is; ++i ){
150 String file_name = options()->write[i]->fileName();
151 String mesh_name = options()->write[i]->meshName();
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 {}
187: ArcaneHdf5VariableWriterObject(sbi)
197 for( Integer i=0, is=m_writers.size(); i<is; ++i )
209 typedef std::set<ItemGroup> ItemGroupSet;
214 m_directory_name(directory_name), m_file_name(file_name)
221 info(4) <<
"BEGIN WRITE N=" << vars.count() <<
" INDEX=" << m_index <<
" directory=" << m_directory_name;
223 String full_filename = out_dir.
file(m_file_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()
239 ARCANE_UNUSED(meta_data);
247 path +=
"/Variables/";
251 var_info->setPath(path);
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;
259 String group_path = index_path +
"/Groups/" + group.
name();
260 var_info->writeGroup(m_hdf_file,m_hdf5_types,group_path,save_type);
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;
310 info() <<
"Hdf5VariableWriter: nb_vars=" <<
variables.count() <<
" index=" << index;
322 XmlNode doc = info_doc->documentNode();
332 XmlNode x = root_element.createAndAppendElement(
"time-variable");
335 for( Integer i=0, n=my_times.
size(); i<n; ++i ){
336 XmlNode tx = x.createAndAppendElement(
"time-value");
337 String index_path = String::format(
"Index{0}/Variables/{1}",i+1,var->
fullName());
339 tx.
setAttrValue(
"global-time",String::fromNumber(my_times[i]));
343 info_doc->save(xml_bytes);
345 m_writer->writeInfos(xml_bytes);
366 if (base_file_name.
null())
367 base_file_name =
"data";
368 m_file_name = base_file_name +
".h5";
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.
Classe gérant un répertoire.
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le 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.
void setPath(const String &path)
Positionne le chemin dans le fichier Hdf5 contenant la valeur de la variable.
Ecriture de variables au format HDF5.
Interface de l'application.
virtual IIOMng * ioMng()=0
Gestionnaire des entrées/sorties.
virtual IRessourceMng * ressourceMng() const =0
Gestionnaire de ressources.
Interface d'écriture des données d'une variable.
Interface du gestionnaire des entrées sorties.
virtual bool writeXmlFile(IXmlDocumentHolder *doc, const String &filename, const bool indented=false)=0
Ecrit l'arbre XML du document doc dans le fichier filename.
virtual IXmlDocumentHolder * parseXmlFile(const String &filename, const String &schemaname=String())=0
Lit et analyse le fichier XML filename.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
Interface du gestionnaire des maillages.
virtual MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Recherche le maillage de nom name.
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 IXmlDocumentHolder * createXmlDocument()=0
Créé un noeud document XML. Crée et retourne un document XML utilisant une implémentation par défaut....
virtual IApplication * application()=0
Application.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual String itemFamilyName() const =0
Nom de la famille associée (nul si aucune).
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual String name() const =0
Nom de la 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
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.
IMesh * mesh() const
Maillage associé.
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.
T * get() const
Retourne l'objet référé par l'instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
Structure contenant les informations pour créer un service.
Liste de noeuds d'un arbre DOM.
XmlNode documentElement() const
Retourne le noeud élément du document.
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
void setAttrValue(const String &name, const String &value)
Positionne l'attribut name à la valeur value.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
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é