Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TimeHistoryMng2.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/* TimeHistoryMng2.cc (C) 2000-2024 */
9/* */
10/* Module gérant un historique de valeurs (Version 2). */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
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"
19
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"
39
40#include "arcane/datatype/DataTypeTraits.h"
41
42#include "arcane/impl/internal/TimeHistoryMngInternal.h"
43#include "arcane/core/GlobalTimeHistoryAdder.h"
44
45#include <variant>
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50namespace Arcane
51{
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
60: public TraceAccessor
62{
63 public:
64
67 {
68 }
69
70 public:
71
72 void build() override {}
73 void beginWrite(const TimeHistoryCurveWriterInfo& infos) override
74 {
75 m_times = infos.times();
76 String path = infos.path();
77 // m_output_path surcharge les infos en argument si non vide.
78 if (m_output_path.empty())
79 m_output_path = path;
80
81 m_gnuplot_path = Directory(Directory(m_output_path), "gnuplot");
82 // Créé le répertoire de sortie.
83 if (m_gnuplot_path.createDirectory()) {
84 warning() << "Can not create gnuplot curve directory '"
85 << m_gnuplot_path.path() << "'";
86 }
87 }
88 void writeCurve(const TimeHistoryCurveInfo& infos) override
89 {
90 String name(infos.name().clone());
91
92 if (infos.subDomain() != NULL_SUB_DOMAIN_ID) {
93 name = "SD" + String::fromNumber(infos.subDomain()) + "_" + name;
94 }
95 if (infos.hasSupport()) {
96 name = infos.support() + "_" + name;
97 }
98
99 String sname(m_gnuplot_path.file(name));
100 FILE* ofile = fopen(sname.localstr(), "w");
101 if (!ofile) {
102 warning() << "Can not open gnuplot curve file '" << sname << "'";
103 return;
104 }
105 RealConstArrayView values = infos.values();
106 Int32ConstArrayView iterations = infos.iterations();
107 Integer nb_val = iterations.size();
108 Integer sub_size = infos.subSize();
109 for (Integer i = 0; i < nb_val; ++i) {
110 fprintf(ofile, "%.16E", Convert::toDouble(m_times[iterations[i]]));
111 for (Integer z = 0; z < sub_size; ++z)
112 fprintf(ofile, " %.16E", Convert::toDouble(values[(i * sub_size) + z]));
113 fprintf(ofile, "\n");
114 }
115 fclose(ofile);
116 }
117
118 void endWrite() override {}
119
120 String name() const override { return "gnuplot"; }
121
122 void setOutputPath(const String& path) override
123 {
124 m_output_path = path;
125 }
126 String outputPath() const override
127 {
128 return m_output_path;
129 }
130
131 private:
132
133 String m_output_path;
134 UniqueArray<Real> m_times;
135 Directory m_gnuplot_path;
136};
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
150: public AbstractModule
151, public CommonVariables
152, public ITimeHistoryMng
153{
154
155 public:
156
158 ~TimeHistoryMng2() override = default;
159
160 public:
161
162 VersionInfo versionInfo() const override { return VersionInfo(1, 0, 0); }
163
164 public:
165
166 void addValue(const String& name, Real value, bool end_time, bool is_local) override
167 {
168 m_internal->addValue(TimeHistoryAddValueArgInternal(name, end_time, (is_local ? parallelMng()->commRank() : -1)), value);
169 }
170 void addValue(const String& name, Int64 value, bool end_time, bool is_local) override
171 {
172 m_internal->addValue(TimeHistoryAddValueArgInternal(name, end_time, (is_local ? parallelMng()->commRank() : -1)), value);
173 }
174 void addValue(const String& name, Int32 value, bool end_time, bool is_local) override
175 {
176 m_internal->addValue(TimeHistoryAddValueArgInternal(name, end_time, (is_local ? parallelMng()->commRank() : -1)), value);
177 }
178 void addValue(const String& name, RealConstArrayView values, bool end_time, bool is_local) override
179 {
180 m_internal->addValue(TimeHistoryAddValueArgInternal(name, end_time, (is_local ? parallelMng()->commRank() : -1)), values);
181 }
182 void addValue(const String& name, Int32ConstArrayView values, bool end_time, bool is_local) override
183 {
184 m_internal->addValue(TimeHistoryAddValueArgInternal(name, end_time, (is_local ? parallelMng()->commRank() : -1)), values);
185 }
186 void addValue(const String& name, Int64ConstArrayView values, bool end_time, bool is_local) override
187 {
188 m_internal->addValue(TimeHistoryAddValueArgInternal(name, end_time, (is_local ? parallelMng()->commRank() : -1)), values);
189 }
190
191 public:
192
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();
200
201 public:
202
209 void removeCurveWriter(const String& name) override;
210
211 public:
212
213 void dumpHistory(bool is_verbose) override;
215
216 bool active() const override { return m_internal->active(); }
217 void setActive(bool is_active) override { m_internal->setActive(is_active); }
218
219 bool isDumpActive() const override { return m_internal->isDumpActive(); }
220 void setDumpActive(bool is_active) override { m_internal->setDumpActive(is_active); }
221
222 bool isShrinkActive() const override { return m_internal->isShrinkActive(); }
223 void setShrinkActive(bool is_active) override { m_internal->setShrinkActive(is_active); }
224
226
227 ITimeHistoryMngInternal* _internalApi() override { return m_internal.get(); }
228
229 private:
230
233};
234
235/*---------------------------------------------------------------------------*/
236/*---------------------------------------------------------------------------*/
237
238TimeHistoryMng2::
239TimeHistoryMng2(const ModuleBuildInfo& mb, bool add_entry_points)
240: AbstractModule(mb)
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)))
245{
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,
261 }
262}
263
264/*---------------------------------------------------------------------------*/
265/*---------------------------------------------------------------------------*/
266
267void TimeHistoryMng2::
268timeHistoryStartInit()
269{
270 m_internal->addNowInGlobalTime();
271}
272
273/*---------------------------------------------------------------------------*/
274
275void TimeHistoryMng2::
276timeHistoryStartInitEnd()
277{
278 m_internal->updateGlobalTimeCurve();
279}
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
284void TimeHistoryMng2::
285timeHistoryBegin()
286{
287 // Si on n'est pas actif, on ne grossit pas inutilement le m_global_times
288 // qui sera copié dans la variable backupée 'm_th_global_time'
289 if (isShrinkActive() && !active()) {
290 // On ne fait rien
291 }
292 else {
293 //warning() << "timeHistoryBegin " << m_global_time() << " " << m_global_times.size();
294 m_internal->addNowInGlobalTime();
295 }
296
297 // Regarde s'il faut imprimer les sorties temporelles
298 {
299 bool force_print_thm = false;
300 int th_step = subDomain()->caseOptionsMain()->writeHistoryPeriod();
301 if (th_step != 0) {
302 if ((globalIteration() % th_step) == 0)
303 if (parallelMng()->isMasterIO() || m_internal->isNonIOMasterCurvesEnabled())
304 force_print_thm = true;
305 }
306 if (subDomain()->applicationInfo().isDebug())
307 force_print_thm = true;
308 if (force_print_thm)
309 m_internal->dumpHistory();
310 }
311}
312
313/*---------------------------------------------------------------------------*/
314/*---------------------------------------------------------------------------*/
315
316void TimeHistoryMng2::
317timeHistoryEnd()
318{
319 m_internal->updateGlobalTimeCurve();
320}
321
322/*---------------------------------------------------------------------------*/
323/*---------------------------------------------------------------------------*/
324
325void TimeHistoryMng2::
326timeHistoryInit()
327{
328 //warning() << "timeHistoryInit " << m_global_time() << " " << m_global_times.size();
329
330 info(4) << "TimeHistory is MasterIO ? " << m_internal->isMasterIO();
331 if (!m_internal->isMasterIO() && !m_internal->isNonIOMasterCurvesEnabled())
332 return;
333 m_internal->editOutputPath(Directory(subDomain()->exportDirectory(), "courbes"));
334 m_internal->addObservers(subDomain()->propertyMng());
335
336 if (platform::getEnvironmentVariable("ARCANE_DISABLE_GNUPLOT_CURVES").null()) {
337 ITimeHistoryCurveWriter2* gnuplot_curve_writer = new GnuplotTimeHistoryCurveWriter2(traceMng());
338 m_internal->addCurveWriter(makeRef(gnuplot_curve_writer));
339 }
340
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();
346 if (cw) {
347 info() << "FOUND CURVE SERVICE (V2)!";
348 m_internal->addCurveWriter(wr_ref);
349 }
350 }
351 }
352}
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356
359{
360 m_internal->addCurveWriter(makeRef(writer));
361}
362
363/*---------------------------------------------------------------------------*/
364/*---------------------------------------------------------------------------*/
365
366void TimeHistoryMng2::
367timeHistoryContinueInit()
368{
369 if (m_internal->isMasterIO() || m_internal->isNonIOMasterCurvesEnabled())
370 m_internal->readVariables(subDomain()->meshMng(), subDomain()->defaultMesh());
371}
372
373/*---------------------------------------------------------------------------*/
374/*---------------------------------------------------------------------------*/
375
376void TimeHistoryMng2::
377timeHistoryRestore()
378{
379 m_internal->resizeArrayAfterRestore();
380}
381
382/*---------------------------------------------------------------------------*/
383/*---------------------------------------------------------------------------*/
384
386dumpHistory(bool is_verbose)
387{
388 ARCANE_UNUSED(is_verbose);
389 m_internal->dumpHistory();
390}
391
392/*---------------------------------------------------------------------------*/
393/*---------------------------------------------------------------------------*/
394
397{
398 m_internal->dumpCurves(writer);
399}
400
401/*---------------------------------------------------------------------------*/
402/*---------------------------------------------------------------------------*/
403
406{
407 m_internal->applyTransformation(v);
408}
409
410/*---------------------------------------------------------------------------*/
411/*---------------------------------------------------------------------------*/
412
414removeCurveWriter(const String& name)
415{
416 m_internal->removeCurveWriter(name);
417}
418
419/*---------------------------------------------------------------------------*/
420/*---------------------------------------------------------------------------*/
421
422/*---------------------------------------------------------------------------*/
423/*---------------------------------------------------------------------------*/
424
425extern "C++" ARCANE_IMPL_EXPORT ITimeHistoryMng*
426arcaneCreateTimeHistoryMng2(ISubDomain* mng)
427{
428 return new TimeHistoryMng2(ModuleBuildInfo(mng, "TimeHistoryMng"));
429}
430extern "C++" ARCANE_IMPL_EXPORT ITimeHistoryMng*
431arcaneCreateTimeHistoryMng2(ISubDomain* mng, bool add_entry_points)
432{
433 return new TimeHistoryMng2(ModuleBuildInfo(mng, "TimeHistoryMng"), add_entry_points);
434}
435
436/*---------------------------------------------------------------------------*/
437/*---------------------------------------------------------------------------*/
438
439} // End namespace Arcane
440
441/*---------------------------------------------------------------------------*/
442/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Classe représentant un module.
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.
IParallelMng * parallelMng() const override
Gestionnaire du parallélisme par échange de message.
Variables communes d'un cas.
Int32 globalIteration() const
Numéro de l'itération courante.
Classe gérant un répertoire.
Definition Directory.h:33
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le répertoire.
Definition Directory.cc:138
virtual bool createDirectory() const
Créé le répertoire.
Definition Directory.cc:120
virtual String path() const
Retourne le chemin du répertoire.
Definition Directory.cc:129
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
Definition IEntryPoint.h:42
@ PAutoLoadEnd
Chargé automatiquement à la fin. Cela signifie qu'un module possédant un point d'entrée avec cette pr...
Definition IEntryPoint.h:80
@ PAutoLoadBegin
Chargé automatiquement au début. Cela signifie qu'un module possédant un point d'entrée avec cette pr...
Definition IEntryPoint.h:73
static const char *const WStartInit
appelé pendant l'initialisation d'un nouveau cas
Definition IEntryPoint.h:50
static const char *const WRestore
appelé pour restaurer les variables lors d'un retour arrière
Definition IEntryPoint.h:52
static const char *const WContinueInit
appelé pendant l'initialisation d'une reprise
Definition IEntryPoint.h:48
static const char *const WInit
appelé pendant l'initialisation
Definition IEntryPoint.h:46
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual const CaseOptionsMain * caseOptionsMain() const =0
Options générales du jeu de donnée.
Interface d'un écrivain d'une courbe.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Informations pour construire un module.
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é
Informations sur une version.
Definition VersionInfo.h:46
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
Definition String.cc:315
String clone() const
Clone cette chaîne.
Definition String.cc:412
TraceMessage warning() const
Flot pour un message d'avertissement.
TraceMessage info() const
Flot pour un message d'information.
double toDouble(Real r)
Converti un Real en double.
Definition Convert.h:40
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
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.
Definition EntryPoint.h:166
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.