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";
539 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i)
540 if (i != master_io_rank) {
543 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
545 m_parallel_mng->recv(length, i);
548 m_parallel_mng->recv(buf, i);
549 ofile <<
"<curve name='";
551 if (length[1] != 0) {
553 m_parallel_mng->recv(buf2, i);
556 ofile <<
"SD" << i <<
"_";
561 ofile <<
"</curves>\n";
575 m_parallel_mng->send(length, master_io_rank);
581 m_parallel_mng->send(length, master_io_rank);
598 JSONWriter json_writer(JSONWriter::FormatFlags::None);
603 json_writer.write(
"version", 1);
605 Integer master_io_rank = m_parallel_mng->masterIORank();
606 json_writer.writeKey(
"curves");
607 json_writer.beginArray();
613 json_writer.write(
"name", th.
name());
618 json_writer.write(
"support", th.
meshHandle().meshName());
619 name = name + th.
meshHandle().meshName() +
"_";
623 json_writer.write(
"sub-domain", master_io_rank);
624 name = name +
"SD" + String::fromNumber(master_io_rank) +
"_";
627 json_writer.write(
"unique-name", name + th.
name());
635 for (
Integer i = 0; i < m_parallel_mng->commSize(); ++i) {
636 if (i != master_io_rank) {
639 for (
Integer icurve = 0; icurve < nb_curve; ++icurve) {
642 m_parallel_mng->recv(length, i);
645 m_parallel_mng->recv(buf, i);
650 if (length[1] != 0) {
652 m_parallel_mng->recv(buf2, i);
657 name = name +
"SD" + String::fromNumber(i) +
"_";
659 json_writer.write(
"sub-domain", i);
665 json_writer.endArray();
671 std::ofstream ofile(out_dir.
file(
"time_history.json").
localstr());
672 ofile << json_writer.getBuffer();
679 Integer master_io_rank = m_parallel_mng->masterIORank();
690 m_parallel_mng->send(length, master_io_rank);
696 m_parallel_mng->send(length, master_io_rank);
707template <
class DataType>
715 if (thpi.timeHistoryAddValueArg().isLocal()) {
723 if (thpi.timeHistoryAddValueArg().isLocal() && thpi.timeHistoryAddValueArg().localSubDomainId() != m_parallel_mng->commRank()) {
727 String name_to_find = thpi.timeHistoryAddValueArg().name().
clone();
728 if (!thpi.meshHandle().
isNull()) {
731 name_to_find = name_to_find +
"_" + thpi.meshHandle().meshName();
733 if (thpi.timeHistoryAddValueArg().isLocal()) {
734 name_to_find = name_to_find +
"_Local";
737 Integer iteration = m_common_variables.globalIteration();
739 if (!thpi.timeHistoryAddValueArg().endTime() && iteration != 0)
748 if (!thpi.meshHandle().
isNull()) {
758 if (values.
size() != th->subSize()) {
759 ARCANE_FATAL(
"Bad subsize for curve '{0}' current={1} old={2}",
760 name_to_find, values.
size(), th->subSize());
783 IVariable* ptr_old_global_time = m_variable_mng->findMeshVariable(default_mesh,
"TimeHistoryGlobalTime");
784 IVariable* ptr_old_meta_data = m_variable_mng->findMeshVariable(default_mesh,
"TimeHistoryMetaData");
785 if (ptr_old_global_time ==
nullptr || ptr_old_meta_data ==
nullptr)
786 ARCANE_FATAL(
"TimeHistoryGlobalTime or TimeHistoryMetaData is not found.");
795 old_global_time.
resize(0);
796 old_meta_data.
reset();
805 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.
String file(const String &file_name) const override
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.