Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ITimeLoopMng.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ITimeLoopMng.h (C) 2000-2021 */
9/* */
10/* Interface du gestionnaire de la boucle en temps. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITIMELOOPMNG_H
13#define ARCANE_ITIMELOOPMNG_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/ArcaneTypes.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28enum class eTimeLoopEventType
29{
30 BeginEntryPoint,
31 EndEntryPoint,
32 BeginIteration,
33 EndIteration
34};
35/*!
36 * \brief Raison pour laquelle on arrête le code.
37 */
39{
40 //! Indique qu'on n'est pas encore en mode d'arrête du code.
41 NoStop =0,
42 //! Pas de raison spécifique
43 NoReason =1,
44 //! Arrêt sur une erreur
45 Error =2,
46 //! Arrêt car temps final atteint
48 //! Arrêt car nombre d'itération maximal spécifié atteint.
50};
51class IBackwardMng;
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55/*!
56 * \brief Interface du gestionnaire de la boucle en temps.
57 *
58 La boucle en temps est composée de trois parties, exécutées dans l'ordre
59 suivant:
60 \arg l'initialisation (Init)
61 \arg la boucle de calcul (ComputeLoop)
62 \arg la terminaison (Exit)
63
64 L'initialisation et la terminaison ne sont appelés qu'une seule fois.
65 Par contre, la boucle de calcul est exécutée tant que personne ne demande
66 l'arrêt explicite par la méthode stopComputeLoop()
67 */
69{
70 public:
71
72 virtual ~ITimeLoopMng() {} //!< Libère les ressources.
73
74 public:
75
76 virtual void build() =0;
77
78 //virtual void initialize() =0;
79
80 public:
81
82 //!< Retourne le gestionnaire du sous-domaine
83 virtual ISubDomain* subDomain() const =0;
84
85 //! Exécute les points d'entrée de terminaison
86 virtual void execExitEntryPoints() =0;
87
88 //! Exécute les points d'entrée de construction
89 virtual void execBuildEntryPoints() =0;
90
91 /*! \brief Exécute les points d'entrée d'initialisation.
92 * \param is_continue est vrai si on est en reprise */
93 virtual void execInitEntryPoints(bool is_continue) =0;
94
95 //! Exécute les points d'entrée après rééquilibrage
96 //virtual void execLoadBalanceEntryPoints() =0;
97
98 //! Exécute les points d'entrée après rééquilibrage
100
101 //! Exécute les points d'entrée après raffinement
103
104 /*!
105 * \brief Indique que la boucle de calcul doit s'interrompre.
106 *
107 * Si \a is_final_time est vrai, cela indique que le temps final est atteint.
108 * Si \a has_error est vrai, cela indique que le calcul est arrété suite à une
109 * erreur. Dans ce cas, le code de retour de l'application sera différent de 0.
110 */
111 virtual void stopComputeLoop(bool is_final_time,bool has_error=false) =0;
112
113 //! Retourne \a true si le temps final est atteint.
114 virtual bool finalTimeReached() const =0;
115
116 //! Retourne le temps CPU utilisé en secondes.
117 virtual Real cpuTimeUsed() const =0;
118
119 //! Retourne la liste des points d'entrée de type 'ComputeLoop' de la boucle en temps.
121
122 //! Liste de tous les points d'entrée pour la boucle en temps actuelle.
124
125 /*!
126 * Exécute le point d'entrée suivant.
127 *
128 * Retourne dans \a is_last \e true si le point d'entrée qui vient d'être
129 * exécuté est le dernier de l'itération.
130 */
131 virtual void doExecNextEntryPoint(bool& is_last) =0;
132
133 //! Retourne le prochain point d'entrée à exécuter ou 0 s'il n'y en a pas
135
136 //! Retourne le point d'entrée en cours d'exécution ou 0 s'il n'y en a pas
138
139 /*!
140 * \brief Lance l'exécution d'une itération de la boucle de calcul.
141 *
142 * \retval 0 si le code doit continuer.
143 * \retval >0 si le calcul s'arrête normalement.
144 * \retval <0 si le calcul s'arrête suite à une erreur.
145 */
146 virtual int doOneIteration() =0;
147
148 /*!
149 * \brief Exécute la boucle de calcul.
150 *
151 * La boucle de calcul est exécutée jusqu'à l'appel à la méthode
152 * stopComputeLoop() ou que le nombre de boucles effectuées est égal
153 * à \a max_loop si \a max_loop est différent de 0.
154 * \retval 1 si le code s'arrête normalement suite au temps final atteint
155 * \retval 2 si le code s'arrête normalement suite à \a max_loop atteint
156 * \retval <0 si le calcul s'arrête suite à une erreur.
157 */
158 virtual int doComputeLoop(Integer max_loop=0) =0;
159
160 //@{
161 //! Enregistrement et choix de la boucle en temps.
162 /*!
163 * \brief Enregistre une boucle en temps.
164 * Enregistre la boucle en temps \a time_loop.
165 *
166 * Si une boucle en temps de même nom que \a time_loop est déjà référencée,
167 * la nouvelle remplace l'ancienne.
168 */
169 virtual void registerTimeLoop(ITimeLoop* time_loop) =0;
170
171 /*! \brief Positionne la boucle en temps à exécuter.
172 * Sélectionne la boucle en temps de nom \a name comme celle qui sera
173 * exécutée. Cette méthode effectue les opérations suivantes:
174 * <ul>
175 * <li>à partir du nom \a name, recherche la boucle en temps à utiliser.
176 * Cette boucle en temps doit avoir été référencée par l'appel à
177 * registerTimeLoop()</li>
178 * <li>pour chaque nom de point d'entrée de la boucle en temps,
179 * recherche le point d'entrée (IEntryPoint) correspondant enregistré dans
180 * l'architecture</li>
181 * <li>contruit la liste des points d'entrée à appeler lors de
182 * l'initialisation, dans la boucle de calcul et lors de la terminaison
183 * en prenant en compte les points d'entrée qui sont chargés automatiquement.</li>
184 * <li>détermine la liste des modules utilisés en considérant qu'un module
185 * est utilisé si et seulement si l'un de ses points d'entrée est utilisé</li>
186 * </ul>
187 *
188 * L'opération est un échec et provoque une erreur fatal dans l'un
189 * des cas suivants:
190 * \arg cette méthode a déjà été appelée,
191 * \arg aucune boucle en temps de nom \a name n'est enregistrée,
192 * \arg un des noms des points d'entrée de la liste ne correspondant à
193 * aucun point d'entrée référencé.
194 *
195 * Si \a name est nulle, la boucle en temps utilisée est la boucle par
196 * défaut qui ne contient aucune point d'entrée explicite. Elle contient
197 * uniquement les points d'entrée automatiquement enregistrés.
198 *
199 * \retval true en cas d'erreur,
200 * \retval false sinon.
201 */
202 virtual void setUsedTimeLoop(const String& name) =0;
203 //@}
204
205 //! Retourne la boucle en temps utilisée
206 virtual ITimeLoop* usedTimeLoop() const =0;
207
208 virtual void setBackwardMng(IBackwardMng* backward_mng) = 0;
209
210 virtual IBackwardMng * getBackwardMng() const = 0;
211
212 /*!
213 * \brief Effectue un retour arrière.
214 *
215 * Cette méthode positionne juste un marqueur. Le retour arrière a
216 * effectivement lieu lorsque le point d'entrée actuellement en cours
217 * d'exécution se termine.
218 *
219 * Après retour-arrière, les points d'entrée de retour-arrière sont
220 * appelés.
221 *
222 * \warning Lors d'une exécution parallèle, cette méthode doit être
223 * appelée par tous les sous-domaines.
224 */
225 virtual void goBackward() =0;
226
227 /*! \brief Vrai si on est actuellement dans un retour-arrière.
228 *
229 * Un retour arrière est actif tant que le temps physique est inférieur
230 * au temps physique atteint avant le déclechement du retout-arrière.
231 */
232 virtual bool isDoingBackward() =0;
233
234 /*!
235 * \brief Programme un repartitionnement du maillage avec l'outil
236 * de partition \a mesh_partitioner.
237 *
238 * Cette méthode positionne juste un marqueur. Le repartitionnement a
239 * effectivement lieu lorsque le dernier point d'entrée de la boucle
240 * de calcul est terminé (fin d'une itération).
241 *
242 * Après partitionnement, les points d'entrée de changement de maillage sont
243 * appelés.
244 *
245 * \warning Lors d'une exécution parallèle, cette méthode doit être
246 * appelée par tous les sous-domaines.
247 */
248 virtual void registerActionMeshPartition(IMeshPartitionerBase* mesh_partitioner) =0;
249
250 /*!
251 * \brief Positionne la période entre deux sauvegarde pour le retour arrière.
252 * Si cette valeur est nulle, le retour arrière est désactivé.
253 */
254 virtual void setBackwardSavePeriod(Integer n) =0;
255
256 /*!
257 * \brief Positionne l'état du mode de vérification
258 */
259 virtual void setVerificationActive(bool is_active) =0;
260
261 /*!
262 * \brief Effectue une vérification.
263 *
264 * Cette opération est collective.
265 *
266 * Cette opération permet d'effectuer manuellement une opération de
267 * vérification, dont le nom est \a name. Ce nom \a name doit être
268 * unique pour une itération donnée.
269 */
270 virtual void doVerification(const String& name) =0;
271
272 /*!
273 * \brief Retourne dans \a names la liste des noms des boucles en temps.
274 */
275 virtual void timeLoopsName(StringCollection& names) const =0;
276
277 //! Retourne dans \a time_loops la liste des boucles en temps.
278 virtual void timeLoops(TimeLoopCollection& time_loops) const =0;
279
280 //! Crée une boucle en temps de nom \a name.
281 virtual ITimeLoop* createTimeLoop(const String& name) =0;
282
283 //! Nombre de boucles de calcul (ComputeLoop) effectuées.
284 virtual Integer nbLoop() const =0;
285
286 /*!
287 * \brief Observable sur l'instance.
288 *
289 * Le type de l'observable est donné par \a type
290 */
291 virtual IObservable* observable(eTimeLoopEventType type) =0;
292
293 //! Positionne la raison pour laquelle on arrête le code
294 virtual void setStopReason(eTimeLoopStopReason reason) =0;
295
296 /*!
297 * \brief Raison pour laquelle on arrête le code.
298 *
299 * Si la valeur est eTimeLoopStopReason::NoStop, alors le code
300 * n'est pas en arrêt.
301 */
302 virtual eTimeLoopStopReason stopReason() const =0;
303};
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
307
308ARCANE_END_NAMESPACE
309
310/*---------------------------------------------------------------------------*/
311/*---------------------------------------------------------------------------*/
312
313#endif
314
Interface d'un point d'entrée d'un module.
Definition IEntryPoint.h:34
Interface d'un partitionneur de maillage.
Interface d'un observable.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface du gestionnaire de la boucle en temps.
virtual EntryPointCollection loopEntryPoints()=0
Retourne la liste des points d'entrée de type 'ComputeLoop' de la boucle en temps.
virtual Integer nbLoop() const =0
Nombre de boucles de calcul (ComputeLoop) effectuées.
virtual void timeLoopsName(StringCollection &names) const =0
Retourne dans names la liste des noms des boucles en temps.
virtual void timeLoops(TimeLoopCollection &time_loops) const =0
Retourne dans time_loops la liste des boucles en temps.
virtual ITimeLoop * createTimeLoop(const String &name)=0
Crée une boucle en temps de nom name.
virtual int doComputeLoop(Integer max_loop=0)=0
Exécute la boucle de calcul.
virtual void execBuildEntryPoints()=0
Exécute les points d'entrée de construction.
virtual IEntryPoint * currentEntryPoint()=0
Retourne le point d'entrée en cours d'exécution ou 0 s'il n'y en a pas.
virtual EntryPointCollection usedTimeLoopEntryPoints()=0
Liste de tous les points d'entrée pour la boucle en temps actuelle.
virtual void goBackward()=0
Effectue un retour arrière.
virtual eTimeLoopStopReason stopReason() const =0
Raison pour laquelle on arrête le code.
virtual void setVerificationActive(bool is_active)=0
Positionne l'état du mode de vérification.
virtual void doVerification(const String &name)=0
Effectue une vérification.
virtual ITimeLoop * usedTimeLoop() const =0
Retourne la boucle en temps utilisée.
virtual IEntryPoint * nextEntryPoint()=0
Retourne le prochain point d'entrée à exécuter ou 0 s'il n'y en a pas.
virtual void execOnMeshRefinementEntryPoints()=0
Exécute les points d'entrée après raffinement.
virtual bool isDoingBackward()=0
Vrai si on est actuellement dans un retour-arrière.
virtual void execInitEntryPoints(bool is_continue)=0
Exécute les points d'entrée d'initialisation.
virtual void stopComputeLoop(bool is_final_time, bool has_error=false)=0
Indique que la boucle de calcul doit s'interrompre.
virtual void setStopReason(eTimeLoopStopReason reason)=0
Positionne la raison pour laquelle on arrête le code.
virtual void registerTimeLoop(ITimeLoop *time_loop)=0
Enregistrement et choix de la boucle en temps.
virtual void setBackwardSavePeriod(Integer n)=0
Positionne la période entre deux sauvegarde pour le retour arrière. Si cette valeur est nulle,...
virtual Real cpuTimeUsed() const =0
Retourne le temps CPU utilisé en secondes.
virtual IObservable * observable(eTimeLoopEventType type)=0
Observable sur l'instance.
virtual void setUsedTimeLoop(const String &name)=0
Positionne la boucle en temps à exécuter. Sélectionne la boucle en temps de nom name comme celle qui ...
virtual ~ITimeLoopMng()
Libère les ressources.
virtual void registerActionMeshPartition(IMeshPartitionerBase *mesh_partitioner)=0
Programme un repartitionnement du maillage avec l'outil de partition mesh_partitioner.
virtual int doOneIteration()=0
Lance l'exécution d'une itération de la boucle de calcul.
virtual void doExecNextEntryPoint(bool &is_last)=0
virtual void execOnMeshChangedEntryPoints()=0
Exécute les points d'entrée après rééquilibrage.
virtual bool finalTimeReached() const =0
Retourne true si le temps final est atteint.
virtual void execExitEntryPoints()=0
Exécute les points d'entrée de terminaison.
virtual ISubDomain * subDomain() const =0
< Retourne le gestionnaire du sous-domaine
Interface d'une boucle en temps.
Definition ITimeLoop.h:41
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eTimeLoopStopReason
Raison pour laquelle on arrête le code.
@ MaxIterationReached
Arrêt car nombre d'itération maximal spécifié atteint.
@ NoStop
Indique qu'on n'est pas encore en mode d'arrête du code.
@ FinalTimeReached
Arrêt car temps final atteint.
@ NoReason
Pas de raison spécifique.
@ Error
Arrêt sur une erreur.
Collection< ITimeLoop * > TimeLoopCollection
Collection de boucles en temps.
Collection< IEntryPoint * > EntryPointCollection
Collection de points d'entrées.