14#include "arcane/utils/Ptr.h"
15#include "arcane/utils/List.h"
17#include "arcane/core/EntryPoint.h"
18#include "arcane/core/ISubDomain.h"
19#include "arcane/core/IVariableMng.h"
20#include "arcane/core/IParallelMng.h"
21#include "arcane/core/ItemGroup.h"
22#include "arcane/core/Directory.h"
23#include "arcane/core/ITimeHistoryMng.h"
24#include "arcane/core/ServiceUtils.h"
25#include "arcane/core/IPostProcessorWriter.h"
26#include "arcane/core/MeshAccessor.h"
27#include "arcane/core/IMesh.h"
28#include "arcane/core/VariableTypes.h"
29#include "arcane/core/CommonVariables.h"
31#include "arcane/core/ITimeLoopMng.h"
33#include "arcane/core/ModuleFactory.h"
34#include "arcane/core/Timer.h"
35#include "arcane/core/VariableCollection.h"
36#include "arcane/core/OutputChecker.h"
37#include "arcane/core/IExternalPlugin.h"
39#include "arcane/std/ArcanePostProcessing_axl.h"
59class ArcanePostProcessingModule
60:
public ArcaneArcanePostProcessingObject
65 ~ArcanePostProcessingModule()
override;
76 void postProcessingStartInit()
override;
77 void postProcessingInit()
override;
93 bool m_is_plugin_initialized =
false;
98 void _saveAtTime(
Real);
100 void _checkCreateOutputDir();
103 void _checkExternalPlugin();
114ArcanePostProcessingModule::
117, m_output_checker(mbi.subDomain(),
"PostProcessing")
118, m_history_output_checker(mbi.subDomain(),
"PostProcessingHistory")
119, m_times(VariableBuilder(this,
"ExportTimes"))
122 m_output_checker.assignGlobalTime(&m_next_global_time,&
options()->outputFrequency);
124 m_history_output_checker.assignIteration(&m_history_next_iteration,&
options()->outputHistoryPeriod);
131ArcanePostProcessingModule::
132~ArcanePostProcessingModule()
150 std::set<String> used_variables;
153 info() <<
"-- List of output variables (" << nb_var <<
" variables):";
154 for(
Integer i=0; i<nb_var; ++i ){
158 ARCANE_FATAL(
"PostTreatment: no variable with name '{0}' exists",varname);
162 " be a mesh variable (node, edge, face or cell)",varname);
164 if (used_variables.find(varname)==used_variables.end()){
165 info() <<
"Variable <" << varname <<
">";
167 used_variables.insert(varname);
171 warning() <<
"Variable <" << varname <<
"> required twice during post-processing analysis";
179 std::set<String> used_groups;
182 info() <<
"-- List of output groups (" << nb_group <<
" groups):";
183 for(
Integer i=0; i<nb_group; ++i ){
188 if (used_groups.find(groupname)==used_groups.end()){
189 info() <<
"Group <" << groupname <<
">";
190 used_groups.insert(groupname);
194 warning() <<
"Group <" << groupname <<
"> required twice during post-processing analysis";
203 if (
mesh->isAmrActivated())
213void ArcanePostProcessingModule::
214_checkCreateOutputDir()
226void ArcanePostProcessingModule::
229 info() <<
" -------------------------------------------";
230 info() <<
"| POST PROCESSING |";
231 info() <<
" -------------------------------------------";
236 info() <<
"Variables output:";
237 m_output_checker.initialize(is_continue);
239 info() <<
"History output:";
240 m_history_output_checker.initialize(is_continue);
245 if (
options()->outputHistoryShrink)
251 const Real current_time = vc.globalTime();
252 m_output_checker.
check(old_time, current_time, vc.globalIteration(), 0);
253 m_history_output_checker.
check(old_time, current_time, vc.globalIteration(), 0);
256 _saveAtTime(current_time);
262void ArcanePostProcessingModule::
263postProcessingStartInit()
265 m_next_global_time = 0.0;
267 m_curves_next_global_time = 0.0;
268 m_curves_next_iteration = 0;
269 m_history_next_iteration = 0;
286 bool save_at_exit =
false;
287 if (
subDomain()->timeLoopMng()->finalTimeReached())
288 save_at_exit =
options()->saveFinalTime();
290 save_at_exit =
options()->endExecutionOutput();
292 _saveAtTime(current_time);
297 info() <<
"Total time for post-processing analysis output (second): " << total_time;
300 info() <<
"Average time per output (second): " << total_time / nb_time
301 <<
" (for " << nb_time <<
" outputs";
304 post_processor->
close();
317 _saveAtTime(current_time);
334 if (global_iteration == 0)
342 bool do_history_output = m_history_output_checker.check(old_time, current_time, global_iteration, 0);
347 bool do_at_current_iteration = m_output_checker.check(old_time, current_time, global_iteration, 0);
348 if (do_at_current_iteration)
356void ArcanePostProcessingModule::
357_saveAtTime(
Real saved_time)
373 _checkCreateOutputDir();
382 info() <<
"**** Output in progress at time " << saved_time <<
" ******";
386 _checkExternalPlugin();
401 for (VariableList::Enumerator v_iter(
m_variables); ++v_iter;) {
416 for (VariableList::Enumerator v_iter(
m_variables); ++v_iter;) {
425void ArcanePostProcessingModule::
426_checkExternalPlugin()
430 auto& plugin_option =
options()->experimentalPythonPlugin;
431 if (!plugin_option.isPresent())
434 String function = plugin_option.functionName();
435 info() <<
"Executing Python function '" << function <<
"'";
436 if (!m_is_plugin_initialized){
437 info() <<
"Initializing Python environment";
439 m_is_plugin_initialized =
true;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions mathématiques diverses.
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.
void _markCurrentIterationPostProcessing()
Marque les variables comme étant post-processées lors de cette itération.
VariableList m_variables
Liste des variables a exporter.
bool m_is_output_at_current_iteration
Indique si on réalise des sorties lors de cette itération.
void _resetCurrentIterationPostProcessing()
Supprime les tags des variables post-processées lors de cette itération.
void exportData() override
Vérifie et écrit les valeurs pour le dépouillement.
void postProcessingExit() override
Informations de dépouillement en sortie de la boucle de calcul.
ItemGroupList m_groups
Liste des groupes à exporter.
void exportDataStart() override
Point d'entrée en début d'itération.
VersionInfo versionInfo() const override
Version du module.
Directory m_output_directory
Répertoire de sortie.
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.
bool createDirectory() const override
Créé le répertoire.
String path() const override
Retourne le chemin du répertoire.
Interface du service de chargement de services externes.
virtual void executeContextFunction(const String &function_name)=0
Exécute la fonction function_name avec un contexte.
virtual void loadFile(const String &filename)=0
Charge et exécute un fichier contenant un script externe.
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.
Interface du gestionnaire d'un sous-domaine.
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
Genre des entités du maillage sur lequel repose la variable.
static const char * TAG_POST_PROCESSING
Tag utilisé pour indiquer si une variable sera post-traitée.
virtual void removeTag(const String &tagname)=0
Supprime le tag tagname.
static const char * TAG_POST_PROCESSING_AT_THIS_ITERATION
Tag utilisé pour indiquer si une variable sera post-traitée à cette itération.
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.
bool check(Real old_time, Real current_time, Integer current_iteration, Integer current_cpu_time, const String &from_function=String())
Vérifie s'il faut effectuer une sortie.
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.
std::int32_t Int32
Type entier signé sur 32 bits.