Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SubDomain.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/* SubDomain.cc (C) 2000-2024 */
9/* */
10/* Gestionnaire du sous-domaine. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/StdHeader.h"
15#include "arcane/utils/PlatformUtils.h"
16#include "arcane/utils/Iostream.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/VersionInfo.h"
19#include "arcane/utils/StringBuilder.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/TraceAccessor.h"
22#include "arcane/utils/MemoryInfo.h"
23#include "arcane/utils/List.h"
24#include "arcane/utils/Property.h"
25#include "arcane/utils/TraceAccessor2.h"
26#include "arcane/utils/ValueConvert.h"
27#include "arcane/utils/IProcessorAffinityService.h"
28#include "arcane/utils/IProfilingService.h"
29
30#include "arcane/core/ISubDomain.h"
31#include "arcane/core/IVariableMng.h"
32#include "arcane/core/IModuleMng.h"
33#include "arcane/core/IServiceMng.h"
34#include "arcane/core/IModule.h"
35#include "arcane/core/IModuleMaster.h"
36#include "arcane/core/IEntryPointMng.h"
37#include "arcane/core/IEntryPoint.h"
38#include "arcane/core/IMeshReader.h"
39#include "arcane/core/ITimerMng.h"
40#include "arcane/core/IApplication.h"
41#include "arcane/core/IGhostLayerMng.h"
42#include "arcane/core/ArcaneException.h"
43#include "arcane/core/CaseOptionsMain.h"
44#include "arcane/core/IMesh.h"
45#include "arcane/core/IMeshModifier.h"
46#include "arcane/core/IMeshSubMeshTransition.h"
47#include "arcane/core/Properties.h"
48#include "arcane/core/IParallelMng.h"
49#include "arcane/core/Directory.h"
50#include "arcane/core/ITimeHistoryMng.h"
51#include "arcane/core/ICaseMng.h"
52#include "arcane/core/ICheckpointMng.h"
53#include "arcane/core/IPropertyMng.h"
54#include "arcane/core/ITimeStats.h"
55#include "arcane/core/ITimeLoop.h"
56#include "arcane/core/ITimeLoopMng.h"
57#include "arcane/core/IIOMng.h"
58#include "arcane/core/IMainFactory.h"
59#include "arcane/core/Timer.h"
60#include "arcane/core/CommonVariables.h"
61#include "arcane/core/XmlNode.h"
62#include "arcane/core/ICaseDocument.h"
63#include "arcane/core/IPhysicalUnitSystem.h"
64#include "arcane/core/IPhysicalUnitSystemService.h"
65#include "arcane/core/IService.h"
66#include "arcane/core/IServiceInfo.h"
67#include "arcane/core/ServiceUtils.h"
68#include "arcane/core/IRessourceMng.h"
69#include "arcane/core/ISession.h"
70#include "arcane/core/IMeshStats.h"
71#include "arcane/core/IParallelSuperMng.h"
72#include "arcane/core/IParallelReplication.h"
73#include "arcane/core/IServiceLoader.h"
74#include "arcane/core/ICheckpointReader.h"
75#include "arcane/core/IMeshPartitioner.h"
76#include "arcane/core/ICaseMeshMasterService.h"
77#include "arcane/core/ILoadBalanceMng.h"
78#include "arcane/core/CaseNodeNames.h"
79#include "arcane/core/ModuleBuildInfo.h"
80#include "arcane/core/Observable.h"
81#include "arcane/core/VariableCollection.h"
82#include "arcane/core/SubDomainBuildInfo.h"
83#include "arcane/core/ServiceBuilder.h"
84#include "arcane/core/IMeshUtilities.h"
85#include "arcane/core/IMeshMng.h"
86#include "arcane/core/MeshHandle.h"
87#include "arcane/core/ObserverPool.h"
88#include "arcane/core/ConfigurationPropertyReader.h"
89#include "arcane/core/parallel/IStat.h"
90
91#include "arcane/core/internal/IDataInternal.h"
92#include "arcane/core/internal/ICaseMngInternal.h"
93#include "arcane/core/internal/IParallelMngInternal.h"
94#include "arcane/core/internal/IVariableMngInternal.h"
95
96#include "arcane/impl/ConfigurationReader.h"
97#include "arcane/impl/internal/MeshMng.h"
98#include "arcane/impl/internal/LegacyMeshBuilder.h"
99
100#include "arcane/CaseOptionService.h"
101#include "arcane/CaseOptionBuildInfo.h"
102
103#include "arcane/accelerator/core/IAcceleratorMng.h"
104#include "arcane/accelerator/core/DeviceInfo.h"
105#include "arcane/accelerator/core/Runner.h"
106#include "arcane/accelerator/core/AcceleratorRuntimeInitialisationInfo.h"
107#include "arcane/accelerator/core/IDeviceInfoList.h"
108
109/*---------------------------------------------------------------------------*/
110/*---------------------------------------------------------------------------*/
111
112namespace Arcane
113{
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
119{
120 public:
122 : m_case_options(new Arcane::CaseOptions(cm,".")),
123 m_mesh_service(CaseOptionBuildInfo(_configList(),"meshes", XmlNode(), default_name, 1, 1), false, false)
124 {
125 m_mesh_service.addAlternativeNodeName("fr","maillages");
126 }
127 private:
128 Arcane::ICaseOptionList* _configList() const
129 {
130 return m_case_options->configList();
131 }
132 public:
133 ICaseOptions* options() const { return m_case_options.get(); }
134 public:
135 void createMeshes()
136 {
137 m_mesh_service.instance()->createMeshes();
138 }
139 private:
140 ReferenceCounter<ICaseOptions> m_case_options;
142};
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
152: public ISubDomain
154{
155 ARCANE_DECLARE_PROPERTY_CLASS(SubDomain);
156
157 public:
158
161 : public TraceAccessor
162 {
163 public:
165 : TraceAccessor(sd->traceMng()), m_sub_domain(sd),
166 m_property_values(VariableBuildInfo(sd,"ArcaneProperties",IVariable::PPrivate))
167 {
168 init();
169 }
170 public:
171 void init()
172 {
173 m_observers.addObserver(this,
174 &PropertyMngCheckpoint::_notifyWrite,
175 m_property_values.variable()->writeObservable());
176 m_observers.addObserver(this,
177 &PropertyMngCheckpoint::_notifyRead,
178 m_property_values.variable()->readObservable());
179 }
180 private:
181 void _notifyRead()
182 {
183 info(4) << "PropertyMngCheckpoint: READ";
184 m_sub_domain->propertyMng()->readFrom(m_property_values);
185 }
186 void _notifyWrite()
187 {
188 info(4) << "PropertyMngCheckpoint: WRITE";
189 m_sub_domain->propertyMng()->writeTo(m_property_values._internalTrueData()->_internalDeprecatedValue());
190 m_property_values.variable()->syncReferences();
191 }
192 private:
193 ISubDomain* m_sub_domain;
194 ObserverPool m_observers;
195 VariableArrayByte m_property_values;
196 };
197
198 public:
199
201
202 public:
203
204 void build() override;
205 void initialize() override;
206 void destroy() override;
207
208 public:
209
210 IBase* objectParent() const override { return m_application; }
211 String objectNamespaceURI() const override { return m_namespace_uri; }
212 String objectLocalName() const override { return m_local_name; }
213 VersionInfo objectVersion() const override { return VersionInfo(1,0,0); }
214
215 public:
216
218 ISession* session() const override { return m_session; }
219 IServiceMng* serviceMng() const override { return m_service_mng.get(); }
220 ITimeLoopMng* timeLoopMng() override { return m_time_loop_mng.get(); }
221 IIOMng* ioMng() override { return m_io_mng.get(); }
222 IVariableMng* variableMng() override { return m_variable_mng.get(); }
223 IModuleMng* moduleMng() override { return m_module_mng.get(); }
224 IEntryPointMng* entryPointMng() override { return m_entry_point_mng.get(); }
225 ICaseMng* caseMng() override { return m_case_mng.get(); }
226 ITimerMng* timerMng() const override { return m_timer_mng; }
227 ICheckpointMng* checkpointMng() const override { return m_checkpoint_mng.get(); }
228 IPropertyMng* propertyMng() const override { return m_property_mng.get(); }
229 ITimeStats* timeStats() const override { return m_time_stats; }
230 IRessourceMng* ressourceMng() const override { return m_application->ressourceMng(); }
231 ITraceMng* traceMng() const override { return TraceAccessor::traceMng(); }
232 IMemoryInfo* memoryInfo() const override { return m_memory_info.get(); }
234 ILoadBalanceMng* loadBalanceMng() override { return m_lb_mng.get(); }
235 IMeshMng* meshMng() const override { return m_mesh_mng.get(); }
236 IModuleMaster* moduleMaster() const override { return m_module_master; }
237 const IConfiguration* configuration() const override { return m_configuration.get(); }
238 IConfiguration* configuration() override { return m_configuration.get(); }
239 IAcceleratorMng* acceleratorMng() override { return m_accelerator_mng.get(); }
240
241 Int32 subDomainId() const override { return m_parallel_mng->commRank(); }
242 Int32 nbSubDomain() const override { return m_parallel_mng->commSize(); }
243 void setIsContinue() override { m_is_continue = true; }
244 bool isContinue() const override { return m_is_continue; }
245 void dumpInfo(std::ostream&) override;
246 void doInitModules() override;
247 void doExitModules() override;
248 IMesh* defaultMesh() override { return m_default_mesh_handle.mesh(); }
249 const MeshHandle& defaultMeshHandle() override { return m_default_mesh_handle; }
250 IMesh* mesh() override { return m_default_mesh_handle.mesh(); }
251 IMesh* findMesh(const String& name,bool throw_exception) override;
252 bool isInitialized() const override { return m_is_initialized; }
253 void setIsInitialized() override;
254 const ApplicationInfo& applicationInfo() const override { return m_application->applicationInfo(); }
255 ICaseDocument* caseDocument() override { return m_case_mng->caseDocument(); }
256 IApplication* application() override { return m_application; }
257 void checkId(const String& where,const String& id) override;
258 const String& caseFullFileName() const override { return m_case_full_file_name; }
259 void setCaseFullFileName(const String& file_name) { m_case_full_file_name = file_name; }
260 const String& caseName() const override { return m_case_name; }
261 void fillCaseBytes(ByteArray& bytes) const override { bytes.copy(m_case_bytes); }
262 void setCaseName(const String& case_name) override { m_case_name = case_name; }
263 void setInitialPartitioner(IInitialPartitioner* partitioner) override
264 {
265 m_legacy_mesh_builder->m_initial_partitioner = partitioner;
266 }
267 void readCaseMeshes() override;
268 void allocateMeshes() override;
269 void readOrReloadMeshes() override;
271 void doInitMeshPartition() override;
272 void addMesh(IMesh* mesh) override;
273 ConstArrayView<IMesh*> meshes() const override;
274 const CaseOptionsMain* caseOptionsMain() const override { return m_case_config; }
275 IParallelMng* parallelMng() override { return m_parallel_mng.get(); }
277 IThreadMng* threadMng() override { return m_parallel_mng->threadMng(); }
278 const IDirectory& exportDirectory() const override { return m_export_directory; }
280 const IDirectory& storageDirectory() const override { return m_storage_directory; }
282 const IDirectory& listingDirectory() const override { return m_listing_directory; }
285 const CommonVariables& variablesCommon() const { return commonVariables(); }
286 const CommonVariables& commonVariables() const override;
287 void dumpInternalInfos(XmlNode& root) override;
288 Integer meshDimension() const override;
290 IDirectExecution* directExecution() const override { return m_direct_execution; }
291 void setDirectExecution(IDirectExecution* v) override { m_direct_execution = v; }
292
293 public:
294
295 void _setLegacyMeshCreation(bool v){ m_is_create_default_mesh_v2 = !v; }
296 bool isLegacyMeshCreation() const { return !m_is_create_default_mesh_v2; }
297
298 public:
299
300 protected:
301
302 const char* _msgClassName() const { return "Init"; }
303
304 private:
305
323 String m_namespace_uri;
324 String m_local_name;
327 ScopedPtrT<MeshMng> m_mesh_mng;
328 MeshHandle m_default_mesh_handle;
338 bool m_is_continue;
339 IDirectExecution* m_direct_execution;
342 bool m_is_create_default_mesh_v2;
343 ScopedPtrT<PropertyMngCheckpoint> m_property_mng_checkpoint;
344 ScopedPtrT<LegacyMeshBuilder> m_legacy_mesh_builder;
346 bool m_has_mesh_service = false;
347 Ref<ICaseMeshMasterService> m_case_mesh_master_service;
348 ObserverPool m_observers;
349 Ref<IAcceleratorMng> m_accelerator_mng;
350
351 private:
352
353 void _doInitialPartition();
354 void _doInitialPartitionForMesh(IMesh* mesh, const String& service_name);
355 void _notifyWriteCheckpoint();
356 void _printCPUAffinity();
357 void _setDefaultAcceleratorDevice(Accelerator::AcceleratorRuntimeInitialisationInfo& config);
358};
359
360/*---------------------------------------------------------------------------*/
361/*---------------------------------------------------------------------------*/
362
363static ISubDomain* global_sub_domain = nullptr;
364
365/* HP: ARCANE_IMPL_EXPORT en attendant de trouver une solution
366 * pour accéder aux traces hors d'un service ou module */
367extern "C" ARCANE_IMPL_EXPORT ISubDomain* _arcaneGetDefaultSubDomain()
368{
369 return global_sub_domain;
370}
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
374
375extern "C++" ISubDomain*
376arcaneCreateSubDomain(ISession* session,const SubDomainBuildInfo& sdbi)
377{
378 Ref<IParallelMng> pm = sdbi.parallelMng();
379 Ref<IParallelMng> all_replica_pm = sdbi.allReplicaParallelMng();
380 String case_file_name = sdbi.caseFileName();
381 ByteConstArrayView bytes = sdbi.caseBytes();
382
383 ITraceMng* tm = pm->traceMng();
384 StringBuilder trace_id;
385 trace_id += String::fromNumber(pm->commRank());
386 if (all_replica_pm!=pm){
387 trace_id += ",r";
388 trace_id += pm->replication()->replicationRank();
389 }
390 trace_id += ",";
391 trace_id += platform::getHostName();
392 tm->setTraceId(trace_id.toString());
393
394 auto* sd = new SubDomain(session,pm,all_replica_pm,case_file_name,bytes);
395 sd->build();
396 //GG: l'init se fait par l'appelant
397 //mng->initialize();
398 global_sub_domain = sd;
399 return sd;
400}
401
402/*---------------------------------------------------------------------------*/
403/*---------------------------------------------------------------------------*/
404
405SubDomain::
406SubDomain(ISession* session,Ref<IParallelMng> pm,Ref<IParallelMng> all_replica_pm,
407 const String& case_file_name,ByteConstArrayView bytes)
408: TraceAccessor2(pm->traceMng())
409, m_session(session)
410, m_application(session->application())
411, m_parallel_mng(pm)
412, m_all_replica_parallel_mng(all_replica_pm)
413, m_timer_mng(nullptr)
414, m_time_stats(nullptr)
415, m_namespace_uri(arcaneNamespaceURI())
416, m_module_master(nullptr)
417, m_time_history_mng(nullptr)
418, m_is_initialized(false)
419, m_case_full_file_name(case_file_name)
420, m_case_name("unknown")
421, m_case_bytes(bytes)
422, m_case_config(nullptr)
423, m_storage_directory(".")
424, m_is_continue(false)
425, m_direct_execution(nullptr)
426, m_is_create_default_mesh_v2(false)
427{
428 m_local_name = "SubDomain";
429 m_memory_info = new MemoryInfo();
430}
431
432/*---------------------------------------------------------------------------*/
433/*---------------------------------------------------------------------------*/
434// Cet appel doit être fait depuis une section critique.
436build()
437{
440 m_configuration = m_application->configurationMng()->defaultConfiguration()->clone();
441
442 m_accelerator_mng = mf->createAcceleratorMngRef(traceMng());
443 m_property_mng = mf->createPropertyMngReference(this);
444 m_io_mng = mf->createIOMng(parallelMng());
445 m_variable_mng = mf->createVariableMng(this);
446 m_mesh_mng = new MeshMng(m_application,m_variable_mng.get());
447 m_default_mesh_handle = m_mesh_mng->createDefaultMeshHandle("Mesh0");
448 m_service_mng = mf->createServiceMng(this);
449 m_checkpoint_mng = mf->createCheckpointMng(this);
450 m_module_mng = mf->createModuleMng(this);
451 m_entry_point_mng = mf->createEntryPointMng(this);
452 m_case_mng = mf->createCaseMng(this)->toReference();
453 m_timer_mng = m_parallel_mng->timerMng();
454 m_time_stats = m_parallel_mng->timeStats();
455 m_time_loop_mng = mf->createTimeLoopMng(this);
456 m_legacy_mesh_builder = new LegacyMeshBuilder(this,m_default_mesh_handle);
457}
458
459/*---------------------------------------------------------------------------*/
460/*---------------------------------------------------------------------------*/
461
464{
465 namespace ax = Arcane::Accelerator;
466 // Initialisation du module parallèle
467 // TODO: a supprimer car plus utile
468 m_parallel_mng->initialize();
469
470 {
471 // Initialise le runner par défaut en fonction des paramètres
472 // donnés par l'utilisateur.
474 ax::AcceleratorRuntimeInitialisationInfo config = app->acceleratorRuntimeInitialisationInfo();
475 _setDefaultAcceleratorDevice(config);
476
477 m_accelerator_mng->initialize(config);
478 Runner* runner = m_accelerator_mng->defaultRunner();
479 const auto& device_info = runner->deviceInfo();
480 info() << "DeviceInfo: name=" << device_info.name();
481 info() << "DeviceInfo: description=" << device_info.description();
482
483 if (Accelerator::impl::isAcceleratorPolicy(runner->executionPolicy())){
484 m_parallel_mng->_internalApi()->setDefaultRunner(runner);
485 m_all_replica_parallel_mng->_internalApi()->setDefaultRunner(runner);
486 }
487 m_variable_mng->_internalApi()->setAcceleratorMng(m_accelerator_mng);
488 }
489
491
493
494 m_time_loop_mng->build();
495
496 m_has_mesh_service = false;
497
498 // Lit le jeu de données.
499 // Il s'agit uniquement de s'assurer de la validité syntaxique
500 // du jeu de données. Les options ne sont pas lues.
501 // Cela doit être fait avant la création du maillage
502 // car l'instance du maillage dépend du jeu de données
503 ICaseDocument* case_document = nullptr;
504 if (!m_case_bytes.empty()){
506 if (!case_document)
507 ARCANE_FATAL("Can not read case options");
508 // Ajoute à la configuration celle présente dans le jeu de données.
509 {
511 cr.addValuesFromXmlNode(case_document->configurationElement(),ConfigurationReader::P_CaseDocument);
512 }
513 }
514
515 properties::readFromConfiguration(m_configuration.get(),*this);
516
517 if (case_document){
518 // Regarde s'il y a un tag <meshes> indiquant que la création et
519 // la lecture du maillage sera gérée par un service
520 XmlNode meshes_elem = case_document->meshesElement();
521 if (!meshes_elem.null()){
522 info() << "Using mesh service to create and allocate meshes";
523 m_has_mesh_service = true;
524 }
525 // TODO: dans ce cas vérifier qu'on n'a pas l'élément 'maillage' historique.
526 }
527 // Créé le maillage par défaut. Il faut le faire avant la création
528 // des services, car ces derniers peuvent en avoir besoin.
530 if (!m_is_create_default_mesh_v2)
531 m_legacy_mesh_builder->createDefaultMesh();
532
533 ScopedPtrT<IServiceLoader> service_loader(mf->createServiceLoader());
534 service_loader->loadSubDomainServices(this);
535
536 // Le module maître doit toujours être créé avant les autres pour que
537 // ses points d'entrées soient appelés en premier et dernier
538 m_module_master = mf->createModuleMaster(this);
539 m_time_history_mng = mf->createTimeHistoryMng(this);
540
541 service_loader->initializeModuleFactories(this);
542 m_lb_mng = mf->createLoadBalanceMng(this);
543
544 m_property_mng_checkpoint = new PropertyMngCheckpoint(this);
545
546 m_observers.addObserver(this,
547 &SubDomain::_notifyWriteCheckpoint,
548 m_checkpoint_mng->writeObservable());
549}
550
551/*---------------------------------------------------------------------------*/
552/*---------------------------------------------------------------------------*/
553
554void SubDomain::
556{
557 // Choix de l'accélérateur à utiliser
558 // Si plusieurs accélérateurs sont disponibles, il faut en choisir un par défaut.
559 // On considère que tous les noeuds ont le même nombre d'accélérateur.
560 // Dans ce cas, on prend comme accélérateur par défaut le i-ème accélérateur disponible,
561 // avec \a i choisi comme étant notre rang modulo le nombre d'accélérateur disponible sur
562 // le noeud.
563 // NOTE: cela fonctionne bien si on utilise un seul processus par accélérateur.
564 // Si on en utilise plus, il faudrait plutôt prendre les rangs consécutifs pour
565 // le même accélérateur.
566 // TODO: Regarder aussi pour voir comment utiliser plutôt l'accélérateur le plus proche
567 // de notre rang. Pour cela il faudrait utiliser des bibliothèque comme HWLOC
568 //
569 auto* device_list = Runner::deviceInfoList(config.executionPolicy());
570
571 Int32 modulo_device = 0;
572 if (device_list){
573 Int32 nb_device = device_list->nbDevice();
574 info() << "DeviceInfo: nb_device=" << nb_device;
576 }
577
578 // TODO: faire cela ailleurs
579 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_ACCELERATOR_PARALLELMNG_RANK_FOR_DEVICE",true)){
580 Int32 modulo = v.value();
581 if (modulo==0)
582 modulo = 1;
583 modulo_device = modulo;
584 info() << "Use commRank() to choose accelerator device with modulo=" << modulo;
585 }
586 if (modulo_device!=0){
587 Int32 device_rank = m_parallel_mng->commRank() % modulo_device;
588 info() << "Using device number=" << device_rank;
589 config.setDeviceId(Accelerator::DeviceId(device_rank));
590 }
591}
592
593/*---------------------------------------------------------------------------*/
594/*---------------------------------------------------------------------------*/
595
596void SubDomain::
597destroy()
598{
599 m_case_mesh_master_service.reset();
600
601 m_property_mng_checkpoint = nullptr;
602
605
607
608 // Normalement on devrait pouvoir supprimer ce test car il ne devrait plus
609 // rester de références sur des services ou module. Cela est le cas
610 // avec l'implémentation 'coreclr' mais pas avec 'mono'. Du coup on
611 // laisse pour l'instant ce test.
612 // A partir de la version 3.7.8, la plupart des problèmes potentiels dus au GC sont
613 // réglés donc il n'est pas nécessaire de retourner directement. Néanmmoins
614 // il reste encore des problèmes avec l'utilisation des 'ICaseFunction'.
615 // On garde donc la possibilité de changer le comportement si une variable
616 // d'environnement est positionnée.
618 bool do_return = true;
619 String x = platform::getEnvironmentVariable("ARCANE_DOTNET_USE_LEGACY_DESTROY");
620 if (x=="1")
621 do_return = true;
622 if (x=="0")
623 do_return = false;
624 if (do_return)
625 return;
626 }
627
628 m_module_master = nullptr;
629
630 m_module_mng->removeAllModules();
631 m_service_mng = nullptr;
632 m_time_history_mng = nullptr;
633 m_mesh_mng->destroyMeshes();
634
635 m_time_loop_mng = nullptr;
636 m_case_mng.reset();
637 m_entry_point_mng = nullptr;
638 m_module_mng = nullptr;
639 m_io_mng = nullptr;
640
641 m_lb_mng = nullptr;
642 m_property_mng.reset();
643
644 // Comme tous les objets peuvent contenir des variables, il faut être
645 // certain de détruire le gestionnaire de variables en dernier.
646 m_variable_mng->_internalApi()->removeAllVariables();
647 m_variable_mng = nullptr;
648
649 delete this;
650}
651
652/*---------------------------------------------------------------------------*/
653/*---------------------------------------------------------------------------*/
654
656dumpInfo(std::ostream& o)
657{
658 m_module_mng->dumpList(o);
659}
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663
664
665/*---------------------------------------------------------------------------*/
666/*---------------------------------------------------------------------------*/
675{
676 info() << "SubDomain: Allocating meshes";
678
679 Timer::Action ts_action2(this,"AllocateMesh");
680 Trace::Setter mci(traceMng(),_msgClassName());
681
683 info() << "** Reading mesh from mesh service";
684 const CaseNodeNames* cnn = caseMng()->caseDocument()->caseNodeNames();
685 String default_service_name = "ArcaneCaseMeshMasterService";
686
687 // NOTE: cet objet sera détruit par caseMng()
688 ICaseOptions* opt = new CaseOptions(caseMng(),cnn->meshes);
691 m_case_mesh_master_service = mbm;
692 m_case_mng->_internalImpl()->internalReadOneOption(mbm->_options(),true);
693 mbm->createMeshes();
694 }
695 else{
696 if (m_is_create_default_mesh_v2)
697 m_legacy_mesh_builder->createDefaultMesh();
698
699 m_legacy_mesh_builder->allocateMeshes();
700 }
701}
702
703/*---------------------------------------------------------------------------*/
704/*---------------------------------------------------------------------------*/
705
708{
709 info() << "SubDomain: read or reload meshes";
711 logdate() << "Initialisation du code.";
712
713 Integer nb_mesh = m_mesh_mng->meshes().size();
714 info() << " nb_mesh_created=" << nb_mesh
715 << " is_continue?=" << m_is_continue;
716
717 A_INFO("Test: {1}",A_TR2("nb_mesh_created",nb_mesh),A_TR(m_is_continue));
718
719 //info() << format4("Test: {1}",{A_PR2("nb_mesh_created",nb_mesh),A_PR(m_is_continue)});
720 //info() << format5(A_PR2("nb_mesh_created",nb_mesh),A_PR(m_is_continue));
721
722 // Regarde si on active le profiling lors de l'initialisation
723 IProfilingService* ps = nullptr;
724 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_PROFILE_CREATE_MESH", true))
725 if (v.value()!=0)
727
728 {
730 ps_sentry.setPrintAtEnd(true);
731
732 if (m_is_continue){
733 for( Integer z=0; z<nb_mesh; ++z ){
734 IPrimaryMesh* mesh = m_mesh_mng->getPrimaryMesh(z);
735 mesh->reloadMesh();
736 }
737 }
738 else{
740 m_case_mesh_master_service->allocateMeshes();
741 }
742 else
743 m_legacy_mesh_builder->readMeshes();
744 }
745 }
746
747 //warning() << "CODE CHANGED IN DEV-X10. NEED TEST";
748 //mesh->computeTiedInterfaces(mbi.m_xml_node);
750 // mesh->readAmrActivator(mbi.m_xml_node);
751
752 // Vérifie la cohérence du maillage
753 for( Integer z=0; z<nb_mesh; ++z ){
754 IMesh* mesh = m_mesh_mng->getMesh(z);
755 mesh->checkValidMesh();
756 mesh->nodesCoordinates().setUpToDate();
757 }
758}
759
760/*---------------------------------------------------------------------------*/
761/*---------------------------------------------------------------------------*/
762
763void SubDomain::
764addMesh(IMesh* mesh)
765{
766 m_mesh_mng->addMesh(mesh);
767}
768
769/*---------------------------------------------------------------------------*/
770/*---------------------------------------------------------------------------*/
771
773meshes() const
774{
775 return m_mesh_mng->meshes();
776}
777
778/*---------------------------------------------------------------------------*/
779/*---------------------------------------------------------------------------*/
780
783{
785 m_legacy_mesh_builder->initializeMeshVariablesFromCaseFile();
786}
787
788/*---------------------------------------------------------------------------*/
789/*---------------------------------------------------------------------------*/
790
793{
794 if (!m_is_continue){
795 IInitialPartitioner* init_part = m_legacy_mesh_builder->m_initial_partitioner.get();
796 if (init_part){
797 info() << "Using custom initial partitioner";
798 init_part->partitionAndDistributeMeshes(m_mesh_mng->meshes());
799 }
800 else{
801 if (m_case_mesh_master_service.get()){
802 m_case_mesh_master_service->partitionMeshes();
803 m_case_mesh_master_service->applyAdditionalOperationsOnMeshes();
804 }
805 else
806 if (m_legacy_mesh_builder->m_use_internal_mesh_partitioner)
807 _doInitialPartition();
808 }
809 }
810
811 // Affichage des informations du maillage
812 for( IMesh* mesh : m_mesh_mng->meshes() ){
814 mh->dumpStats();
815 }
816}
817
818/*---------------------------------------------------------------------------*/
819/*---------------------------------------------------------------------------*/
825{
826}
827
828/*---------------------------------------------------------------------------*/
829/*---------------------------------------------------------------------------*/
830
831void SubDomain::
832_doInitialPartition()
833{
834 // NOTE: Ce code n'est utilisé que par le mécanisme historique de création
835 // de maillage. Lorsqu'on utilise les maillages pour les services, le code
836 // correspondant est dans ArcaneCaseMeshService.
837
838 String test_service = "MeshPartitionerTester";
839
840 for( IMesh* mesh : m_mesh_mng->meshes() ){
841 bool is_mesh_allocated = mesh->isAllocated();
842 info() << "InitialPartitioning mesh=" << mesh->name() << " is_allocated?=" << is_mesh_allocated;
844 continue;
845 // Comme 'parmetis' n'aime pas repartitionner un maillage si un des sous-domaines
846 // est vide (ce qui est le cas si un seul processeur créé les mailles), il
847 // faut d'abord utiliser le partitionneur basique qui répartit les mailles
848 // entre les sous-domaines, puis 'parmetis' s'il est présent
849 if (m_legacy_mesh_builder->m_use_partitioner_tester) {
850 Int64 nb_cell = mesh->nbCell();
851 Int64 min_nb_cell = parallelMng()->reduce(Parallel::ReduceMin,nb_cell);
852 info() << "Min nb cell=" << min_nb_cell;
853 if (min_nb_cell==0)
854 _doInitialPartitionForMesh(mesh, test_service);
855 else
856 info() << "Mesh name=" << mesh->name() << " have cells. Do not use " << test_service;
857 }
858 else
859 info() << "No basic partition first needed";
860 _doInitialPartitionForMesh(mesh, m_legacy_mesh_builder->m_internal_partitioner_name);
861 }
862}
863
864/*---------------------------------------------------------------------------*/
865/*---------------------------------------------------------------------------*/
866
867void SubDomain::
868_doInitialPartitionForMesh(IMesh* mesh, const String& service_name)
869{
870 info() << "DoInitialPartition. mesh=" << mesh->name() << " service=" << service_name;
871
872 String lib_name = service_name;
873 IMeshPartitionerBase* mesh_partitioner_base = nullptr;
874 Ref<IMeshPartitionerBase> mesh_partitioner_base_ref;
875 Ref<IMeshPartitioner> mesh_partitioner_ref;
876
877 ServiceBuilder<IMeshPartitionerBase> sbuilder(this);
878 mesh_partitioner_base_ref = sbuilder.createReference(service_name,mesh,SB_AllowNull);
879 mesh_partitioner_base = mesh_partitioner_base_ref.get();
880
881 if (!mesh_partitioner_base){
882 // Si pas trouvé, recherche avec l'ancienne interface 'IMeshPartitioner' pour des
883 // raisons de compatibilité
884 pwarning() << "No implementation for 'IMeshPartitionerBase' interface found. "
885 << "Searching implementation for legacy 'IMeshPartitioner' interface";
886 ServiceBuilder<IMeshPartitioner> sbuilder_legacy(this);
887 mesh_partitioner_ref = sbuilder_legacy.createReference(service_name,mesh,SB_AllowNull);
888 if (mesh_partitioner_ref.get())
889 mesh_partitioner_base = mesh_partitioner_ref.get();
890 }
891
892 if (!mesh_partitioner_base){
893 // Si pas trouvé, récupère la liste des valeurs possibles et les affiche.
894 StringUniqueArray valid_names;
895 sbuilder.getServicesNames(valid_names);
896 String valid_values = String::join(", ",valid_names);
897 String msg = String::format("The specified service for the initial mesh partitionment ({0}) "
898 "is not available (valid_values={1}). This service has to implement "
899 "interface Arcane::IMeshPartitionerBase",
900 lib_name,valid_values);
901 ARCANE_THROW(ParallelFatalErrorException, msg);
902 }
903
904 bool is_dynamic = mesh->isDynamic();
905 mesh->modifier()->setDynamic(true);
906 mesh->utilities()->partitionAndExchangeMeshWithReplication(mesh_partitioner_base,true);
907 mesh->modifier()->setDynamic(is_dynamic);
908}
909
910/*---------------------------------------------------------------------------*/
911/*---------------------------------------------------------------------------*/
912
915{
916 if (!m_is_initialized)
917 ARCANE_FATAL("Uninitialized session");
918
919 logdate() << "Execution of the end of compute entry points";
920
921 // Sauve les données du gestionnaire d'historique si demandé
922 if (caseOptionsMain()->doTimeHistory())
923 m_time_history_mng->dumpHistory(true);
924
925 m_time_loop_mng->execExitEntryPoints();
926
927 m_parallel_mng->printStats();
928
929 traceMng()->flush();
930}
931
932/*---------------------------------------------------------------------------*/
933/*---------------------------------------------------------------------------*/
934
936checkId(const String& where,const String& id)
937{
938 Int64 len = id.length();
939 const char* str = id.localstr();
940 if (len==0 || !str)
941 throw BadIDException(where,id);
942
943 if (!isalpha(str[0]))
944 throw BadIDException(where,id);
945 for( Int64 i=1; i<len; ++i )
946 if (!isalpha(str[i]) && !isdigit(str[i]) && str[i]!='_' && str[i]!='.')
947 throw BadIDException(where,id);
948}
949
950/*---------------------------------------------------------------------------*/
951/*---------------------------------------------------------------------------*/
952
955{
956 Trace::Setter mci(traceMng(),_msgClassName());
957
958 info() << "Reading the case `" << m_case_full_file_name << "'";
959
961 if (!case_doc)
962 ARCANE_FATAL("No input data");
963
964 m_legacy_mesh_builder->readCaseMeshes();
966}
967
968/*---------------------------------------------------------------------------*/
969/*---------------------------------------------------------------------------*/
970
972commonVariables() const
973{
974 if (!m_module_master)
975 throw BadReferenceException("module master in SubDomain::variablesCommon()");
977}
978
979/*---------------------------------------------------------------------------*/
980/*---------------------------------------------------------------------------*/
981
984{
985 // Info sur la boucle en temps utilisée.
986 {
988 ITimeLoop* time_loop = tlm->usedTimeLoop();
989 XmlElement time_loop_elem(root,"timeloopinfo");
990 XmlElement title(time_loop_elem,"title",time_loop->title());
991 XmlElement description(time_loop_elem,"description",time_loop->description());
992
993 String ustr_userclass("userclass");
994 for( StringCollection::Enumerator j(time_loop->userClasses()); ++j; )
996 }
997
999 XmlElement modules(root,"modules");
1000
1001 String ustr_module("module");
1002 String ustr_name("name");
1003 String ustr_activated("activated");
1004 String ustr_true("true");
1005 String ustr_false("false");
1006 String ustr_variable("variable");
1007 String ustr_variable_ref("variable-ref");
1008 String ustr_ref("ref");
1009 String ustr_datatype("datatype");
1010 String ustr_dimension("dimension");
1011 String ustr_kind("kind");
1012 String ustr_caseblock("caseblock");
1013 String ustr_tagname("tagname");
1014
1015 // Liste des modules avec les variables qu'ils utilisent.
1016 for( ModuleCollection::Enumerator i(moduleMng()->modules()); ++i; ){
1018 module_element.setAttrValue(ustr_name,(*i)->name());
1019 bool is_activated = (*i)->used();
1021 var_ref_list.clear();
1025 variable_element.setAttrValue(ustr_ref,(*j)->name());
1026 }
1027 }
1028
1029 // Liste des variables.
1030 XmlElement variables(root,"variables");
1033 XmlElement elem(variables,ustr_variable);
1034 IVariable* var = *j;
1035 String dim = String::fromNumber(var->dimension());
1036 elem.setAttrValue(ustr_name,var->name());
1037 elem.setAttrValue(ustr_datatype,dataTypeName(var->dataType()));
1038 elem.setAttrValue(ustr_dimension,dim);
1039 elem.setAttrValue(ustr_kind,itemKindName(var->itemKind()));
1040 }
1041
1042 // Liste des blocs d'options
1043 const ICaseMng* cm = caseMng();
1044 CaseOptionsCollection blocks = cm->blocks();
1045 XmlElement blocks_elem(root,"caseblocks");
1046 for( CaseOptionsCollection::Enumerator i(blocks); ++i; ){
1047 const ICaseOptions* block = *i;
1049 block_elem.setAttrValue(ustr_tagname,block->rootTagName());
1050 const IModule* block_module = block->caseModule();
1051 if (block_module)
1052 block_elem.setAttrValue(ustr_module,block_module->name());
1053 }
1054}
1055
1056/*---------------------------------------------------------------------------*/
1057/*---------------------------------------------------------------------------*/
1058
1060meshDimension() const
1061{
1062 return m_default_mesh_handle.mesh()->dimension();
1063}
1064
1065/*---------------------------------------------------------------------------*/
1066/*---------------------------------------------------------------------------*/
1067
1068IMesh* SubDomain::
1069findMesh(const String& name,bool throw_exception)
1070{
1071 return m_mesh_mng->findMesh(name,throw_exception);
1072}
1073
1074/*---------------------------------------------------------------------------*/
1075/*---------------------------------------------------------------------------*/
1076
1077void SubDomain::
1078_notifyWriteCheckpoint()
1079{
1080 info(4) << "SubDomain::_notifyWriteCheckpoint()";
1081 {
1082 Properties time_stats_properties(propertyMng(),"TimeStats");
1083 timeStats()->saveTimeValues(&time_stats_properties);
1084 }
1085 {
1086 Properties p(propertyMng(),"MessagePassingStats");
1087 parallelMng()->stat()->saveValues(traceMng(),&p);
1088 }
1089}
1090
1091/*---------------------------------------------------------------------------*/
1092/*---------------------------------------------------------------------------*/
1093
1096{
1097 m_is_initialized = true;
1098 info(4) << "SubDomain::setIsInitialized()";
1099 {
1101 timeStats()->mergeTimeValues(&time_stats_properties);
1102 }
1103 {
1104 Properties p(propertyMng(),"MessagePassingStats");
1105 parallelMng()->stat()->mergeValues(traceMng(),&p);
1106 }
1107}
1108
1109/*---------------------------------------------------------------------------*/
1110/*---------------------------------------------------------------------------*/
1118{
1119 bool do_print_affinity = false;
1120 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_PRINT_CPUAFFINITY", true))
1121 do_print_affinity = (v.value()>0);
1122 if (!do_print_affinity)
1123 return;
1124 info() << "PrintCPUAffinity";
1126
1127 // Il est possible que certains sous-domaines n'aient pas d'instance
1128 // de 'IProcessorAffinityService'. Dans ce cas on n'affichera que des '0'.
1129
1131 const Int32 nb_byte = 48;
1132 if (pas){
1133 String cpuset = pas->cpuSetString();
1134 cpuset_bytes = cpuset.bytes();
1135 }
1136 cpuset_bytes.resize(nb_byte,Byte{0});
1137 cpuset_bytes[nb_byte-1] = Byte{0};
1138
1139 IParallelMng* pm = parallelMng();
1140 const Int32 nb_rank = pm->commSize();
1141 bool is_master = pm->isMasterIO();
1142
1144 if (is_master)
1145 all_cpuset_bytes.resize(nb_rank,nb_byte);
1146 pm->gather(cpuset_bytes,all_cpuset_bytes.viewAsArray(),pm->masterIORank());
1147 if (is_master)
1148 for( Int32 i=0; i<nb_rank; ++i ){
1149 info() << "CPUAffinity " << Trace::Width(5) << i << " = " << all_cpuset_bytes[i].data();
1150 }
1151}
1152
1153/*---------------------------------------------------------------------------*/
1154/*---------------------------------------------------------------------------*/
1155
1156/*---------------------------------------------------------------------------*/
1157/*---------------------------------------------------------------------------*/
1158
1159template<typename V> void SubDomain::
1160_applyPropertyVisitor(V& p)
1161{
1162 auto b = p.builder();
1163
1164 p << b.addBool("LegacyMeshCreation")
1165 .addDescription("Using legacy mesh creation")
1166 .addGetter([](auto a) { return a.x.isLegacyMeshCreation(); })
1167 .addSetter([](auto a) { a.x._setLegacyMeshCreation(a.v); });
1168}
1169
1170/*---------------------------------------------------------------------------*/
1171/*---------------------------------------------------------------------------*/
1172
1173ARCANE_REGISTER_PROPERTY_CLASS(SubDomain,());
1174
1175/*---------------------------------------------------------------------------*/
1176/*---------------------------------------------------------------------------*/
1177
1178} // End namespace Arcane
1179
1180/*---------------------------------------------------------------------------*/
1181/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
void setDeviceId(DeviceId name)
Positionne le device associé au Runner associé.
Interface du gestionnaire des accélérateurs.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
static const IDeviceInfoList * deviceInfoList(eExecutionPolicy policy)
Liste des devices pour la politique d'exécution policy.
Definition Runner.cc:447
const DeviceInfo & deviceInfo() const
Information sur le device associé à cette instance.
Definition Runner.cc:430
eExecutionPolicy executionPolicy() const
Politique d'exécution associée.
Definition Runner.cc:300
Informations sur une application.
Tableau d'items de types quelconques.
Exception sur un identifiant non valide.
Exception lorsqu'on essaie de déréférencer un pointer nul.
Noms des noeuds XML d'un jeu de données Arcane.
Informations pour construire une option de jeu de données.
Classe de base d'une liste d'options du jeu de données.
Definition CaseOptions.h:57
Variables communes d'un cas.
Lecteurs de fichiers de configuration.
Classe gérant un répertoire.
Definition Directory.h:33
Interface de l'application.
virtual IMainFactory * mainFactory() const =0
Manufacture principale.
virtual IPhysicalUnitSystemService * getPhysicalUnitSystemService()=0
Service gérant les systèmes d'unités physiques.
virtual IConfigurationMng * configurationMng() const =0
Gestionnaire des configurations d'exécution.
virtual bool hasGarbageCollector() const =0
Indique que certains objets sont gérés via un ramasse miette.
virtual const ApplicationInfo & applicationInfo() const =0
Informations sur l'exécutable.
Interface de la classe de base des objets principaux arcane.
Definition IBase.h:38
virtual IRessourceMng * ressourceMng() const =0
Gestionnaire de ressources.
Interface d'une classe gérant un document XML du jeu de données.
Interface du gestionnaire de cas.
Definition ICaseMng.h:56
virtual ICaseDocument * caseDocument()=0
Document XML du jeu de données (peut être nul si pas de jeu de donneés)
Interface d'une liste d'options du jeu de données.
Interface d'une liste d'options du jeu de données.
virtual IModule * caseModule() const =0
Retourne le module associé ou nullptr s'il n'y en a pas.
virtual String rootTagName() const =0
Nom de l'élément dans le langage du jeu de données.
Interface du gestionnaire des informations des protections.
Interface d'une configuration.
Interface d'un service d'exécution direct.
Interface d'une classe gérant un répertoire.
Definition IDirectory.h:31
Interface du gestionnaire de point d'entrée.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:42
Interface d'un partitionneur initial.
Interface d'enregistrement des variables pour l'equilibrage de charge.
Manufacture des classes d'Arcane.
Interface d'un collecteur d'informations sur l'usage mémoire.
Definition IMemoryInfo.h:60
virtual String name() const =0
Nom du maillage.
virtual Integer nbCell()=0
Nombre de mailles du maillage.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
Interface du gestionnaire des maillages.
Definition IMeshMng.h:40
static IMeshStats * create(ITraceMng *trace, IMesh *mesh, IParallelMng *pm)
Création d'une instance par défaut.
Definition MeshStats.cc:42
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual bool isAllocated()=0
Vrai si le maillage est allouée.
virtual void checkValidMesh()=0
Vérification de la validité des structues internes de maillage (interne)
Interface du module principal.
virtual CommonVariables * commonVariables()=0
Accès aux variables 'communes' partagés entre tout service et module.
virtual CaseOptionsMain * caseoptions()=0
Retourne les options de ce module.
Interface du gestionnaire de modules.
Definition IModuleMng.h:39
Interface d'un module.
Definition IModule.h:39
Interface d'un observable.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual IParallelReplication * replication() const =0
Informations sur la réplication.
virtual IStat * stat()=0
Gestionnaire des statistiques.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void gather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf, Int32 rank)=0
Effectue un regroupement sur un processeurs. Il s'agit d'une opération collective....
virtual Integer masterIORank() const =0
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface d'un système d'unité.
virtual void reloadMesh()=0
Recharge le maillage à partir des variables protégées.
Interface d'un service de de trace des appels de fonctions.
Interface d'un service de profiling.
Interface du gestionnaire des propriétés.
Interface d'un gestionnaire de ressource.
Interface du gestionnaire de services.
Definition IServiceMng.h:31
Interface d'une session d'exécution d'un cas.
Definition ISession.h:44
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IPropertyMng * propertyMng() const =0
Gestionnaire de propriétés.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Classe gérant un historique de valeurs.
Interface du gestionnaire de la boucle en temps.
Interface d'une boucle en temps.
Definition ITimeLoop.h:41
Interface gérant les statistiques sur les temps d'exécution.
Definition ITimeStats.h:48
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:53
Interface du gestionnaire de variables.
virtual void variables(VariableRefCollection v, IModule *i)=0
Donne l'ensemble des variables du module i.
Interface d'une variable.
Definition IVariable.h:54
virtual void syncReferences()=0
Synchronise les références.
virtual IObservable * readObservable()=0
Observable en lecture.
virtual IObservable * writeObservable()=0
Observable en écriture.
@ PPrivate
Indique que la variable est privée.
Definition IVariable.h:114
Construction du maillage via la méthode "historique".
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Handle sur un maillage.
Definition MeshHandle.h:47
IMesh * mesh() const
Maillage associé.
Classe de base d'un observable.
void detachAllObservers() override
Détache tous les observeurs associés à cette instance.
void notifyAllObservers() override
Notifie tous les observateurs.
Definition Observable.cc:72
Liste d'observateurs.
void addObserver(T *obj, void(T::*func)(const IObservable &), IObservable *oba)
Ajoute un observateur.
Classe permettant de démarrer et arrêter automatiquement un service.
Liste de propriétés.
Definition Properties.h:64
Classe pour gérer la lecture/écriture des propriétés dans les protections/reprises.
Definition SubDomain.cc:162
Implémentation d'un gestionnaire de sous-domaine.
Definition SubDomain.cc:154
void readOrReloadMeshes() override
Lit ou relit les maillages.
Definition SubDomain.cc:707
IParallelMng * allReplicaParallelMng() const override
Retourne le gestionnaire de parallélisme pour tous les réplicats.
Definition SubDomain.cc:276
String objectLocalName() const override
Nom local de l'objet.
Definition SubDomain.cc:212
IPhysicalUnitSystem * physicalUnitSystem() override
Système d'unité du sous-domaine.
Definition SubDomain.cc:233
String m_case_name
Nom du cas.
Definition SubDomain.cc:331
IModuleMng * moduleMng() override
Retourne le gestionnaire de modules.
Definition SubDomain.cc:223
IThreadMng * threadMng() override
Retourne le gestionnaire de thread.
Definition SubDomain.cc:277
IParallelMng * parallelMng() override
Retourne le gestionnaire de parallélisme.
Definition SubDomain.cc:275
Observable m_on_destroy_observable
Observable lors d'une destruction.
Definition SubDomain.cc:337
const String & caseName() const override
Nom du cas.
Definition SubDomain.cc:260
void setListingDirectory(const IDirectory &dir) override
Positionne le chemin de sortie des infos listing.
Definition SubDomain.cc:283
Ref< ICaseMng > m_case_mng
Gestionnaire du jeu de données.
Definition SubDomain.cc:315
IEntryPointMng * entryPointMng() override
Retourne le gestionnaire de points d'entrée.
Definition SubDomain.cc:224
ILoadBalanceMng * loadBalanceMng() override
Retourne le gestionnaire d'équilibrage de charge.
Definition SubDomain.cc:234
ISession * m_session
Session.
Definition SubDomain.cc:306
IBase * objectParent() const override
Parent de cet objet.
Definition SubDomain.cc:210
void setIsContinue() override
Positionne un flag indiquant qu'on effectue une reprise.
Definition SubDomain.cc:243
const String & caseFullFileName() const override
Chemin complet du fichier contenant le jeu de données.
Definition SubDomain.cc:258
void doInitModules() override
Appelle les points d'entrée d'initialisation du module.
Definition SubDomain.cc:824
IConfiguration * configuration() override
Configuration associée.
Definition SubDomain.cc:238
ICaseDocument * caseDocument() override
Document XML du cas.
Definition SubDomain.cc:255
IServiceMng * serviceMng() const override
Gestionnaire de services.
Definition SubDomain.cc:219
Ref< IParallelMng > m_all_replica_parallel_mng
Gestionnaire du parallélisme pour tous les réplicats.
Definition SubDomain.cc:309
IIOMng * ioMng() override
Retourne le gestionnaire des entrées/sorties.
Definition SubDomain.cc:221
void setInitialPartitioner(IInitialPartitioner *partitioner) override
Positionne le partitionneur initial.
Definition SubDomain.cc:263
const CommonVariables & commonVariables() const override
Informations sur les variables standards.
Definition SubDomain.cc:972
void setStorageDirectory(const IDirectory &dir) override
Positionne le chemin de sortie des exportations nécessitant un archivage.
Definition SubDomain.cc:281
void build() override
Construit les membres de l'instance. L'instance n'est pas utilisable tant que cette méthode n'a pas é...
Definition SubDomain.cc:436
bool m_has_mesh_service
Indique si on utilise le mécanisme de service pour lire le maillage.
Definition SubDomain.cc:346
ITimeHistoryMng * timeHistoryMng() override
Retourne le gestionnaire d'historique.
Definition SubDomain.cc:284
IMemoryInfo * memoryInfo() const override
Gestionnaire d'informations mémoire.
Definition SubDomain.cc:232
bool m_is_initialized
true si initialisé
Definition SubDomain.cc:329
String m_case_full_file_name
Chemin d'accès du cas.
Definition SubDomain.cc:330
const IDirectory & exportDirectory() const override
Répertoire de base des exportations.
Definition SubDomain.cc:278
void dumpInfo(std::ostream &) override
Affiche des informations sur l'instance.
Definition SubDomain.cc:656
void fillCaseBytes(ByteArray &bytes) const override
Remplit bytes avec le contenue du jeu de données.
Definition SubDomain.cc:261
IModuleMaster * moduleMaster() const override
Interface du module maître.
Definition SubDomain.cc:236
ScopedPtrT< ILoadBalanceMng > m_lb_mng
Gestionnaire de caracteristiques pour l'equilibrage.
Definition SubDomain.cc:340
IVariableMng * variableMng() override
Retourne le gestionnaire de variables.
Definition SubDomain.cc:222
ScopedPtrT< IModuleMng > m_module_mng
Gestionnaire des modules.
Definition SubDomain.cc:313
const IDirectory & storageDirectory() const override
Répertoire de base des exportations nécessitant un archivage.
Definition SubDomain.cc:280
Int32 subDomainId() const override
Numéro du sous-domaine associé à ce gestionnaire.
Definition SubDomain.cc:241
Ref< IPropertyMng > m_property_mng
Gestionnaire de propriétés.
Definition SubDomain.cc:318
IMeshMng * meshMng() const override
Retourne le gestionnaire de maillage.
Definition SubDomain.cc:235
void _printCPUAffinity()
Affiche l'affinité CPU de tous les rangs.
CaseOptionsMain * m_case_config
Config du cas.
Definition SubDomain.cc:333
void dumpInternalInfos(XmlNode &root) override
Sort les informations internes de l'architecture. Les informations sont stockées dans un arbre XML ay...
Definition SubDomain.cc:983
IApplication * m_application
Gestionnaire principal.
Definition SubDomain.cc:307
void allocateMeshes() override
Allocation des maillages.
Definition SubDomain.cc:674
IObservable * onDestroyObservable() override
Notification avant destruction du sous-domaine.
Definition SubDomain.cc:289
ByteUniqueArray m_case_bytes
Données du cas.
Definition SubDomain.cc:332
void doInitMeshPartition() override
Applique le partitionnement de maillage de l'initialisation.
Definition SubDomain.cc:792
ITimerMng * timerMng() const override
Retourne le gestionnaire de timers.
Definition SubDomain.cc:226
VersionInfo objectVersion() const override
Numéro de version du service.
Definition SubDomain.cc:213
ICaseMng * caseMng() override
Retourne le gestionnaire du jeu de données.
Definition SubDomain.cc:225
Ref< IParallelMng > m_parallel_mng
Gestionnaire du parallélisme.
Definition SubDomain.cc:308
ConstArrayView< IMesh * > meshes() const override
Listes des maillages du sous-domaine.
Definition SubDomain.cc:773
ScopedPtrT< IPhysicalUnitSystem > m_physical_unit_system
Système d'unité physique.
Definition SubDomain.cc:322
const IDirectory & listingDirectory() const override
Répertoire de base des listings (logs, info exécution).
Definition SubDomain.cc:282
void setExportDirectory(const IDirectory &dir) override
Positionne le chemin de sortie des exportations (protections et reprises)
Definition SubDomain.cc:279
void setIsInitialized() override
Indique que le sous-domaine est initialié.
ScopedPtrT< IEntryPointMng > m_entry_point_mng
Gestionnaire des points d'entrée.
Definition SubDomain.cc:314
const IConfiguration * configuration() const override
Configuration associée.
Definition SubDomain.cc:237
ScopedPtrT< IServiceMng > m_service_mng
Gestionnaire des services.
Definition SubDomain.cc:321
IModuleMaster * m_module_master
Module maitre.
Definition SubDomain.cc:325
ScopedPtrT< ITimeHistoryMng > m_time_history_mng
Gestionnaire d'historique.
Definition SubDomain.cc:326
IDirectExecution * directExecution() const override
Service d'exécution directe (ou null)
Definition SubDomain.cc:290
const MeshHandle & defaultMeshHandle() override
Handle sur le maillage par défaut.
Definition SubDomain.cc:249
ScopedPtrT< IVariableMng > m_variable_mng
Gestionnaire des variables.
Definition SubDomain.cc:312
void readCaseMeshes() override
Lit les informations de maillage du jeu de données.
Definition SubDomain.cc:954
ScopedPtrT< ICheckpointMng > m_checkpoint_mng
Gestionnaire de protections.
Definition SubDomain.cc:317
Integer meshDimension() const override
Dimension du maillage (1D, 2D ou 3D).
void initialize() override
Initialise l'instance. L'instance n'est pas utilisable tant que cette méthode n'a pas été appelée.
Definition SubDomain.cc:463
void doExitModules() override
Exécution des modules de fin d'exécution.
Definition SubDomain.cc:914
Directory m_export_directory
Répertoire d'exportation.
Definition SubDomain.cc:334
const CaseOptionsMain * caseOptionsMain() const override
Options générales du jeu de donnée.
Definition SubDomain.cc:274
ITimeStats * m_time_stats
Statistiques sur les temps d'exécution.
Definition SubDomain.cc:319
ISession * session() const override
Session.
Definition SubDomain.cc:218
String objectNamespaceURI() const override
Namespace de l'objet.
Definition SubDomain.cc:211
ScopedPtrT< IMemoryInfo > m_memory_info
Informations sur l'utilisation mémoire.
Definition SubDomain.cc:311
void setCaseName(const String &case_name) override
Positionne le nom du cas.
Definition SubDomain.cc:262
bool isContinue() const override
Vrai si on effectue une reprise, faux sinon.
Definition SubDomain.cc:244
IMainFactory * mainFactory() override
Manufacture principale.
Definition SubDomain.cc:217
ICheckpointMng * checkpointMng() const override
Gestionnaire de protections.
Definition SubDomain.cc:227
IRessourceMng * ressourceMng() const override
Gestionnaire de ressources.
Definition SubDomain.cc:230
IPropertyMng * propertyMng() const override
Gestionnaire de propriétés.
Definition SubDomain.cc:228
ScopedPtrT< IConfiguration > m_configuration
Configuration.
Definition SubDomain.cc:341
ITimeLoopMng * timeLoopMng() override
Retourne le gestionnaire de la boucle en temps.
Definition SubDomain.cc:220
void checkId(const String &where, const String &id) override
Vérifie qu'un identifiant est valide.
Definition SubDomain.cc:936
Directory m_listing_directory
Répertoire des listings.
Definition SubDomain.cc:336
IApplication * application() override
Application.
Definition SubDomain.cc:256
ScopedPtrT< ITimeLoopMng > m_time_loop_mng
Gestionnaire de la boucle en temps.
Definition SubDomain.cc:320
Directory m_storage_directory
Répertoire d'archivage.
Definition SubDomain.cc:335
ITimerMng * m_timer_mng
Gestionnaire des timers.
Definition SubDomain.cc:316
ITraceMng * traceMng() const override
Gestionnaire de traces.
Definition SubDomain.cc:231
ITimeStats * timeStats() const override
Statistiques des temps d'exécution.
Definition SubDomain.cc:229
IMesh * defaultMesh() override
Maillage par défaut.
Definition SubDomain.cc:248
void initializeMeshVariablesFromCaseFile() override
Initialise les variables dont les valeurs sont spécifiées dans le jeu de données.
Definition SubDomain.cc:782
void setDirectExecution(IDirectExecution *v) override
Positionne le service d'exécution directe.
Definition SubDomain.cc:291
bool isInitialized() const override
Indique si la session a été initialisée.
Definition SubDomain.cc:252
Int32 nbSubDomain() const override
Nombre total de sous-domaines.
Definition SubDomain.cc:242
IAcceleratorMng * acceleratorMng() override
Gestionnaire de l'accélérateur associé
Definition SubDomain.cc:239
const ApplicationInfo & applicationInfo() const override
Informations sur l'exécutable.
Definition SubDomain.cc:254
ScopedPtrT< IIOMng > m_io_mng
Gestionnaire des entrées/sorties.
Definition SubDomain.cc:310
Postionne le nom de l'action en cours d'exécution.
Definition Timer.h:110
Paramètres nécessaires à la construction d'une variable.
Collection de variables.
IArrayDataInternalT< T > * _internalTrueData()
IVariable * variable() const
Variable associée.
Informations sur une version.
Definition VersionInfo.h:46
Elément d'un arbre DOM.
Definition XmlNode.h:396
Noeud d'un arbre DOM.
Definition XmlNode.h:51
API EN COURS DE CONCEPTION. NE PAS UTILISER.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
virtual void flush()=0
Flush tous les flots.
Chaîne de caractères unicode.
TraceMessage pwarning() const
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage logdate() const
Flot pour un message de log précédé de la date.
Positionne une classe de message.
Formattage du flot en longueur.
Vecteur 1D de données avec sémantique par valeur (style STL).
Espace de nom pour l'utilisation des accélérateurs.
void dumpDateAndMemoryUsage(IParallelMng *pm, ITraceMng *tm)
Écrit dans tm la date et la mémoire consommée.
Definition Parallel.cc:162
void callDotNETGarbageCollector()
Appelle le Garbage Collector de '.Net' s'il est disponible.
IProfilingService * getProfilingService()
Service utilisé pour obtenir pour obtenir des informations de profiling.
IProcessorAffinityService * getProcessorAffinityService()
Service utilisé pour la gestion de l'affinité des processeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ SB_AllowNull
Autorise l'absence du service.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:634
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
Definition UtilsTypes.h:525
const char * dataTypeName(eDataType type)
Nom du type de donnée.
Definition DataTypes.cc:70