14#include "arcane/utils/FatalErrorException.h"
15#include "arcane/utils/TraceInfo.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/ValueConvert.h"
19#include "arcane/IParallelMng.h"
20#include "arcane/Timer.h"
21#include "arcane/IItemFamilyPolicyMng.h"
22#include "arcane/IItemFamilyExchanger.h"
23#include "arcane/IParticleFamily.h"
25#include "arcane/mesh/MeshExchanger.h"
26#include "arcane/mesh/DynamicMesh.h"
27#include "arcane/mesh/MeshExchange.h"
28#include "arcane/core/internal/IMeshModifierInternal.h"
29#include "arcane/core/internal/IItemFamilySerializerMngInternal.h"
30#include "arcane/core/internal/IMeshInternal.h"
42MeshExchanger(IMesh* mesh,ITimeStats* stats)
43: TraceAccessor(mesh->traceMng())
46, m_phase(ePhase::Init)
50 String max_pending_str = platform::getEnvironmentVariable(
"ARCANE_MESH_EXCHANGE_MAX_PENDING_MESSAGE");
51 if (!max_pending_str.null()){
52 Int32 max_pending = 0;
53 if (!builtInGetValue(max_pending,max_pending_str))
54 m_exchanger_option.setMaxPendingMessage(max_pending);
57 String use_collective_str = platform::getEnvironmentVariable(
"ARCANE_MESH_EXCHANGE_USE_COLLECTIVE");
58 if (use_collective_str==
"1" || use_collective_str==
"TRUE")
59 m_exchanger_option.setExchangeMode(ParallelExchangerOptions::EM_Collective);
61 m_exchanger_option.setVerbosityLevel(1);
70 for( IItemFamilyExchanger* exchanger : m_family_exchangers )
83 if ( !m_mesh->itemFamilyNetwork() || !IItemFamilyNetwork::plug_serializer )
89 UniqueArray<IItemFamily*> sorted_families;
91 sorted_families.reserve(families.count());
92 sorted_families.add(m_mesh->cellFamily());
93 sorted_families.add(m_mesh->faceFamily());
94 sorted_families.add(m_mesh->edgeFamily());
95 sorted_families.add(m_mesh->nodeFamily());
96 for( IItemFamily* family : families )
98 IParticleFamily* particle_family = family->toParticleFamily();
100 sorted_families.add(family);
108 std::map<IItemFamily*,IItemFamilyExchanger*> family_exchanger_map;
109 for( IItemFamily* family : sorted_families ){
110 _addItemFamilyExchanger(family);
115 if(m_mesh->useMeshItemFamilyDependencies())
117 _buildWithItemFamilyNetwork();
121 std::set<String> family_set ;
122 UniqueArray<IItemFamily*> sorted_families;
124 sorted_families.reserve(families.count());
125 sorted_families.add(m_mesh->cellFamily());
126 family_set.insert(m_mesh->cellFamily()->name()) ;
127 sorted_families.add(m_mesh->faceFamily());
128 family_set.insert(m_mesh->faceFamily()->name()) ;
129 sorted_families.add(m_mesh->edgeFamily());
130 family_set.insert(m_mesh->edgeFamily()->name()) ;
131 sorted_families.add(m_mesh->nodeFamily());
132 family_set.insert(m_mesh->nodeFamily()->name()) ;
133 for( IItemFamily* family : families )
135 IParticleFamily* particle_family = family->toParticleFamily();
138 sorted_families.add(family);
139 family_set.insert(family->name()) ;
143 for(
auto family : m_mesh->itemFamilyNetwork()->getFamilies(IItemFamilyNetwork::InverseTopologicalOrder) )
145 auto value = family_set.insert(family->name()) ;
148 sorted_families.add(family) ;
157 std::map<IItemFamily*,IItemFamilyExchanger*> family_exchanger_map;
158 for( IItemFamily* family : sorted_families ){
159 _addItemFamilyExchanger(family);
163 m_phase = ePhase::ComputeInfos;
170_buildWithItemFamilyNetwork()
172 m_mesh->itemFamilyNetwork()->schedule([&](IItemFamily* family) {
173 _addItemFamilyExchanger(family);
174 }, IItemFamilyNetwork::InverseTopologicalOrder);
176 for( IItemFamily* family : m_mesh->itemFamilies() ){
177 IParticleFamily* particle_family = family->toParticleFamily();
179 _addItemFamilyExchanger(family);
187_addItemFamilyExchanger(IItemFamily* family)
189 IItemFamilyExchanger* exchanger = family->policyMng()->createExchanger();
190 m_family_exchangers.add(exchanger);
191 m_family_exchanger_map.insert(std::make_pair(family,exchanger));
192 exchanger->setParallelExchangerOption(m_exchanger_option);
199_checkPhase(ePhase wanted_phase)
201 if (m_phase!=wanted_phase)
202 ARCANE_FATAL(
"Invalid exchange phase wanted={0} current={1}",
203 (
int)wanted_phase,(
int)m_phase);
210computeExchangeInfos()
212 _checkPhase(ePhase::ComputeInfos);
219 Timer::Action ts_action1(m_time_stats,
"MeshExchangeComputeInfos",
true);
232 pwarning() <<
"No load balance is performed";
239 if (exchanger==cell_exchanger)
242 info() <<
"ComputeExchange family=" << family->
name()
252 exchanger->computeExchangeItems();
254 exchanger->setExchangeItems(mesh_exchange.
getItemsToSend(family));
255 exchanger->computeExchangeInfos();
268 Int32 rank = m_mesh->meshPartInfo().partRank();
274 Integer new_owner = owners[item];
280 m_phase = ePhase::ProcessExchange;
291 _checkPhase(ePhase::ProcessExchange);
296 Timer::Action ts_action1(m_time_stats,
"MessagesExchange",
true);
301 e->processExchange();
304 m_phase = ePhase::RemoveItems;
313 _checkPhase(ePhase::RemoveItems);
326 Timer::Action ts_action1(m_time_stats,
"RemoveSendedItems",
true);
331 exchanger->removeSentItems();
335 m_mesh->modifier()->_modifierInternalApi()->removeNeedRemoveMarkedItems();
337 m_phase = ePhase::AllocateItems;
344allocateReceivedItems()
346 _checkPhase(ePhase::AllocateItems);
349 Timer::Action ts_action1(m_time_stats,
"ReadAndAllocItems",
true);
354 e->readAndAllocItems();
357 auto* family_serializer_mng = m_mesh->_internalApi()->familySerializerMng();
358 if (family_serializer_mng) family_serializer_mng->finalizeItemAllocation();
362 if (m_mesh->itemFamilyNetwork() && m_mesh->itemFamilyNetwork()->isActivated())
364 auto family_set = m_mesh->itemFamilyNetwork()->getFamilies();
365 for (
auto family : family_set) {
366 m_family_exchanger_map[family]->readAndAllocItemRelations();
372 e->readAndAllocSubMeshItems();
380 e->itemFamily()->notifyItemsOwnerChanged();
383 m_phase = ePhase::UpdateItemGroups;
392 _checkPhase(ePhase::UpdateItemGroups);
399 m_phase = ePhase::UpdateVariables;
408 _checkPhase(ePhase::UpdateVariables);
417 m_phase = ePhase::Finalize;
426 _checkPhase(ePhase::Finalize);
436 e->finalizeExchange();
438 m_phase = ePhase::Ended;
447 auto x = m_family_exchanger_map.find(family);
448 if (x==m_family_exchanger_map.end())
466_setNextPhase(ePhase next_phase)
468 m_phase = next_phase;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Échange des entités et leurs caractéristiques pour une famille donnée.
virtual bool computeExchangeInfos()=0
Détermine les informations nécessaires pour les échanges.
virtual void setExchangeItems(ConstArrayView< std::set< Int32 > > items_to_send)=0
Positionne la liste des entités à échanger.
Interface d'une famille d'entités.
virtual IParticleFamily * toParticleFamily()=0
Retourne l'interface de la famille de particule de cette famille.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual String name() const =0
Nom de la famille.
virtual void notifyItemsOwnerChanged()=0
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
virtual IPrimaryMesh * toPrimaryMesh()=0
Retourne l'instance sous la forme d'un IPrimaryMesh.
Interface d'une famille de particules.
virtual bool getEnableGhostItems() const =0
récupère le flag pour gérer les particules ghost de la famille
virtual IItemFamily * itemFamily()=0
Interface sur la famille.
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
Postionne le nom de l'action en cours d'exécution.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage pwarning() const
Echange des entités de maillages entre entre sous-domaines.
ConstArrayView< std::set< Int32 > > getItemsToSend(IItemFamily *family) const
Liste par sous-domaine des entités à envoyer pour la famille family.
void computeInfos()
Calcule les infos.
IItemFamilyExchanger * findExchanger(IItemFamily *family) override
Échangeur associé à la famille family. Lance une exception si non trouvé
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
Int32 Integer
Type représentant un entier.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
std::int32_t Int32
Type entier signé sur 32 bits.