Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CheckpointMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CheckpointMng.cc (C) 2000-2018 */
9/* */
10/* Gestionnaire des protections. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15#include "arcane/utils/TraceAccessor.h"
16#include "arcane/utils/String.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/IOException.h"
19#include "arcane/utils/TraceInfo.h"
20#include "arcane/utils/Array.h"
21#include "arcane/utils/NotImplementedException.h"
22#include "arcane/utils/ITraceMng.h"
23
24#include "arcane/Directory.h"
25#include "arcane/ICheckpointMng.h"
26#include "arcane/ISubDomain.h"
27#include "arcane/IParallelMng.h"
28#include "arcane/IParallelReplication.h"
29#include "arcane/IRessourceMng.h"
30#include "arcane/IVariableMng.h"
31#include "arcane/IIOMng.h"
32#include "arcane/IXmlDocumentHolder.h"
33#include "arcane/XmlNode.h"
34#include "arcane/ICheckpointReader.h"
35#include "arcane/ICheckpointWriter.h"
36#include "arcane/ServiceBuilder.h"
37#include "arcane/IObservable.h"
38#include "arcane/CheckpointInfo.h"
39#include "arcane/SubDomainBuildInfo.h"
40#include "arcane/MeshPartInfo.h"
41
42#include "arcane/VariableCollection.h"
43#include "arcane/IVariable.h"
44#include "arcane/IMeshModifier.h"
45#include "arcane/ItemGroup.h"
46#include "arcane/IItemFamily.h"
47#include "arcane/IMainFactory.h"
48#include "arcane/IPrimaryMesh.h"
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
53ARCANE_BEGIN_NAMESPACE
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58extern "C++" ISubDomain*
59arcaneCreateSubDomain(ISession* session,const SubDomainBuildInfo& sdbi);
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
67: public TraceAccessor
68, public ICheckpointMng
69{
70 public:
71
72 public:
73
75 ~CheckpointMng() override;
76
77 public:
78
79 void readCheckpoint() override;
80 void readDefaultCheckpoint() override;
81 CheckpointInfo readDefaultCheckpointInfo() override;
82 void readCheckpoint(ICheckpointReader* reader) override;
83 void readCheckpoint(ByteConstArrayView infos) override;
84 void readCheckpoint(const CheckpointInfo& checkpoint_infos) override;
85 CheckpointInfo readCheckpointInfo(Span<const Byte> infos,const String& buf_name) override;
86
87 void writeCheckpoint(ICheckpointWriter* writer) override;
88 void writeCheckpoint(ICheckpointWriter* writer,ByteArray& infos) override;
89 void writeDefaultCheckpoint(ICheckpointWriter* writer) override;
90 IObservable* writeObservable() override { return m_write_observable; }
91 IObservable* readObservable() override { return m_read_observable; }
92
93 public:
94
95 void build();
96
97 private:
98
99 ISubDomain* m_sub_domain;
102
103 private:
104
105 void _writeCheckpointInfoFile(ICheckpointWriter* checkpoint_writer,ByteArray& infos);
106 CheckpointInfo _readCheckpointInfo(Span<const Byte> infos,const String& info_file_name);
107 void _readCheckpoint(const CheckpointInfo& checkpoint_info);
108 void _readCheckpoint(const CheckpointReadInfo& infos);
109 bool _checkChangingNbSubDomain(const CheckpointInfo& ci);
110 void _applyNbSubDomainChange(const CheckpointInfo& ci,ICheckpointReader2* reader);
111 void _changeItemsOwner(IMesh* mesh,Int32ConstArrayView old_ranks_to_new_ranks);
112};
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116
117extern "C++" ICheckpointMng*
118arcaneCreateCheckpointMng(ISubDomain* sd)
119{
121 cm->build();
122 return cm;
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
128CheckpointMng::
129CheckpointMng(ISubDomain* sd)
130: TraceAccessor(sd->traceMng())
131, m_sub_domain(sd)
132, m_write_observable(IObservable::createDefault())
133, m_read_observable(IObservable::createDefault())
134{
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
140CheckpointMng::
141~CheckpointMng()
142{
145
146 delete m_read_observable;
147 delete m_write_observable;
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156void CheckpointMng::
157build()
158{
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172
175{
176 m_sub_domain->variableMng()->readCheckpoint(reader);
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
183void CheckpointMng::
184_readCheckpoint(const CheckpointReadInfo& infos)
185{
186 m_sub_domain->variableMng()->readCheckpoint(infos);
188}
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
195{
196 // Lit le fichier contenant les infos de la précédente exécution pour
197 // connaître le service de protection/reprise utilisé
198 String info_file_name(m_sub_domain->exportDirectory().file("checkpoint_info.xml"));
199 ByteUniqueArray bytes;
200 IIOMng* io_mng = m_sub_domain->ioMng();
201 io_mng->collectiveRead(info_file_name,bytes);
202 CheckpointInfo checkpoint_info = _readCheckpointInfo(bytes,info_file_name);
203 return checkpoint_info;
204}
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
218
221{
222 CheckpointInfo checkpoint_info = _readCheckpointInfo(bytes_infos,"unknown");
223 _readCheckpoint(checkpoint_info);
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242CheckpointInfo CheckpointMng::
243_readCheckpointInfo(Span<const Byte> bytes_infos,const String& info_file_name)
244{
246
247 // Par défaut, relit les infos en fonction du IParallelMng associé au sous-domaine
248 IParallelMng* pm = m_sub_domain->parallelMng();
249 Int32 rank = pm->commRank();
250 checkpoint_info.setSubDomainRank(rank);
251 Int32 replication_rank = pm->replication()->replicationRank();
252 checkpoint_info.setReplicationRank(replication_rank);
253
254 ITraceMng* tm = m_sub_domain->traceMng();
257 XmlNode doc_node = xml_doc->documentNode();
258 if (doc_node.null())
259 ARCANE_FATAL("Can not read file '{0}' containing checkpoint/restart informations",
261
262 XmlNode doc_elem = doc_node.documentElement();
263
264 Int32 nb_checkpoint_sub_domain = doc_elem.attr("nb-sub-domain").valueAsInteger();
266
267 Int32 nb_checkpoint_replication = doc_elem.attr("nb-replication").valueAsInteger();
269
270 XmlNode service_elem = doc_elem.child("service");
271 String service_name = service_elem.attrValue("name");
272 if (service_name.null()){
274 "The file '{0}}' doesn't have "
275 "the name of the protection/restore service used "
276 "(attribute /checkpoint-info/service/@name)", info_file_name);
277 }
278 checkpoint_info.setServiceName(service_name);
279 String service_directory = service_elem.attrValue("directory");
280 checkpoint_info.setDirectory(service_directory);
281
282 XmlNode times_node = doc_node.documentElement().child("times");
283
284 XmlNode last_index_attr = times_node.attr("last-index");
285 if (last_index_attr.null())
286 ARCANE_THROW(IOException,"missing attribute 'last-index'");
287
288 XmlNode last_time_attr = times_node.attr("last-time");
289 if (last_time_attr.null())
290 ARCANE_THROW(IOException,"missing attribute 'last-time'");
291
292 Real last_time = last_time_attr.valueAsReal();
293 checkpoint_info.setCheckpointTime(last_time);
294
295 Integer last_index = last_index_attr.valueAsInteger();
296 checkpoint_info.setCheckpointIndex(last_index);
297
298 XmlNode meta_data_node = service_elem.child("meta-data");
299 if (meta_data_node.null())
300 ARCANE_THROW(IOException,"missing tag 'meta-data'");
301 checkpoint_info.setReaderMetaData(meta_data_node.value());
302
303 return checkpoint_info;
304}
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
311{
312 _readCheckpoint(checkpoint_info);
313}
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318void CheckpointMng::
319_readCheckpoint(const CheckpointInfo& checkpoint_info)
320{
321 String service_name = checkpoint_info.serviceName();
322 if (service_name.null())
324
326
328
329 IApplication* app = m_sub_domain->application();
330 // Tente d'utiliser l'interface ICheckpointReader2 si disponible.
331 // A noter que le service qui implémente ICheckpointReader2 est un service
332 // de l'application alors que pour ICheckpointReader il s'agit d'un service
333 // de sous-domaine
334 // S'il n'est pas disponible, utilise l'implémentation ICheckpointReader.
335 // Avec la nouvelle implémentation, il est possible de traiter le cas où
336 // le nombre de sous-domaines change.
337 {
340 if (s.get()){
341 info() << "Using the checkpoint/restart service"
342 << " <" << service_name << "> (implement ICheckpointReader2)";
344 _applyNbSubDomainChange(checkpoint_info,s.get());
345 else{
347 IParallelMng* pm = m_sub_domain->parallelMng();
348 cri.setParallelMng(pm);
349 cri.setReader(s.get());
350 _readCheckpoint(cri);
351 }
352 return;
353 }
354 }
355 // Avec l'ancienne implémentation, il n'est pas possible de changer
356 // le nombre de sous-domaines
357 if (has_changing_sub_domain)
358 ARCANE_FATAL("The number of sub-domains/replica in this run is different "
359 "from the number in checkpoint but the service specified "
360 "for checkpoint {0} does not handle this case",service_name);
361
362 ServiceFinder2T<ICheckpointReader,ISubDomain> sf2(app,m_sub_domain);
363 Ref<ICheckpointReader> checkpoint_reader(sf2.createReference(service_name));
364
365 if (!checkpoint_reader.get()){
366 ARCANE_FATAL("The service specified for checkpoint/restart ({0}) is not available",
367 service_name);
368 }
369
370 info() << "Using the checkpoint/restart service <" << service_name << ">";
371 Real last_time = checkpoint_info.checkpointTime();
372 Int32 last_index = checkpoint_info.checkpointIndex();
373
374 checkpoint_reader->setCurrentTimeAndIndex(last_time,last_index);
375
376 String meta_data = checkpoint_info.readerMetaData();
377 checkpoint_reader->setReaderMetaData(meta_data);
378 checkpoint_reader->setBaseDirectoryName(service_directory);
379
380 readCheckpoint(checkpoint_reader.get());
381}
382
383/*---------------------------------------------------------------------------*/
384/*---------------------------------------------------------------------------*/
385
391
392/*---------------------------------------------------------------------------*/
393/*---------------------------------------------------------------------------*/
394
397{
400
401 if (m_sub_domain->allReplicaParallelMng()->isMasterIO()){
403 String info_file(export_directory.file("checkpoint_info.xml"));
404 std::ofstream ofile(info_file.localstr());
405 ofile.write((const char*)bytes_infos.unguardedBasePointer(),bytes_infos.size());
406 if (!ofile.good())
407 ARCANE_THROW(IOException,"Can not write file '{0}'",info_file);
408 }
409}
410
411/*---------------------------------------------------------------------------*/
412/*---------------------------------------------------------------------------*/
413
421
422/*---------------------------------------------------------------------------*/
423/*---------------------------------------------------------------------------*/
424
427{
428 ISubDomain* sd = m_sub_domain;
429 IParallelMng* pm = sd->parallelMng();
431
432 Int32 nb_rank = pm->commSize();
433 Int32 nb_replica = pr->nbReplication();
434
436
438
439 IRessourceMng* rm = sd->ressourceMng();
441 XmlNode doc = info_document->documentNode();
442 XmlElement root(doc,"checkpoint-info");
443
444 // Sauvegarde les infos sur le nombre de réplication et de sous-domaines.
445 // Cela permettra plus tard de mettre en place les reprises en faisant
446 // varier le nombre de sous-domaines ou de réplication.
447 root.setAttrValue("nb-sub-domain",String::fromNumber(nb_rank));
448 root.setAttrValue("nb-replication",String::fromNumber(nb_replica));
449
450 XmlElement service_info(root,"service");
451 String reader_name = checkpoint_writer->readerServiceName();
452 service_info.setAttrValue("name",reader_name);
453 service_info.setAttrValue("directory",checkpoint_writer->baseDirectoryName());
454
455 String reader_meta_data = checkpoint_writer->readerMetaData();
456 XmlElement meta_data_elem(service_info,"meta-data",reader_meta_data);
457 XmlElement checkpoints_time_elem(root,"times");
458
459 XmlNode info_root = info_document->documentNode().documentElement();
460
461 {
462 // Sauve les informations de la dernière protection
463 Integer nb_checkpoint = checkpoints_time.size();
464 if (nb_checkpoint>0){
465 checkpoints_time_elem.setAttrValue("last-time",String::fromNumber(checkpoints_time[nb_checkpoint-1]));
466 checkpoints_time_elem.setAttrValue("last-index",String::fromNumber(nb_checkpoint-1));
467 }
468 }
469 checkpoints_time_elem.clear();
470 for( Integer i=0, is=checkpoints_time.size(); i<is; ++i ){
472 elem.setAttrValue("value",String::fromNumber(checkpoints_time[i]));
473 }
474
475 info_document->save(infos);
476}
477
478/*---------------------------------------------------------------------------*/
479/*---------------------------------------------------------------------------*/
486{
487 // Vérifie que le nombre de sous-domaine et de replica est le même entre
488 // la protection et l'exécution courante.
489 Int32 nb_checkpoint_sub_domain = ci.nbSubDomain();
490 Int32 nb_checkpoint_replication = ci.nbReplication();
491 // Si on n'a pas les infos (ou qu'elles sont invalides) sur le nombre de
492 // sous-domaines ou de replica, on considère qu'on ne change pas le partitionnement.
493 // Cela peut arriver si le fichier 'checkpoint_info' est trop ancien
494 // ou n'a pas été écrit par ce CheckpointMng.
496 info() << "Invalid or missing partitionning info in checkpoint.";
497 return false;
498 }
499 info() << "Reading checkpoint nb_sub_domain=" << nb_checkpoint_sub_domain
500 << " nb_replication=" << nb_checkpoint_replication;
501 MeshPartInfo current_part_info(makeMeshPartInfoFromParallelMng(m_sub_domain->parallelMng()));
502
503 Int32 nb_rank = current_part_info.nbPart();
504 Int32 nb_replication = current_part_info.nbReplication();
505 bool has_different_sub_domain = false;
506 if (nb_rank!=nb_checkpoint_sub_domain){
508 }
509 // Pour l'instant, one ne supporte pas le changement du nombre de réplica.
512 "Bad number of replication ({0} in checkpoint, {1} in this run)",
514 }
516}
517
518/*---------------------------------------------------------------------------*/
519/*---------------------------------------------------------------------------*/
520
521void CheckpointMng::
522_changeItemsOwner(IMesh* mesh,Int32ConstArrayView old_ranks_to_new_ranks)
523{
524 Int32 mesh_rank = mesh->meshPartInfo().partRank();
525 // Change les propriétaires de toutes les familles
526 for( IItemFamily* family : mesh->itemFamilies() ){
527 const ItemGroup& all_items = family->allItems();
528 // Change les propriétaires pour correspondre au nouveau découpage.
530 Item item = *iitem;
531 Int32 owner = item.owner();
533 }
534 family->notifyItemsOwnerChanged();
535 }
536}
537
538/*---------------------------------------------------------------------------*/
539/*---------------------------------------------------------------------------*/
540
541void CheckpointMng::
542_applyNbSubDomainChange(const CheckpointInfo& ci,ICheckpointReader2* reader)
543{
544 ISubDomain* sd1 = m_sub_domain;
545 IApplication* app = sd1->application();
546 IParallelMng* pm = sd1->parallelMng();
547 Int32 nb_old_rank = ci.nbSubDomain();
548 Int32 my_rank = pm->commRank();
549 Int32 nb_rank = pm->commSize();
550 if (nb_rank>nb_old_rank)
551 ARCANE_THROW(NotImplementedException,"Increasing number of sub-domains (old={0} new={1})",
552 nb_old_rank,nb_rank);
553 UniqueArray<Int32> old_ranks_to_new_ranks(nb_old_rank);
554 UniqueArray<Int32> ranks_to_read;
555 for( Integer i=0; i<nb_old_rank; ++i ){
556 Int32 new_rank = i % nb_rank;
557 old_ranks_to_new_ranks[i] = new_rank;
558 if (new_rank==my_rank)
559 ranks_to_read.add(i);
560 }
561 info() << "OLD_RANKS_TO_NEW_RANKS=" << old_ranks_to_new_ranks;
562 info() << "RANKS_TO_READ=" << ranks_to_read;
563 info() << "Apply Changing nb sub domain my_rank=" << my_rank;
564 String service_name = ci.serviceName();
565 // TODO: faire un nouveau parallelMng() par sous-domaine créé
566 // (pour avoir un ITraceMng par sous-domaine)
567 IParallelMng* pm2 = pm->sequentialParallelMng();
568 UniqueArray<ISubDomain*> sd_to_merge_list2;
569 UniqueArray<Byte> case_bytes;
570 sd1->fillCaseBytes(case_bytes);
571
572 String message_passing_service = "SequentialParallelMngContainerFactory";
573 ServiceBuilder<IParallelMngContainerFactory> sf(app);
574 auto pbf = sf.createReference(message_passing_service,SB_AllowNull);
575 if (!pbf)
576 ARCANE_FATAL("Can not find service '{0}' implementing IParallelMngContainerFactory",message_passing_service);
577 Ref<IParallelMngContainer> parallel_builder(pbf->_createParallelMngBuilder(1,pm2->communicator()));
578
579 for( Int32 i : ranks_to_read ){
580 info() << "Reading Part sub_domain index=" << i;
581 info() << "Using the checkpoint/restart service"
582 << " <" << service_name << "> (implement ICheckpointReader2)";
583 CheckpointInfo checkpoint_info2(ci);
584 checkpoint_info2.setSubDomainRank(i);
585 CheckpointReadInfo cri(checkpoint_info2);
586 cri.setReader(reader);
587 cri.setParallelMng(pm2);
588 bool is_first = (i==my_rank);
589 ISubDomain* sd2 = nullptr;
590 if (is_first){
591 sd2 = sd1;
592 }
593 else {
594 String file_suffix = String::format("s_{0}_{1}",my_rank,i);
595 ITraceMng* tm = app->createAndInitializeTraceMng(sd1->traceMng(),file_suffix);
596 Ref<IParallelMng> sub_pm = parallel_builder->_createParallelMng(0,tm);
597 SubDomainBuildInfo sdbi(sub_pm,i);
598 sdbi.setCaseFileName(sd1->caseFullFileName());
599 sdbi.setCaseBytes(case_bytes);
600
601 // TODO: protéger arcaneCreateSubDomain()
602 // dans une section critique.
603 // On utilise directement arcaneCreateSubDomain() pour éviter
604 // d'ajouter le sous-domaine créé à la liste des sous-domaines
605 // de la session (cela peut poser problème car ensuite on ne
606 // saura pas vraiment le détruire)
607 sd2 = arcaneCreateSubDomain(sd1->session(),sdbi);
608 sd2->initialize();
609 sd2->readCaseMeshes();
610
611 sd_to_merge_list2.add(sd2);
612 sd2->setIsContinue();
613 sd2->allocateMeshes();
614 }
615 sd2->variableMng()->readCheckpoint(cri);
616 sd2->checkpointMng()->readObservable()->notifyAllObservers();
617 // Il faut indiquer que les variables sont utilisées sinon
618 // elles ne seront pas transférées. Les sous-domaines additionnels
619 // ne créent pas les modules donc il est possible que le sous-domaine
620 // sd1 ait plus de variables que les autres. C'est le cas avec les
621 // variable NoDump qui n'existent pas chez les autres sous-domaines.
622 // Il ne faut donc pas les initialiser.
623 // TODO: il serait préférable de prendre les variables du
624 // maillage communes à tout les maillages qu'on va fusionner.
625 VariableCollection vars = sd2->variableMng()->variables();
626 for( VariableCollection::Enumerator ivar(vars); ++ivar; ){
627 IVariable* var = *ivar;
628 if (var->isUsed())
629 continue;
630 if ((var->property() & IVariable::PNoDump)!=0)
631 continue;
632 // Ne traite pas les variables qui ne sont pas sur des familles.
633 if (var->itemFamilyName().null())
634 continue;
635 var->setUsed(true);
636 info() << "LIST_VAR name=" << var->fullName();
637 }
638 }
639 UniqueArray<IMesh*> meshes_to_merge;
640 for( ISubDomain* sd_to_merge : sd_to_merge_list2 ){
641 meshes_to_merge.add(sd_to_merge->defaultMesh());
642 }
643
644 // Change les propriétaires des maillages pour qu'ils référencent les
645 // nouveaux rangs.
646 _changeItemsOwner(sd1->defaultMesh(),old_ranks_to_new_ranks);
647 for( IMesh* mesh : meshes_to_merge )
648 _changeItemsOwner(mesh,old_ranks_to_new_ranks);
649
650 {
651 IMesh* mesh = sd1->defaultMesh();
652 // Procède à la fusion des maillages
653 mesh->modifier()->mergeMeshes(meshes_to_merge);
654 // Met à jour IMesh::meshPartInfo() car
655 // le nombre de parties des maillage a changé.
656 MeshPartInfo p(makeMeshPartInfoFromParallelMng(mesh->parallelMng()));
657 mesh->toPrimaryMesh()->setMeshPartInfo(p);
658 }
659
660 // TODO: détruire les sous-domaines créés
661}
662
663/*---------------------------------------------------------------------------*/
664/*---------------------------------------------------------------------------*/
665
666ARCANE_END_NAMESPACE
667
668/*---------------------------------------------------------------------------*/
669/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
Tableau d'items de types quelconques.
Informations sur une protection.
Gestionnaire des protections.
IObservable * m_write_observable
Observable en écriture.
void readDefaultCheckpoint() override
Lit une protection par défaut.
IObservable * readObservable() override
Observable en lecture.
void writeCheckpoint(ICheckpointWriter *writer) override
Écrit une protection par défaut avec l'écrivain writer.
void _writeCheckpointInfoFile(ICheckpointWriter *checkpoint_writer, ByteArray &infos)
CheckpointInfo readCheckpointInfo(Span< const Byte > infos, const String &buf_name) override
Lit les informations d'une protection.
IObservable * writeObservable() override
Observable en écriture.
void writeDefaultCheckpoint(ICheckpointWriter *writer) override
Écrit une protection avec l'écrivain writer.
bool _checkChangingNbSubDomain(const CheckpointInfo &ci)
Regarde si le nombre de sous-domaines a changé entre la protection et l'allocation actuelle.
void readCheckpoint() override
Lit une protection.
CheckpointInfo readDefaultCheckpointInfo() override
Lit les informations de protection par défaut.
IObservable * m_read_observable
Observable en lecture.
Informations de relecture d'une protection.
Classe gérant un répertoire.
Definition Directory.h:33
Interface de l'application.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface du gestionnaire des informations des protections.
Interface du service de lecture d'une protection/reprise (V2)
Interface du service de lecture d'une protection/reprise.
Interface du service d'écriture d'une protection/reprise.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:42
Interface d'une famille d'entités.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual const MeshPartInfo & meshPartInfo() const =0
Informations sur les parties du maillage.
Exception lorsqu'une erreur d'entrée/sortie est détectée.
Definition IOException.h:32
Interface d'un observable.
virtual void detachAllObservers()=0
Détache tous les observeurs associés à cette instance.
virtual void notifyAllObservers()=0
Notifie tous les observateurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual IParallelReplication * replication() const =0
Informations sur la réplication.
virtual IParallelMng * sequentialParallelMng()=0
Retourne un gestionnaire de parallélisme séquentiel.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
Informations sur la réplication des sous-domaines en parallèle.
Interface d'un gestionnaire de ressource.
virtual IXmlDocumentHolder * createXmlDocument()=0
Créé un noeud document XML. Crée et retourne un document XML utilisant une implémentation par défaut....
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IIOMng * ioMng()=0
Retourne le gestionnaire des entrées/sorties.
virtual IApplication * application()=0
Application.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual const IDirectory & exportDirectory() const =0
Répertoire de base des exportations.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
virtual IParallelMng * allReplicaParallelMng() const =0
Retourne le gestionnaire de parallélisme pour tous les réplicats.
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Definition IVariable.h:72
static IXmlDocumentHolder * loadFromBuffer(Span< const Byte > buffer, const String &name, ITraceMng *tm)
Charge un document XML.
Definition DomUtils.cc:426
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Classe de base d'un élément de maillage.
Definition Item.h:83
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
Definition Item.h:365
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Definition Item.h:229
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Informations un maillage partitionné.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
Exception lorsqu'une erreur fatale 'parallèle' est générée.
Elément d'un arbre DOM.
Definition XmlNode.h:396
Noeud d'un arbre DOM.
Definition XmlNode.h:51
XmlNode attr(const String &name, bool throw_exception=false) const
Retourne l'attribut de nom name.
Definition XmlNode.cc:248
XmlNode documentElement() const
Retourne le noeud élément du document.
Definition XmlNode.cc:556
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
Definition XmlNode.cc:225
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
Definition XmlNode.cc:64
void setAttrValue(const String &name, const String &value)
Positionne l'attribut name à la valeur value.
Definition XmlNode.cc:239
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
@ SB_AllowNull
Autorise l'absence du service.