14#include "arcane/utils/Ptr.h"
15#include "arcane/utils/List.h"
17#include "arcane/EntryPoint.h"
18#include "arcane/ISubDomain.h"
19#include "arcane/IVariableMng.h"
20#include "arcane/IApplication.h"
21#include "arcane/IParallelMng.h"
22#include "arcane/ItemGroup.h"
23#include "arcane/Directory.h"
24#include "arcane/ITimeHistoryMng.h"
25#include "arcane/ServiceUtils.h"
26#include "arcane/IPostProcessorWriter.h"
27#include "arcane/SimpleProperty.h"
28#include "arcane/MeshAccessor.h"
29#include "arcane/IMesh.h"
30#include "arcane/VariableTypes.h"
31#include "arcane/CommonVariables.h"
32#include "arcane/MathUtils.h"
33#include "arcane/ITimeLoopMng.h"
34#include "arcane/ItemEnumerator.h"
35#include "arcane/ModuleFactory.h"
36#include "arcane/Timer.h"
37#include "arcane/IVariableAccessor.h"
38#include "arcane/VariableCollection.h"
40#include "arcane/OutputChecker.h"
42#include "arcane/std/ArcanePostProcessing_axl.h"
63class ArcanePostProcessingModule
64:
public ArcaneArcanePostProcessingObject
68 explicit ArcanePostProcessingModule(
const ModuleBuilder& cb);
69 ~ArcanePostProcessingModule();
80 virtual void postProcessingStartInit();
81 virtual void postProcessingInit();
100 void _saveAtTime(
Real);
102 void _checkCreateOutputDir();
113ArcanePostProcessingModule::
116, m_output_checker(mbi.subDomain(),
"PostProcessing")
117, m_history_output_checker(mbi.subDomain(),
"PostProcessingHistory")
118, m_times(VariableBuilder(this,
"ExportTimes"))
120, m_output_dir_created(false)
121, m_post_processor_timer(0)
124 m_output_checker.assignGlobalTime(&m_next_global_time,&
options()->outputFrequency);
126 m_history_output_checker.assignIteration(&m_history_next_iteration,&
options()->outputHistoryPeriod);
133ArcanePostProcessingModule::
134~ArcanePostProcessingModule()
152 std::set<String> used_variables;
155 info() <<
"-- List of output variables (" << nb_var <<
" variables):";
156 for(
Integer i=0; i<nb_var; ++i ){
160 ARCANE_FATAL(
"PostTreatment: no variable with name '{0}' exists",varname);
164 " be a mesh variable (node, edge, face or cell)",varname);
166 if (used_variables.find(varname)==used_variables.end()){
167 info() <<
"Variable <" << varname <<
">";
169 used_variables.insert(varname);
170 var->
addTag(
"PostProcessing",
"1");
173 warning() <<
"Variable <" << varname <<
"> required twice during post-processing analysis";
181 std::set<String> used_groups;
184 info() <<
"-- List of output groups (" << nb_group <<
" groups):";
185 for(
Integer i=0; i<nb_group; ++i ){
190 if (used_groups.find(groupname)==used_groups.end()){
191 info() <<
"Group <" << groupname <<
">";
192 used_groups.insert(groupname);
196 warning() <<
"Group <" << groupname <<
"> required twice during post-processing analysis";
205 if(
mesh->isAmrActivated())
215void ArcanePostProcessingModule::
216_checkCreateOutputDir()
228void ArcanePostProcessingModule::
231 info() <<
" -------------------------------------------";
232 info() <<
"| POST PROCESSING |";
233 info() <<
" -------------------------------------------";
238 info() <<
"Variables output:";
239 m_output_checker.initialize(is_continue);
241 info() <<
"History output:";
242 m_history_output_checker.initialize(is_continue);
247 if (
options()->outputHistoryShrink==
true){
257 Real current_time = vc.globalTime();
258 m_output_checker.check(old_time,current_time,
259 vc.globalIteration(),0);
260 m_history_output_checker.check(old_time,current_time,
261 vc.globalIteration(),0);
263 _saveAtTime(current_time);
270void ArcanePostProcessingModule::
271postProcessingStartInit()
273 m_next_global_time = 0.0;
275 m_curves_next_global_time = 0.0;
276 m_curves_next_iteration = 0;
277 m_history_next_iteration = 0;
294 bool save_at_exit =
false;
295 if (
subDomain()->timeLoopMng()->finalTimeReached())
296 save_at_exit =
options()->saveFinalTime();
298 save_at_exit =
options()->endExecutionOutput();
300 _saveAtTime(current_time);
305 info() <<
"Total time for post-processing analysis output (second): " << total_time;
308 info() <<
"Average time per output (second): " << total_time / nb_time
309 <<
" (for " << nb_time <<
" outputs";
312 post_processor->
close();
326 bool do_output = m_output_checker.check(old_time,current_time,
329 _saveAtTime(current_time);
348 bool do_history_output = m_history_output_checker.check(old_time,current_time,
357void ArcanePostProcessingModule::
358_saveAtTime(
Real saved_time)
373 _checkCreateOutputDir();
382 info() <<
"**** Output in progress at time " << saved_time <<
" ******";
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Generation de la classe de base du Module.
CaseOptionsArcanePostProcessing * options() const
Options du jeu de données du module.
Arcane::VariableScalarInteger m_next_iteration
Variables du module.
ISubDomain * subDomain() const override
Sous-domaine associé au module.
IMesh * defaultMesh() const override
Maillage par défaut pour ce module.
Module de sortie pour le dépouillement.
Timer * m_post_processor_timer
Timer pour le temps passé à écrire.
bool m_output_dir_created
true si répertoire créé.
VariableArrayReal m_times
Instants de temps des sauvegardes.
virtual VersionInfo versionInfo() const
Version du module.
virtual void exportDataStart()
Point d'entrée en début d'itération.
VariableList m_variables
Liste des variables a exporter.
ItemGroupList m_groups
Liste des groupes à exporter.
virtual void exportData()
Vérifie et écrit les valeurs pour le dépouillement.
virtual void postProcessingExit()
Informations de dépouillement en sortie de la boucle de calcul.
Directory m_output_directory
Répertoire de sortie.
bool m_do_output
true si les sorties sont actives
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Variables communes d'un cas.
Real globalTime() const
Temps courant.
Int32 globalIteration() const
Numéro de l'itération courante.
CommonVariables(IModule *c)
Construit les références des variables communes pour le module c.
Real globalOldTime() const
Temps courant précédent.
Classe gérant un répertoire.
virtual bool createDirectory() const
Créé le répertoire.
virtual String path() const
Retourne le chemin du répertoire.
Interface d'un écrivain pour les informations de post-traitement.
virtual void setVariables(VariableCollection variables)=0
Positionne la liste des variables à sortir.
virtual void setTimes(RealConstArrayView times)=0
Positionne la liste des temps.
virtual void close()=0
Ferme l'écrivain. Après fermeture, il ne peut plus être utilisé
virtual void setGroups(ItemGroupCollection groups)=0
Positionne la liste des groupes à sortir.
virtual void setBaseDirectoryName(const String &dirname)=0
Positionne le nom du répertoire de sortie des fichiers. Ce répertoire doit exister.
virtual const CommonVariables & commonVariables() const =0
Informations sur les variables standards.
virtual IMesh * defaultMesh()=0
Maillage par défaut.
virtual bool isContinue() const =0
Vrai si on effectue une reprise, faux sinon.
virtual ITimeHistoryMng * timeHistoryMng()=0
Retourne le gestionnaire d'historique.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
virtual void setShrinkActive(bool is_active)=0
Positionne le booléen indiquant si l'historique est compressé
virtual void setActive(bool is_active)=0
Positionne l'état d'activation.
Interface du gestionnaire de variables.
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 void writePostProcessing(IPostProcessorWriter *writer)=0
Ecrit les variables pour un post-traitement.
Interface d'une variable.
virtual void addTag(const String &tagname, const String &tagvalue)=0
Ajoute le tag tagname avev la valeur tagvalue.
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
Groupe d'entités de maillage.
const String & name() const
Nom du groupe.
bool null() const
true is le groupe est le groupe nul
Informations pour construire un module.
ISubDomain * subDomain() const
Accès au sous-domaine associé
Gère les sorties basées sur un temps physique, temps CPU ou un nombre d'itération.
Chaîne de caractères unicode.
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
@ TimerReal
Timer utilisant le temps réel.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage warning() const
Flot pour un message d'avertissement.
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
Informations sur une version.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
VariableRefArrayT< Real > VariableArrayReal
Variable tableau de type réels.
constexpr __host__ __device__ bool isEqual(const _Type &a, const _Type &b)
Teste l'égalité bit à bit entre deux valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
List< ItemGroup > ItemGroupList
Tableau de groupes d'éléments du maillage.
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
double Real
Type représentant un réel.