14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/utils/Iterator.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/Array.h"
19#include "arcane/utils/Enumerator.h"
20#include "arcane/utils/Collection.h"
21#include "arcane/utils/IOnlineDebuggerService.h"
23#include "arcane/ModuleMaster.h"
24#include "arcane/EntryPoint.h"
25#include "arcane/CaseOptionsMain.h"
26#include "arcane/ITimeHistoryMng.h"
27#include "arcane/IVariableMng.h"
28#include "arcane/ISubDomain.h"
29#include "arcane/IApplication.h"
30#include "arcane/IModuleMng.h"
31#include "arcane/ITimeLoopMng.h"
32#include "arcane/IParallelMng.h"
33#include "arcane/ICaseMng.h"
34#include "arcane/IModuleMng.h"
35#include "arcane/ModuleBuildInfo.h"
36#include "arcane/ITimeLoopService.h"
46extern "C++" ARCANE_CORE_EXPORT IModuleMaster*
47arcaneCreateModuleMaster(ISubDomain* sd)
49 ModuleBuildInfo mbi(sd,sd->defaultMeshHandle(),
"ArcaneMasterInternal");
50 ModuleMaster* m =
new ModuleMaster(mbi);
61, m_case_options_main(0)
64, m_old_elapsed_time(0.0)
65, m_is_first_loop(true)
68, m_thm_global_cpu_time(0.0)
69, m_thm_diff_elapsed(0.0)
70, m_thm_global_elapsed_time(0.0)
71, m_thm_global_time(0.0)
72, m_has_thm_dump_at_iteration(false)
93 &ModuleMaster::_masterLoopExit,
97 &ModuleMaster::_masterMeshChanged,
101 &ModuleMaster::_masterRestore,
157 info() <<
"Initialization to restore the functions of the input data: "
160 <<
" iteration=" << opt_iteration;
163 _masterContinueInit();
203 info() <<
"Information on consumption (unit:second): Con(R=...,I=...,C=...)";
204 info() <<
" R -> consumption in real time (clock) since the beginning of the computation";
205 info() <<
" I -> real time (clock) spent during the last iteration";
206 info() <<
" C -> consumption in CPU time since the beginning of the computation";
207 info() <<
"Information on memory consumption (unit: Mo): Mem=(X,m=X1:R1,M=X2:R2,avg=Z)";
208 info() <<
" X -> memory consumption of the process";
209 info() <<
" X1 -> memory consumption of the least memory hungry process and R1 is its rank";
210 info() <<
" X2 -> memory consumption of the most memory hungry process and R2 is its rank";
211 info() <<
" Z -> average memory consumption of all process";
220 Real mem_used = platform::getMemoryUsed();
227 m_thm_mem_used = mem_used;
240 Real cpu_time = (Real)platform::getCPUTime();
241 Real elapsed_time = platform::getRealTime();
245 values[0] = cpu_time;
246 values[1] = elapsed_time;
247 values[2] = (hyoda)?hyoda->loopbreak(
subDomain()):0.0;
249 cpu_time = values[0];
250 elapsed_time = values[1];
251 if (hyoda && values[2]>0.0)
265 m_thm_diff_cpu = diff_cpu;
267 m_thm_diff_elapsed = diff_elapsed;
278 Int32 mem_min_rank = 0;
279 Int32 mem_max_rank = 0;
280 pm->
computeMinMaxSum(mem_used,mem_min,mem_max,mem_sum,mem_min_rank,mem_max_rank);
283 Int64 i_diff_elapsed = (Int64)(diff_elapsed * 1000.0);
285 info(1) <<
"Date: " << platform::getCurrentDateTime()
286 <<
" Conso=(R=" << (((Real)i_elapsed) / 1000.0)
287 <<
",I=" << (((Real)i_diff_elapsed) / 1000.0)
288 <<
",C=" << ((Real)i_cpu / 1000.0)
289 <<
") Mem=(" << (Int64)(mem_used/1e6)
290 <<
",m=" << (Int64)(mem_min/1e6)
291 <<
":" << mem_min_rank
292 <<
",M=" << (Int64)(mem_max/1e6)
293 <<
":" << mem_max_rank
294 <<
",avg=" << (Int64)(mem_sum/1e6) / pm->
commSize()
299 m_has_thm_dump_at_iteration =
false;
322 if (
subDomain()->timeLoopMng()->finalTimeReached()){
323 info() <<
"===============================================================";
324 info() <<
"====== END OF COMPUTATION REACHED... =======================";
325 info() <<
"===============================================================";
335 if (m_has_thm_dump_at_iteration)
347 Real cpu_time = (Real)platform::getCPUTime();
348 Real elapsed_time = platform::getRealTime();
351 Real mem_used = platform::getMemoryUsed();
356 thm->
addValue(
"TotalMemory",mem_used);
358 thm->
addValue(
"GlobalCpuTime",global_cpu_time);
359 thm->
addValue(
"ElapsedTime",diff_elapsed);
360 thm->
addValue(
"GlobalElapsedTime",global_elapsed_time);
362 m_has_thm_dump_at_iteration =
true;
364 Int64 i_elapsed = (Int64)(global_elapsed_time * 1000.0);
365 Int64 i_diff_elapsed = (Int64)(diff_elapsed * 1000.0);
366 Int64 i_cpu = (Int64)(global_cpu_time * 1000.0);
368 info(4) <<
"EndIter: Date: " << platform::getCurrentDateTime()
369 <<
" Conso=(R=" << (((Real)i_elapsed) / 1000.0)
370 <<
",I=" << (((Real)i_diff_elapsed) / 1000.0)
371 <<
",C=" << ((Real)i_cpu / 1000.0)
372 <<
") Mem=(" << (Int64)(mem_used/1e6)
396 service->onTimeLoopBeginLoop();
408 service->onTimeLoopEndLoop();
420 service->onTimeLoopStartInit();
432 service->onTimeLoopContinueInit();
444 service->onTimeLoopExit();
456 service->onTimeLoopMeshChanged();
468 service->onTimeLoopRestore();
Classe représentant un module.
ISubDomain * subDomain() const override
Sous-domaine associé au module.
IParallelMng * parallelMng() const override
Gestionnaire du parallélisme par échange de message.
Variables communes d'un cas.
VariableScalarInt32 m_global_iteration
Itération courante.
VariableScalarReal m_global_elapsed_time
Temps horloge utilisé (en seconde)
VariableScalarReal m_global_cpu_time
Temps CPU utilisé (en seconde)
VariableScalarReal m_global_old_deltat
Delta T au temps précédent le temps global.
VariableScalarReal m_global_old_elapsed_time
Temps précédent horloge utilisé (en seconde)
VariableScalarReal m_global_time
Temps actuel.
VariableScalarReal m_global_old_cpu_time
Temps précédent CPU utilisé (en seconde)
VariableScalarReal m_global_old_time
Temps précédent le temps actuel.
VariableScalarReal m_global_deltat
Delta T global.
Informations sur le type flottant.
Interface du gestionnaire de cas.
virtual void updateOptions(Real current_time, Real current_deltat, Integer current_iteration)=0
Met à jour les options basée sur une table de marche en temps.
@ PAutoLoadEnd
Chargé automatiquement à la fin. Cela signifie qu'un module possédant un point d'entrée avec cette pr...
@ PAutoLoadBegin
Chargé automatiquement au début. Cela signifie qu'un module possédant un point d'entrée avec cette pr...
static const char *const WComputeLoop
appelé pendant la boucle de calcul
static const char *const WStartInit
appelé pendant l'initialisation d'un nouveau cas
static const char *const WRestore
appelé pour restaurer les variables lors d'un retour arrière
static const char *const WOnMeshChanged
appelé après un changement de maillage
static const char *const WContinueInit
appelé pendant l'initialisation d'une reprise
static const char *const WInit
appelé pendant l'initialisation
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void computeMinMaxSum(char val, char &min_val, char &max_val, char &sum_val, Int32 &min_rank, Int32 &max_rank)=0
Calcule en une opération la somme, le min, le max d'une valeur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
virtual ITimeHistoryMng * timeHistoryMng()=0
Retourne le gestionnaire d'historique.
virtual ICaseMng * caseMng()=0
Retourne le gestionnaire du jeu de données.
virtual IParallelMng * allReplicaParallelMng() const =0
Retourne le gestionnaire de parallélisme pour tous les réplicats.
Classe gérant un historique de valeurs.
virtual void addValue(const String &name, Real value, bool end_time=true, bool is_local=false)=0
Ajoute la valeur value à l'historique name.
Interface d'un service opérant lors de la boucle en temps.
Informations pour construire un module.
ISubDomain * subDomain() const
Accès au sous-domaine associé
void masterInit()
Point d'entrée auto-chargé en début d'initialisation.
virtual ~ModuleMaster()
Destructeur.
void masterStartInit()
Point d'entrée auto-chargé en début d'initialisation d'un nouveau cas.
CaseOptionsMain * m_case_options_main
Instance des options du module.
bool m_is_first_loop
Indique si on est dans la première itération de l'exécution.
Real m_old_cpu_time
Valeur du temps CPU à la derniere itération.
Real m_old_elapsed_time
Valeur du temps horloge à la derniere itération.
virtual void timeStepInformation()
Affichage surchargeable des informations du pas de temps.
void timeLoopEnd()
Point d'entrée auto-chargé en fin d'itération de la boucle de calcul.
void timeLoopBegin()
Point d'entrée auto-chargé en début d'itération de la boucle de calcul.
virtual void addTimeLoopService(ITimeLoopService *tls)
Ajoute le service de boucle en temps.
virtual void dumpStandardCurves()
Sort les courbes classiques (CPUTime, ElapsedTime, ...)
UniqueArray< ITimeLoopService * > m_timeloop_services
Liste des serviecs de boucle en temps.
virtual void timeIncrementation()
Incrémentation du pas de temps surchargeable.
Integer m_nb_loop
Nombre de boucles de calcul effectuées.
void masterContinueInit()
Point d'entrée auto-chargé en début de reprise d'un nouveau cas.
String name() const
Nom de la variable.
Vue modifiable d'un tableau d'un type T.
TraceMessage info() const
Flot pour un message d'information.
Formattage des réels avec une précision donnée.
Formattage du flot en longueur.
void addEntryPoint(ModuleType *module, const char *name, void(ModuleType::*func)(), const String &where=IEntryPoint::WComputeLoop, int property=IEntryPoint::PNone)
Routine template permettant de référencer un point d'entrée dans un module.