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() <<
"'";
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());
176 Integer master_io_rank = m_parallel_mng->masterIORank();
179 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i) {
180 if (i != master_io_rank) {
183 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
184 m_parallel_mng->recv(length, i);
190 m_parallel_mng->recv(buf, i);
191 m_parallel_mng->recv(iterations_to_write, i);
192 m_parallel_mng->recv(values_to_write, i);
196 if (length[4] != 0) {
198 m_parallel_mng->recv(buf2, i);
201 TimeHistoryCurveInfo curve_info(name, name_mesh, iterations_to_write, values_to_write, length[3], i);
217 Integer master_io_rank = m_parallel_mng->masterIORank();
226 th.
arrayToWrite(iterations_to_write, values_to_write, infos);
229 length[1] = iterations_to_write.
size();
230 length[2] = values_to_write.
size();
231 length[3] = th.subSize();
239 m_parallel_mng->send(length, master_io_rank);
241 m_parallel_mng->send(iterations_to_write, master_io_rank);
242 m_parallel_mng->send(values_to_write, master_io_rank);
289 bool need_update =
false;
291 auto p = m_properties;
294 if (!p->get(
"version", version)) {
296 m_trace_mng->info() <<
"The checkpoint contains legacy format of TimeHistory variables, updating...";
300 else if (version == 2) {
301 m_trace_mng->info() <<
"TimeHistory Variables version 2";
304 ARCANE_FATAL(
"Unknown TimeHistory Variables format -- Found version: {0}", version);
307 m_trace_mng->info(4) <<
"readVariables resizes m_global_time to " <<
m_th_global_time.size();
311 m_trace_mng->info() <<
"Reading the values history";
313 IIOMng* io_mng = m_parallel_mng->ioMng();
316 m_trace_mng->error() <<
" METADATA len=" <<
m_th_meta_data().length()
318 ARCANE_FATAL(
"The meta-data of TimeHistoryMng2 are invalid.");
320 XmlNode root_node = doc->documentNode();
326 String ustr_index(
"index");
327 String ustr_sub_size(
"sub-size");
328 String ustr_data_type(
"data-type");
331 String ustr_support(
"support");
332 String ustr_sub_domain(
"sub-domain");
335 String name = curve.attrValue(ustr_name);
336 Integer index = curve.attr(ustr_index).valueAsInteger();
337 Integer sub_size = curve.attr(ustr_sub_size).valueAsInteger();
338 String data_type_str = curve.attrValue(ustr_data_type);
340 String support_str = curve.attrValue(ustr_support,
false);
342 XmlNode sub_domain_node = curve.
attr(ustr_sub_domain);
343 Integer sub_domain = NULL_SUB_DOMAIN_ID;
344 if (!sub_domain_node.
null()) {
349 if (sub_domain != NULL_SUB_DOMAIN_ID && m_parallel_mng->commRank() != sub_domain) {
359 if (support_str.
null()) {
396 name = name +
"_" + mh.meshName();
398 if (sub_domain != NULL_SUB_DOMAIN_ID) {
399 name = name +
"_Local";
411 Integer current_iteration = m_common_variables.globalIteration();
419 if (n > current_iteration) {
420 n = current_iteration;
422 m_trace_mng->info() <<
"TimeHistoryRestore: truncating TimeHistoryGlobalTime array to size n=" << n <<
"\n";
429 i->second->removeAfterIteration(current_iteration);
439 m_directory = directory;
440 if (m_output_path.empty()) {
441 m_output_path = m_directory.path();
442 if (m_directory.createDirectory()) {
443 m_trace_mng->warning() <<
"Can't create the output directory '" << m_output_path <<
"'";
458 if (thpi.timeHistoryAddValueArg().isLocal() && thpi.timeHistoryAddValueArg().localSubDomainId() != m_parallel_mng->commRank()) {
466 String name_to_find = thpi.timeHistoryAddValueArg().name().
clone();
467 if (!thpi.meshHandle().
isNull()) {
470 name_to_find = name_to_find +
"_" + thpi.meshHandle().meshName();
472 if (thpi.timeHistoryAddValueArg().isLocal()) {
473 name_to_find = name_to_find +
"_Local";
480 hl->second->arrayToWrite(iterations, values, infos);
494 m_trace_mng->debug() <<
"Writing of the history of values path=" << m_output_path;
500 for (
auto& cw_ref : m_curve_writers2) {
502 m_trace_mng->debug() <<
"Writing curves with '" << writer->
name()
516 Integer master_io_rank = m_parallel_mng->masterIORank();
518 std::ofstream ofile(m_directory.file(
"time_history.xml").localstr());
519 ofile <<
"<?xml version='1.0' ?>\n";
520 ofile <<
"<curves>\n";
525 ofile <<
"<curve name='";
530 ofile <<
"SD" << master_io_rank <<
"_";
532 ofile << th.
name() <<
"'/>\n";
537 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i)
538 if (i != master_io_rank) {
541 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
543 m_parallel_mng->recv(length, i);
546 m_parallel_mng->recv(buf, i);
547 ofile <<
"<curve name='";
549 if (length[1] != 0) {
551 m_parallel_mng->recv(buf2, i);
554 ofile <<
"SD" << i <<
"_";
559 ofile <<
"</curves>\n";
573 m_parallel_mng->send(length, master_io_rank);
579 m_parallel_mng->send(length, master_io_rank);
596 JSONWriter json_writer(JSONWriter::FormatFlags::None);
601 json_writer.write(
"version", 1);
603 Integer master_io_rank = m_parallel_mng->masterIORank();
604 json_writer.writeKey(
"curves");
605 json_writer.beginArray();
611 json_writer.write(
"name", th.
name());
616 json_writer.write(
"support", th.
meshHandle().meshName());
617 name = name + th.
meshHandle().meshName() +
"_";
621 json_writer.write(
"sub-domain", master_io_rank);
622 name = name +
"SD" + String::fromNumber(master_io_rank) +
"_";
625 json_writer.write(
"unique-name", name + th.
name());
631 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i) {
632 if (i != master_io_rank) {
635 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
638 m_parallel_mng->recv(length, i);
641 m_parallel_mng->recv(buf, i);
646 if (length[1] != 0) {
648 m_parallel_mng->recv(buf2, i);
653 name = name +
"SD" + String::fromNumber(i) +
"_";
655 json_writer.write(
"sub-domain", i);
661 json_writer.endArray();
667 std::ofstream ofile(out_dir.
file(
"time_history.json").
localstr());
668 ofile << json_writer.getBuffer();
675 Integer master_io_rank = m_parallel_mng->masterIORank();
686 m_parallel_mng->send(length, master_io_rank);
692 m_parallel_mng->send(length, master_io_rank);
703template <
class DataType>
711 if (thpi.timeHistoryAddValueArg().isLocal()) {
719 if (thpi.timeHistoryAddValueArg().isLocal() && thpi.timeHistoryAddValueArg().localSubDomainId() != m_parallel_mng->commRank()) {
723 String name_to_find = thpi.timeHistoryAddValueArg().name().
clone();
724 if (!thpi.meshHandle().
isNull()) {
727 name_to_find = name_to_find +
"_" + thpi.meshHandle().meshName();
729 if (thpi.timeHistoryAddValueArg().isLocal()) {
730 name_to_find = name_to_find +
"_Local";
733 Integer iteration = m_common_variables.globalIteration();
735 if (!thpi.timeHistoryAddValueArg().endTime() && iteration != 0)
744 if (!thpi.meshHandle().
isNull()) {
754 if (values.
size() != th->subSize()) {
755 ARCANE_FATAL(
"Bad subsize for curve '{0}' current={1} old={2}",
756 name_to_find, values.
size(), th->subSize());
779 IVariable* ptr_old_global_time = m_variable_mng->findMeshVariable(default_mesh,
"TimeHistoryGlobalTime");
780 IVariable* ptr_old_meta_data = m_variable_mng->findMeshVariable(default_mesh,
"TimeHistoryMetaData");
781 if (ptr_old_global_time ==
nullptr || ptr_old_meta_data ==
nullptr)
782 ARCANE_FATAL(
"TimeHistoryGlobalTime or TimeHistoryMetaData is not found.");
791 old_global_time.
resize(0);
792 old_meta_data.
reset();
801 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 des IO.
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...
bool m_is_master_io_of_sd
True si je suis le gestionnaire des IO pour mon sous-domaine.
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_need_comm
Indique si au moins une courbe est non local (donc nécessite des communications).
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 localSubDomainId() 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.
@ ReduceMin
Minimum des valeurs.
-*- 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.