14#include "arcane/utils/ArrayView.h"
15#include "arcane/utils/ScopedPtr.h"
16#include "arcane/utils/CheckedConvert.h"
18#include "arcane/ITimeHistoryCurveWriter2.h"
19#include "arcane/BasicService.h"
20#include "arcane/FactoryService.h"
21#include "arcane/IApplication.h"
22#include "arcane/IRessourceMng.h"
23#include "arcane/IXmlDocumentHolder.h"
24#include "arcane/XmlNode.h"
39class ArcaneCurveWriter
54 std::ofstream m_stream;
73 virtual String name()
const {
return "ArcaneCurveWriter"; }
89 Int64 offset = m_p->m_stream.tellp();
90 m_p->m_stream.write((
const char*)values.
data(), values.
size() *
sizeof(T));
99ArcaneCurveWriter::Impl::
102, m_file_name(
"curves")
104 String full_path = path +
"/" + m_file_name +
".acv";
105 info() <<
"Begin write curves full_path=" << full_path;
106 m_stream.open(full_path.localstr(), std::ios::trunc);
108 warning() <<
"Can not open file '" << full_path <<
"' for writing curves";
109 m_curves_doc = app->ressourceMng()->createXmlDocument();
110 XmlNode doc = m_curves_doc->documentNode();
111 m_root_element = XmlElement(doc,
"curves");
126 if (!m_output_path.empty())
127 m_output_path = path;
129 info() << A_FUNCNAME <<
"Begin write curves path=" << path;
130 m_p =
new Impl(subDomain()->application(),
traceMng(), path);
134 m_p->m_root_element.setAttrValue(
"times-offset", String::fromNumber(time_offset));
135 m_p->m_root_element.setAttrValue(
"times-size", String::fromNumber(infos.
times().
size()));
136 m_p->m_root_element.setAttrValue(
"x",
"iteration");
142void ArcaneCurveWriter::
151 header[3] = (
Byte)122;
157 header[4] = (
Byte)m_version;
162 Int32 v = 0x01020304;
164 for (
Integer i = 0; i < 4; ++i)
165 header[8 + i] = ptr[i];
166 m_p->m_stream.write((
const char*)header, 12);
176 m_p->m_curves_doc->save(bytes);
177 if (m_version == 2) {
179 write_info[0] = _write(bytes.
constView());
184 else if (m_version == 1) {
187 write_info[1] = bytes.
size();
192 ARCANE_FATAL(
"Invalid version {0} (valid values are '1' or '2')", m_version);
194 info(4) <<
"End writing curves";
211 Int32 range_iterations[2];
216 Int32 first_iter = iterations[0];
217 Int32 last_iter = iterations[nb_val - 1];
218 Int32 diff = 1 + last_iter - first_iter;
221 if (diff == nb_val) {
222 range_iterations[0] = first_iter;
223 range_iterations[1] = last_iter;
227 Int64 iteration_offset = _write(iterations);
229 XmlNode node = m_p->m_root_element.createAndAppendElement(
"curve");
233 if (infos.subDomain() != NULL_SUB_DOMAIN_ID) {
234 name =
"SD" + String::fromNumber(infos.subDomain()) +
"_" +
name;
236 if (infos.hasSupport()) {
237 name = infos.support() +
"_" +
name;
241 node.
setAttrValue(
"iterations-offset", String::fromNumber(iteration_offset));
242 node.
setAttrValue(
"iterations-size", String::fromNumber(iterations.
size()));
243 node.
setAttrValue(
"values-offset", String::fromNumber(values_offset));
247 if (infos.hasSupport()) {
250 if (infos.subDomain() != NULL_SUB_DOMAIN_ID) {
251 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.
Integer size() const
Nombre d'éléments du vecteur.
Int64 largeSize() const
Nombre d'éléments du vecteur (en 64 bits)
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.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
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.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
-*- 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.