14#include "arcane/utils/Iterator.h"
15#include "arcane/utils/List.h"
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/StringBuilder.h"
19#include "arcane/utils/IMemoryInfo.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/IProfilingService.h"
22#include "arcane/utils/IMessagePassingProfilingService.h"
23#include "arcane/utils/ValueConvert.h"
24#include "arcane/utils/TimeoutException.h"
25#include "arcane/utils/GoBackwardException.h"
26#include "arcane/utils/OStringStream.h"
27#include "arcane/utils/FloatingPointExceptionSentry.h"
28#include "arcane/utils/JSONWriter.h"
30#include "arcane/core/IApplication.h"
31#include "arcane/core/IServiceLoader.h"
32#include "arcane/core/ISubDomain.h"
33#include "arcane/core/CommonVariables.h"
34#include "arcane/core/IVariableMng.h"
35#include "arcane/core/IEntryPoint.h"
36#include "arcane/core/IEntryPointMng.h"
37#include "arcane/core/IMesh.h"
38#include "arcane/core/IMeshSubMeshTransition.h"
39#include "arcane/core/IModule.h"
40#include "arcane/core/Directory.h"
41#include "arcane/core/IModuleMng.h"
42#include "arcane/core/Timer.h"
43#include "arcane/core/ITimeLoop.h"
44#include "arcane/core/ITimeLoopMng.h"
45#include "arcane/core/TimeLoopEntryPointInfo.h"
46#include "arcane/core/TimeLoopSingletonServiceInfo.h"
47#include "arcane/core/IParallelMng.h"
48#include "arcane/core/IMainFactory.h"
49#include "arcane/core/ICaseMng.h"
50#include "arcane/core/ICaseFunction.h"
51#include "arcane/core/IServiceFactory.h"
52#include "arcane/core/IModuleFactory.h"
53#include "arcane/core/ServiceBuilder.h"
54#include "arcane/core/ServiceInfo.h"
55#include "arcane/core/ServiceUtils.h"
56#include "arcane/core/CaseOptions.h"
57#include "arcane/core/ICaseDocument.h"
58#include "arcane/core/IVerifierService.h"
59#include "arcane/core/IMeshPartitioner.h"
60#include "arcane/core/IVariableFilter.h"
61#include "arcane/core/ITimeStats.h"
62#include "arcane/core/XmlNodeIterator.h"
63#include "arcane/core/ServiceFinder2.h"
64#include "arcane/core/VariableCollection.h"
65#include "arcane/core/Observable.h"
66#include "arcane/core/IParallelReplication.h"
67#include "arcane/core/IItemFamily.h"
68#include "arcane/core/IConfiguration.h"
69#include "arcane/core/IMeshUtilities.h"
70#include "arcane/core/IVariableUtilities.h"
71#include "arcane/core/IItemEnumeratorTracer.h"
72#include "arcane/core/ObservablePool.h"
73#include "arcane/core/parallel/IStat.h"
74#include "arcane/core/IVariableSynchronizer.h"
75#include "arcane/core/IVariableSynchronizerMng.h"
77#include "arcane/accelerator/core/IAcceleratorMng.h"
78#include "arcane/accelerator/core/Runner.h"
80#include "arcane/impl/DefaultBackwardMng.h"
134 void build()
override;
169 _createOwnDefaultBackwardMng();
183 Integer
nbLoop()
const override {
return m_nb_loop; }
190 void execRestoreEntryPoints();
198 return m_observables[type];
269 bool m_stop_time_loop;
270 bool m_stop_has_error;
271 bool m_final_time_reached;
276 bool m_verif_same_parallel;
278 bool m_verification_active;
281 bool m_verification_only_at_exit =
false;
284 bool m_my_own_backward_mng;
293 String m_message_class_name;
294 Integer m_alarm_timer_value;
311 void _resetTimer()
const;
314 void _createOwnDefaultBackwardMng();
318 void _callSpecificEntryPoint();
335TimeLoopMng(ISubDomain* sd)
336: TraceAccessor(sd->traceMng())
338, m_entry_point_mng(m_sub_domain->entryPointMng())
339, m_default_time_loop(nullptr)
340, m_used_time_loop(nullptr)
341, m_current_entry_point_ptr(nullptr)
342, m_stop_time_loop(false)
343, m_stop_has_error(false)
344, m_final_time_reached(false)
345, m_current_entry_point(0)
346, m_verif_type(VerifNone)
347, m_verif_same_parallel(false)
349, m_verification_active(false)
350, m_verification_at_entry_point(false)
351, m_backward_mng(nullptr)
352, m_my_own_backward_mng(false)
353, m_message_class_name(
"TimeLoopMng")
354, m_alarm_timer_value(0)
359 String s = platform::getEnvironmentVariable(
"ARCANE_LISTENER_TIMEOUT");
362 if (!builtInGetValue(v,s))
364 m_alarm_timer_value = v;
368 String s = platform::getEnvironmentVariable(
"ARCANE_VERIF_PARALLEL");
370 m_verif_same_parallel =
true;
373 m_observables.add(eTimeLoopEventType::BeginEntryPoint);
374 m_observables.add(eTimeLoopEventType::EndEntryPoint);
375 m_observables.add(eTimeLoopEventType::BeginIteration);
376 m_observables.add(eTimeLoopEventType::EndIteration);
386 ITimeLoop * tm = i->second;
390 if (m_my_own_backward_mng)
406 String verif_env = platform::getEnvironmentVariable(
"STDENV_VERIF");
407 if (verif_env==
"READ"){
409 info() <<
"Checking in read mode";
411 if (verif_env==
"WRITE"){
413 info() <<
"Checking in write mode";
415 if (verif_env==
"CHECKSYNC"){
417 info() <<
"Checking synchronizations";
419 if (verif_env==
"CHECKREPLICA"){
421 info() <<
"Checking variables values between replica";
424 m_verification_active =
true;
427 String s = platform::getEnvironmentVariable(
"STDENV_VERIF_ENTRYPOINT");
430 info() <<
"Do verification at each entry point";
434 String s = platform::getEnvironmentVariable(
"STDENV_VERIF_ONLY_AT_EXIT");
435 if (s==
"1" || s==
"true" || s==
"TRUE"){
436 m_verification_only_at_exit =
true;
437 info() <<
"Do verification only at exit";
443 String s = platform::getEnvironmentVariable(
"ARCANE_CALL_SPECIFIC_ENTRY_POINT");
446 info() <<
"Use specific entry point: " << s;
451 if (m_verification_active){
452 m_verif_path = platform::getEnvironmentVariable(
"STDENV_VERIF_PATH");
461 if (
subDomain()->parallelMng()->isMasterIO()){
469 String msg_pass_prof_str = platform::getEnvironmentVariable(
"ARCANE_MESSAGE_PASSING_PROFILING");
470 if (!msg_pass_prof_str.null()) {
474 if (msg_pass_prof_str ==
"JSON") {
475 service_name =
"JsonMessagePassingProfiling";
476 }
else if (msg_pass_prof_str ==
"OTF2") {
477 service_name =
"Otf2MessagePassingProfiling";
479 ServiceBuilder<IMessagePassingProfilingService> srv(this->
subDomain());
480 m_msg_pass_prof_srv = srv.createReference(service_name ,
SB_AllowNull);
489_createOwnDefaultBackwardMng()
493 m_my_own_backward_mng =
true;
500setBackwardMng(IBackwardMng* backward_mng)
502 ARCANE_ASSERT((backward_mng),(
"IBackwardMng pointer null"));
506 if (m_my_own_backward_mng)
512 m_my_own_backward_mng =
false;
522 info() <<
"-- Executing init entry points";
529 _execOneEntryPoint(
ic);
540 info() <<
"-- Executing build entry points";
545 _execOneEntryPoint(
ic);
553execRestoreEntryPoints()
556 info() <<
"-- Executing restore entry points";
560 _execOneEntryPoint(
ic);
571 info() <<
"-- Executing entry points after mesh change";
575 info() <<
"Execute: " <<
ic->name();
576 _execOneEntryPoint(
ic);
587 info() <<
"-- Executing entry points after mesh refinement";
591 info() <<
"Execute: " <<
ic->name();
592 _execOneEntryPoint(
ic);
603 info() <<
"-- Executing terminal entry points";
607 _execOneEntryPoint(
ic);
621 if (m_msg_pass_prof_srv.get() && m_msg_pass_prof_srv->implName() ==
"JsonMessagePassingProfiling") {
625 std::ofstream file(
fullname.localstr());
626 m_msg_pass_prof_srv->printInfos(file);
637 m_observables[eTimeLoopEventType::BeginEntryPoint]->notifyAllObservers();
638 ic->executeEntryPoint();
639 m_observables[eTimeLoopEventType::EndEntryPoint]->notifyAllObservers();
651 _checkVerif(name,0,
true);
674 warning() <<
"No verification service is available."
675 <<
" No verification will be performed";
679 info() <<
"Use the service <" << service_name1
680 <<
"> for verification";
687 VariableCollection variables(
subDomain()->variableMng()->usedVariables());
688 for( VariableCollection::Enumerator i(variables); ++i; ){
692 if (var->isPartial())
694 nb_error += var->checkIfSync(5);
697 info() <<
"Error in synchronization nb_error=" << nb_error
698 <<
" entry_point=" << entry_point_name;
703 _checkVerifSameOnAllReplica(entry_point_name);
708 if (current_iter>=0){
710 StringBuilder path = Directory(
m_verif_path).file(
"verif_file");
711 if (m_verif_same_parallel){
716 StringBuilder sub_dir;
718 sub_dir += current_iter;
720 sub_dir += entry_point_name;
727 if (m_verif_same_parallel)
728 parallel_sequential =
false;
734 ServiceFinder2T<IVerifierService,ISubDomain> sf(app,sd);
735 ScopedPtrT<IVerifierService> current_save(sf.find(service_name1));
736 if (current_save.get()){
739 current_save->writeReferenceFile();
747 FloatingPointExceptionSentry fpes(
false);
749 platform::getEnvironmentVariable(
"STDENV_VERIF_SKIP_GHOSTS").null());
762_checkVerifSameOnAllReplica(
const String& entry_point_name)
764 info() <<
"CHECK: comparing variables values on all replica"
765 <<
" entry_point_name=" << entry_point_name;
767 IParallelMng* replica_pm = sd->parallelMng()->replication()->replicaParallelMng();
768 IVariableMng* vm = sd->variableMng();
769 VariableCollection variables(vm->usedVariables());
770 VariableList vars_to_check;
771 for( VariableCollection::Enumerator i(variables); ++i; ){
775 if (var->isPartial())
781 vars_to_check.add(var);
783 VariableCollection common_vars = vm->utilities()->filterCommonVariables(replica_pm,vars_to_check,
true);
787 FloatingPointExceptionSentry fpes(
false);
788 for( VariableCollection::Enumerator ivar(common_vars); ++ivar; ){
789 IVariable* var = *ivar;
790 nb_error += var->checkIfSameOnAllReplica(10);
795 info() <<
"Errors in comparing values between replica nb_error=" << nb_error
796 <<
" entry_point=" << entry_point_name;
860 global_iteration = 1;
866 if (m_stop_time_loop){
867 if (m_stop_has_error)
877 execRestoreEntryPoints();
880 m_mesh_partitioner.clear();
885 if (!m_mesh_partitioner.empty()) {
897 Real global_time =
sd->commonVariables().globalTime();
910 info() <<
"The module " <<
mod->name() <<
" is desactivated";
912 info() <<
"The module " <<
mod->name() <<
" is activated";
919 m_observables[eTimeLoopEventType::BeginIteration]->notifyAllObservers();
924 sd->timeStats()->notifyNewIterationLoop();
929 if (
mod &&
mod->disabled()){
934 _execOneEntryPoint(*i, index,
true);
945 _checkVerif(
"_EndLoop",0,
true);
947 m_observables[eTimeLoopEventType::EndIteration]->notifyAllObservers();
952 if (!m_verif_same_parallel)
961 info() <<
"TimeLoopMng::doOneIteration(): Force prepareDump()";
963 sd->defaultMesh()->prepareForDump();
967 if (m_stop_time_loop){
968 if (m_stop_has_error)
993 IMesh* mesh = mesh_partitioner->primaryMesh();
997 mesh->
utilities()->partitionAndExchangeMeshWithReplication(mesh_partitioner,
false);
999 info() <<
"Time spent to repartition the mesh (unit: second): "
1000 <<
timer.lastActivationTime();
1016 plog() <<
"MeshPartitionCommunicatingInfos:" <<
json_writer.getBuffer();
1026 m_mesh_partitioner.clear();
1029 sd->timeStats()->dumpCurrentStats(
"MeshesLoadBalance");
1036_callSpecificEntryPoint()
1042 ep->executeEntryPoint();
1056 log() <<
"Registering the time loop " << name;
1060 ARCANE_FATAL(
"The time loop '{0}' is defined twice",name);
1084 info() <<
"Available time loops: ";
1086 info() <<
"Time loop <" <<
tl.second->name() <<
">";
1091 logdate() <<
"Using time loop " << name;
1106 for(
const auto&
it : m_module_state_list ){
1115 info() <<
"The entry points of the module \""
1116 <<
module_state.m_alias <<
"\" won't be executed (inactive module).";
1193 if (
ti.isRequired())
1194 ARCANE_FATAL(
"Unable to find a singleton service named '{0}'",name);
1195 info() <<
"The optional singleton service named '" << name <<
"' was not found";
1197 info() <<
"Loading singleton service '" << name <<
"'";
1202 ICaseDocument* doc = cm->caseDocument();
1204 XmlNode services_element = doc->servicesElement();
1205 String ustr_name(
"name");
1206 String ustr_active(
"active");
1207 XmlNodeList services = services_element.children(
"service");
1208 for( XmlNode x : services ) {
1209 String name = x.attrValue(ustr_name);
1210 XmlNode active_node = x.attr(ustr_active);
1211 bool is_active =
true;
1212 if (!active_node.null())
1213 is_active = active_node.valueAsBoolean(
true);
1237 if (
it == m_module_state_list.end())
1258 <<
"\" can't be in the entry point list \""
1259 << where <<
"\" of the time loop";
1289 m_module_state_list.insert(ModuleStateMap::value_type(
module_name,
ms));
1296 m_module_state_list.insert(ModuleStateMap::value_type(
module_name,
ms));
1333 name =
ilang->second->moduleName();
1335 auto it = m_module_state_list.find(name);
1336 if (
it == m_module_state_list.end())
1339 ARCANE_FATAL(
"Error in configuring active modules: no module named '{0}' is registered.",
1343 ms.m_is_active = active;
1347 if (!
ms.m_is_optional && !
ms.m_is_active) {
1349 <<
"\" can't be declared mandatory in the time loop"
1350 <<
" while being inactive in the input data."
1351 <<
" It's activity is therefore forced. ";
1352 ms.m_is_active =
true;
1367 if (index==std::string::npos){
1368 ARCANE_FATAL(
"The string '{0}' is not a valid reference to an entry point (has to be of type "
1426 Ref<IModule> module = mfi->createModule(m_sub_domain,m_sub_domain->defaultMeshHandle());
1428 info() <<
"Loading module " <<
module->name()
1429 << " (Version " << module->versionInfo() << ")";
1444 log() <<
"Adding the entry point `" <<
entry_point->module()->name() <<
"::" <<
entry_point->name() <<
"' to the execution";
1453 else if (where==IEntryPoint::WExit){
1476 debug() <<
"Adding the module `" <<
c->name() <<
"' to the execution";
1501 Real
s2 =
ep->totalElapsedTime();
1510 info(5) <<
"CPU_TIME where=" << ep->
where() <<
" name=" << ep->
name() <<
" S=" << s2;
1511 total_real_time += s2;
1513 compute_real_time += s2;
1516 json_writer.endArray();
1517 info(4) <<
"TOTAL_REAL_TIME COMPUTE=" << compute_real_time <<
" TOTAL=" << total_real_time;
1522 info() <<
"Information on the execution time";
1525 if (acc_mng->isInitialized()){
1526 Accelerator::Runner* runner = acc_mng->defaultRunner();
1527 info() <<
" TotalRunner (" << runner->executionPolicy() <<
") = "
1528 << runner->cumulativeCommandTime() <<
" seconds";
1531 info() <<
" TotalElapsed = " << total_exec_time <<
" seconds";
1532 info() <<
" CumulativeElapsed = " << scv.globalElapsedTime()
1533 <<
" seconds (" << platform::timeToHourMinuteSecond(scv.globalElapsedTime()) <<
")";
1534 info() <<
" T = Total time spent in the function or in the module (s)";
1535 info() <<
" TC = Total time spend per call (ms)";
1536 info() <<
" TCC = Total time spent per call and per cell (ns)";
1537 info() <<
" N = Number of time the function was called";
1539 info() <<
" Use the clock time (elapsed) for the statistics";
1541 std::ostringstream o;
1542 std::ios_base::fmtflags f = o.flags(std::ios::right);
1546 nb_cell = mesh->nbCell();
1550 o <<
"\n Name T TC TCC % N\n";
1553 IModule *
module = * j;
1554 Real total_time_module = 0.;
1555 Real total_time_module_entry_point = 0.;
1557 IEntryPoint * ic = * i;
1558 if (ic->module()!=module)
1560 Integer nb_call = ic->nbCall();
1563 Real total_time = ic->totalElapsedTime();
1566 const String& ep_name = ic->name();
1568 Int64 l = ep_name.length();
1570 o.write(ep_name.localstr(), 34);
1581 Real r = (1e3 * total_time) / nb_call;
1583 total_time_module += r;
1584 total_time_module_entry_point += total_time;
1589 r = (r * 1e6) / nb_cell;
1594 if (total_exec_time>0)
1606 o <<
module->name();
1614 Real r = (total_time_module * 1e6) / nb_cell;
1627 JSONWriter::Object jo(json_writer,
"MessagePassingStats");
1628 Parallel::IStat* s = pm->
stat();
1630 s->printCollective(pm);
1631 s->dumpJSON(json_writer);
1636 JSONWriter::Object jo(json_writer,
"VariablesStats");
1640 JSONWriter::Object jo(json_writer,
"TimeStats");
1646 JSONWriter::Object jo(json_writer,
"Profiling");
1647 ps->dumpJSON(json_writer);
1651 Item::dumpStats(traceMng());
1663 Real
s1 = (*i)->totalElapsedTime();
1676 _createOwnDefaultBackwardMng();
1690 _createOwnDefaultBackwardMng();
1702 names.add(i->first);
1722 return sm->mainFactory()->createTimeLoop(
sm, name);
1740 m_stop_time_loop =
true;
1743 m_final_time_reached =
true;
1761 _createOwnDefaultBackwardMng();
1764 info() <<
"Repartioning required but inactive due to a backward process active";
1767 m_mesh_partitioner.add(mesh_partitioner);
1782 if (m_alarm_timer_value>0){
1783 info() <<
"Set the timeout before alarm at " << m_alarm_timer_value <<
" seconds";
1788 _createOwnDefaultBackwardMng();
1796 if (!platform::getEnvironmentVariable(
"ARCANE_SPECIFIC_PROFILING").null()){
1797 info() <<
"Specific profiling activated";
1805 String s = platform::getEnvironmentVariable(
"ARCANE_CHECK_MEMORY_BLOCK_SIZE_ITERATION");
1807 Int64 block_size = 0;
1808 bool is_bad = builtInGetValue(block_size,s);
1809 if (!
is_bad && block_size>2){
1810 info() <<
"Set Memory StackTraceMinAllocSize to " << block_size;
1811 mem_info->setStackTraceMinAllocSize(block_size);
1817 if (m_msg_pass_prof_srv.get())
1818 m_msg_pass_prof_srv->startProfiling();
1822 if (!
ps->isInitialized())
1832 _callSpecificEntryPoint();
1837 info()<<
"===================================================";
1838 info()<<
"====== MAXIMUM NUMBER OF ITERATION REACHED =======";
1839 info()<<
"===================================================";
1856 std::ostringstream
ostr;
1863 info() <<
"ITERATION_MemoryInfo: " <<
ostr.str();
1873 if (m_msg_pass_prof_srv.get())
1874 m_msg_pass_prof_srv->stopProfiling();
1877 traceMng()->
flush();
1880 platform::sleep(40);
1883 if (m_verification_only_at_exit){
1884 info() <<
"Doing verification at exit";
1890 ps2->printInfos(
true);
1892 if (m_msg_pass_prof_srv.get())
1893 m_msg_pass_prof_srv->stopProfiling();
1894 if (IItemEnumeratorTracer::singleton())
1895 IItemEnumeratorTracer::singleton()->dumpStats();
1896 info() <<
"End of compute loop: reason=" << (
int)m_stop_reason;
1899 if (m_final_time_reached)
1913 if (m_alarm_timer_value>0)
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
void clear()
Supprime tous les éléments de la collection.
Integer count() const
Nombre d'éléments de la collection.
EnumeratorT< IModule * > Enumerator
Type d'un itérateur sur toute la collection.
Exception pour demander un retour-arrière de la boucle en temps.
Interface de l'application.
Interface gérant les stratégies de retour-arrière.
virtual void init()=0
Initialisation du manager de retour en arrière.
virtual void clear()=0
Supprime les ressources associées au retour-arrière.
virtual bool checkAndApplySave(bool is_forced)=0
Vérifie et applique la sauvegarde des variables si nécessaire. Si is_forced est vrai,...
virtual void endAction()=0
Indique que les actions de sauvegarde/restauration sont terminées.
virtual void goBackward()=0
Signale qu'on souhaite effectué un retour arrière.
virtual bool isLocked() const =0
Indique si les sauvegardes de retour-arrière sont vérouillées.
virtual bool isBackwardEnabled() const =0
Indique si un retour-arrière est programmé.
virtual void beginAction()=0
Indique qu'on commence les actions de sauvegarde/restauration sont terminées.
virtual bool checkAndApplyRestore()=0
Vérifie et applique la restauration si nécessaire.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'une partie d'un jeu de données.
Interface d'une classe gérant un document XML du jeu de données.
Interface d'une fonction du jeu de données.
virtual void value(Real param, Real &v) const =0
Valeur v de l'option pour le paramètre param.
Interface du gestionnaire de cas.
Interface d'une liste d'options du jeu de données.
Interface du gestionnaire de point d'entrée.
virtual IEntryPoint * findEntryPoint(const String &s)=0
Point d'entrée de nom s.
virtual EntryPointCollection entryPoints()=0
Liste des points d'entrées.
Interface d'un point d'entrée d'un module.
static const char *const WComputeLoop
appelé pendant la boucle de calcul
static const char *const WBuild
appelé pour la construction du module
@ 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 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 WOnMeshRefinement
appelé après un raffinement de maillage
static const char *const WOnMeshChanged
appelé après un changement de maillage
static const char *const WContinueInit
appelé pendant l'initialisation d'une reprise
virtual String where() const =0
Retourne l'endroit ou est appelé le point d'entrée.
static const char *const WInit
appelé pendant l'initialisation
virtual String name() const =0
Retourne le nom du point d'entrée.
Interface d'une famille d'entités.
Interface d'un collecteur d'informations sur l'usage mémoire.
virtual String name() const =0
Nom du maillage.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Interface d'un partitionneur de maillage.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
Informations sur la fabrique d'un module.
Interface du gestionnaire de modules.
virtual ModuleCollection modules() const =0
Liste des modules.
Interface d'un observable.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual IParallelReplication * replication() const =0
Informations sur la réplication.
virtual IStat * stat()=0
Gestionnaire des statistiques.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface d'un service de profiling.
Interface des informations d'un service ou d'un module.
Interface de chargement des services.
virtual bool loadSingletonService(ISubDomain *sd, const String &name)=0
Charge le service singleton de sous-domaine de nom name.
Interface du gestionnaire d'un sous-domaine.
virtual IModuleMng * moduleMng()=0
Retourne le gestionnaire de modules.
virtual const CommonVariables & commonVariables() const =0
Informations sur les variables standards.
virtual IMesh * defaultMesh()=0
Maillage par défaut.
virtual ITimeStats * timeStats() const =0
Statistiques des temps d'exécution.
virtual IApplication * application()=0
Application.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
virtual ICaseMng * caseMng()=0
Retourne le gestionnaire du jeu de données.
virtual IAcceleratorMng * acceleratorMng()=0
Gestionnaire de l'accélérateur associé
Interface du gestionnaire de la boucle en temps.
Interface d'une boucle en temps.
static const char * WRestore
appelé pour restaurer les variables lors d'un retour arrière
virtual TimeLoopEntryPointInfoCollection entryPoints(const String &where) const =0
Liste des noms des points d'entrée pour le point d'appel where.
static const char * WOnMeshChanged
appelé après un changement de maillage
static const char * WExit
appelé lors de la terminaison du code.
virtual IConfiguration * configuration()=0
Options de configuration.
virtual TimeLoopSingletonServiceInfoCollection singletonServices() const =0
Liste services singletons.
static const char * WOnMeshRefinement
appelé après un raffinement de maillage
static const char * WBuild
appelé lors de la lecture du jeu de données
static const char * WComputeLoop
appelé pendant la boucle de calcul
static const char * WInit
appelé pendant l'initialisation, l'initialisation d'une reprise ou d'un nouveau cas
virtual String name() const =0
Nom de la boucle en temps.
Interface d'un service de synchronisation de variable.
@ PNoReplicaSync
Indique que la variable n'a pas forcément la même valeur entre les réplicas.
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Flot de sortie lié à une String.
Classe permettant de démarrer et arrêter automatiquement un service.
Infos d'un point d'entrée d'une boucle en temps.
Gestionnaire de la boucle en temps.
bool finalTimeReached() const override
Retourne true si le temps final est atteint.
IObservable * observable(eTimeLoopEventType type) override
Observable sur l'instance.
ModuleFactoryMap m_module_factory_map
Etat de tous les modules référencés.
std::map< String, ITimeLoop * > TimeLoopMap
Liste de boucles en temps.
TimeLoopMap m_time_loop_list
Liste des boucles en temps.
void registerActionMeshPartition(IMeshPartitionerBase *mesh_partitioner) override
Programme un repartitionnement du maillage avec l'outil de partition mesh_partitioner.
EntryPointCollection usedTimeLoopEntryPoints() override
Liste de tous les points d'entrée pour la boucle en temps actuelle.
void _processEntryPoints(EntryPointList &entry_points, const TimeLoopEntryPointInfoCollection &entry_points_info, const char *where)
Ajoute à la liste entry_points les points d'entrée proposés dans entry_points_info.
@ VerifSameReplica
Vérifie que les variables sont synchronisées.
@ VerifWrite
Indique qu'on génère des valeurs pour vérifier.
@ VerifNone
Indique qu'on ne fait pas de vérifications.
@ VerifRead
Indique qu'on relit et vérifie des valeurs.
ITimeLoop * createTimeLoop(const String &name) override
Crée une boucle en temps de nom name.
EntryPointList m_exit_entry_points
Liste des points d'entrée à exécuter à la terminaison.
EntryPointCollection loopEntryPoints() override
Retourne la liste des points d'entrée de type 'ComputeLoop' de la boucle en temps.
ITimeLoop * usedTimeLoop() const override
Retourne la boucle en temps utilisée.
EntryPointList m_on_mesh_changed_entry_points
Liste des points d'entrée à exécuter après un changement de maillage.
std::map< String, ModuleState > ModuleStateMap
Liste des états des modules.
ITimeLoop * m_default_time_loop
Boucle en temps par défaut.
void doVerification(const String &name) override
Effectue une vérification.
void stopComputeLoop(bool is_final_time, bool has_error) override
Indique que la boucle de calcul doit s'interrompre.
void execInitEntryPoints(bool is_continue) override
Exécute les points d'entrée d'initialisation.
IEntryPoint * nextEntryPoint() override
Retourne la fonction suivante à appeler.
bool _createModule(const String &module_name)
Crée un module à partir de son nom.
eTimeLoopStopReason stopReason() const override
Raison pour laquelle on arrête le code.
void doExecNextEntryPoint(bool &is_last) override
void execExitEntryPoints() override
Exécute les points d'entrée de terminaison.
static void _extractModuleAndEntryPointName(const String &timeloop_call_name, String &module_name, String &entry_point_name)
EntryPointList m_build_entry_points
Liste des points d'entrée à exécuter lors de la construction.
EntryPointList m_used_time_loop_entry_points
Liste de tous les points d'entrée de la boucle en temps utilisée.
Integer m_current_entry_point
Prochain point d'entrée à exécuter.
int doOneIteration() override
Lance l'exécution d'une itération de la boucle de calcul.
void execOnMeshRefinementEntryPoints() override
Exécute les points d'entrée après raffinement.
ISubDomain * subDomain() const override
< Retourne le gestionnaire du sous-domaine
bool m_verification_at_entry_point
Si vrai, effectue vérifications à chaque point d'entrée, sinon uniquement en fin d'itération.
void timeLoops(TimeLoopCollection &time_loops) const override
Retourne dans time_loops la liste des boucles en temps.
EntryPointList m_restore_entry_points
Liste des points d'entrée à exécuter lors d'un retour arrière.
EntryPointList m_on_mesh_refinement_entry_points
Liste des points d'entrée à exécuter après un raffinement.
ISubDomain * m_sub_domain
Gestionnaire du sous-domaine.
ModuleFactoryMap m_lang_module_factory_map
Liste des fabriques des modules.
Integer nbLoop() const override
Nombre de boucles de calcul (ComputeLoop) effectuées.
bool isDoingBackward() override
Vrai si on est actuellement dans un retour-arrière.
int doComputeLoop(Integer max_loop) override
Exécute la boucle de calcul.
void timeLoopsName(StringCollection &names) const override
Retourne dans names la liste des noms des boucles en temps.
void goBackward() override
Effectue un retour arrière.
void setStopReason(eTimeLoopStopReason reason) override
Positionne la raison pour laquelle on arrête le code.
EntryPointList m_loop_entry_points
Liste des points d'entrée à exécuter.
IEntryPointMng * m_entry_point_mng
Gestionnaire de points d'entrée.
EntryPointList m_init_entry_points
Liste des points d'entrée à exécuter à l'initialisation.
String m_specific_entry_point_name
Pour test, point d'entrée spécifique à appeler.
ModuleList m_list_execute_module
Liste des modules à éxécuter.
Real cpuTimeUsed() const override
Retourne le temps CPU utilisé en secondes.
void execBuildEntryPoints() override
Exécute les points d'entrée de construction.
void setBackwardSavePeriod(Integer n) override
Positionne la période entre deux sauvegarde pour le retour arrière. Si cette valeur est nulle,...
IEntryPoint * m_current_entry_point_ptr
Point d'entrée en cours d'exécution.
IBackwardMng * m_backward_mng
Gestionnaire du retour-arrière;.
ITimeLoop * m_used_time_loop
Boucle en temps utilisée.
void setUsedTimeLoop(const String &name) override
Positionne la boucle en temps à exécuter. Sélectionne la boucle en temps de nom name comme celle qui ...
eVerifType m_verif_type
Type de vérifications.
void _fillModuleStateMap(ITimeLoop *time_loop)
void _doMeshPartition()
Effectue un repartitionnement des maillages.
std::map< String, IModuleFactoryInfo * > ModuleFactoryMap
Liste des fabriques des modules indéxés par leur nom.
void execOnMeshChangedEntryPoints() override
Exécute les points d'entrée après rééquilibrage.
void _addExecuteEntryPoint(IEntryPoint *)
Ajoute un point d'entrée à exécuter.
IEntryPoint * currentEntryPoint() override
Retourne le point d'entrée en cours d'exécution ou 0 s'il n'y en a pas.
void _fillModuleFactoryMap()
Remplit m_module_factory_map avec la liste des fabriques disponibles.
void registerTimeLoop(ITimeLoop *timeloop) override
Enregistrement et choix de la boucle en temps.
Ref< IVerifierService > m_verifier_service
Liste des fabriques des modules dans la langue du JDD.
String m_verif_path
Répertoire de sauvegarde/lecture des verifs.
void setVerificationActive(bool is_active) override
Positionne l'état du mode de vérification.
Infos d'un service singleton d'une boucle en temps.
Postionne le nom de l'action en cours d'exécution.
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.
Interface du gestionnaire de traces.
virtual void flush()=0
Flush tous les flots.
virtual TraceMessage plog()=0
Flot pour un message de log parallèle.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Exception lorsqu'un timeout survient.
Classe d'accès aux traces.
TraceMessage pwarning() const
TraceMessage log() const
Flot pour un message de log.
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
TraceMessage plog() const
Flot pour un message de log.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage warning() const
Flot pour un message d'avertissement.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage logdate() const
Flot pour un message de log précédé de la date.
Positionne une classe de message.
Formattage du flot en longueur.
Int64 toInt64(Real r)
Converti un Real en Int64.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ SB_AllowNull
Autorise l'absence du service.
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.
@ DT_String
Donnée de type chaîne de caractère UTF-8.
Int32 Integer
Type représentant un entier.