Arcane  v3.16.0.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
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
69setUsedTimeLoop(ISubDomain* sub_domain)
70{
71 ITimeLoopMng* loop_mng = sub_domain->timeLoopMng();
72
73 XmlNode time_loop_elem = sub_domain->caseDocument()->timeloopElement();
74
75 {
76 SequentialSection ss(sub_domain);
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{
106 IMainFactory* factory = m_application->mainFactory();
107
108 ByteConstSpan config_bytes = m_application->configBuffer();
109 ScopedPtrT<IXmlDocumentHolder> config_doc(m_application->ioMng()->parseXmlBuffer(config_bytes,String()));
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
118 StringList required_modules_list;
119 StringList optional_modules_list;
120 List<TimeLoopEntryPointInfo> entry_points;
121 StringList user_classes;
122 List<TimeLoopSingletonServiceInfo> singleton_services;
123
124 List<TimeLoopSingletonServiceInfo> global_singleton_services;
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;
139 global_singleton_services.add(TimeLoopSingletonServiceInfo(j_node.attrValue(ustr_name),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();
148 singleton_services.clone(global_singleton_services);
149
150 String name = i.attrValue(ustr_name);
151
152 if (name.null())
153 continue;
154 ITimeLoop* time_loop = factory->createTimeLoop(m_application, name);
155 XmlNode timeloop_node = i;
156
157 for( const auto& j_node : timeloop_node ){
158 String elem_name = j_node.name();
159 String elem_value = j_node.value();
160
161 if (elem_name==ustr_modules){
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;
175 singleton_services.add(TimeLoopSingletonServiceInfo(k->attrValue(ustr_name),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;
184 StringList depends;
185 entry_points.add(TimeLoopEntryPointInfo(k_node.attrValue(ustr_name),depends));
186 }
187
188 String cwhere = j_node.attrValue("where");
189 if (cwhere != ITimeLoop::WInit
190 && cwhere != ITimeLoop::WComputeLoop
191 && cwhere != ITimeLoop::WRestore
192 && cwhere != ITimeLoop::WExit
193 && cwhere != ITimeLoop::WBuild
194 && cwhere != ITimeLoop::WOnMeshChanged
195 && cwhere != ITimeLoop::WOnMeshRefinement)
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 {
223 user_classes.add(elem_value);
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.
void clear()
Supprime tous les éléments de la collection.
Definition Collection.h:68
Lecteurs de fichiers de configuration.
void addValuesFromXmlNode(const XmlNode &element, Integer priority)
Ajoute des valeurs à la configuration.
Classe de base d'une exception.
Interface de l'application.
virtual XmlNode timeloopElement()=0
Retourne l'élément contenant le choix de la boucle en temps.
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
virtual ICaseDocument * caseDocument()=0
Document XML du cas.
virtual ITimeLoopMng * timeLoopMng()=0
Retourne le gestionnaire de la boucle en temps.
Interface du gestionnaire de la boucle en temps.
virtual void registerTimeLoop(ITimeLoop *time_loop)=0
Enregistrement et choix de la boucle en temps.
virtual void setUsedTimeLoop(const String &name)=0
Positionne la boucle en temps à exécuter. Sélectionne la boucle en temps de nom name comme celle qui ...
Interface d'une boucle en temps.
Definition ITimeLoop.h:41
virtual void setUserClasses(const StringCollection &)=0
Retourne la liste des classes associées à la boucle en temps.
static const char * WRestore
appelé pour restaurer les variables lors d'un retour arrière
Definition ITimeLoop.h:54
virtual void setRequiredModulesName(const StringCollection &)=0
Positionne la liste des des modules obligatoires.
static const char * WOnMeshChanged
appelé après un changement de maillage
Definition ITimeLoop.h:56
virtual void setTitle(const String &)=0
Positionne le titre de la boucle en temps.
virtual void setSingletonServices(const TimeLoopSingletonServiceInfoCollection &c)=0
Positionne la liste des services singletons.
static const char * WExit
appelé lors de la terminaison du code.
Definition ITimeLoop.h:60
virtual IConfiguration * configuration()=0
Options de configuration.
static const char * WOnMeshRefinement
appelé après un raffinement de maillage
Definition ITimeLoop.h:58
virtual void setDescription(const String &)=0
Positionne la description de la boucle en temps.
virtual void setOptionalModulesName(const StringCollection &)=0
Positionne la liste des des modules facultatifs.
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
virtual void setEntryPoints(const String &where, const TimeLoopEntryPointInfoCollection &)=0
Positionne la liste des noms des points d'entrée pour le point d'appel where.
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.
Implémentation d'une collection d'éléments sous forme de vecteur.
Definition List.h:222
void clone(const Collection< T > &base)
Clone la collection base.
Definition List.h:280
ListEnumeratorT< ITimeLoop * > Enumerator
Definition List.h:243
Flot de sortie lié à une String.
T * get() const
Retourne l'objet référé par l'instance.
Definition Ptr.h:121
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
Section de code à exécuter séquentiellement.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
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.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage error() const
Flot pour un message d'erreur.
ITraceMng * traceMng() const
Gestionnaire de trace.
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
Definition XmlNode.cc:225
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
Definition XmlNode.cc:64
String value() const
Valeur du noeud.
Definition XmlNode.cc:199
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
Definition XmlNode.cc:93
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
ConstIterT< XmlNode > const_iter
Type d'un itérateur constant sur tout le tableau.
Definition XmlNode.h:76
String name() const
Nom du noeud.
Definition XmlNode.cc:132
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:596