Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TimeLoopReader.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* TimeLoopReader.cc (C) 2000-2020 */
9/* */
10/* Chargement d'une boucle en temps. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/Iterator.h"
15#include "arcane/utils/ScopedPtr.h"
16#include "arcane/utils/ApplicationInfo.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/List.h"
19#include "arcane/utils/OStringStream.h"
20#include "arcane/utils/FatalErrorException.h"
21
22#include "arcane/impl/TimeLoopReader.h"
23
24#include "arcane/IApplication.h"
25#include "arcane/IXmlDocumentHolder.h"
26#include "arcane/IIOMng.h"
27#include "arcane/ISubDomain.h"
28#include "arcane/XmlNode.h"
29#include "arcane/XmlNodeList.h"
30#include "arcane/XmlNodeIterator.h"
31#include "arcane/ICaseDocument.h"
32#include "arcane/ArcaneException.h"
33#include "arcane/ITimeLoopMng.h"
34#include "arcane/ITimeLoop.h"
35#include "arcane/IMainFactory.h"
36#include "arcane/SequentialSection.h"
37#include "arcane/TimeLoopEntryPointInfo.h"
38#include "arcane/TimeLoopSingletonServiceInfo.h"
39#include "arcane/impl/ConfigurationReader.h"
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44namespace Arcane
45{
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
52: TraceAccessor(sm->traceMng())
53, m_application(sm)
54{
55}
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
70{
71 ITimeLoopMng* loop_mng = sub_domain->timeLoopMng();
72
73 XmlNode time_loop_elem = sub_domain->caseDocument()->timeloopElement();
74
75 {
77 try{
78 String value;
79 if (!time_loop_elem.null())
80 value = time_loop_elem.value();
81 if (value.null())
82 ARCANE_FATAL("No time loop specified");
83 if (value.empty())
84 value = "ArcaneEmptyLoop";
85 // La boucle en temps est spécifiée dans le fichier de config.
86 m_time_loop_name = value;
87 info() << "Using the time loop <" << m_time_loop_name << ">";
88 loop_mng->setUsedTimeLoop(m_time_loop_name);
89 }
90 catch(const Exception& ex){
91 error() << ex << '\n';
92 ss.setError(true);
93 }
94 catch(...){
95 ss.setError(true);
96 }
97 }
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
105{
107
108 ByteConstSpan config_bytes = m_application->configBuffer();
110 if (!config_doc.get())
111 ARCANE_FATAL("Can not parse code configuration file");
112 XmlNode root_elem = config_doc->documentNode().documentElement();
113
114 // XmlNode root_elem = m_application->configRootElement();
115 XmlNode elem = root_elem.child(String("time-loops"));
116 XmlNodeList timeloops = elem.children(String("time-loop"));
117
123
125
126 String ustr_name("name");
127 String ustr_modules("modules");
128
129 // Liste des services singletons globaux
130 XmlNodeList global_singleton_elems = root_elem.children("singleton-services");
131 info() << "CHECK GLOBAL SINGLETON SERVICES";
132 for( const auto& i : global_singleton_elems ){
133 info() << "CHECK GLOBAL SINGLETON SERVICES 2 " << i.name();
134
135 for( const auto& j_node : i ){
136 if (j_node.name()=="service"){
137 bool is_required = (j_node.attrValue("need")=="required");
138 info() << "GLOBAL SINGLETON SERVICE name=" << j_node.attrValue(ustr_name) << " is_required?=" << is_required;
140 }
141 }
142 }
143
144 for( const auto& i : timeloops ){
145 optional_modules_list.clear();
146 required_modules_list.clear();
147 user_classes.clear();
149
150 String name = i.attrValue(ustr_name);
151
152 if (name.null())
153 continue;
156
157 for( const auto& j_node : timeloop_node ){
158 String elem_name = j_node.name();
159 String elem_value = j_node.value();
160
162 for(XmlNode::const_iter k (j_node) ; k() ; ++k)
163 if (k->name()=="module"){
164 if (k->attrValue("need")=="required")
165 required_modules_list.add(k->attrValue(ustr_name));
166 else
167 optional_modules_list.add(k->attrValue(ustr_name));
168 }
169 }
170 else if (elem_name=="singleton-services"){
171 for(XmlNode::const_iter k (j_node) ; k() ; ++k)
172 if (k->name()=="service"){
173 bool is_required = (k->attrValue("need")=="required");
174 //info() << "SINGLETON SERVICE name=" << k->attrValue(ustr_name) << " is_required?=" << is_required;
176 }
177 }
178 else if (elem_name=="entry-points"){
179 entry_points.clear();
180 for( XmlNode::const_iter k (j_node) ; k() ; ++k){
181 XmlNode k_node = *k;
182 if (k_node.name()!="entry-point")
183 continue;
186 }
187
188 String cwhere = j_node.attrValue("where");
196 {
198 s() << "Incorrect value for the attribute \"where\" (time loop ";
199 s() << name << "): \"" << cwhere << "\".\n";
200 s() << "Available values are: "
202 << ", " << ITimeLoop::WComputeLoop
203 << ", " << ITimeLoop::WRestore
206 << ", " << ITimeLoop::WBuild
207 << ", " << ITimeLoop::WExit
208 << ".";
209 throw InternalErrorException(A_FUNCINFO,s.str());
210 }
211 time_loop->setEntryPoints(cwhere,entry_points);
212 }
213 else if (elem_name=="title")
214 {
215 time_loop->setTitle(elem_value);
216 }
217 else if (elem_name=="description")
218 {
219 time_loop->setDescription(elem_value);
220 }
221 else if (elem_name=="userclass")
222 {
224 }
225 else if (elem_name=="configuration"){
226 ConfigurationReader cr(traceMng(),time_loop->configuration());
227 cr.addValuesFromXmlNode(j_node,ConfigurationReader::P_TimeLoop);
228 }
229 }
230
231 time_loop->setRequiredModulesName(required_modules_list);
232 time_loop->setOptionalModulesName(optional_modules_list);
233 time_loop->setUserClasses(user_classes);
234 time_loop->setSingletonServices(singleton_services);
235
236 m_time_loops.add(time_loop);
237 }
238}
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
245{
246 ITimeLoopMng* loop_mng = sd->timeLoopMng();
247 for( TimeLoopList::Enumerator i(m_time_loops); ++i; )
248 loop_mng->registerTimeLoop(*i);
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254} // End namespace Arcane
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Lecteurs de fichiers de configuration.
Interface de l'application.
virtual IMainFactory * mainFactory() const =0
Manufacture principale.
virtual IIOMng * ioMng()=0
Gestionnaire des entrées/sorties.
Manufacture des classes d'Arcane.
virtual ITimeLoop * createTimeLoop(IApplication *sm, const String &name)=0
Crée une boucle en temps de nom name.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface du gestionnaire de la boucle en temps.
Interface d'une boucle en temps.
Definition ITimeLoop.h:41
static const char * WRestore
appelé pour restaurer les variables lors d'un retour arrière
Definition ITimeLoop.h:54
static const char * WOnMeshChanged
appelé après un changement de maillage
Definition ITimeLoop.h:56
static const char * WExit
appelé lors de la terminaison du code.
Definition ITimeLoop.h:60
static const char * WOnMeshRefinement
appelé après un raffinement de maillage
Definition ITimeLoop.h:58
static const char * WBuild
appelé lors de la lecture du jeu de données
Definition ITimeLoop.h:50
static const char * WComputeLoop
appelé pendant la boucle de calcul
Definition ITimeLoop.h:48
static const char * WInit
appelé pendant l'initialisation, l'initialisation d'une reprise ou d'un nouveau cas
Definition ITimeLoop.h:52
Exception lorsqu'une erreur interne survient.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Flot de sortie lié à une String.
Section de code à exécuter séquentiellement.
Infos d'un point d'entrée d'une boucle en temps.
TimeLoopReader(IApplication *sm)
Crée une instance associée au gestionnaire sm.
void setUsedTimeLoop(ISubDomain *sd)
Positionne la boucle en temps utilisée dans le gestionnaire sd.
void readTimeLoops()
Effectue la lecture des boucles en temps disponible.
void registerTimeLoops(ISubDomain *sd)
Enregistre la liste des boucles en temps dans le gestionnaire sd.
~TimeLoopReader()
Libère les ressources.
IApplication * m_application
Superviseur.
Infos d'un service singleton d'une boucle en temps.
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
Classe de base d'une exception.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Span< const std::byte > ByteConstSpan
Vue en lecture seule d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:706