14#include "arcane/utils/Iostream.h"
15#include "arcane/utils/ApplicationInfo.h"
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/PlatformUtils.h"
20#include "arcane/ITimeHistoryMng.h"
21#include "arcane/IIOMng.h"
22#include "arcane/CommonVariables.h"
23#include "arcane/ISubDomain.h"
24#include "arcane/Directory.h"
25#include "arcane/AbstractModule.h"
26#include "arcane/EntryPoint.h"
27#include "arcane/ObserverPool.h"
28#include "arcane/IVariableMng.h"
29#include "arcane/CaseOptionsMain.h"
30#include "arcane/IParallelMng.h"
31#include "arcane/ITimeHistoryCurveWriter2.h"
32#include "arcane/ITimeHistoryTransformer.h"
33#include "arcane/XmlNode.h"
34#include "arcane/XmlNodeList.h"
35#include "arcane/IXmlDocumentHolder.h"
36#include "arcane/ServiceFinder2.h"
37#include "arcane/ServiceBuilder.h"
38#include "arcane/core/IMeshMng.h"
40#include "arcane/datatype/DataTypeTraits.h"
42#include "arcane/impl/internal/TimeHistoryMngInternal.h"
43#include "arcane/core/GlobalTimeHistoryAdder.h"
59class GnuplotTimeHistoryCurveWriter2
65 GnuplotTimeHistoryCurveWriter2(
ITraceMng* tm)
72 void build()
override {}
75 m_times = infos.
times();
78 if (m_output_path.empty())
83 if (m_gnuplot_path.createDirectory()) {
84 warning() <<
"Can not create gnuplot curve directory '"
85 << m_gnuplot_path.path() <<
"'";
92 if (infos.subDomain() != NULL_SUB_DOMAIN_ID) {
93 name =
"SD" + String::fromNumber(infos.subDomain()) +
"_" +
name;
95 if (infos.hasSupport()) {
100 FILE* ofile = fopen(sname.
localstr(),
"w");
102 warning() <<
"Can not open gnuplot curve file '" << sname <<
"'";
109 for (
Integer i = 0; i < nb_val; ++i) {
111 for (
Integer z = 0; z < sub_size; ++z)
113 fprintf(ofile,
"\n");
124 m_output_path = path;
128 return m_output_path;
157 TimeHistoryMng2(
const ModuleBuildInfo& cb,
bool add_entry_points =
true);
158 ~TimeHistoryMng2()
override =
default;
193 void timeHistoryBegin()
override;
194 void timeHistoryEnd()
override;
195 void timeHistoryInit()
override;
196 void timeHistoryStartInit()
override;
197 void timeHistoryContinueInit()
override;
198 void timeHistoryRestore()
override;
199 void timeHistoryStartInitEnd();
216 bool active()
const override {
return m_internal->active(); }
217 void setActive(
bool is_active)
override { m_internal->setActive(is_active); }
219 bool isDumpActive()
const override {
return m_internal->isDumpActive(); }
220 void setDumpActive(
bool is_active)
override { m_internal->setDumpActive(is_active); }
223 void setShrinkActive(
bool is_active)
override { m_internal->setShrinkActive(is_active); }
239TimeHistoryMng2(
const ModuleBuildInfo& mb,
bool add_entry_points)
241, CommonVariables(this)
242, m_internal(
makeRef(new TimeHistoryMngInternal(subDomain()->variableMng(),
243 makeRef(new Properties(subDomain()->propertyMng(),
"ArcaneTimeHistoryProperties")))))
244, m_adder(
makeRef(new GlobalTimeHistoryAdder(this)))
246 if (add_entry_points) {
247 addEntryPoint(
this,
"ArcaneTimeHistoryBegin", &TimeHistoryMng2::timeHistoryBegin,
249 addEntryPoint(
this,
"ArcaneTimeHistoryEnd", &TimeHistoryMng2::timeHistoryEnd,
251 addEntryPoint(
this,
"ArcaneTimeHistoryInit", &TimeHistoryMng2::timeHistoryInit,
253 addEntryPoint(
this,
"ArcaneTimeHistoryStartInit", &TimeHistoryMng2::timeHistoryStartInit,
255 addEntryPoint(
this,
"ArcaneTimeHistoryContinueInit", &TimeHistoryMng2::timeHistoryContinueInit,
257 addEntryPoint(
this,
"ArcaneTimeHistoryStartInitEnd", &TimeHistoryMng2::timeHistoryStartInitEnd,
259 addEntryPoint(
this,
"ArcaneTimeHistoryRestore", &TimeHistoryMng2::timeHistoryRestore,
267void TimeHistoryMng2::
268timeHistoryStartInit()
270 m_internal->addNowInGlobalTime();
275void TimeHistoryMng2::
276timeHistoryStartInitEnd()
278 m_internal->updateGlobalTimeCurve();
284void TimeHistoryMng2::
294 m_internal->addNowInGlobalTime();
299 bool force_print_thm =
false;
303 if (
parallelMng()->isMasterIO() || m_internal->isNonIOMasterCurvesEnabled())
304 force_print_thm =
true;
306 if (
subDomain()->applicationInfo().isDebug())
307 force_print_thm =
true;
309 m_internal->dumpHistory();
316void TimeHistoryMng2::
319 m_internal->updateGlobalTimeCurve();
325void TimeHistoryMng2::
330 info(4) <<
"TimeHistory is MasterIO ? " << m_internal->isMasterIO();
331 if (!m_internal->isMasterIO() && !m_internal->isNonIOMasterCurvesEnabled())
333 m_internal->editOutputPath(Directory(
subDomain()->exportDirectory(),
"courbes"));
334 m_internal->addObservers(
subDomain()->propertyMng());
337 ITimeHistoryCurveWriter2* gnuplot_curve_writer =
new GnuplotTimeHistoryCurveWriter2(
traceMng());
338 m_internal->addCurveWriter(
makeRef(gnuplot_curve_writer));
341 if (m_internal->isMasterIO() || m_internal->isNonIOMasterCurvesEnabled()) {
342 ServiceBuilder<ITimeHistoryCurveWriter2> builder(
subDomain());
343 auto writers = builder.createAllInstances();
344 for (
auto& wr_ref : writers) {
345 ITimeHistoryCurveWriter2* cw = wr_ref.get();
347 info() <<
"FOUND CURVE SERVICE (V2)!";
348 m_internal->addCurveWriter(wr_ref);
360 m_internal->addCurveWriter(
makeRef(writer));
366void TimeHistoryMng2::
367timeHistoryContinueInit()
369 if (m_internal->isMasterIO() || m_internal->isNonIOMasterCurvesEnabled())
376void TimeHistoryMng2::
379 m_internal->resizeArrayAfterRestore();
388 ARCANE_UNUSED(is_verbose);
389 m_internal->dumpHistory();
398 m_internal->dumpCurves(writer);
407 m_internal->applyTransformation(v);
416 m_internal->removeCurveWriter(
name);
430extern "C++" ARCANE_IMPL_EXPORT ITimeHistoryMng*
431arcaneCreateTimeHistoryMng2(ISubDomain* mng,
bool add_entry_points)
433 return new TimeHistoryMng2(ModuleBuildInfo(mng,
"TimeHistoryMng"), add_entry_points);
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
String name() const override
Nom du module.
ITraceMng * traceMng() const override
Gestionnaire de traces.
ISubDomain * subDomain() const override
Sous-domaine associé au module.
IMesh * defaultMesh() const override
Maillage par défaut pour ce module.
AbstractModule(const ModuleBuildInfo &)
Constructeur à partir d'un ModuleBuildInfo.
IParallelMng * parallelMng() const override
Gestionnaire du parallélisme par échange de message.
Int32 globalIteration() const
Numéro de l'itération courante.
CommonVariables(IModule *c)
Construit les références des variables communes pour le module c.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe gérant un répertoire.
void beginWrite(const TimeHistoryCurveWriterInfo &infos) override
Notifie un début d'écriture.
void setOutputPath(const String &path) override
Répertoire de base où seront écrites les courbes.
String outputPath() const override
Répertoire de base où seront écrites les courbes.
void writeCurve(const TimeHistoryCurveInfo &infos) override
Ecrit une courbe.
void endWrite() override
Notifie la fin de l'écriture.
String name() const override
Nom de l'écrivain.
static const char *const WComputeLoop
appelé pendant la boucle de calcul
static const char *const WStartInit
appelé pendant l'initialisation d'un nouveau cas
static const char *const WRestore
appelé pour restaurer les variables lors d'un retour arrière
@ PAutoLoadEnd
Chargé automatiquement à la fin. Cela signifie qu'un module possédant un point d'entrée avec cette pr...
@ PAutoLoadBegin
Chargé automatiquement au début. Cela signifie qu'un module possédant un point d'entrée avec cette pr...
static const char *const WContinueInit
appelé pendant l'initialisation d'une reprise
static const char *const WInit
appelé pendant l'initialisation
Interface du gestionnaire d'un sous-domaine.
virtual const CaseOptionsMain * caseOptionsMain() const =0
Options générales du jeu de donnée.
Interface d'un écrivain d'une courbe.
virtual String name() const =0
Nom de l'écrivain.
Interface de la partie interne d'un gestionnaire d'historique de valeur.
Classe gérant un historique de valeurs.
Interface d'un objet transformant les courbes d'historiques.
Interface du gestionnaire de traces.
Informations pour construire un module.
Référence à une instance.
Chaîne de caractères unicode.
String clone() const
Clone cette chaîne.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Classe étendant les arguments lors d'un ajout de valeur dans un historique de valeur.
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.
Gestionnaire d'un historique de valeurs.
void applyTransformation(ITimeHistoryTransformer *v) override
Applique la transformation v à l'ensemble des courbes.
void setDumpActive(bool is_active) override
Positionne l'état d'activation des sorties.
void dumpCurves(ITimeHistoryCurveWriter2 *writer) override
Utilise l'écrivain writer pour sortir toutes les courbes.
ITimeHistoryMngInternal * _internalApi() override
API interne à Arcane.
void removeCurveWriter(ITimeHistoryCurveWriter2 *writer) override
Supprime un écrivain.
void addValue(const String &name, Real value, bool end_time, bool is_local) override
Ajoute la valeur value à l'historique name.
void setActive(bool is_active) override
Positionne l'état d'activation.
void addValue(const String &name, Int64 value, bool end_time, bool is_local) override
void dumpHistory(bool is_verbose) override
Sauve l'historique.
bool active() const override
Indique l'état d'activation.
void addValue(const String &name, Int64ConstArrayView values, bool end_time, bool is_local) override
void setShrinkActive(bool is_active) override
Positionne le booléen indiquant si l'historique est compressé
void addValue(const String &name, RealConstArrayView values, bool end_time, bool is_local) override
Ajoute la valeur value à l'historique name.
VersionInfo versionInfo() const override
Version du module.
void addValue(const String &name, Int32 value, bool end_time, bool is_local) override
Ajoute la valeur value à l'historique name.
bool isDumpActive() const override
Indique l'état d'activation des sorties.
void addValue(const String &name, Int32ConstArrayView values, bool end_time, bool is_local) override
Ajoute la valeur value à l'historique name.
void addCurveWriter(ITimeHistoryCurveWriter2 *writer) override
Ajoute un écrivain.
bool isShrinkActive() const override
Retourne un booléen indiquant si l'historique est compressé
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
Informations sur une version.
double toDouble(Real r)
Converti un Real en double.
-*- 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.
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
void addEntryPoint(ModuleType *module, const char *name, void(ModuleType::*func)(), const String &where=IEntryPoint::WComputeLoop, int property=IEntryPoint::PNone)
Routine template permettant de référencer un point d'entrée dans un module.
std::int32_t Int32
Type entier signé sur 32 bits.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.