14#include "arcane/mesh/ItemsOwnerBuilder.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/SmallArray.h"
19#include "arcane/utils/TraceAccessor.h"
20#include "arcane/utils/HashTableMap2.h"
21#include "arcane/utils/ValueConvert.h"
23#include "arcane/core/IParallelMng.h"
24#include "arcane/core/ParallelMngUtils.h"
25#include "arcane/core/IParallelExchanger.h"
26#include "arcane/core/ISerializeMessage.h"
27#include "arcane/core/ISerializer.h"
29#include "arcane/parallel/BitonicSortT.H"
31#include "arcane/mesh/ItemInternalMap.h"
32#include "arcane/mesh/DynamicMesh.h"
78 , m_cell_uid(cell_uid)
80 , m_cell_owner(cell_owner)
86 Int64 m_item_uid = NULL_ITEM_UNIQUE_ID;
87 Int64 m_cell_uid = NULL_ITEM_UNIQUE_ID;
88 Int32 m_item_sender_rank = A_NULL_RANK;
89 Int32 m_cell_owner = A_NULL_RANK;
98 void computeFacesOwner();
103 Int32 m_verbose_level = 0;
124 if (
k1.m_item_uid <
k2.m_item_uid)
126 if (
k1.m_item_uid >
k2.m_item_uid)
129 if (
k1.m_cell_uid <
k2.m_cell_uid)
131 if (
k1.m_cell_uid >
k2.m_cell_uid)
134 if (
k1.m_item_sender_rank <
k2.m_item_sender_rank)
136 if (
k1.m_item_sender_rank >
k2.m_item_sender_rank)
140 return (
k1.m_cell_owner <
k2.m_cell_owner);
159 return ItemOwnerInfo(INT64_MAX, INT64_MAX, INT32_MAX, INT32_MAX);
163 return fsi.m_item_uid != INT64_MAX;
173ItemsOwnerBuilderImpl::
179 m_verbose_level = v.value();
185void ItemsOwnerBuilderImpl::
193 info() <<
"** BEGIN ComputeFacesOwner nb_face=" <<
faces_map.count();
204 face.mutableItemBase().setOwner(my_rank, my_rank);
217 for (
Cell cell : face.cells()) {
219 info() <<
"ADD lid=" <<
lid <<
" uid=" <<
face_uid <<
" cell_uid=" << cell.uniqueId() <<
" owner=" << cell.owner();
220 m_items_owner_info.add(ItemOwnerInfo(
face_uid, cell.uniqueId(),
my_rank, cell.owner()));
227 _processSortedInfos(faces_map);
252 info() <<
"Sorted item_uid=" << x.m_item_uid <<
" cell_uid=" << x.m_cell_uid <<
" owner=" << x.m_cell_owner;
259void ItemsOwnerBuilderImpl::
264 const Int32 nb_rank = pm->
commSize();
274 for (Int32 i = (
nb_sorted - 1); i >= 0; --i) {
328 if (item_uid != current_item_uid) {
329 current_item_uid = item_uid;
330 current_item_owner = first_ioi->m_cell_owner;
332 Int32 orig_sender = items_owner_info[i].m_item_sender_rank;
333 UniqueArray<Int64>& send_array = resend_items_owner_info_map[orig_sender];
334 send_array.add(current_item_uid);
335 send_array.add(current_item_owner);
336 if (verbose_level >= 2)
337 info() <<
"SEND i=" << i <<
" rank=" << orig_sender <<
" item_uid=" << current_item_uid <<
" new_owner=" << current_item_owner;
342 for (
const auto& [key, value] : resend_items_owner_info_map) {
343 if (verbose_level >= 1)
344 info() <<
"RESEND_INFO to_rank=" << key <<
" nb=" << value.size();
345 exchanger->addSender(key);
347 exchanger->initializeCommunicationsMessages();
350 for (
const auto& [key, value] : resend_items_owner_info_map) {
351 ISerializeMessage* sm = exchanger->messageToSend(index);
353 ISerializer* s = sm->serializer();
354 s->setMode(ISerializer::ModeReserve);
355 s->reserveArray(value);
361 exchanger->processExchange();
362 UniqueArray<Int64> receive_info;
364 for (Integer i = 0, ns = exchanger->nbReceiver(); i < ns; ++i) {
365 ISerializeMessage* sm = exchanger->messageToReceive(i);
366 ISerializer* s = sm->serializer();
368 s->getArray(receive_info);
369 Int32 receive_size = receive_info.size();
370 if (verbose_level >= 1)
371 info() <<
"RECEIVE_INFO size=" << receive_size <<
" rank2=" << sm->destination();
373 if ((receive_size % 2) != 0)
374 ARCANE_FATAL(
"Size '{0}' is not a multiple of 2", receive_size);
375 Int32 buf_size = receive_size / 2;
376 for (
Int32 z = 0; z < buf_size; ++z) {
377 Int64 item_uid = receive_info[z * 2];
379 impl::ItemBase x = items_map.
findItem(item_uid);
380 if (verbose_level >= 2)
381 info() <<
"SetOwner uid=" << item_uid <<
" new_owner" << item_owner;
382 x.toMutable().setOwner(item_owner, my_rank);
394ItemsOwnerBuilder(DynamicMesh* mesh)
395: m_p(std::make_unique<ItemsOwnerBuilderImpl>(mesh))
405void ItemsOwnerBuilder::
408 m_p->computeFacesOwner();
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue sur les informations des faces.
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void waitAllRequests(ArrayView< Request > rvalues)=0
Bloque en attendant que les requêtes rvalues soient terminées.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Implementation of std::unordered_map.
Implémentation d'un maillage.
IParallelMng * parallelMng() override
Gestionnaire de parallèlisme.
void notifyItemsOwnerChanged() override
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
Tableau associatif de ItemInternal.
impl::ItemBase findItem(Int64 uid) const
Retourne l'entité de numéro unique uid.
Implémentation de l'algorithme de calcul des propriétaires.
void _sortInfos()
Tri les instances contenues dans m_items_owner_info replace les valeurs triées dans ce même tableau.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
Classe d'accès aux traces.
TraceMessage info() const
Flot pour un message d'information.
Integer toInteger(Real r)
Converti un Int64 en un Integer.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
Ref< IParallelExchanger > createExchangerRef(IParallelMng *pm)
Retourne une interface pour transférer des messages entre rangs.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.