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"
76#include "arcane/core/VariableComparer.h"
78#include "arcane/accelerator/core/IAcceleratorMng.h"
79#include "arcane/accelerator/core/Runner.h"
81#include "arcane/impl/DefaultBackwardMng.h"
105 ModuleState(
bool is_optional,
const String & alias)
106 : m_is_active(
false), m_is_optional(is_optional), m_alias(alias) { }
131 ~TimeLoopMng()
override;
135 void build()
override;
161 void setBackwardMng(
IBackwardMng* backward_mng)
override;
170 _createOwnDefaultBackwardMng();
191 void execRestoreEntryPoints();
199 return m_observables[type];
211 const TimeLoopEntryPointInfoCollection& entry_points_info,
270 bool m_stop_time_loop;
271 bool m_stop_has_error;
272 bool m_final_time_reached;
277 bool m_verif_same_parallel;
279 bool m_verification_active;
282 bool m_verification_only_at_exit =
false;
286 bool m_my_own_backward_mng;
295 String m_message_class_name;
311 void _execOneEntryPoint(
IEntryPoint* ic,
Integer index_value = 0,
bool do_verif =
false);
313 void _resetTimer()
const;
314 void _checkVerif(
const String& entry_point_name,
Integer index,
bool do_verif);
315 void _checkVerifSameOnAllReplica(
const String& entry_point_name);
316 void _createOwnDefaultBackwardMng();
320 void _callSpecificEntryPoint();
337TimeLoopMng(ISubDomain* sd)
338: TraceAccessor(sd->traceMng())
340, m_entry_point_mng(m_sub_domain->entryPointMng())
341, m_default_time_loop(nullptr)
342, m_used_time_loop(nullptr)
343, m_current_entry_point_ptr(nullptr)
344, m_stop_time_loop(false)
345, m_stop_has_error(false)
346, m_final_time_reached(false)
347, m_current_entry_point(0)
348, m_verif_type(VerifNone)
349, m_verif_same_parallel(false)
351, m_verification_active(false)
352, m_verification_at_entry_point(false)
353, m_backward_mng(nullptr)
354, m_my_own_backward_mng(false)
355, m_message_class_name(
"TimeLoopMng")
356, m_alarm_timer_value(0)
364 if (!builtInGetValue(v,s))
366 m_alarm_timer_value = v;
372 m_verif_same_parallel =
true;
375 m_observables.add(eTimeLoopEventType::BeginEntryPoint);
376 m_observables.add(eTimeLoopEventType::EndEntryPoint);
377 m_observables.add(eTimeLoopEventType::BeginIteration);
378 m_observables.add(eTimeLoopEventType::EndIteration);
388 ITimeLoop * tm = i->second;
392 if (m_my_own_backward_mng)
409 if (verif_env==
"READ"){
411 info() <<
"Checking in read mode";
413 if (verif_env==
"WRITE"){
415 info() <<
"Checking in write mode";
417 if (verif_env==
"CHECKSYNC"){
419 info() <<
"Checking synchronizations";
421 if (verif_env==
"CHECKREPLICA"){
423 info() <<
"Checking variables values between replica";
426 m_verification_active =
true;
434 info() <<
"Using 'Relative' method to compute difference of variable values";
436 if (s==
"LOCALNORMMAX"){
438 info() <<
"Using 'LocalNormMax' method to compute difference of variable values";
446 info() <<
"Do verification at each entry point";
451 if (s==
"1" || s==
"true" || s==
"TRUE"){
452 m_verification_only_at_exit =
true;
453 info() <<
"Do verification only at exit";
462 info() <<
"Use specific entry point: " << s;
467 if (m_verification_active){
477 if (
subDomain()->parallelMng()->isMasterIO()){
486 if (!msg_pass_prof_str.null()) {
490 if (msg_pass_prof_str ==
"JSON") {
491 service_name =
"JsonMessagePassingProfiling";
492 }
else if (msg_pass_prof_str ==
"OTF2") {
493 service_name =
"Otf2MessagePassingProfiling";
495 ServiceBuilder<IMessagePassingProfilingService> srv(this->
subDomain());
496 m_msg_pass_prof_srv = srv.createReference(service_name ,
SB_AllowNull);
505_createOwnDefaultBackwardMng()
509 m_my_own_backward_mng =
true;
518 ARCANE_ASSERT((backward_mng),(
"IBackwardMng pointer null"));
522 if (m_my_own_backward_mng)
528 m_my_own_backward_mng =
false;
538 info() <<
"-- Executing init entry points";
545 _execOneEntryPoint(ic);
556 info() <<
"-- Executing build entry points";
561 _execOneEntryPoint(ic);
569execRestoreEntryPoints()
572 info() <<
"-- Executing restore entry points";
576 _execOneEntryPoint(ic);
587 info() <<
"-- Executing entry points after mesh change";
591 info() <<
"Execute: " << ic->
name();
592 _execOneEntryPoint(ic);
603 info() <<
"-- Executing entry points after mesh refinement";
607 info() <<
"Execute: " << ic->
name();
608 _execOneEntryPoint(ic);
619 info() <<
"-- Executing terminal entry points";
623 _execOneEntryPoint(ic);
628 JSONWriter json_writer(JSONWriter::FormatFlags::None);
629 json_writer.beginObject();
630 _dumpTimeInfos(json_writer);
631 json_writer.endObject();
632 traceMng()->plog() <<
"TimeStats:" << json_writer.getBuffer();
637 if (m_msg_pass_prof_srv.get() && m_msg_pass_prof_srv->implName() ==
"JsonMessagePassingProfiling") {
638 String fullname(
subDomain()->listingDirectory().file(
"message_passing_logs.")
641 std::ofstream file(fullname.
localstr());
642 m_msg_pass_prof_srv->printInfos(file);
653 m_observables[eTimeLoopEventType::BeginEntryPoint]->notifyAllObservers();
655 m_observables[eTimeLoopEventType::EndEntryPoint]->notifyAllObservers();
658 _checkVerif(ic->
name(),index,do_verif);
667 _checkVerif(name,0,
true);
674_checkVerif(
const String& entry_point_name,
Integer index,
bool do_verif)
686 if (service_name1.
empty())
687 service_name1 =
"ArcaneBasicVerifier2";
692 warning() <<
"No verification service is available."
693 <<
" No verification will be performed";
697 info() <<
"Use the service <" << service_name1
698 <<
"> for verification";
705 VariableCollection variables(
subDomain()->variableMng()->usedVariables());
706 for( VariableCollection::Enumerator i(variables); ++i; ){
710 if (var->isPartial())
712 VariableComparerResults r = variable_comparer.
apply(var, sync_compare_args);
713 nb_error += r.nbDifference();
716 info() <<
"Error in synchronization nb_error=" << nb_error
717 <<
" entry_point=" << entry_point_name;
722 _checkVerifSameOnAllReplica(entry_point_name);
727 if (current_iter>=0){
729 StringBuilder path = Directory(
m_verif_path).file(
"verif_file");
730 if (m_verif_same_parallel){
735 StringBuilder sub_dir;
737 sub_dir += current_iter;
739 sub_dir += entry_point_name;
747 if (m_verif_same_parallel)
748 parallel_sequential =
false;
754 ServiceFinder2T<IVerifierService,ISubDomain> sf(app,sd);
755 ScopedPtrT<IVerifierService> current_save(sf.find(service_name1));
756 if (current_save.get()){
759 current_save->writeReferenceFile();
767 FloatingPointExceptionSentry fpes(
false);
782_checkVerifSameOnAllReplica(
const String& entry_point_name)
784 info() <<
"CHECK: comparing variables values on all replica"
785 <<
" entry_point_name=" << entry_point_name;
787 IParallelMng* replica_pm = sd->parallelMng()->replication()->replicaParallelMng();
788 IVariableMng* vm = sd->variableMng();
789 VariableCollection variables(vm->usedVariables());
790 VariableList vars_to_check;
791 for( VariableCollection::Enumerator i(variables); ++i; ){
795 if (var->isPartial())
801 vars_to_check.add(var);
803 VariableCollection common_vars = vm->utilities()->filterCommonVariables(replica_pm,vars_to_check,
true);
806 VariableComparer variable_comparer;
808 VariableComparerArgs compare_args = variable_comparer.buildForCheckIfSameOnAllReplica();
809 compare_args.setMaxPrint(10);
810 FloatingPointExceptionSentry fpes(
false);
811 for( VariableCollection::Enumerator ivar(common_vars); ++ivar; ){
812 IVariable* var = *ivar;
813 VariableComparerResults r = variable_comparer.apply(var, compare_args);
814 nb_error += r.nbDifference();
819 info() <<
"Errors in comparing values between replica nb_error=" << nb_error
820 <<
" entry_point=" << entry_point_name;
882 if (current_iteration==0){
884 global_iteration = 1;
885 current_iteration = 1;
890 if (m_stop_time_loop){
891 if (m_stop_has_error)
901 execRestoreEntryPoints();
904 m_mesh_partitioner.clear();
908 bool mesh_partition_done =
false;
909 if (!m_mesh_partitioner.empty()) {
911 mesh_partition_done =
true;
928 bool is_active =
true;
929 f->
value(global_time, is_active);
930 bool mod_disabled = mod->
disabled();
931 bool mod_new_disabled = !is_active;
932 if (mod_new_disabled != mod_disabled){
933 if (mod_new_disabled)
934 info() <<
"The module " << mod->
name() <<
" is desactivated";
936 info() <<
"The module " << mod->
name() <<
" is activated";
943 m_observables[eTimeLoopEventType::BeginIteration]->notifyAllObservers();
958 _execOneEntryPoint(*i, index,
true);
969 _checkVerif(
"_EndLoop",0,
true);
971 m_observables[eTimeLoopEventType::EndIteration]->notifyAllObservers();
974 bool force_prepare_dump =
false;
976 if (!m_verif_same_parallel)
977 force_prepare_dump =
true;
981 if (force_prepare_dump_str==
"TRUE" || force_prepare_dump_str==
"1" || force_prepare_dump_str==
"true")
982 force_prepare_dump =
true;
984 if (force_prepare_dump){
985 info() <<
"TimeLoopMng::doOneIteration(): Force prepareDump()";
991 if (m_stop_time_loop){
992 if (m_stop_has_error)
1017 IMesh*
mesh = mesh_partitioner->primaryMesh();
1021 mesh->utilities()->partitionAndExchangeMeshWithReplication(mesh_partitioner,
false);
1023 info() <<
"Time spent to repartition the mesh (unit: second): "
1034 JSONWriter json_writer(JSONWriter::FormatFlags::None);
1035 json_writer.beginObject();
1036 json_writer.write(
"Mesh",
mesh->name());
1037 json_writer.write(
"Iteration", current_iteration);
1038 json_writer.write(
"CommunicatingRanks", communicating_ranks);
1039 json_writer.endObject();
1040 plog() <<
"MeshPartitionCommunicatingInfos:" << json_writer.getBuffer();
1046 Timer::Action ts_action1(sd,
"OnMeshChangeEntryPoints",
true);
1050 m_mesh_partitioner.clear();
1060_callSpecificEntryPoint()
1080 log() <<
"Registering the time loop " << name;
1084 ARCANE_FATAL(
"The time loop '{0}' is defined twice",name);
1108 info() <<
"Available time loops: ";
1110 info() <<
"Time loop <" << tl.second->name() <<
">";
1115 logdate() <<
"Using time loop " << name;
1123 service_loader->loadModules(sd,
false);
1130 for(
const auto& it : m_module_state_list ){
1133 if (!module_state.m_is_optional || module_state.m_is_active){
1136 ARCANE_FATAL(
"The module \"{0}\" was not created.",module_state.m_alias);
1139 info() <<
"The entry points of the module \""
1140 << module_state.m_alias <<
"\" won't be executed (inactive module).";
1144 _createSingletonServices(service_loader.
get());
1195 auto_load_ends.add(ic);
1217 if (ti.isRequired())
1218 ARCANE_FATAL(
"Unable to find a singleton service named '{0}'",name);
1219 info() <<
"The optional singleton service named '" << name <<
"' was not found";
1221 info() <<
"Loading singleton service '" << name <<
"'";
1226 ICaseDocument* doc = cm->caseDocument();
1228 XmlNode services_element = doc->servicesElement();
1229 String ustr_name(
"name");
1230 String ustr_active(
"active");
1231 XmlNodeList services = services_element.children(
"service");
1232 for( XmlNode x : services ) {
1233 String name = x.attrValue(ustr_name);
1234 XmlNode active_node = x.attr(ustr_active);
1235 bool is_active =
true;
1236 if (!active_node.null())
1237 is_active = active_node.valueAsBoolean(
true);
1249 const TimeLoopEntryPointInfoCollection& entry_points_info,
1255 const String& timeloop_call_name = entry_point_info.name();
1260 auto it = m_module_state_list.find(module_name);
1261 if (it == m_module_state_list.end())
1262 ARCANE_FATAL(
"No module named '{0}' is referenced",module_name);
1265 if (!module_state.m_is_optional || module_state.m_is_active){
1266 if (!module_state.m_alias.
null())
1267 module_name = module_state.m_alias;
1270 call_alias += entry_point_name;
1273 log() <<
"Looking for entry point '" << call_alias <<
"'";
1275 ARCANE_FATAL(
"No entry point named '{0}' is referenced",call_alias);
1281 msg() <<
"The entry point '" << call_alias <<
"' declared \"" << ep_where
1282 <<
"\" can't be in the entry point list \""
1283 << where <<
"\" of the time loop";
1297 entry_points.add(entry_point);
1311 const String& module_name = *i;
1313 m_module_state_list.insert(ModuleStateMap::value_type(module_name, ms));
1318 const String& module_name = *i;
1320 m_module_state_list.insert(ModuleStateMap::value_type(module_name,ms));
1333 String ustr_module(
"module");
1334 String ustr_false(
"false");
1335 String ustr_name(
"name");
1336 String ustr_alias(
"alias");
1337 String ustr_active(
"active");
1339 if (i->name() != ustr_module)
1346 XmlNode active_node = module_node.
attr(ustr_active);
1348 if (!active_node.
null())
1357 name = ilang->second->moduleName();
1359 auto it = m_module_state_list.find(name);
1360 if (it == m_module_state_list.end())
1363 ARCANE_FATAL(
"Error in configuring active modules: no module named '{0}' is registered.",
1367 ms.m_is_active = active;
1371 if (!ms.m_is_optional && !ms.m_is_active) {
1372 pwarning() <<
"The module \"" << ms.m_alias
1373 <<
"\" can't be declared mandatory in the time loop"
1374 <<
" while being inactive in the input data."
1375 <<
" It's activity is therefore forced. ";
1376 ms.m_is_active =
true;
1387 String& entry_point_name)
1389 std::string std_timeloop_call_name(timeloop_call_name.
localstr());
1390 size_t index = std_timeloop_call_name.find_first_of(
'.');
1391 if (index==std::string::npos){
1392 ARCANE_FATAL(
"The string '{0}' is not a valid reference to an entry point (has to be of type "
1393 "'module_name.entry_point_name)",timeloop_call_name);
1395 std::string std_module_name = std_timeloop_call_name.substr(0, index);
1396 std::string std_entry_point_name = std_timeloop_call_name.substr(index+1);
1397 module_name = std_module_name;
1398 entry_point_name = std_entry_point_name;
1421 ARCANE_FATAL(
"Two modules with same name '{0}'",module_name);
1423 info(5) <<
"Registering module in factory map name=" << module_name;
1430 warning() <<
"Two modules with same translated name=" << translated_name
1431 <<
" ignoring name=" << module_name;
1435 info(5) <<
"Registering module in lang factory map name=" << translated_name;
1452 info() <<
"Loading module " <<
module->name()
1453 << " (Version " << module->versionInfo() << ")";
1468 log() <<
"Adding the entry point `" << entry_point->
module()->
name() <<
"::" << entry_point->
name() <<
"' to the execution";
1477 else if (where==IEntryPoint::WExit){
1500 debug() <<
"Adding the module `" << c->
name() <<
"' to the execution";
1519 Real total_real_time = 0.0;
1520 Real compute_real_time = 0.0;
1521 json_writer.writeKey(
"EntryPoints");
1522 json_writer.beginArray();
1528 json_writer.write(
"Name",ep->
name());
1529 json_writer.write(
"TotalCpuTime",s2);
1530 json_writer.write(
"TotalElapsedTime",s2);
1532 json_writer.write(
"Where",ep->
where());
1534 info(5) <<
"CPU_TIME where=" << ep->
where() <<
" name=" << ep->
name() <<
" S=" << s2;
1535 total_real_time += s2;
1537 compute_real_time += s2;
1540 json_writer.endArray();
1541 info(4) <<
"TOTAL_REAL_TIME COMPUTE=" << compute_real_time <<
" TOTAL=" << total_real_time;
1546 info() <<
"Information on the execution time";
1548 Accelerator::IAcceleratorMng* acc_mng =
m_sub_domain->acceleratorMng();
1549 if (acc_mng->isInitialized()){
1550 Accelerator::Runner* runner = acc_mng->defaultRunner();
1551 info() <<
" TotalRunner (" << runner->executionPolicy() <<
") = "
1552 << runner->cumulativeCommandTime() <<
" seconds";
1555 info() <<
" TotalElapsed = " << total_exec_time <<
" seconds";
1556 info() <<
" CumulativeElapsed = " << scv.globalElapsedTime()
1558 info() <<
" T = Total time spent in the function or in the module (s)";
1559 info() <<
" TC = Total time spend per call (ms)";
1560 info() <<
" TCC = Total time spent per call and per cell (ns)";
1561 info() <<
" N = Number of time the function was called";
1563 info() <<
" Use the clock time (elapsed) for the statistics";
1565 std::ostringstream o;
1566 std::ios_base::fmtflags f = o.flags(std::ios::right);
1570 nb_cell = mesh->
nbCell();
1574 o <<
"\n Name T TC TCC % N\n";
1577 IModule * module = * j;
1578 Real total_time_module = 0.;
1579 Real total_time_module_entry_point = 0.;
1581 IEntryPoint * ic = * i;
1582 if (ic->module()!=module)
1587 Real total_time = ic->totalElapsedTime();
1590 const String& ep_name = ic->name();
1592 Int64 l = ep_name.length();
1594 o.write(ep_name.localstr(), 34);
1605 Real r = (1e3 * total_time) / nb_call;
1607 total_time_module += r;
1608 total_time_module_entry_point += total_time;
1613 r = (r * 1e6) / nb_cell;
1618 if (total_exec_time>0)
1630 o << module->name();
1638 Real r = (total_time_module * 1e6) / nb_cell;
1650 if (pm->isParallel()){
1651 JSONWriter::Object jo(json_writer,
"MessagePassingStats");
1652 Parallel::IStat* s = pm->stat();
1654 s->printCollective(pm);
1655 s->dumpJSON(json_writer);
1660 JSONWriter::Object jo(json_writer,
"VariablesStats");
1661 m_sub_domain->variableMng()->dumpStatsJSON(json_writer);
1664 JSONWriter::Object jo(json_writer,
"TimeStats");
1670 JSONWriter::Object jo(json_writer,
"Profiling");
1671 ps->dumpJSON(json_writer);
1675 Item::dumpStats(traceMng());
1685 Real total_elapsed_time = 0.0;
1687 Real s1 = (*i)->totalElapsedTime();
1688 total_elapsed_time += s1;
1690 return total_elapsed_time;
1700 _createOwnDefaultBackwardMng();
1714 _createOwnDefaultBackwardMng();
1726 names.add(i->first);
1736 time_loops.add(i->second);
1755 m_stop_reason = reason;
1764 m_stop_time_loop =
true;
1765 m_stop_has_error = has_error;
1767 m_final_time_reached =
true;
1770 else if (is_final_time)
1785 _createOwnDefaultBackwardMng();
1788 info() <<
"Repartioning required but inactive due to a backward process active";
1791 m_mesh_partitioner.add(mesh_partitioner);
1801 bool is_end =
false;
1802 bool is_end_by_max_loop =
false;
1806 if (m_alarm_timer_value>0){
1807 info() <<
"Set the timeout before alarm at " << m_alarm_timer_value <<
" seconds";
1812 _createOwnDefaultBackwardMng();
1815 bool want_specific_profiling =
false;
1821 info() <<
"Specific profiling activated";
1822 want_specific_profiling =
true;
1831 Int64 block_size = 0;
1832 bool is_bad = builtInGetValue(block_size,s);
1833 if (!is_bad && block_size>2){
1834 info() <<
"Set Memory StackTraceMinAllocSize to " << block_size;
1841 if (m_msg_pass_prof_srv.get())
1842 m_msg_pass_prof_srv->startProfiling();
1852 if (want_specific_profiling)
1856 _callSpecificEntryPoint();
1860 if (max_loop!=0 && m_nb_loop>=max_loop){
1861 info()<<
"===================================================";
1862 info()<<
"====== MAXIMUM NUMBER OF ITERATION REACHED =======";
1863 info()<<
"===================================================";
1864 is_end_by_max_loop =
true;
1870 if (max_loop!=0 && (1+m_nb_loop)>=max_loop){
1875 if (mem_info && mem_info->isCollecting()){
1876 mem_info->endCollect();
1880 std::ostringstream ostr;
1882 mem_info->printAllocatedMemory(ostr,iteration-1);
1884 mem_info->printAllocatedMemory(ostr,iteration-2);
1886 mem_info->printAllocatedMemory(ostr,iteration-5);
1887 info() <<
"ITERATION_MemoryInfo: " << ostr.str();
1888 mem_info->beginCollect();
1897 if (m_msg_pass_prof_srv.get())
1898 m_msg_pass_prof_srv->stopProfiling();
1901 traceMng()->flush();
1907 if (m_verification_only_at_exit){
1908 info() <<
"Doing verification at exit";
1916 if (m_msg_pass_prof_srv.get())
1917 m_msg_pass_prof_srv->stopProfiling();
1918 if (IItemEnumeratorTracer::singleton())
1919 IItemEnumeratorTracer::singleton()->dumpStats();
1920 info() <<
"End of compute loop: reason=" << (int)m_stop_reason;
1921 if (is_end_by_max_loop)
1923 if (m_final_time_reached)
1937 if (m_alarm_timer_value>0)
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer count() const
Nombre d'éléments de la collection.
bool empty() const
True si la collection est vide.
EnumeratorT< ICaseOptions * > Enumerator
VariableScalarInt32 m_global_iteration
Itération courante.
Real globalTime() const
Temps courant.
Int32 globalIteration() const
Numéro de l'itération courante.
interval d'itérateurs constant
const String & additionalInfo() const
Retourne les infos supplémentaires.
Exception pour demander un retour-arrière de la boucle en temps.
Interface de l'application.
virtual IMainFactory * mainFactory() const =0
Manufacture principale.
virtual String userName() const =0
Nom de l'utilisateur.
Interface gérant les stratégies de retour-arrière.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'une partie d'un jeu de données.
virtual String language() const =0
Langage utilisé dans le jeu de données.
Interface d'une classe gérant un document XML du jeu de données.
virtual XmlNode modulesElement()=0
Retourne l'élément contenant la description des modules.
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.
virtual CaseOptionsCollection blocks() const =0
Collection des blocs d'options.
virtual ICaseDocument * caseDocument()=0
Document XML du jeu de données (peut être nul si pas de jeu de donneés)
Interface d'une liste d'options du jeu de données.
virtual ICaseFunction * activateFunction()=0
Fonction indiquant l'état d'activation de l'option.
virtual IModule * caseModule() const =0
Retourne le module associé ou nullptr s'il n'y en a pas.
virtual void merge(const IConfiguration *c)=0
Fusionne cette configuration avec la configuration c.
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.
virtual void executeEntryPoint()=0
Appelle le point d'entrée.
virtual Real totalElapsedTime() const =0
Temps d'exécution passé (temps horloge) dans ce point d'entrée en (en milli-s)
static const char *const WComputeLoop
appelé pendant la boucle de calcul
static const char *const WBuild
appelé pour la construction du module
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
virtual Integer nbCall() const =0
Retourne le nombre de fois que le point d'entrée a été exécuté
static const char *const WOnMeshRefinement
appelé après un raffinement de maillage
@ 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...
virtual int property() const =0
Retourne les propriétés du point d'entrée.
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 IModule * module() const =0
Retourne le module associé au point d'entrée.
virtual String name() const =0
Retourne le nom du point d'entrée.
Interface d'une famille d'entités.
virtual IVariableSynchronizer * allItemsSynchronizer()=0
Synchroniseur sur toutes les entités de la famille.
virtual IServiceLoader * createServiceLoader()=0
Crée une instance du chargeur de services.
virtual ITimeLoop * createTimeLoop(IApplication *sm, const String &name)=0
Crée une boucle en temps de nom name.
Interface d'un collecteur d'informations sur l'usage mémoire.
virtual void setIteration(Integer iteration)=0
Positionne le numéro de l'itération courante.
virtual void setStackTraceMinAllocSize(Int64 alloc_size)=0
Positionne la taille minimale des allocations dont on trace la pile d'appel.
virtual Integer nbCell()=0
Nombre de mailles du maillage.
Interface d'un partitionneur de maillage.
virtual void prepareForDump()=0
Prépare l'instance en vue d'une protection.
Informations sur la fabrique d'un module.
virtual String moduleName() const =0
Nom du module créé par cette fabrique.
virtual Ref< IModule > createModule(ISubDomain *parent, const MeshHandle &mesh_handle)=0
Créé un module.
virtual const IServiceInfo * serviceInfo() const =0
Informations sur le module pouvant être créé par cette fabrique.
Interface du gestionnaire de modules.
virtual ModuleCollection modules() const =0
Liste des modules.
virtual void setUsed(bool v)=0
Indique si un module est utilisé ou non (interne).
virtual String name() const =0
Nom du module.
virtual bool disabled() const =0
true si le module est désactivé
virtual void setDisabled(bool v)=0
Active ou désactive temporairement le module (interne).
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 bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual bool hasReplication() const =0
Indique si la réplication est active.
Interface d'un service de profiling.
virtual bool isInitialized() const
Indique si initialize() a déjà été appelé
virtual void initialize()=0
Initialise le service de profiling.
virtual void reset()=0
Remet à zéro les compteurs.
virtual void printInfos(bool dump_file=false)=0
Affiche les infos de profiling.
Interface des informations d'un service ou d'un module.
virtual String tagName(const String &lang) const =0
Nom de l'élément XML du service pour le langage lang. Si lang est nul, retourne le nom par défaut.
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 const IConfiguration * configuration() const =0
Configuration associée.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
virtual IMainFactory * mainFactory()=0
Manufacture principale.
virtual ICaseMng * caseMng()=0
Retourne le gestionnaire du jeu de données.
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 StringCollection optionalModulesName() const =0
Liste des noms des modules facultatifs.
static const char * WOnMeshChanged
appelé après un changement de maillage
static const char * WExit
appelé lors de la terminaison du code.
virtual StringCollection requiredModulesName() const =0
Liste des noms des modules obligatoires.
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.
virtual void dumpCurrentStats(const String &name)=0
Affiche les statistiques d'une action.
virtual void notifyNewIterationLoop()=0
Notifie qu'on commence une nouvelle itération de la boucle de calcul.
Interface du gestionnaire de traces.
virtual IVariableSynchronizerMng * synchronizerMng() const =0
Interface du gestionnaire de synchronisation des variables.
virtual void flushPendingStats()=0
Traite les statistiques en cours.
Interface d'un service de synchronisation de variable.
virtual Int32ConstArrayView communicatingRanks()=0
Rangs des sous-domaines avec lesquels on communique.
@ 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.
ListEnumeratorT< IEntryPoint * > Enumerator
Flot de sortie lié à une String.
Classe permettant de démarrer et arrêter automatiquement un service.
T * get() const
Retourne l'objet référé par l'instance.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Encapsulation d'un pointeur qui se détruit automatiquement.
Classe utilitaire pour retrouver un ou plusieurs services implémentant l'interface InterfaceType.
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.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
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.
Exception lorsqu'un timeout survient.
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.
Real lastActivationTime() const
Retourne le temps (en secondes) passé lors de la dernière activation du timer.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
TraceMessage logdate() const
Flot pour un message de log précédé de la date.
TraceMessage log() const
Flot pour un message de log.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage warning() const
Flot pour un message d'avertissement.
TraceMessage plog() const
Flot pour un message de log.
TraceMessage pwarning() const
Positionne une classe de message.
Formattage du flot en longueur.
Vecteur 1D de données avec sémantique par valeur (style STL).
Arguments des méthodes de VariableComparer.
void setMaxPrint(Int32 v)
Positionne le nombre d'erreurs à afficher dans le listing.
Classe pour effectuer des comparaisons entre les variables.
VariableComparerResults apply(IVariable *var, const VariableComparerArgs &compare_args)
Applique la comparaison compare_args à la variable var.
VariableComparerArgs buildForCheckIfSync()
Créé une comparaison pour vérifie qu'une variable est bien synchronisée.
XmlNode attr(const String &name, bool throw_exception=false) const
Retourne l'attribut de nom name.
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
bool null() const
Vrai si le noeud est nul.
ConstIterT< XmlNode > const_iter
Type d'un itérateur constant sur tout le tableau.
bool valueAsBoolean(bool throw_exception=false) const
Valeur du noeud convertie en booléan.
VariableRefScalarT< Integer > VariableScalarInteger
Variable scalaire de type entier.
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.
std::int64_t Int64
Type entier signé sur 64 bits.
eVariableComparerComputeDifferenceMethod
Méthode utilisée pour calculer la différence entre deux valeurs v1 et v2.
@ Relative
Utilise (v1-v2) / v1.
@ LocalNormMax
Utilise (v1-v2) / local_norm_max.
Int32 Integer
Type représentant un entier.
Collection< String > StringCollection
Collection de chaînes de caractères.
List< IModule * > ModuleList
Tableau de modules.
List< IEntryPoint * > EntryPointList
Tableau de points d'entrées.
Collection< ICaseOptions * > CaseOptionsCollection
Collection d'options du jeu de données.
Collection< ITimeLoop * > TimeLoopCollection
Collection de boucles en temps.
Collection< IModuleFactoryInfo * > ModuleFactoryInfoCollection
Collection d'informations sur les fabriques de module.
double Real
Type représentant un réel.
Collection< IEntryPoint * > EntryPointCollection
Collection de points d'entrées.
@ DT_String
Donnée de type chaîne de caractère UTF-8.