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