Arcane  4.2.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
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/* Classe permettant d'exécuter du code directement 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: Il faut implémenter cette méthode pour hériter de MainFactory
51 // mais elle ne sera pas utilisée dans le cas d'une exécution directe
52 // (c'est toujours une instance de ArcaneMain() qui sera créée)
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 // Par défaut il n'y a pas de fichiers de configuration dans le cas
106 // d'une exécution directe.
107 build_info.setConfigFileName(String());
108
109 // Par défaut, limite le niveau de verbosité de l'initialisation
110 // Cela permet d'éviter d'afficher les infos sur les versions
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
142{
143 auto& build_info = m_p->m_application_build_info;
144
145 m_p->m_has_minimal_verbosity_level = (build_info.minimalVerbosityLevel() != Trace::UNSPECIFIED_VERBOSITY_LEVEL);
146 m_p->m_has_output_level = (build_info.outputLevel() != Trace::UNSPECIFIED_VERBOSITY_LEVEL);
147
148 if (!m_p->m_has_minimal_verbosity_level)
149 build_info.setMinimalVerbosityLevel(level);
150 if (!m_p->m_has_output_level)
151 build_info.setOutputLevel(level);
152}
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157int ArcaneSimpleExecutor::
158initialize()
159{
160 if (m_p->m_arcane_main)
161 ARCANE_FATAL("This instance is already initialized");
162
164 auto factory = new ArcaneSimpleExecutorMainFactory();
165 m_p->m_main_factory = factory;
166 m_p->m_arcane_main = new ArcaneMainExecInfo(app_info, m_p->m_application_build_info, factory);
167
168 int r = m_p->m_arcane_main->initialize();
169 return r;
170}
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
175int ArcaneSimpleExecutor::
176runCode(IFunctor* f)
177{
178 if (!m_p->m_arcane_main)
179 ARCANE_FATAL("This instance is not yet initialized");
180 if (!f)
181 return 0;
182 IArcaneMain* am = m_p->m_arcane_main->arcaneMainClass();
183 bool clean_abort = false;
184 bool is_print = true;
185 return ArcaneMain::callFunctorWithCatchedException(f, am, &clean_abort, is_print);
186}
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190
191ApplicationBuildInfo& ArcaneSimpleExecutor::
192applicationBuildInfo()
193{
194 return m_p->m_application_build_info;
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200const ApplicationBuildInfo& ArcaneSimpleExecutor::
201applicationBuildInfo() const
202{
203 return m_p->m_application_build_info;
204}
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209ISubDomain* ArcaneSimpleExecutor::
210createSubDomain(const String& case_file_name, Span<const std::byte> file_content)
211{
212 _checkInit();
213 IApplication* app = m_p->m_arcane_main->arcaneMainClass()->application();
214 ITraceMng* tr = app->traceMng();
215 if (!m_p->m_has_minimal_verbosity_level)
216 tr->setVerbosityLevel(Trace::DEFAULT_VERBOSITY_LEVEL);
217 if (!m_p->m_has_output_level)
218 tr->setStandardOutputVerbosityLevel(Trace::DEFAULT_VERBOSITY_LEVEL);
219 IMainFactory* main_factory = app->mainFactory();
220 // TODO : utiliser le service de code spécifié dans ApplicationInfo.
221 Ref<ICodeService> code_service = createArcaneCodeService(app);
222 ISession* session(code_service->createSession());
223 IParallelSuperMng* psm = app->parallelSuperMng();
224 Ref<IParallelMng> world_pm = psm->internalCreateWorldParallelMng(0);
225
226 SubDomainBuildInfo sdbi(world_pm, 0);
227 UniqueArray<Byte> case_bytes;
228 bool has_case_file = !case_file_name.empty();
229 if (has_case_file) {
230 sdbi.setCaseFileName(case_file_name);
231 if (file_content.empty()) {
232 bool is_bad = app->ioMng()->collectiveRead(case_file_name, case_bytes);
233 if (is_bad)
234 ARCANE_FATAL("Can not read case file '{0}'", case_file_name);
235 sdbi.setCaseBytes(case_bytes);
236 tr->info() << "Create sub domain with case file '" << case_file_name << "'";
237 }
238 else {
239 sdbi.setCaseContent(file_content);
240 }
241 }
242 else {
243 sdbi.setCaseFileName({});
244 if (file_content.empty())
245 sdbi.setCaseBytes({});
246 else
247 sdbi.setCaseContent(file_content);
248 }
249 // Le service de statistiques doit être détruit explicitement
250 ITimeStats* time_stat = main_factory->createTimeStats(world_pm->timerMng(), tr, "Stats");
251 time_stat->beginGatherStats();
252 m_p->m_time_stats_list.add(time_stat);
253 world_pm->setTimeStats(time_stat);
254
255 ISubDomain* sub_domain(session->createSubDomain(sdbi));
256 if (has_case_file) {
257 code_service->initCase(sub_domain, false);
258 }
259 return sub_domain;
260}
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
265ISubDomain* ArcaneSimpleExecutor::
266createSubDomain(const String& case_file_name)
267{
268 return createSubDomain(case_file_name, {});
269}
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
274} // End namespace Arcane
275
276/*---------------------------------------------------------------------------*/
277/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fichier contenant les déclarations concernant le modèle de programmation par échange de message.
Informations pour construire une instance de IApplication.
Informations sur une application.
const CommandLineArguments & commandLineArguments() const
Arguments de la ligne de commande.
int initialize()
Création de l'instance 'IArcaneMain'.
Classe de gestion de l'exécution.
Definition ArcaneMain.h:80
static void arcaneInitialize()
Initialise Arcane.
static void arcaneFinalize()
Termine l'utilisation Arcane.
static int callFunctorWithCatchedException(IFunctor *functor, IArcaneMain *amain, bool *clean_abort, bool is_print=true)
Appelle le fonctor functor en récupérant les éventuelles exceptions.
static ApplicationInfo & defaultApplicationInfo()
Infos par défaut de l'application.
IArcaneMain * createArcaneMain(const ApplicationInfo &app_info) override
Crée une instance de IArcaneMain.
void _setDefaultVerbosityLevel(Integer level)
Positionne le niveau des traces à level si elles ne sont pas positionnées.
Interface de l'application.
Interface de la classe de gestion du code.
Definition IArcaneMain.h:54
Interface gérant les statistiques sur les temps d'exécution.
Definition ITimeStats.h:43
Référence à une instance.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type représentant un entier.