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"
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"
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"
58extern "C++" ISubDomain*
59arcaneCreateSubDomain(ISession* session,
const SubDomainBuildInfo& sdbi);
79 void readCheckpoint()
override;
80 void readDefaultCheckpoint()
override;
129CheckpointMng(ISubDomain* sd)
130: TraceAccessor(sd->traceMng())
132, m_write_observable(IObservable::createDefault())
133, m_read_observable(IObservable::createDefault())
176 m_sub_domain->
variableMng()->readCheckpoint(reader);
186 m_sub_domain->
variableMng()->readCheckpoint(infos);
259 ARCANE_FATAL(
"Can not read file '{0}' containing checkpoint/restart informations",
274 "The file '{0}}' doesn't have "
275 "the name of the protection/restore service used "
278 checkpoint_info.setServiceName(service_name);
279 String service_directory = service_elem.
attrValue(
"directory");
280 checkpoint_info.setDirectory(service_directory);
284 XmlNode last_index_attr = times_node.
attr(
"last-index");
285 if (last_index_attr.null())
286 ARCANE_THROW(IOException,
"missing attribute 'last-index'");
288 XmlNode last_time_attr = times_node.attr(
"last-time");
289 if (last_time_attr.null())
290 ARCANE_THROW(IOException,
"missing attribute 'last-time'");
292 Real last_time = last_time_attr.valueAsReal();
293 checkpoint_info.setCheckpointTime(last_time);
295 Integer last_index = last_index_attr.valueAsInteger();
296 checkpoint_info.setCheckpointIndex(last_index);
298 XmlNode meta_data_node = service_elem.
child(
"meta-data");
299 if (meta_data_node.null())
301 checkpoint_info.setReaderMetaData(meta_data_node.value());
303 return checkpoint_info;
341 info() <<
"Using the checkpoint/restart service"
342 <<
" <" <<
service_name <<
"> (implement ICheckpointReader2)";
348 cri.setParallelMng(pm);
349 cri.setReader(s.get());
350 _readCheckpoint(
cri);
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);
362 ServiceFinder2T<ICheckpointReader,ISubDomain> sf2(app,m_sub_domain);
363 Ref<ICheckpointReader> checkpoint_reader(sf2.createReference(service_name));
365 if (!checkpoint_reader.get()){
366 ARCANE_FATAL(
"The service specified for checkpoint/restart ({0}) is not available",
370 info() <<
"Using the checkpoint/restart service <" << service_name <<
">";
371 Real last_time = checkpoint_info.checkpointTime();
372 Int32 last_index = checkpoint_info.checkpointIndex();
374 checkpoint_reader->setCurrentTimeAndIndex(last_time,last_index);
376 String meta_data = checkpoint_info.readerMetaData();
377 checkpoint_reader->setReaderMetaData(meta_data);
378 checkpoint_reader->setBaseDirectoryName(service_directory);
447 root.
setAttrValue(
"nb-sub-domain",String::fromNumber(nb_rank));
496 info() <<
"Invalid or missing partitionning info in checkpoint.";
512 "Bad number of replication ({0} in checkpoint, {1} in this run)",
531 Int32 owner = item.
owner();
534 family->notifyItemsOwnerChanged();
542_applyNbSubDomainChange(
const CheckpointInfo& ci,ICheckpointReader2* reader)
544 ISubDomain* sd1 = m_sub_domain;
545 IApplication* app = sd1->application();
546 IParallelMng* pm = sd1->parallelMng();
547 Int32 nb_old_rank = ci.nbSubDomain();
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);
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();
568 UniqueArray<ISubDomain*> sd_to_merge_list2;
569 UniqueArray<Byte> case_bytes;
570 sd1->fillCaseBytes(case_bytes);
572 String message_passing_service =
"SequentialParallelMngContainerFactory";
573 ServiceBuilder<IParallelMngContainerFactory> sf(app);
574 auto pbf = sf.createReference(message_passing_service,
SB_AllowNull);
576 ARCANE_FATAL(
"Can not find service '{0}' implementing IParallelMngContainerFactory",message_passing_service);
577 Ref<IParallelMngContainer> parallel_builder(pbf->_createParallelMngBuilder(1,pm2->communicator()));
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;
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);
607 sd2 = arcaneCreateSubDomain(sd1->session(),sdbi);
609 sd2->readCaseMeshes();
611 sd_to_merge_list2.add(sd2);
612 sd2->setIsContinue();
613 sd2->allocateMeshes();
615 sd2->variableMng()->readCheckpoint(cri);
616 sd2->checkpointMng()->readObservable()->notifyAllObservers();
625 VariableCollection vars = sd2->variableMng()->variables();
626 for( VariableCollection::Enumerator ivar(vars); ++ivar; ){
627 IVariable* var = *ivar;
633 if (var->itemFamilyName().null())
636 info() <<
"LIST_VAR name=" << var->fullName();
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());
646 _changeItemsOwner(sd1->defaultMesh(),old_ranks_to_new_ranks);
647 for( IMesh* mesh : meshes_to_merge )
648 _changeItemsOwner(mesh,old_ranks_to_new_ranks);
651 IMesh* mesh = sd1->defaultMesh();
653 mesh->
modifier()->mergeMeshes(meshes_to_merge);
656 MeshPartInfo p(makeMeshPartInfoFromParallelMng(mesh->parallelMng()));
657 mesh->toPrimaryMesh()->setMeshPartInfo(p);
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
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.
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.
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.
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.
static IXmlDocumentHolder * loadFromBuffer(Span< const Byte > buffer, const String &name, ITraceMng *tm)
Charge un document XML.
Groupe d'entités de maillage.
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
XmlNode attr(const String &name, bool throw_exception=false) const
Retourne l'attribut de nom name.
XmlNode documentElement() const
Retourne le noeud élément du document.
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
void setAttrValue(const String &name, const String &value)
Positionne l'attribut name à la valeur value.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
Classe d'accès aux traces.
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.