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) {
59 meta_data_str() <<
"<?xml version='1.0' ?>\n";
60 meta_data_str() <<
"<curves>\n";
63 meta_data_str() <<
"<curve "
64 <<
" name='" << val->
name() <<
"'"
65 <<
" index='" << val->
index() <<
"'"
67 <<
" sub-size='" << val->subSize() <<
"'";
70 meta_data_str() <<
" support='" << val->
meshHandle().meshName() <<
"'";
73 meta_data_str() <<
" sub-domain='" << val->
localProcId() <<
"'";
76 meta_data_str() <<
"/>\n";
78 meta_data_str() <<
"</curves>\n";
81 String ss = meta_data_str.str();
95 m_observer_pool.addObserver(
this,
99 m_observer_pool.addObserver(
this,
101 m_variable_mng->writeObservable());
110 auto p = m_properties;
111 p->setInt32(
"version", m_version);
122 addValue(thpi, m_common_variables.globalTime());
165 Integer master_io_rank = m_parallel_mng->masterIORank();
168 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i) {
169 if (i != master_io_rank) {
172 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
173 m_parallel_mng->recv(length, i);
179 m_parallel_mng->recv(buf, i);
180 m_parallel_mng->recv(iterations_to_write, i);
181 m_parallel_mng->recv(values_to_write, i);
185 if (length[4] != 0) {
187 m_parallel_mng->recv(buf2, i);
190 TimeHistoryCurveInfo curve_info(name, name_mesh, iterations_to_write, values_to_write, length[3], i);
206 Integer master_io_rank = m_parallel_mng->masterIORank();
215 th.
arrayToWrite(iterations_to_write, values_to_write, infos);
218 length[1] = iterations_to_write.
size();
219 length[2] = values_to_write.
size();
220 length[3] = th.subSize();
228 m_parallel_mng->send(length, master_io_rank);
230 m_parallel_mng->send(iterations_to_write, master_io_rank);
231 m_parallel_mng->send(values_to_write, master_io_rank);
278 bool need_update =
false;
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);
296 m_trace_mng->info(4) <<
"readVariables resizes m_global_time to " <<
m_th_global_time.size();
300 m_trace_mng->info() <<
"Reading the values history";
302 IIOMng* io_mng = m_parallel_mng->ioMng();
305 m_trace_mng->error() <<
" METADATA len=" <<
m_th_meta_data().length()
307 ARCANE_FATAL(
"The meta-data of TimeHistoryMng2 are invalid.");
309 XmlNode root_node = doc->documentNode();
315 String ustr_index(
"index");
316 String ustr_sub_size(
"sub-size");
317 String ustr_data_type(
"data-type");
320 String ustr_support(
"support");
321 String ustr_sub_domain(
"sub-domain");
324 String name = curve.attrValue(ustr_name);
325 Integer index = curve.attr(ustr_index).valueAsInteger();
326 Integer sub_size = curve.attr(ustr_sub_size).valueAsInteger();
327 String data_type_str = curve.attrValue(ustr_data_type);
329 String support_str = curve.attrValue(ustr_support,
false);
331 XmlNode sub_domain_node = curve.
attr(ustr_sub_domain);
332 Integer sub_domain = NULL_SUB_DOMAIN_ID;
333 if (!sub_domain_node.
null()) {
337 if (sub_domain != NULL_SUB_DOMAIN_ID && m_parallel_mng->commRank() != sub_domain) {
347 if (support_str.
null()) {
384 name = name +
"_" + mh.meshName();
386 if (sub_domain != NULL_SUB_DOMAIN_ID) {
387 name = name +
"_Local";
399 Integer current_iteration = m_common_variables.globalIteration();
407 if (n > current_iteration) {
408 n = current_iteration;
410 m_trace_mng->info() <<
"TimeHistoryRestore: truncating TimeHistoryGlobalTime array to size n=" << n <<
"\n";
417 i->second->removeAfterIteration(current_iteration);
427 m_directory = directory;
428 if (m_output_path.empty()) {
429 m_output_path = m_directory.path();
430 if (m_directory.createDirectory()) {
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()) {
454 String name_to_find = thpi.timeHistoryAddValueArg().name().
clone();
455 if (!thpi.meshHandle().
isNull()) {
458 name_to_find = name_to_find +
"_" + thpi.meshHandle().meshName();
460 if (thpi.timeHistoryAddValueArg().isLocal()) {
461 name_to_find = name_to_find +
"_Local";
468 hl->second->arrayToWrite(iterations, values, infos);
482 m_trace_mng->debug() <<
"Writing of the history of values path=" << m_output_path;
488 for (
auto& cw_ref : m_curve_writers2) {
490 m_trace_mng->debug() <<
"Writing curves with '" << writer->
name()
504 Integer master_io_rank = m_parallel_mng->masterIORank();
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='";
518 ofile <<
"SD" << master_io_rank <<
"_";
520 ofile << th.
name() <<
"'/>\n";
525 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i)
526 if (i != master_io_rank) {
529 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
531 m_parallel_mng->recv(length, i);
534 m_parallel_mng->recv(buf, i);
535 ofile <<
"<curve name='";
537 if (length[1] != 0) {
539 m_parallel_mng->recv(buf2, i);
542 ofile <<
"SD" << i <<
"_";
547 ofile <<
"</curves>\n";
561 m_parallel_mng->send(length, master_io_rank);
567 m_parallel_mng->send(length, master_io_rank);
584 JSONWriter json_writer(JSONWriter::FormatFlags::None);
589 json_writer.write(
"version", 1);
591 Integer master_io_rank = m_parallel_mng->masterIORank();
592 json_writer.writeKey(
"curves");
593 json_writer.beginArray();
599 json_writer.write(
"name", th.
name());
604 json_writer.write(
"support", th.
meshHandle().meshName());
605 name = name + th.
meshHandle().meshName() +
"_";
609 json_writer.write(
"sub-domain", master_io_rank);
610 name = name +
"SD" + String::fromNumber(master_io_rank) +
"_";
613 json_writer.write(
"unique-name", name + th.
name());
619 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i) {
620 if (i != master_io_rank) {
623 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
626 m_parallel_mng->recv(length, i);
629 m_parallel_mng->recv(buf, i);
634 if (length[1] != 0) {
636 m_parallel_mng->recv(buf2, i);
641 name = name +
"SD" + String::fromNumber(i) +
"_";
643 json_writer.write(
"sub-domain", i);
649 json_writer.endArray();
655 std::ofstream ofile(out_dir.
file(
"time_history.json").
localstr());
656 ofile << json_writer.getBuffer();
663 Integer master_io_rank = m_parallel_mng->masterIORank();
674 m_parallel_mng->send(length, master_io_rank);
680 m_parallel_mng->send(length, master_io_rank);
691template <
class DataType>
703 if (thpi.timeHistoryAddValueArg().isLocal() && thpi.timeHistoryAddValueArg().localProcId() != m_parallel_mng->commRank()) {
707 String name_to_find = thpi.timeHistoryAddValueArg().name().
clone();
708 if (!thpi.meshHandle().
isNull()) {
711 name_to_find = name_to_find +
"_" + thpi.meshHandle().meshName();
713 if (thpi.timeHistoryAddValueArg().isLocal()) {
714 name_to_find = name_to_find +
"_Local";
717 Integer iteration = m_common_variables.globalIteration();
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}",
740 name_to_find, values.
size(), th->subSize());
763 IVariable* ptr_old_global_time = m_variable_mng->findMeshVariable(default_mesh,
"TimeHistoryGlobalTime");
764 IVariable* ptr_old_meta_data = m_variable_mng->findMeshVariable(default_mesh,
"TimeHistoryMetaData");
765 if (ptr_old_global_time ==
nullptr || ptr_old_meta_data ==
nullptr)
766 ARCANE_FATAL(
"TimeHistoryGlobalTime or TimeHistoryMetaData is not found.");
775 old_global_time.
resize(0);
776 old_meta_data.
reset();
785 m_curve_writers2.erase(writer);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void clear()
Supprime les éléments du tableau.
const T * unguardedBasePointer() const
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
interval d'itérateurs constant
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.
Interface du gestionnaire des entrées sorties.
virtual IXmlDocumentHolder * parseXmlString(const String &str, const String &name)=0
Lit et analyse le fichier XML contenu dans la chaîne str.
Interface du gestionnaire des maillages.
virtual MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Recherche le maillage de nom name.
Interface du gestionnaire des propriétés.
virtual IObservable * writeObservable()=0
Observable pour l'écriture.
Interface d'un écrivain d'une courbe.
virtual String name() const =0
Nom de l'écrivain.
virtual void endWrite()=0
Notifie la fin de l'écriture.
virtual void beginWrite(const TimeHistoryCurveWriterInfo &infos)=0
Notifie un début d'écriture.
virtual void writeCurve(const TimeHistoryCurveInfo &infos)=0
Ecrit une courbe.
Interface d'un objet transformant les courbes d'historiques.
Interface d'une variable.
interval d'itérateursCette classe gère un couple d'itérateurs autorisant la modification des éléments...
bool isNull() const
Indique si le handle est nul (il ne référence aucun maillage existant ou non)
Flot de sortie lié à une String.
T * get() const
Retourne l'objet référé par l'instance.
Référence à une instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Int64 length() const
Retourne la longueur de la chaîne.
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.
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.
Historique de valeurs du type T.
void addValue(ConstArrayView< DataType > values, Integer iteration)
Méthode permettant d'ajouter des valeurs à une itération.
Classe de base d'un historique de valeurs.
Integer index() const
Index de l'historique dans la liste.
const MeshHandle & meshHandle() const
Méthode permettant de récupérer le MeshHandle enregistré.
const String & name() const
Nom de l'historique.
eDataType dataType() const
Type de données de l'historique.
virtual void applyTransformation(ITraceMng *msg, ITimeHistoryTransformer *v)=0
Méthode permettant d'appliquer une transformation sur les valeurs de l'historique de valeur.
virtual void fromOldToNewVariables(IVariableMng *vm, IMesh *default_mesh)=0
Méthode permettant de convertir les variables d'anciennes sauvegardes vers le nouveau format.
Integer localProcId() const
Méthode permettant de récupérer l'id du sous-domaine à qui appartient cet historique.
virtual void arrayToWrite(UniqueArray< Int32 > &iterations, UniqueArray< Real > &values, const TimeHistoryCurveWriterInfo &infos) const =0
Méthode permettant de récupérer les itérations et les valeurs d'un historique de valeur.
bool isLocal() const
Méthode permettant de savoir si c'est un historique global ou local à un sous-domaine.
virtual void dumpValues(ITraceMng *msg, ITimeHistoryCurveWriter2 *writer, const TimeHistoryCurveWriterInfo &infos) const =0
Imprime les valeurs de l'historique avec l'écrivain writer.
Vecteur 1D de données avec sémantique par valeur (style STL).
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
void reset()
Réinitialise la variable avec sa valeur par défaut.
Liste de noeuds d'un arbre DOM.
XmlNode attr(const String &name, bool throw_exception=false) const
Retourne l'attribut de nom name.
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
bool null() const
Vrai si le noeud est nul.
Integer valueAsInteger(bool throw_exception=false) const
Valeur du noeud convertie en entier.
VariableRefArrayT< Real > VariableArrayReal
Variable tableau de type réels.
VariableRefScalarT< String > VariableScalarString
Variable scalaire de type chaine de caractère.
-*- 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....
Int32 Integer
Type représentant un entier.
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.
std::int32_t Int32
Type entier signé sur 32 bits.