14#include "arcane/utils/ArrayView.h"
15#include "arcane/utils/ScopedPtr.h"
16#include "arcane/utils/CheckedConvert.h"
18#include "arcane/core/ITimeHistoryCurveWriter2.h"
19#include "arcane/core/BasicService.h"
20#include "arcane/core/FactoryService.h"
21#include "arcane/core/IApplication.h"
22#include "arcane/core/IRessourceMng.h"
23#include "arcane/core/IXmlDocumentHolder.h"
24#include "arcane/core/XmlNode.h"
41class ArcaneCurveWriter
56 std::ofstream m_stream;
75 virtual String name()
const {
return "ArcaneCurveWriter"; }
91 Int64 offset = m_p->m_stream.tellp();
92 m_p->m_stream.write((
const char*)values.
data(), values.
size() *
sizeof(T));
101ArcaneCurveWriter::Impl::
104, m_file_name(
"curves")
106 String full_path = path +
"/" + m_file_name +
".acv";
107 info() <<
"Begin write curves full_path=" << full_path;
108 m_stream.open(full_path.localstr(), std::ios::trunc);
110 warning() <<
"Impossible d'ouvrir le fichier '" << full_path <<
"' pour écrire les courbes";
111 m_curves_doc = app->ressourceMng()->createXmlDocument();
112 XmlNode doc = m_curves_doc->documentNode();
113 m_root_element = XmlElement(doc,
"curves");
128 if (!m_output_path.empty())
129 m_output_path = path;
131 info() << A_FUNCNAME <<
"Début de l'écriture des courbes chemin=" << path;
132 m_p =
new Impl(subDomain()->application(),
traceMng(), path);
136 m_p->m_root_element.setAttrValue(
"times-offset", String::fromNumber(time_offset));
137 m_p->m_root_element.setAttrValue(
"times-size", String::fromNumber(infos.
times().
size()));
138 m_p->m_root_element.setAttrValue(
"x",
"iteration");
144void ArcaneCurveWriter::
153 header[3] = (
Byte)122;
159 header[4] = (
Byte)m_version;
164 Int32 v = 0x01020304;
166 for (
Integer i = 0; i < 4; ++i)
167 header[8 + i] = ptr[i];
168 m_p->m_stream.write((
const char*)header, 12);
178 m_p->m_curves_doc->save(bytes);
179 if (m_version == 2) {
181 write_info[0] = _write(bytes.constView());
182 write_info[1] = bytes.largeSize();
186 else if (m_version == 1) {
188 write_info[0] = CheckedConvert::toInt32(_write(bytes.constView()));
189 write_info[1] = bytes.size();
194 ARCANE_FATAL(
"Version invalide {0} (valeurs valides sont '1' ou '2')", m_version);
196 info(4) <<
"Fin de l'écriture des courbes";
213 Int32 range_iterations[2];
218 Int32 first_iter = iterations[0];
219 Int32 last_iter = iterations[nb_val - 1];
220 Int32 diff = 1 + last_iter - first_iter;
223 if (diff == nb_val) {
224 range_iterations[0] = first_iter;
225 range_iterations[1] = last_iter;
229 Int64 iteration_offset = _write(iterations);
231 XmlNode node = m_p->m_root_element.createAndAppendElement(
"curve");
235 if (infos.subDomain() != NULL_SUB_DOMAIN_ID) {
236 name =
"SD" + String::fromNumber(infos.subDomain()) +
"_" +
name;
238 if (infos.hasSupport()) {
239 name = infos.support() +
"_" +
name;
243 node.
setAttrValue(
"iterations-offset", String::fromNumber(iteration_offset));
244 node.
setAttrValue(
"iterations-size", String::fromNumber(iterations.
size()));
245 node.
setAttrValue(
"values-offset", String::fromNumber(values_offset));
249 if (infos.hasSupport()) {
252 if (infos.subDomain() != NULL_SUB_DOMAIN_ID) {
253 node.
setAttrValue(
"sub-domain", String::fromNumber(infos.subDomain()));
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ARCANE_REGISTER_SUB_DOMAIN_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Ecriture des courbes au format spécifique Arcane.
virtual void setOutputPath(const String &path)
Répertoire de base où seront écrites les courbes.
virtual String name() const
Nom de l'écrivain.
virtual String outputPath() const
Répertoire de base où seront écrites les courbes.
virtual void endWrite()
Notifie la fin de l'écriture.
virtual void build()
Construction de niveau build du service.
virtual void beginWrite(const TimeHistoryCurveWriterInfo &infos)
Notifie un début d'écriture.
virtual void writeCurve(const TimeHistoryCurveInfo &infos)
Ecrit une courbe.
Vue constante d'un tableau de type T.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface de l'application.
Interface d'un écrivain d'une courbe.
Interface du gestionnaire de traces.
Encapsulation d'un pointeur qui se détruit automatiquement.
Structure contenant les informations pour créer un service.
Chaîne de caractères unicode.
String clone() const
Clone cette chaîne.
Informations pour l'écriture d'une courbe.
Int32ConstArrayView iterations() const
Liste des itérations.
const String & name() const
Nom de la courbe.
RealConstArrayView values() const
Liste des valeurs de la courbe.
Integer subSize() const
Nombre de valeur par temps.
Informations sur l'écriture des courbes.
String path() const
Chemin ou écrire les données (sauf si surchargé spécifiquement par le service via ITimeHistoryCurveWr...
RealConstArrayView times() const
Liste des temps.
Classe d'accès aux traces.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage warning() const
Flot pour un message d'avertissement.
ITraceMng * traceMng() const
Gestionnaire de trace.
void setAttrValue(const String &name, const String &value)
Positionne l'attribut name à la valeur value.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
unsigned char Byte
Type d'un octet.
std::int32_t Int32
Type entier signé sur 32 bits.