Arcane  v3.16.6.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-2025 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/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/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/ConfigurationPropertyReader.h"
81#include "arcane/core/parallel/IStat.h"
82
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 {
721 ProfilingSentryWithInitialize ps_sentry(ps);
722 ps_sentry.setPrintAtEnd(true);
723
724 if (m_is_continue){
725 for( Integer z=0; z<nb_mesh; ++z ){
726 IPrimaryMesh* mesh = m_mesh_mng->getPrimaryMesh(z);
727 mesh->reloadMesh();
728 }
729 }
730 else{
732 m_case_mesh_master_service->allocateMeshes();
733 }
734 else
735 m_legacy_mesh_builder->readMeshes();
736 }
737 }
738
739 //warning() << "CODE CHANGED IN DEV-X10. NEED TEST";
740 //mesh->computeTiedInterfaces(mbi.m_xml_node);
742 // mesh->readAmrActivator(mbi.m_xml_node);
743
744 // Vérifie la cohérence du maillage
745 for( Integer z=0; z<nb_mesh; ++z ){
746 IMesh* mesh = m_mesh_mng->getMesh(z);
747 mesh->checkValidMesh();
748 mesh->nodesCoordinates().setUpToDate();
749 }
750}
751
752/*---------------------------------------------------------------------------*/
753/*---------------------------------------------------------------------------*/
754
756addMesh(IMesh* mesh)
757{
758 m_mesh_mng->addMesh(mesh);
759}
760
761/*---------------------------------------------------------------------------*/
762/*---------------------------------------------------------------------------*/
763
765meshes() const
766{
767 return m_mesh_mng->meshes();
768}
769
770/*---------------------------------------------------------------------------*/
771/*---------------------------------------------------------------------------*/
772
775{
777 m_legacy_mesh_builder->initializeMeshVariablesFromCaseFile();
778}
779
780/*---------------------------------------------------------------------------*/
781/*---------------------------------------------------------------------------*/
782
785{
786 if (!m_is_continue){
787 IInitialPartitioner* init_part = m_legacy_mesh_builder->m_initial_partitioner.get();
788 if (init_part){
789 info() << "Using custom initial partitioner";
790 init_part->partitionAndDistributeMeshes(m_mesh_mng->meshes());
791 }
792 else{
793 if (m_case_mesh_master_service.get()){
794 m_case_mesh_master_service->partitionMeshes();
795 m_case_mesh_master_service->applyAdditionalOperationsOnMeshes();
796 }
797 else
798 if (m_legacy_mesh_builder->m_use_internal_mesh_partitioner)
799 _doInitialPartition();
800 }
801 }
802
803 // Affichage des informations du maillage
804 for( IMesh* mesh : m_mesh_mng->meshes() ){
806 mh->dumpStats();
807 }
808}
809
810/*---------------------------------------------------------------------------*/
811/*---------------------------------------------------------------------------*/
817{
818}
819
820/*---------------------------------------------------------------------------*/
821/*---------------------------------------------------------------------------*/
822
823void SubDomain::
824_doInitialPartition()
825{
826 // NOTE: Ce code n'est utilisé que par le mécanisme historique de création
827 // de maillage. Lorsqu'on utilise les maillages pour les services, le code
828 // correspondant est dans ArcaneCaseMeshService.
829
830 String test_service = "MeshPartitionerTester";
831
832 for( IMesh* mesh : m_mesh_mng->meshes() ){
833 bool is_mesh_allocated = mesh->isAllocated();
834 info() << "InitialPartitioning mesh=" << mesh->name() << " is_allocated?=" << is_mesh_allocated;
835 if (!is_mesh_allocated)
836 continue;
837 // Comme 'parmetis' n'aime pas repartitionner un maillage si un des sous-domaines
838 // est vide (ce qui est le cas si un seul processeur créé les mailles), il
839 // faut d'abord utiliser le partitionneur basique qui répartit les mailles
840 // entre les sous-domaines, puis 'parmetis' s'il est présent
841 if (m_legacy_mesh_builder->m_use_partitioner_tester) {
842 Int64 nb_cell = mesh->nbCell();
843 Int64 min_nb_cell = parallelMng()->reduce(Parallel::ReduceMin,nb_cell);
844 info() << "Min nb cell=" << min_nb_cell;
845 if (min_nb_cell==0)
846 _doInitialPartitionForMesh(mesh, test_service);
847 else
848 info() << "Mesh name=" << mesh->name() << " have cells. Do not use " << test_service;
849 }
850 else
851 info() << "No basic partition first needed";
852 _doInitialPartitionForMesh(mesh, m_legacy_mesh_builder->m_internal_partitioner_name);
853 }
854}
855
856/*---------------------------------------------------------------------------*/
857/*---------------------------------------------------------------------------*/
858
859void SubDomain::
860_doInitialPartitionForMesh(IMesh* mesh, const String& service_name)
861{
862 info() << "DoInitialPartition. mesh=" << mesh->name() << " service=" << service_name;
863
864 String lib_name = service_name;
865 IMeshPartitionerBase* mesh_partitioner_base = nullptr;
866 Ref<IMeshPartitionerBase> mesh_partitioner_base_ref;
867 Ref<IMeshPartitioner> mesh_partitioner_ref;
868
869 ServiceBuilder<IMeshPartitionerBase> sbuilder(this);
870 mesh_partitioner_base_ref = sbuilder.createReference(service_name,mesh,SB_AllowNull);
871 mesh_partitioner_base = mesh_partitioner_base_ref.get();
872
873 if (!mesh_partitioner_base){
874 // Si pas trouvé, recherche avec l'ancienne interface 'IMeshPartitioner' pour des
875 // raisons de compatibilité
876 pwarning() << "No implementation for 'IMeshPartitionerBase' interface found. "
877 << "Searching implementation for legacy 'IMeshPartitioner' interface";
878 ServiceBuilder<IMeshPartitioner> sbuilder_legacy(this);
879 mesh_partitioner_ref = sbuilder_legacy.createReference(service_name,mesh,SB_AllowNull);
880 if (mesh_partitioner_ref.get())
881 mesh_partitioner_base = mesh_partitioner_ref.get();
882 }
883
884 if (!mesh_partitioner_base){
885 // Si pas trouvé, récupère la liste des valeurs possibles et les affiche.
886 StringUniqueArray valid_names;
887 sbuilder.getServicesNames(valid_names);
888 String valid_values = String::join(", ",valid_names);
889 String msg = String::format("The specified service for the initial mesh partitionment ({0}) "
890 "is not available (valid_values={1}). This service has to implement "
891 "interface Arcane::IMeshPartitionerBase",
892 lib_name,valid_values);
893 ARCANE_THROW(ParallelFatalErrorException, msg);
894 }
895
896 bool is_dynamic = mesh->isDynamic();
897 mesh->modifier()->setDynamic(true);
898 mesh->utilities()->partitionAndExchangeMeshWithReplication(mesh_partitioner_base,true);
899 mesh->modifier()->setDynamic(is_dynamic);
900}
901
902/*---------------------------------------------------------------------------*/
903/*---------------------------------------------------------------------------*/
904
907{
908 if (!m_is_initialized)
909 ARCANE_FATAL("Uninitialized session");
910
911 logdate() << "Execution of the end of compute entry points";
912
913 // Sauve les données du gestionnaire d'historique si demandé
914 if (caseOptionsMain()->doTimeHistory())
915 m_time_history_mng->dumpHistory(true);
916
917 m_time_loop_mng->execExitEntryPoints();
918
919 m_parallel_mng->printStats();
920
921 traceMng()->flush();
922}
923
924/*---------------------------------------------------------------------------*/
925/*---------------------------------------------------------------------------*/
926
928checkId(const String& where,const String& id)
929{
930 Int64 len = id.length();
931 const char* str = id.localstr();
932 if (len==0 || !str)
933 throw BadIDException(where,id);
934
935 if (!isalpha(str[0]))
936 throw BadIDException(where,id);
937 for( Int64 i=1; i<len; ++i )
938 if (!isalpha(str[i]) && !isdigit(str[i]) && str[i] != '_' && str[i] != '.' && str[i] != '-')
939 throw BadIDException(where,id);
940}
941
942/*---------------------------------------------------------------------------*/
943/*---------------------------------------------------------------------------*/
944
947{
948 Trace::Setter mci(traceMng(),_msgClassName());
949
950 info() << "Reading the case `" << m_case_full_file_name << "'";
951
952 ICaseDocument* case_doc = caseDocument();
953 if (!case_doc)
954 ARCANE_FATAL("No input data");
955
956 m_legacy_mesh_builder->readCaseMeshes();
957 m_case_config = m_module_master->caseoptions();
958}
959
960/*---------------------------------------------------------------------------*/
961/*---------------------------------------------------------------------------*/
962
964commonVariables() const
965{
966 if (!m_module_master)
967 throw BadReferenceException("module master in SubDomain::variablesCommon()");
968 return *m_module_master->commonVariables();
969}
970
971/*---------------------------------------------------------------------------*/
972/*---------------------------------------------------------------------------*/
973
976{
977 // Info sur la boucle en temps utilisée.
978 {
979 ITimeLoopMng* tlm = timeLoopMng();
980 ITimeLoop* time_loop = tlm->usedTimeLoop();
981 XmlElement time_loop_elem(root,"timeloopinfo");
982 XmlElement title(time_loop_elem,"title",time_loop->title());
983 XmlElement description(time_loop_elem,"description",time_loop->description());
984
985 String ustr_userclass("userclass");
986 for( StringCollection::Enumerator j(time_loop->userClasses()); ++j; )
987 XmlElement elem(time_loop_elem,ustr_userclass,*j);
988 }
989
990 VariableRefList var_ref_list;
991 XmlElement modules(root,"modules");
992
993 String ustr_module("module");
994 String ustr_name("name");
995 String ustr_activated("activated");
996 String ustr_true("true");
997 String ustr_false("false");
998 String ustr_variable("variable");
999 String ustr_variable_ref("variable-ref");
1000 String ustr_ref("ref");
1001 String ustr_datatype("datatype");
1002 String ustr_dimension("dimension");
1003 String ustr_kind("kind");
1004 String ustr_caseblock("caseblock");
1005 String ustr_tagname("tagname");
1006
1007 // Liste des modules avec les variables qu'ils utilisent.
1008 for( ModuleCollection::Enumerator i(moduleMng()->modules()); ++i; ){
1009 XmlElement module_element(modules,ustr_module);
1010 module_element.setAttrValue(ustr_name,(*i)->name());
1011 bool is_activated = (*i)->used();
1012 module_element.setAttrValue(ustr_activated,is_activated ? ustr_true : ustr_false);
1013 var_ref_list.clear();
1014 variableMng()->variables(var_ref_list,*i);
1015 for( VariableRefList::Enumerator j(var_ref_list); ++j; ){
1016 XmlElement variable_element(module_element,ustr_variable_ref);
1017 variable_element.setAttrValue(ustr_ref,(*j)->name());
1018 }
1019 }
1020
1021 // Liste des variables.
1022 XmlElement variables(root,"variables");
1023 VariableCollection var_prv_list = variableMng()->variables();
1024 for( VariableCollection::Enumerator j(var_prv_list); ++j; ){
1025 XmlElement elem(variables,ustr_variable);
1026 IVariable* var = *j;
1027 String dim = String::fromNumber(var->dimension());
1028 elem.setAttrValue(ustr_name,var->name());
1029 elem.setAttrValue(ustr_datatype,dataTypeName(var->dataType()));
1030 elem.setAttrValue(ustr_dimension,dim);
1031 elem.setAttrValue(ustr_kind,itemKindName(var->itemKind()));
1032 }
1033
1034 // Liste des blocs d'options
1035 const ICaseMng* cm = caseMng();
1036 CaseOptionsCollection blocks = cm->blocks();
1037 XmlElement blocks_elem(root,"caseblocks");
1038 for( CaseOptionsCollection::Enumerator i(blocks); ++i; ){
1039 const ICaseOptions* block = *i;
1040 XmlElement block_elem(blocks_elem,ustr_caseblock);
1041 block_elem.setAttrValue(ustr_tagname,block->rootTagName());
1042 const IModule* block_module = block->caseModule();
1043 if (block_module)
1044 block_elem.setAttrValue(ustr_module,block_module->name());
1045 }
1046}
1047
1048/*---------------------------------------------------------------------------*/
1049/*---------------------------------------------------------------------------*/
1050
1052meshDimension() const
1053{
1054 return m_default_mesh_handle.mesh()->dimension();
1055}
1056
1057/*---------------------------------------------------------------------------*/
1058/*---------------------------------------------------------------------------*/
1059
1061findMesh(const String& name,bool throw_exception)
1062{
1063 return m_mesh_mng->findMesh(name,throw_exception);
1064}
1065
1066/*---------------------------------------------------------------------------*/
1067/*---------------------------------------------------------------------------*/
1068
1069void SubDomain::
1070_notifyWriteCheckpoint()
1071{
1072 info(4) << "SubDomain::_notifyWriteCheckpoint()";
1073 {
1074 Properties time_stats_properties(propertyMng(),"TimeStats");
1075 timeStats()->saveTimeValues(&time_stats_properties);
1076 }
1077 {
1078 Properties p(propertyMng(),"MessagePassingStats");
1079 parallelMng()->stat()->saveValues(traceMng(),&p);
1080 }
1081}
1082
1083/*---------------------------------------------------------------------------*/
1084/*---------------------------------------------------------------------------*/
1085
1088{
1089 m_is_initialized = true;
1090 info(4) << "SubDomain::setIsInitialized()";
1091 {
1092 Properties time_stats_properties(propertyMng(),"TimeStats");
1093 timeStats()->mergeTimeValues(&time_stats_properties);
1094 }
1095 {
1096 Properties p(propertyMng(),"MessagePassingStats");
1098 }
1099}
1100
1101/*---------------------------------------------------------------------------*/
1102/*---------------------------------------------------------------------------*/
1110{
1111 bool do_print_affinity = false;
1112 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_PRINT_CPUAFFINITY", true))
1113 do_print_affinity = (v.value()>0);
1114 if (!do_print_affinity)
1115 return;
1116 info() << "PrintCPUAffinity";
1118
1119 // Il est possible que certains sous-domaines n'aient pas d'instance
1120 // de 'IProcessorAffinityService'. Dans ce cas on n'affichera que des '0'.
1121
1122 UniqueArray<Byte> cpuset_bytes;
1123 const Int32 nb_byte = 48;
1124 if (pas){
1125 String cpuset = pas->cpuSetString();
1126 cpuset_bytes = cpuset.bytes();
1127 }
1128 cpuset_bytes.resize(nb_byte,Byte{0});
1129 cpuset_bytes[nb_byte-1] = Byte{0};
1130
1131 IParallelMng* pm = parallelMng();
1132 const Int32 nb_rank = pm->commSize();
1133 bool is_master = pm->isMasterIO();
1134
1135 UniqueArray2<Byte> all_cpuset_bytes;
1136 if (is_master)
1137 all_cpuset_bytes.resize(nb_rank,nb_byte);
1138 pm->gather(cpuset_bytes,all_cpuset_bytes.viewAsArray(),pm->masterIORank());
1139 if (is_master)
1140 for( Int32 i=0; i<nb_rank; ++i ){
1141 info() << "CPUAffinity " << Trace::Width(5) << i << " = " << all_cpuset_bytes[i].data();
1142 }
1143}
1144
1145/*---------------------------------------------------------------------------*/
1146/*---------------------------------------------------------------------------*/
1147
1148/*---------------------------------------------------------------------------*/
1149/*---------------------------------------------------------------------------*/
1150
1151template<typename V> void SubDomain::
1152_applyPropertyVisitor(V& p)
1153{
1154 auto b = p.builder();
1155
1156 p << b.addBool("LegacyMeshCreation")
1157 .addDescription("Using legacy mesh creation")
1158 .addGetter([](auto a) { return a.x.isLegacyMeshCreation(); })
1159 .addSetter([](auto a) { a.x._setLegacyMeshCreation(a.v); });
1160}
1161
1162/*---------------------------------------------------------------------------*/
1163/*---------------------------------------------------------------------------*/
1164
1165ARCANE_REGISTER_PROPERTY_CLASS(SubDomain,());
1166
1167/*---------------------------------------------------------------------------*/
1168/*---------------------------------------------------------------------------*/
1169
1170} // End namespace Arcane
1171
1172/*---------------------------------------------------------------------------*/
1173/*---------------------------------------------------------------------------*/
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
eExecutionPolicy executionPolicy() const
Politique d'exécution associée à acceleratorRuntime()
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:68
const DeviceInfo & deviceInfo() const
Information sur le device associé à cette instance.
Definition Runner.cc:433
eExecutionPolicy executionPolicy() const
Politique d'exécution associée.
Definition Runner.cc:302
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.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
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.
Definition Collection.h:68
EnumeratorT< String > Enumerator
Definition Collection.h:129
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)
Definition Convert.cc:122
Classe gérant un répertoire.
Definition Directory.h:35
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.
Definition IDirectory.h:32
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
static IMeshStats * create(ITraceMng *trace, IMesh *mesh, IParallelMng *pm)
Création d'une instance par défaut.
Definition MeshStats.cc:42
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 d'un observable.
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 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:37
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
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:56
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:116
virtual eItemKind itemKind() const =0
Type 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".
ListEnumeratorT< VariableRef * > Enumerator
Definition List.h:243
Handle sur un maillage.
Definition MeshHandle.h:47
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:450
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:291
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:816
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:964
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:756
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:975
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:784
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:765
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:946
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:906
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:928
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:774
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.
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.
ARCCORE_BASE_EXPORT String getHostName()
Nom de la machine sur lequel tourne le processus.
void callDotNETGarbageCollector()
Appelle le Garbage Collector de '.Net' s'il est disponible.
IProfilingService * getProfilingService()
Service utilisé pour obtenir pour obtenir des informations de profiling.
ARCCORE_BASE_EXPORT String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
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.
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:208
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:422
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:563
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
Definition UtilsTypes.h:446
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.