Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ArcaneSimpleExecutor.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* ArcaneSimpleExecutor.cc (C) 2000-2026 */
9/* */
10/* Class allowing code to be executed directly via Arcane. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/impl/ArcaneSimpleExecutor.h"
15
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/TraceClassConfig.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/ApplicationInfo.h"
21
23
24#include "arcane/impl/ArcaneMain.h"
25#include "arcane/impl/MainFactory.h"
26#include "arcane/impl/internal/ArcaneMainExecInfo.h"
27
28#include "arcane/core/SubDomainBuildInfo.h"
29#include "arcane/core/ISession.h"
30#include "arcane/core/ICodeService.h"
31#include "arcane/core/IApplication.h"
32#include "arcane/core/IParallelSuperMng.h"
33#include "arcane/core/IParallelMng.h"
34#include "arcane/core/ITimeStats.h"
35#include "arcane/core/IIOMng.h"
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40namespace Arcane
41{
42extern "C++" ARCANE_IMPL_EXPORT Ref<ICodeService>
43createArcaneCodeService(IApplication* app);
44
46: public MainFactory
47{
48 public:
49
50 // NOTE: This method must be implemented to inherit from MainFactory
51 // but it will not be used in the case of direct execution
52 // (it is always an instance of ArcaneMain() that will be created)
53 IArcaneMain* createArcaneMain(const ApplicationInfo& app_info) override
54 {
55 return new ArcaneMain(app_info, this);
56 }
57};
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
63{
64 public:
65
66 Impl()
67 {
69 }
70 ~Impl() noexcept(false)
71 {
72 for (ITimeStats* ts : m_time_stats_list) {
73 ts->endGatherStats();
74 delete ts;
75 }
76 if (m_arcane_main) {
77 m_arcane_main->finalize();
78 delete m_arcane_main;
79 }
80 delete m_main_factory;
82 }
83
84 public:
85
86 ArcaneMainExecInfo* m_arcane_main = nullptr;
87 ArcaneSimpleExecutorMainFactory* m_main_factory = nullptr;
88 ApplicationBuildInfo m_application_build_info;
89 bool m_has_minimal_verbosity_level = false;
90 bool m_has_output_level = false;
91 UniqueArray<ITimeStats*> m_time_stats_list;
92};
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
97ArcaneSimpleExecutor::
98ArcaneSimpleExecutor()
99: m_p(new Impl())
100{
102 const CommandLineArguments& cmd_line_args = app_info.commandLineArguments();
103 auto& build_info = m_p->m_application_build_info;
104 build_info.parseArguments(cmd_line_args);
105 // By default, there are no configuration files in the case
106 // of direct execution.
107 build_info.setConfigFileName(String());
108
109 // By default, limit the verbosity level of the initialization
110 // This prevents displaying version information.
112}
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116
117ArcaneSimpleExecutor::
118~ArcaneSimpleExecutor() noexcept(false)
119{
120 delete m_p;
121}
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126void ArcaneSimpleExecutor::
127_checkInit()
128{
129 if (!m_p->m_arcane_main)
130 ARCANE_FATAL("This instance is not initialized. Call initialize() method");
131}
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135
141{
142 auto& build_info = m_p->m_application_build_info;
143
144 m_p->m_has_minimal_verbosity_level = (build_info.minimalVerbosityLevel() != Trace::UNSPECIFIED_VERBOSITY_LEVEL);
145 m_p->m_has_output_level = (build_info.outputLevel() != Trace::UNSPECIFIED_VERBOSITY_LEVEL);
146
147 if (!m_p->m_has_minimal_verbosity_level)
148 build_info.setMinimalVerbosityLevel(level);
149 if (!m_p->m_has_output_level)
150 build_info.setOutputLevel(level);
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156int ArcaneSimpleExecutor::
157initialize()
158{
159 if (m_p->m_arcane_main)
160 ARCANE_FATAL("This instance is already initialized");
161
163 auto factory = new ArcaneSimpleExecutorMainFactory();
164 m_p->m_main_factory = factory;
165 m_p->m_arcane_main = new ArcaneMainExecInfo(app_info, m_p->m_application_build_info, factory);
166
167 int r = m_p->m_arcane_main->initialize();
168 return r;
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174int ArcaneSimpleExecutor::
175runCode(IFunctor* f)
176{
177 if (!m_p->m_arcane_main)
178 ARCANE_FATAL("This instance is not yet initialized");
179 if (!f)
180 return 0;
181 IArcaneMain* am = m_p->m_arcane_main->arcaneMainClass();
182 bool clean_abort = false;
183 bool is_print = true;
184 return ArcaneMain::callFunctorWithCatchedException(f, am, &clean_abort, is_print);
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
190ApplicationBuildInfo& ArcaneSimpleExecutor::
191applicationBuildInfo()
192{
193 return m_p->m_application_build_info;
194}
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198
199const ApplicationBuildInfo& ArcaneSimpleExecutor::
200applicationBuildInfo() const
201{
202 return m_p->m_application_build_info;
203}
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
208ISubDomain* ArcaneSimpleExecutor::
209createSubDomain(const String& case_file_name)
210{
211 _checkInit();
212 IApplication* app = m_p->m_arcane_main->arcaneMainClass()->application();
213 ITraceMng* tr = app->traceMng();
214 if (!m_p->m_has_minimal_verbosity_level)
215 tr->setVerbosityLevel(Trace::DEFAULT_VERBOSITY_LEVEL);
216 if (!m_p->m_has_output_level)
217 tr->setStandardOutputVerbosityLevel(Trace::DEFAULT_VERBOSITY_LEVEL);
218 IMainFactory* main_factory = app->mainFactory();
219 // TODO: use the code service specified in ApplicationInfo.
220 Ref<ICodeService> code_service = createArcaneCodeService(app);
221 ISession* session(code_service->createSession());
222 IParallelSuperMng* psm = app->parallelSuperMng();
223 Ref<IParallelMng> world_pm = psm->internalCreateWorldParallelMng(0);
224
225 SubDomainBuildInfo sdbi(world_pm, 0);
226 UniqueArray<Byte> case_bytes;
227 bool has_case_file = !case_file_name.empty();
228 if (has_case_file) {
229 bool is_bad = app->ioMng()->collectiveRead(case_file_name, case_bytes);
230 if (is_bad)
231 ARCANE_FATAL("Can not read case file '{0}'", case_file_name);
232 sdbi.setCaseFileName(case_file_name);
233 sdbi.setCaseBytes(case_bytes);
234 tr->info() << "Create sub domain with case file '" << case_file_name << "'";
235 }
236 else {
237 sdbi.setCaseFileName(String());
238 sdbi.setCaseBytes(ByteConstArrayView());
239 }
240 // The statistics service must be explicitly destroyed
241 ITimeStats* time_stat = main_factory->createTimeStats(world_pm->timerMng(), tr, "Stats");
242 time_stat->beginGatherStats();
243 m_p->m_time_stats_list.add(time_stat);
244 world_pm->setTimeStats(time_stat);
245
246 ISubDomain* sub_domain(session->createSubDomain(sdbi));
247 if (has_case_file) {
248 code_service->initCase(sub_domain, false);
249 }
250 return sub_domain;
251}
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255
256} // End namespace Arcane
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
File containing declarations concerning the message passing model.
Information for constructing an instance of IApplication.
Application information.
const CommandLineArguments & commandLineArguments() const
Command line arguments.
Execution information.
int initialize()
Creation of the 'IArcaneMain' instance.
Execution management class.
Definition ArcaneMain.h:89
static void arcaneInitialize()
Initializes Arcane.
static void arcaneFinalize()
Terminates Arcane usage.
static int callFunctorWithCatchedException(IFunctor *functor, IArcaneMain *amain, bool *clean_abort, bool is_print=true)
Calls the functor functor while catching possible exceptions.
static ApplicationInfo & defaultApplicationInfo()
Default application info.
IArcaneMain * createArcaneMain(const ApplicationInfo &app_info) override
Creates an instance of IArcaneMain.
void _setDefaultVerbosityLevel(Integer level)
Sets the trace level to level if it is not set.
Application interface.
Interface of the code management class.
Definition IArcaneMain.h:55
Interface managing execution time statistics.
Definition ITimeStats.h:44
Reference to an instance.
1D data vector with value semantics (STL style).
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.
ConstArrayView< Byte > ByteConstArrayView
C equivalent of a 1D array of characters.
Definition UtilsTypes.h:476