Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CodeService.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* CodeService.cc (C) 2000-2024 */
9/* */
10/* Service du code. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/CodeService.h"
15
16#include "arcane/utils/List.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/Exception.h"
19#include "arcane/utils/String.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/IProfilingService.h"
22#include "arcane/utils/PlatformUtils.h"
23#include "arcane/utils/Array.h"
24#include "arcane/utils/ValueConvert.h"
25#include "arcane/utils/JSONWriter.h"
26
27#include "arcane/core/IApplication.h"
28#include "arcane/core/ISession.h"
29#include "arcane/core/IServiceLoader.h"
30#include "arcane/core/IMainFactory.h"
31#include "arcane/core/ISubDomain.h"
32#include "arcane/core/ServiceBuildInfo.h"
33#include "arcane/core/ICheckpointMng.h"
34#include "arcane/core/ICaseMng.h"
35#include "arcane/core/ITimeLoopMng.h"
36#include "arcane/core/IVariableMng.h"
37#include "arcane/core/CheckpointInfo.h"
38#include "arcane/core/internal/IVariableMngInternal.h"
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43namespace Arcane
44{
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
50{
51 public:
53 public:
54 IServiceInfo* m_service_info;
55 IApplication* m_application;
56 StringList m_extensions;
57};
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62CodeServicePrivate::
63CodeServicePrivate(IApplication* application,IServiceInfo* si)
64: m_service_info(si)
65, m_application(application)
66{
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72/*---------------------------------------------------------------------------*/
73/*---------------------------------------------------------------------------*/
74
75CodeService::
76CodeService(const ServiceBuildInfo& sbi)
77: m_p(new CodeServicePrivate(sbi.application(),sbi.serviceInfo()))
78{
79}
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
83
84CodeService::
85~CodeService()
86{
87 delete m_p;
88}
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
94allowExecution() const
95{
96 return true;
97}
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
103validExtensions() const
104{
105 return m_p->m_extensions;
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
113{
114 ITraceMng* trace = session->traceMng();
115
116 ISubDomain* sub_domain = session->createSubDomain(sdbi);
117
118 // Permet à la classe dérivée de faire ses modifs
119 _preInitializeSubDomain(sub_domain);
120
121 try{
122 sub_domain->readCaseMeshes();
123 }
124 catch(const Exception& ex)
125 {
126 trace->error() << ex;
127 throw;
128 }
129 catch(...){
130 trace->error() << "Unknown exception thrown";
131 throw;
132 }
133
134 return sub_domain;
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
141initCase(ISubDomain* sub_domain,bool is_continue)
142{
143 IProfilingService* ps = nullptr;
144 bool is_profile_init = false;
145 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_PROFILE_INIT", true))
146 is_profile_init = (v.value()!=0);
147 if (is_profile_init)
149 {
150 ProfilingSentryWithInitialize ps_sentry(ps);
151 ps_sentry.setPrintAtEnd(true);
152 /*
153 * Les différentes phases de l'initialisation sont :
154 * - allocation des structures gérant les maillages.
155 * - relecture des protections (si on est en reprise).
156 * - lecture (phase1, donc sans les éléments de maillage) du jeu de données.
157 * - appel des points d'entrée de type 'build'.
158 * - lecture des maillages (si init) ou relecture (si reprise).
159 */
160 if (is_continue)
161 sub_domain->setIsContinue();
162 sub_domain->allocateMeshes();
163 if (is_continue){
164 ICheckpointMng* cm = sub_domain->checkpointMng();
166 ci.setIsRestart(true);
167 cm->readCheckpoint(ci);
168 }
169 ICaseMng* case_mng = sub_domain->caseMng();
170 // Lecture du jeu de donnée (phase1)
171 case_mng->readOptions(true);
172 ITimeLoopMng* loop_mng = sub_domain->timeLoopMng();
173 loop_mng->execBuildEntryPoints();
174 sub_domain->readOrReloadMeshes();
175
176 IVariableMng* vm = sub_domain->variableMng();
177 vm->_internalApi()->initializeVariables(is_continue);
178 if (!is_continue)
179 sub_domain->initializeMeshVariablesFromCaseFile();
180 // Lecture du jeu de donnée (phase2)
181 case_mng->readOptions(false);
182 case_mng->printOptions();
183 // Effectue le partitionnement initial ou de reprise
184 sub_domain->doInitMeshPartition();
185 loop_mng->execInitEntryPoints(is_continue);
186 sub_domain->setIsInitialized();
187 }
188
189 if (is_profile_init && ps){
190 // Génère un fichier JSON avec les informations de profiling
191 // de l'initialisation.
192 JSONWriter json_writer(JSONWriter::FormatFlags::None);
193 json_writer.beginObject();
194 ps->dumpJSON(json_writer);
195 json_writer.endObject();
196 String file_name = String("profiling_init-") + platform::getProcessId() + String(".json");
197 std::ofstream ofile(file_name.localstr());
198 ofile << json_writer.getBuffer();
199 }
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
206serviceInfo() const
207{
208 return m_p->m_service_info;
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
215serviceParent() const
216{
217 return m_p->m_application;
218}
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
223void CodeService::
224_addExtension(const String& extension)
225{
226 m_p->m_extensions.add(extension);
227}
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
231
232IApplication* CodeService::
233_application() const
234{
235 return m_p->m_application;
236}
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
240
241}
242
243/*---------------------------------------------------------------------------*/
244/*---------------------------------------------------------------------------*/
Informations sur une protection.
virtual StringCollection validExtensions() const
Retourne la liste des extensions de fichier traitées par l'instance. L'extension ne comprend pas le '...
virtual bool allowExecution() const
Retourne si le code accepte l'exécution.
virtual void initCase(ISubDomain *sub_domain, bool is_continue)
Initialise la session session.
virtual IServiceInfo * serviceInfo() const
Informations du service.
virtual ISubDomain * createAndLoadCase(ISession *session, const SubDomainBuildInfo &sdbi)
Créé et charge le cas avec les infos sdbi pour la session session.
virtual IBase * serviceParent() const
Parent de ce service.
Interface de l'application.
Interface de la classe de base des objets principaux arcane.
Definition IBase.h:38
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface du gestionnaire de cas.
Definition ICaseMng.h:56
virtual void printOptions()=0
Affiche les valeurs des options.
virtual void readOptions(bool is_phase1)=0
Lit les options du jeu de donnée correspondant aux modules utilisés.
Interface du gestionnaire des informations des protections.
virtual ARCANE_DEPRECATED_122 void readCheckpoint()=0
Lit une protection.
virtual CheckpointInfo readDefaultCheckpointInfo()=0
Lit les informations de protection par défaut.
virtual void dumpJSON(JSONWriter &writer)=0
Ecrit les infos de profiling dans l'écrivain writer.
Interface des informations d'un service ou d'un module.
Interface d'une session d'exécution d'un cas.
Definition ISession.h:44
virtual ISubDomain * createSubDomain(const SubDomainBuildInfo &sdbi)=0
Créé un sous-domaine avec les paramètres contenus dans sdbi.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual ICheckpointMng * checkpointMng() const =0
Gestionnaire de protections.
virtual ITimeLoopMng * timeLoopMng()=0
Retourne le gestionnaire de la boucle en temps.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
virtual void readCaseMeshes()=0
Lit les informations de maillage du jeu de données.
virtual ICaseMng * caseMng()=0
Retourne le gestionnaire du jeu de données.
Interface du gestionnaire de la boucle en temps.
virtual void execBuildEntryPoints()=0
Exécute les points d'entrée de construction.
virtual void execInitEntryPoints(bool is_continue)=0
Exécute les points d'entrée d'initialisation.
Interface du gestionnaire de variables.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
Ecrivain au format JSON.
Definition JSONWriter.h:33
Classe permettant de démarrer et arrêter automatiquement un service.
void setPrintAtEnd(bool v)
Indique si on imprime les résultats à la fin du profiling.
Paramètres nécessaires à la construction d'un sous-domaine.
Classe de base d'une exception.
Interface du gestionnaire de traces.
virtual TraceMessage error()=0
Flot pour un message d'erreur.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
IProfilingService * getProfilingService()
Service utilisé pour obtenir pour obtenir des informations de profiling.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-