14#include "arcane/impl/internal/TimeHistoryMngInternal.h"
16#include "arcane/core/IMeshMng.h"
17#include "arcane/core/IPropertyMng.h"
19#include "arcane/utils/JSONWriter.h"
33 m_trace_mng->
info() <<
"Add CurveWriter2 name=" <<
writer->name();
35 m_curve_writers2.insert(
writer);
44 for (
auto&
cw : m_curve_writers2)
45 if (
cw->name() == name) {
64 <<
" name='" <<
val->name() <<
"'"
65 <<
" index='" <<
val->index() <<
"'"
67 <<
" sub-size='" <<
val->subSize() <<
"'";
69 if (!
val->meshHandle().isNull()) {
110 auto p = m_properties;
111 p->setInt32(
"version", m_version);
146 writer->beginWrite(infos);
149 th.dumpValues(m_trace_mng,
writer, infos);
156 writer->beginWrite(infos);
160 th.dumpValues(m_trace_mng,
writer, infos);
168 for (Integer i = 0; i < m_parallel_mng->
commSize(); ++i) {
173 m_parallel_mng->
recv(length, i);
179 m_parallel_mng->
recv(buf, i);
185 if (length[4] != 0) {
220 length[3] =
th.subSize();
221 if (!
th.meshHandle().isNull()) {
232 if (!
th.meshHandle().isNull()) {
255 m_trace_mng->
info() <<
"Fin sortie historique: " << platform::getCurrentDateTime();
268 th.applyTransformation(m_trace_mng, v);
280 auto p = m_properties;
283 if (!
p->get(
"version", version)) {
285 m_trace_mng->
info() <<
"The checkpoint contains legacy format of TimeHistory variables, updating...";
289 else if (version == 2) {
290 m_trace_mng->
info() <<
"TimeHistory Variables version 2";
293 ARCANE_FATAL(
"Unknown TimeHistory Variables format -- Found version: {0}", version);
300 m_trace_mng->
info() <<
"Reading the values history";
307 ARCANE_FATAL(
"The meta-data of TimeHistoryMng2 are invalid.");
384 name = name +
"_" +
mh.meshName();
387 name = name +
"_Local";
410 m_trace_mng->
info() <<
"TimeHistoryRestore: truncating TimeHistoryGlobalTime array to size n=" << n <<
"\n";
427 m_directory = directory;
428 if (m_output_path.
empty()) {
429 m_output_path = m_directory.
path();
431 m_trace_mng->
warning() <<
"Can't create the output directory '" << m_output_path <<
"'";
446 if (
thpi.timeHistoryAddValueArg().isLocal() &&
thpi.timeHistoryAddValueArg().localProcId() != m_parallel_mng->
commRank()) {
455 if (!
thpi.meshHandle().isNull()) {
460 if (
thpi.timeHistoryAddValueArg().isLocal()) {
468 hl->second->arrayToWrite(iterations, values, infos);
482 m_trace_mng->
debug() <<
"Writing of the history of values path=" << m_output_path;
485 m_trace_mng->
info() <<
"Begin output history: " << platform::getCurrentDateTime();
488 for (
auto&
cw_ref : m_curve_writers2) {
490 m_trace_mng->
debug() <<
"Writing curves with '" <<
writer->name()
491 <<
"' date=" << platform::getCurrentDateTime();
506 std::ofstream
ofile(m_directory.
file(
"time_history.xml").localstr());
507 ofile <<
"<?xml version='1.0' ?>\n";
508 ofile <<
"<curves>\n";
513 ofile <<
"<curve name='";
514 if (!
th.meshHandle().isNull()) {
515 ofile <<
th.meshHandle().meshName() <<
"_";
525 for (Integer i = 0; i < m_parallel_mng->
commSize(); ++i)
531 m_parallel_mng->
recv(length, i);
534 m_parallel_mng->
recv(buf, i);
535 ofile <<
"<curve name='";
537 if (length[1] != 0) {
540 ofile <<
buf2.unguardedBasePointer() <<
"_";
542 ofile <<
"SD" << i <<
"_";
543 ofile << buf.unguardedBasePointer() <<
"'/>\n";
547 ofile <<
"</curves>\n";
559 if (
th.meshHandle().isNull()) {
603 if (!
th.meshHandle().isNull()) {
605 name = name +
th.meshHandle().meshName() +
"_";
619 for (Integer i = 0; i < m_parallel_mng->
commSize(); ++i) {
626 m_parallel_mng->
recv(length, i);
629 m_parallel_mng->
recv(buf, i);
630 json_writer.write(
"name", buf.unguardedBasePointer());
634 if (length[1] != 0) {
638 name = name +
buf2.unguardedBasePointer() +
"_";
641 name = name +
"SD" + String::fromNumber(i) +
"_";
644 json_writer.write(
"unique-name", name + buf.unguardedBasePointer());
655 std::ofstream
ofile(
out_dir.file(
"time_history.json").localstr());
672 if (
th.meshHandle().isNull()) {
691template <
class DataType>
703 if (
thpi.timeHistoryAddValueArg().isLocal() &&
thpi.timeHistoryAddValueArg().localProcId() != m_parallel_mng->
commRank()) {
708 if (!
thpi.meshHandle().isNull()) {
713 if (
thpi.timeHistoryAddValueArg().isLocal()) {
719 if (!
thpi.timeHistoryAddValueArg().endTime() && iteration != 0)
728 if (!
thpi.meshHandle().isNull()) {
738 if (values.size() !=
th->subSize()) {
739 ARCANE_FATAL(
"Bad subsize for curve '{0}' current={1} old={2}",
742 th->addValue(values, iteration);
766 ARCANE_FATAL(
"TimeHistoryGlobalTime or TimeHistoryMetaData is not found.");
785 m_curve_writers2.erase(
writer);
791template void TimeHistoryMngInternal::
794template void TimeHistoryMngInternal::
797template void TimeHistoryMngInternal::
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Real globalTime() const
Temps courant.
Int32 globalIteration() const
Numéro de l'itération courante.
VariableScalarReal m_global_time
Temps actuel.
Classe gérant un répertoire.
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le répertoire.
virtual bool createDirectory() const
Créé le répertoire.
virtual String path() const
Retourne le chemin du répertoire.
Interface du gestionnaire des entrées sorties.
Interface du gestionnaire des maillages.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual IIOMng * ioMng() const =0
Gestionnaire des entrées/sorties.
virtual Integer masterIORank() const =0
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
Interface du gestionnaire des propriétés.
Interface d'un écrivain d'une courbe.
Interface d'un objet transformant les courbes d'historiques.
virtual IVariable * findMeshVariable(IMesh *mesh, const String &name)=0
Retourne la variable du maillage de nom name ou 0 si aucune de se nom existe.
virtual IObservable * writeObservable()=0
Observable pour les variables en écriture.
Interface d'une variable.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Flot de sortie lié à une String.
void addObserver(T *obj, void(T::*func)(const IObservable &), IObservable *oba)
Ajoute un observateur.
Classe étendant les arguments lors d'un ajout de valeur dans un historique de valeur.
Informations pour l'écriture d'une courbe.
Informations sur l'écriture des courbes.
bool isShrinkActive() const override
Retourne un booléen indiquant si l'historique est compressé
void updateMetaData() override
Méthode permettant de mettre à jour les méta-données des courbes.
bool m_is_master_io
True si je suis le gestionnaire actif.
void addNowInGlobalTime() override
Méthode permettant d'ajouter le GlobalTime actuel au tableau des GlobalTimes.
void addValue(const TimeHistoryAddValueArgInternal &thpi, Real value) override
Méthode permettant d'ajouter une valeur à un historique.
void _dumpSummaryOfCurves()
Méthode permettant de sortir un fichier JSON avec le nom de chaque courbe sortie en format GNUPLOT ai...
void _removeCurveWriter(const Ref< ITimeHistoryCurveWriter2 > &writer)
Méthode permettant de retirer un écrivain.
void updateGlobalTimeCurve() override
Méthode permettant de copier le tableau de GlobalTime dans la variable globale GlobalTime.
void resizeArrayAfterRestore() override
Méthode permettant de redimensionner les tableaux de valeurs après une reprise.
void addObservers(IPropertyMng *prop_mng) override
Méthode permettant de rajouter les observers sauvegardant l'historique avant une protection.
bool m_is_dump_active
Indique si les dump sont actifs.
void removeCurveWriter(const String &name) override
Méthode permettant de retirer un écrivain.
void readVariables(IMeshMng *mesh_mng, IMesh *default_mesh) override
Méthode permettant de récupérer les courbes précédemment écrites lors d'une reprise.
void dumpHistory() override
Méthode permettant d'écrire toutes les courbes à l'aide de tous les writers enregistrés.
void _dumpSummaryOfCurvesLegacy()
Méthode permettant de sortir un fichier XML avec le nom de chaque courbe sortie en format GNUPLOT.
HistoryList m_history_list
Liste des historiques.
void _addHistoryValue(const TimeHistoryAddValueArgInternal &thpi, ConstArrayView< DataType > values)
Méthode permettant d'ajouter des valeurs à un historique de valeurs.
VariableArrayReal m_th_global_time
Tableau des instants de temps.
bool m_enable_non_io_master_curves
Indique si l'ecriture de courbes par des procs non io_master est possible.
void _dumpCurvesAllWriters()
Méthode permettant de sortir toutes les courbes avec tous les writers.
void applyTransformation(ITimeHistoryTransformer *v) override
Applique la transformation v à l'ensemble des courbes.
void iterationsAndValues(const TimeHistoryAddValueArgInternal &thpi, UniqueArray< Int32 > &iterations, UniqueArray< Real > &values) override
Méthode permettant de sortir les itérations et les valeurs d'un historique.
void dumpCurves(ITimeHistoryCurveWriter2 *writer) override
Méthode permettant d"écrire les courbes à l'aide du writer fourni.
bool m_io_master_write_only
Indique si les writers doivent être appelé par tous les processus.
void _saveProperties()
Méthode permettant de sauver les propriétés des metadatas.
VariableScalarString m_th_meta_data
Infos des historiques.
void _fromLegacyFormat(IMesh *default_mesh)
Méthode permettant de convertir l'ancien format vers le nouveau.
void editOutputPath(const Directory &directory) override
Méthode permettant de changer le répertoire de sortie des courbes.
void _destroyAll()
Destructeur.
RealUniqueArray m_global_times
Liste des temps globaux.
bool m_is_active
Indique si le service est actif.
void addCurveWriter(Ref< ITimeHistoryCurveWriter2 > writer) override
Méthode permettant d'ajouter un écrivain pour la sortie des courbes.
Classe de base d'un historique de valeurs.
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
void swapValues(VariableRefScalarT< DataType > &rhs)
Échange les valeurs de la variable rhs avec celles de l'instance.
String name() const
Nom de la variable.
Liste de noeuds d'un arbre DOM.
Integer size() const
Nombre d'éléments du vecteur.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void copy(const U ©_array)
Recopie le tableau copy_array dans l'instance.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
virtual TraceMessage warning()=0
Flot pour un message d'avertissement.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessage error()=0
Flot pour un message d'erreur.
Chaîne de caractères unicode.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
eDataType
Type d'une donnée.
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Int64
Donnée de type entier 64 bits.
@ DT_Real
Donnée de type réel.
ARCANE_DATATYPE_EXPORT eDataType dataTypeFromName(const char *name, bool &has_error)
Trouve le type associé à name.
const char * dataTypeName(eDataType type)
Nom du type de donnée.