Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
IOMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* IOMng.cc (C) 2000-2024 */
9/* */
10/* Gestionnaire des entrées-sorties. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/Iostream.h"
17#include "arcane/utils/Array.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/CheckedConvert.h"
21
22#include "arcane/IApplication.h"
23#include "arcane/DomUtils.h"
24#include "arcane/XmlNode.h"
25#include "arcane/IIOMng.h"
26#include "arcane/IParallelSuperMng.h"
27#include "arcane/IParallelMng.h"
28#include "arcane/IXmlDocumentHolder.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33ARCANE_BEGIN_NAMESPACE
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
40class IOMng
41: public IIOMng
42{
43 public:
46 ~IOMng() override;
47
48 IXmlDocumentHolder* parseXmlFile(const String& filename, const String& schemaname = String()) override;
49 IXmlDocumentHolder* parseXmlFile(const String& filename, const String& schemaname, ByteConstArrayView schema_data) override;
50 IXmlDocumentHolder* parseXmlBuffer(Span<const Byte> buffer, const String& name) override;
51 IXmlDocumentHolder* parseXmlBuffer(Span<const std::byte> buffer,const String& name) override;
52 IXmlDocumentHolder* parseXmlString(const String& str, const String& name) override;
53 bool writeXmlFile(IXmlDocumentHolder* doc, const String& filename, const bool indented) override;
54 bool collectiveRead(const String& filename, ByteArray& bytes) override
55 {
56 return collectiveRead(filename,bytes,true);
57 }
58 bool collectiveRead(const String& filename, ByteArray& bytes, bool is_binary) override;
59 bool localRead(const String& filename, ByteArray& bytes) override
60 {
61 return localRead(filename, bytes, true);
62 }
63 bool localRead(const String& filename, ByteArray& bytes, bool is_binary) override;
64
65 private:
66
67 IParallelMng* m_parallel_mng;
68 IParallelSuperMng* m_parallel_super_mng;
69 IThreadMng* m_thread_mng;
70 ITraceMng* m_trace_mng;
71
72 template <typename ParallelMngType> bool
73 _collectiveRead(ParallelMngType* pm, const String& filename, ByteArray& bytes, bool is_binary);
74};
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
79extern "C++" ARCANE_IMPL_EXPORT IIOMng*
80arcaneCreateIOMng(IParallelMng* pm)
81{
82 return new IOMng(pm);
83}
84
85extern "C++" ARCANE_IMPL_EXPORT IIOMng*
86arcaneCreateIOMng(IParallelSuperMng* psm)
87{
88 return new IOMng(psm);
89}
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
94IOMng::
95IOMng(IParallelMng* pm)
96: m_parallel_mng(pm)
97, m_parallel_super_mng(nullptr)
98, m_thread_mng(pm->threadMng())
99, m_trace_mng(pm->traceMng())
100{
101}
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106IOMng::
107IOMng(IParallelSuperMng* psm)
108: m_parallel_mng(nullptr)
109, m_parallel_super_mng(psm)
110, m_thread_mng(psm->threadMng())
111, m_trace_mng(psm->application()->traceMng())
112{
113}
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
118IOMng::
119~IOMng()
120{
121}
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
127writeXmlFile(IXmlDocumentHolder* doc, const String& filename, const bool to_indent)
128{
129 if (!doc)
130 return true;
131 std::ofstream ofile(filename.localstr());
132
133 // Check if stream is OK
134 if (!ofile.good())
135 return true;
136
137 Integer indented = to_indent ? 1 : -1;
138 domutils::saveDocument(ofile, doc->documentNode().domNode(), indented);
139 return false;
140}
141
142/*---------------------------------------------------------------------------*/
143/*---------------------------------------------------------------------------*/
144
146parseXmlFile(const String& filename, const String& schemaname)
147{
148 return IXmlDocumentHolder::loadFromFile(filename, schemaname, m_trace_mng);
149}
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
153
155parseXmlFile(const String& filename,
156 const String& schemaname,
158{
159 dom::DOMImplementation domimp;
160 // Lecture du fichier contenant les informations internes.
161 return domimp._load(filename, m_trace_mng, schemaname, schema_data);
162}
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
168parseXmlBuffer(Span<const Byte> buffer, const String& name)
169{
170 return IXmlDocumentHolder::loadFromBuffer(buffer, name, m_trace_mng);
171}
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
175
178{
179 return IXmlDocumentHolder::loadFromBuffer(buffer, name, m_trace_mng);
180}
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
186parseXmlString(const String& str, const String& name)
187{
188 dom::DOMImplementation domimp;
190 ByteConstSpan buffer(reinterpret_cast<const std::byte*>(utf8_buf.data()), utf8_buf.size());
191 // Lecture du fichier contenant les informations internes.
192 return domimp._load(buffer, name, m_trace_mng);
193}
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
197
198template <typename ParallelMngType>
199bool IOMng::
200_collectiveRead(ParallelMngType* pm, const String& filename, ByteArray& bytes, bool is_binary)
201{
202 // La lecture necessite deux broadcast: un pour la taille du fichier et
203 // un pour les valeurs du fichier.
204 //IParallelSuperMng* pm = m_application->parallelSuperMng();
205 Integer size = 0;
206 if (pm->commRank() == 0) {
207 if (!localRead(filename, bytes, is_binary)) {
208 // Prévient d'un bug si bytes n'était pas vidé et qu'il y a un problème de lecture
209 size = bytes.size();
210 }
211 }
212 {
213 IntegerArrayView bs(1, &size);
214 pm->broadcast(bs, 0);
215 //m_trace_mng->info() << "IO_SIZE=" << size;
216 }
217 bytes.resize(size);
218 if (size != 0)
219 pm->broadcast(bytes, 0);
220 return bytes.empty();
221}
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
225
227collectiveRead(const String& filename, ByteArray& bytes, bool is_binary)
228{
229 if (m_parallel_mng)
230 return _collectiveRead(m_parallel_mng, filename, bytes, is_binary);
231 return _collectiveRead(m_parallel_super_mng, filename, bytes, is_binary);
232}
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
238localRead(const String& filename, ByteArray& bytes, bool is_binary)
239{
240 return platform::readAllFile(filename,is_binary,bytes);
241}
242
243/*---------------------------------------------------------------------------*/
244/*---------------------------------------------------------------------------*/
245
246ARCANE_END_NAMESPACE
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
Tableau d'items de types quelconques.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:42
Gestionnaire des entrées sorties.
Definition IOMng.cc:42
IXmlDocumentHolder * parseXmlBuffer(Span< const Byte > buffer, const String &name) override
Lit et analyse le fichier XML contenu dans le buffer buffer.
Definition IOMng.cc:168
bool localRead(const String &filename, ByteArray &bytes) override
Lecture locale d'un fichier.
Definition IOMng.cc:59
IXmlDocumentHolder * parseXmlString(const String &str, const String &name) override
Lit et analyse le fichier XML contenu dans la chaîne str.
Definition IOMng.cc:186
bool collectiveRead(const String &filename, ByteArray &bytes) override
Lecture collective d'un fichier.
Definition IOMng.cc:54
bool writeXmlFile(IXmlDocumentHolder *doc, const String &filename, const bool indented) override
Ecrit l'arbre XML du document doc dans le fichier filename.
Definition IOMng.cc:127
IXmlDocumentHolder * parseXmlFile(const String &filename, const String &schemaname=String()) override
Lit et analyse le fichier XML filename.
Definition IOMng.cc:146
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
Classe abstraite du superviseur de parallélisme.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Gestionnaire d'un document DOM.
static IXmlDocumentHolder * loadFromBuffer(Span< const Byte > buffer, const String &name, ITraceMng *tm)
Charge un document XML.
Definition DomUtils.cc:426
static IXmlDocumentHolder * loadFromFile(const String &filename, ITraceMng *tm)
Charge un document XML.
Definition DomUtils.cc:445
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
ByteConstArrayView utf8() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:275
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
bool readAllFile(StringView filename, bool is_binary, ByteArray &out_bytes)
Lit le contenu d'un fichier et le conserve dans out_bytes.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:615
Span< const std::byte > ByteConstSpan
Vue en lecture seule d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:706