14#include "arcane/utils/Iterator.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/Collection.h"
19#include "arcane/core/IMesh.h"
20#include "arcane/core/ISubDomain.h"
21#include "arcane/core/IParallelMng.h"
22#include "arcane/core/IParallelExchanger.h"
23#include "arcane/core/IItemFamily.h"
25#include "arcane/core/Item.h"
26#include "arcane/core/MeshVariable.h"
27#include "arcane/core/IParticleFamily.h"
28#include "arcane/core/ParallelMngUtils.h"
29#include "arcane/core/ConnectivityItemVector.h"
30#include "arcane/core/IndexedItemConnectivityView.h"
31#include "arcane/core/ItemPrinter.h"
32#include "arcane/core/IParallelMng.h"
33#include "arcane/core/VariableTypes.h"
34#include "arcane/core/IItemFamilyNetwork.h"
35#include "arcane/core/IGhostLayerMng.h"
36#include "arcane/core/ConnectivityItemVector.h"
37#include "arcane/core/IVariableSynchronizer.h"
38#include "arcane/core/ISerializeMessage.h"
39#include "arcane/core/ISerializer.h"
41#include "arcane/mesh/IndexedItemConnectivityAccessor.h"
42#include "arcane/mesh/MeshExchange.h"
43#include "arcane/mesh/NewItemOwnerBuilder.h"
60 IncrementalUnorderedMultiArray(
Integer size)
61 : m_current_increment(-1)
68 IncrementalUnorderedMultiArray()
69 : m_current_increment(-1)
73 inline void resize(
Integer size)
75 m_index.resize(size, -1);
76 m_size.resize(size, 0);
81 return m_index.size();
84 inline void dataReserve(
Integer size)
89 inline void addData(
const T data)
100 inline void beginIncrement(
Integer id)
102 ARCANE_ASSERT((m_current_increment == -1), (
"call endIncrement before begin"));
103 m_current_increment = id;
105 m_index[m_current_increment] = m_data.size();
108 inline void endIncrement()
110 m_size[m_current_increment] = m_current_size;
111 m_current_increment = -1;
117 return m_data.
subView(m_index[
id], m_size[
id]);
122 return m_data.
subView(m_index[
id], m_size[
id]);
142 DynamicMultiArray(
Integer size)
146 DynamicMultiArray() {}
148 inline void resize(
Integer size)
155 return m_data.size();
158 inline void addData(
Integer id,
const T data)
160 m_data[id].add(data);
182MeshExchange(
IMesh* mesh)
185, m_parallel_mng(mesh->parallelMng())
186, m_nb_rank(m_parallel_mng->commSize())
187, m_rank(m_parallel_mng->commRank())
188, m_cell_family(mesh->itemFamily(
IK_Cell))
189, m_neighbour_cells_owner(NULL)
190, m_neighbour_cells_new_owner(NULL)
191, m_neighbour_extra_cells_owner(NULL)
192, m_neighbour_extra_cells_new_owner(NULL)
202 for (
const auto& itosend : m_items_to_send)
203 delete itosend.second;
204 delete m_neighbour_cells_owner;
205 delete m_neighbour_cells_new_owner;
206 delete m_neighbour_extra_cells_owner;
207 delete m_neighbour_extra_cells_new_owner;
208 for (
const auto& idestrank : m_item_dest_ranks_map)
209 delete idestrank.second;
210 for (
const auto& ighostdestrank_map : m_ghost_item_dest_ranks_map)
211 for (
const auto& ighostdestrank : ighostdestrank_map)
212 delete ighostdestrank.second;
222 auto iter = m_items_to_send.find(family);
223 if (iter == m_items_to_send.end())
225 return iter->second->constView();
235 auto iter = m_items_to_send.find(family);
236 if (iter == m_items_to_send.end())
238 return iter->second->view();
250 m_items_to_send.insert(std::make_pair(family,
new UniqueArray<std::set<Int32>>));
255 if (
m_mesh->isAmrActivated()) {
257 _computeGraphConnectivityInfos();
258 _exchangeCellDataInfos(cells_new_owner,
true);
259 _markRemovableCells(cells_new_owner,
true);
260 _markRemovableParticles();
261 _computeItemsToSend2();
263 else if (
m_mesh->itemFamilyNetwork() &&
m_mesh->itemFamilyNetwork()->isActivated()) {
264 if (
m_mesh->useMeshItemFamilyDependencies()) {
266 _computeGraphConnectivityInfos();
267 _exchangeCellDataInfos3();
268 _exchangeGhostItemDataInfos();
269 _markRemovableItems();
270 _markRemovableParticles();
271 _computeItemsToSend3();
275 _computeMeshConnectivityInfos(cells_new_owner);
277 _computeGraphConnectivityInfos();
278 _exchangeCellDataInfos(cells_new_owner,
false);
279 _exchangeCellDataInfos3();
282 _markRemovableDoFs();
283 _markRemovableCells(cells_new_owner,
false);
284 _markRemovableParticles();
285 _computeItemsToSend(
true);
289 _computeMeshConnectivityInfos(cells_new_owner);
290 _computeGraphConnectivityInfos();
291 _exchangeCellDataInfos(cells_new_owner,
false);
292 _markRemovableCells(cells_new_owner,
false);
293 _markRemovableParticles();
294 _computeItemsToSend();
302_computeGraphConnectivityInfos()
307 tmp_new_owner.fill(NULL_ITEM_ID);
309 tmp_owner.fill(NULL_ITEM_ID);
312 tmp_link_new_owner.fill(NULL_ITEM_ID);
314 tmp_link_owner.fill(NULL_ITEM_ID);
318 m_neighbour_extra_cells_owner =
new DynamicMultiArray<Int32>(cell_variable_size);
319 m_neighbour_extra_cells_new_owner =
new DynamicMultiArray<Int32>(cell_variable_size);
322 _addGraphConnectivityToNewConnectivityInfo();
330_addGraphConnectivityToNewConnectivityInfo()
333 Int32Array& extra_new_owners = m_neighbour_extra_cells_new_owner->at(icell.localId());
334 Int32Array& extra_owners = m_neighbour_extra_cells_owner->at(icell.localId());
335 ItemDestRankArray* item_dest_ranks =
nullptr;
337 item_dest_ranks = m_item_dest_ranks_map[m_cell_family];
339 item_dest_ranks = m_ghost_item_dest_ranks_map[icell->owner()][m_cell_family];
340 item_dest_ranks->at(icell.localId()).
addRange(extra_new_owners);
341 item_dest_ranks->at(icell.localId()).addRange(extra_owners);
344 _propagatesToChildDependencies(m_cell_family);
353 Integer cell_variable_size = m_cell_family->maxLocalId();
359 tmp_new_owner.fill(NULL_ITEM_ID);
361 tmp_owner.fill(NULL_ITEM_ID);
365 Integer cell_local_id = cell.localId();
367 tmp_owner[m_rank] = cell_local_id;
369 m_neighbour_cells_owner->beginIncrement(cell_local_id);
370 m_neighbour_cells_new_owner->beginIncrement(cell_local_id);
374 Integer cell2_local_id = icell2.localId();
375 Integer cell2_new_owner = cells_new_owner[cell2_local_id];
376 Integer cell2_owner = icell2->owner();
379 if (tmp_new_owner[cell2_new_owner] != cell_local_id) {
380 tmp_new_owner[cell2_new_owner] = cell_local_id;
381 m_neighbour_cells_new_owner->addData(cell2_new_owner);
383 if (tmp_owner[cell2_owner] != cell_local_id) {
384 tmp_owner[cell2_owner] = cell_local_id;
385 m_neighbour_cells_owner->addData(cell2_owner);
389 m_neighbour_cells_owner->endIncrement();
390 m_neighbour_cells_new_owner->endIncrement();
398_exchangeCellDataInfos([[maybe_unused]]
Int32ConstArrayView cells_new_owner,
bool use_active_cells)
403 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
404 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i)
405 sd_exchange->addSender(recv_sub_domains[i]);
407 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
409 UniqueArray<Int64> cells_to_comm_uid;
410 UniqueArray<Int32> cells_to_comm_owner;
411 UniqueArray<Int32> cells_to_comm_owner_size;
412 UniqueArray<Int32> cells_to_comm_new_owner;
413 UniqueArray<Int32> cells_to_comm_new_owner_size;
415 ItemGroup own_items = m_cell_family->allItems().own();
416 ItemGroup all_items = m_cell_family->allItems();
418 if (use_active_cells) {
419 own_items = m_cell_family->allItems().ownActiveCellGroup();
420 all_items = m_cell_family->allItems().activeCellGroup();
423 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
424 ISerializeMessage* comm = sd_exchange->messageToSend(i);
425 Int32 dest_sub_domain = comm->destination().value();
426 ISerializer* sbuf = comm->serializer();
428 cells_to_comm_uid.clear();
429 cells_to_comm_owner.clear();
430 cells_to_comm_owner_size.clear();
431 cells_to_comm_new_owner.clear();
432 cells_to_comm_new_owner_size.clear();
436 Integer cell_local_id = cell.localId();
438 bool need_send = owners.
contains(dest_sub_domain);
441 need_send = extra_owners.contains(dest_sub_domain);
448 const Integer nb_owner = owners.size();
450 Int32ConstArrayView extra_new_owner = m_neighbour_extra_cells_new_owner->at(cell_local_id);
451 const Integer nb_extra_new_owner = extra_new_owner.
size();
453 cells_to_comm_uid.add(cell.uniqueId().asInt64());
454 cells_to_comm_owner_size.add(nb_owner);
455 cells_to_comm_new_owner_size.add(nb_new_owner + nb_extra_new_owner);
456 for (
Integer zz = 0; zz < nb_owner; ++zz)
457 cells_to_comm_owner.add(owners[zz]);
458 for (
Integer zz = 0; zz < nb_new_owner; ++zz)
459 cells_to_comm_new_owner.add(new_owners[zz]);
460 for (
Integer zz = 0; zz < nb_extra_new_owner; ++zz)
461 cells_to_comm_new_owner.add(extra_new_owner[zz]);
463 sbuf->setMode(ISerializer::ModeReserve);
465 sbuf->reserveInt64(1);
466 sbuf->reserveArray(cells_to_comm_uid);
467 sbuf->reserveArray(cells_to_comm_owner_size);
468 sbuf->reserveArray(cells_to_comm_owner);
469 sbuf->reserveArray(cells_to_comm_new_owner_size);
470 sbuf->reserveArray(cells_to_comm_new_owner);
472 sbuf->allocateBuffer();
475 sbuf->putInt64(cells_to_comm_uid.size());
476 sbuf->putArray(cells_to_comm_uid);
477 sbuf->putArray(cells_to_comm_owner_size);
478 sbuf->putArray(cells_to_comm_owner);
479 sbuf->putArray(cells_to_comm_new_owner_size);
480 sbuf->putArray(cells_to_comm_new_owner);
483 sd_exchange->processExchange();
486 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
487 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
488 ISerializer* sbuf = comm->serializer();
491 Int64 nb_cell = sbuf->getInt64();
492 sbuf->getArray(cells_to_comm_uid);
493 sbuf->getArray(cells_to_comm_owner_size);
494 sbuf->getArray(cells_to_comm_owner);
495 sbuf->getArray(cells_to_comm_new_owner_size);
496 sbuf->getArray(cells_to_comm_new_owner);
497 cells_to_comm_local_id.resize(nb_cell);
498 m_cell_family->itemsUniqueIdToLocalId(cells_to_comm_local_id, cells_to_comm_uid);
499 for (
Integer icell = 0; icell < nb_cell; ++icell) {
500 Integer cell_local_id = cells_to_comm_local_id[icell];
501 Integer cell_nb_owner = cells_to_comm_owner_size[icell];
502 Integer cell_nb_new_owner = cells_to_comm_new_owner_size[icell];
504 info() <<
" cell " << icell
505 <<
" lid=" << cell_local_id
506 <<
" uid=" << cells_to_comm_uid[icell]
507 <<
" ind=" << m_neighbour_cells_owner->index(cell_local_id);
509 if (m_neighbour_cells_owner->index(cell_local_id) != (-1))
510 fatal() <<
"Cell uid=" << cells_to_comm_uid[icell] <<
" already has neighbours 'owner'!";
511 if (m_neighbour_cells_new_owner->index(cell_local_id) != (-1))
512 fatal() <<
"Cell uid=" << cells_to_comm_uid[icell] <<
" already has neighbours 'new_owner'!";
513 m_neighbour_cells_owner->beginIncrement(cell_local_id);
514 m_neighbour_cells_new_owner->beginIncrement(cell_local_id);
516 info() <<
" cell " << icell
517 <<
" lid=" << cell_local_id
518 <<
" uid=" << cells_to_comm_uid[icell]
519 <<
" ind=" << m_neighbour_cells_owner->index(cell_local_id);
521 for (
Integer zz = 0; zz < cell_nb_owner; ++zz)
522 m_neighbour_cells_owner->addData(cells_to_comm_owner[owner_index + zz]);
523 owner_index += cell_nb_owner;
524 m_neighbour_cells_owner->endIncrement();
526 for (
Integer zz = 0; zz < cell_nb_new_owner; ++zz)
527 m_neighbour_cells_new_owner->addData(cells_to_comm_new_owner[new_owner_index + zz]);
528 new_owner_index += cell_nb_new_owner;
529 m_neighbour_cells_new_owner->endIncrement();
538_addItemToSend(ArrayView<std::set<Int32>> items_to_send,
540 bool use_itemfamily_network)
543 for (
Integer zz = 0, nb_new_owner = new_owners.size(); zz < nb_new_owner; ++zz)
544 items_to_send[new_owners[zz]].insert(local_id);
546 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
547 for (
Integer zz = 0, nb_extra_new_owner = extra_new_owners.size(); zz < nb_extra_new_owner; ++zz)
548 items_to_send[extra_new_owners[zz]].insert(local_id);
550 if (use_itemfamily_network) {
551 Int32ConstArrayView network_new_owners = m_item_dest_ranks_map[m_cell_family]->at(cell_local_id);
552 for (
Integer zz = 0, nb_network_new_owner = network_new_owners.size(); zz < nb_network_new_owner; ++zz) {
553 items_to_send[network_new_owners[zz]].insert(local_id);
562_computeItemsToSend(
bool send_dof)
564 for (
const auto& iter : m_items_to_send)
565 iter.second->resize(m_nb_rank);
567 IItemFamily* node_family = mesh()->nodeFamily();
568 IItemFamily* edge_family = mesh()->edgeFamily();
569 IItemFamily* face_family = mesh()->faceFamily();
570 IItemFamily* cell_family = m_cell_family;
572 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
573 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
574 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
575 ArrayView<std::set<Int32>> cells_to_send =
_getItemsToSend(cell_family);
579 bool use_itemfamily_network =
m_mesh->itemFamilyNetwork() &&
m_mesh->itemFamilyNetwork()->isActivated();
581 _addItemToSend(cells_to_send, icell.itemLocalId(), icell.itemLocalId(), use_itemfamily_network);
586 Integer node_local_id = node.localId();
588 _addItemToSend(nodes_to_send, node_local_id, icell.localId(), use_itemfamily_network);
593 Integer edge_local_id = edge.localId();
595 _addItemToSend(edges_to_send, edge_local_id, icell.localId(), use_itemfamily_network);
600 Integer face_local_id = face.localId();
602 _addItemToSend(faces_to_send, face_local_id, icell.localId(), use_itemfamily_network);
607 for (IItemFamily* family :
m_mesh->itemFamilies()) {
608 IParticleFamily* particle_family = family->toParticleFamily();
609 if (particle_family && particle_family->getEnableGhostItems() ==
true) {
612 Cell cell = iparticle->cell();
615 _addItemToSend(to_send, iparticle->localId(), cell.localId(), use_itemfamily_network);
618 if (send_dof && family->itemKind() ==
IK_DoF) {
619 _setItemsToSend(family);
625 for (
const auto& iter : m_items_to_send)
626 (*(iter.second))[m_rank].clear();
628 const bool is_print =
false;
630 debug() <<
"PRINT ITEM TO SEND V1";
654 Integer cell_variable_size = m_cell_family->maxLocalId();
660 tmp_new_owner.
fill(NULL_ITEM_ID);
662 tmp_owner.
fill(NULL_ITEM_ID);
664 ENUMERATE_CELL (icell, m_cell_family->allItems().ownActiveCellGroup()) {
665 const Cell& cell = *icell;
668 tmp_owner[m_rank] = cell_local_id;
670 m_neighbour_cells_owner->beginIncrement(cell_local_id);
671 m_neighbour_cells_new_owner->beginIncrement(cell_local_id);
675 for (
CellEnumerator icell2((*inode)._internalActiveCells(local_ids)); icell2.hasNext(); ++icell2) {
676 Integer cell2_local_id = icell2.localId();
677 Integer cell2_new_owner = cells_new_owner[cell2_local_id];
678 Integer cell2_owner = icell2->owner();
680 if (tmp_new_owner[cell2_new_owner] != cell_local_id) {
681 tmp_new_owner[cell2_new_owner] = cell_local_id;
682 m_neighbour_cells_new_owner->addData(cell2_new_owner);
684 if (tmp_owner[cell2_owner] != cell_local_id) {
685 tmp_owner[cell2_owner] = cell_local_id;
686 m_neighbour_cells_owner->addData(cell2_owner);
691 m_neighbour_cells_owner->endIncrement();
692 m_neighbour_cells_new_owner->endIncrement();
700_addTreeCellToSend(
ArrayView<std::set<Int32>> items_to_send,
706 Cell cell(cells[local_id]);
707 if (cell.level() == 0) {
708 for (
Integer zz = 0, nb_new_owner = new_owners.
size(); zz < nb_new_owner; ++zz)
709 items_to_send[new_owners[zz]].insert(local_id);
711 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
712 for (
Integer zz = 0, nb_extra_new_owner = extra_new_owners.
size(); zz < nb_extra_new_owner; ++zz)
713 items_to_send[extra_new_owners[zz]].insert(local_id);
718 _familyTree(family, top_parent);
719 for (
Integer c = 0, cs = family.
size(); c < cs; c++) {
720 for (
Integer zz = 0, nb_new_owner = new_owners.
size(); zz < nb_new_owner; ++zz)
721 items_to_send[new_owners[zz]].insert(family[c]);
730_addTreeItemToSend(
Int32 cell_local_id, CellInfoListView cells)
736 Cell cell(cells[cell_local_id]);
741 _familyTree(family, top_parent);
743 IItemFamily* node_family = mesh()->nodeFamily();
744 IItemFamily* edge_family = mesh()->edgeFamily();
745 IItemFamily* face_family = mesh()->faceFamily();
747 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
748 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
749 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
753 for (
Integer c = 0, cs = family.size(); c < cs; c++)
754 for (
Integer zz = 0, nb_new_owner = new_owners.size(); zz < nb_new_owner; ++zz) {
755 Cell cell2 = cells[family[c]];
756 for (Node node : cell2.nodes())
757 nodes_to_send[new_owners[zz]].insert(node.localId());
758 for (Edge edge : cell2.edges())
759 edges_to_send[new_owners[zz]].insert(edge.localId());
760 for (Face face : cell2.faces())
761 faces_to_send[new_owners[zz]].insert(face.localId());
771 ARCANE_ASSERT((!item.itemBase().isSubactive()), (
"The family tree doesn't include subactive items"));
776 family.add(item.localId());
779 if (!item.isActive())
780 for (
Integer c = 0, cs = item.nbHChildren(); c < cs; c++) {
781 Item ichild = item.hChild(c);
783 _familyTree(family, ichild.toCell(),
false);
791_computeItemsToSend2()
793 for (
const auto& iter : m_items_to_send)
794 iter.second->resize(m_nb_rank);
796 IItemFamily* node_family = mesh()->nodeFamily();
797 IItemFamily* edge_family = mesh()->edgeFamily();
798 IItemFamily* face_family = mesh()->faceFamily();
800 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
801 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
802 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
803 ArrayView<std::set<Int32>> cells_to_send =
_getItemsToSend(m_cell_family);
808 CellInfoListView cells(m_cell_family);
809 ENUMERATE_CELL (icell, m_cell_family->allItems().ownActiveCellGroup()) {
811 _addTreeCellToSend(cells_to_send, icell.itemLocalId(), icell.itemLocalId(), cells);
813 if (cell.level() == 0) {
818 Integer node_local_id = node.localId();
822 _addItemToSend(nodes_to_send, node_local_id, icell2.localId());
830 Integer edge_local_id = edge.localId();
832 _addItemToSend(edges_to_send, edge_local_id, icell2.localId());
839 Integer face_local_id = face.localId();
841 _addItemToSend(faces_to_send, face_local_id, icell2.localId());
846 else if (cell.level() > 0)
847 _addTreeItemToSend(icell.itemLocalId(), cells);
850 for (IItemFamily* family :
m_mesh->itemFamilies()) {
851 IParticleFamily* particle_family = family->toParticleFamily();
852 if (particle_family && particle_family->getEnableGhostItems() ==
true) {
855 _addItemToSend(to_send, iparticle->localId(), iparticle->cell().localId());
861 for (
const auto& iter : m_items_to_send)
862 (*(iter.second))[m_rank].clear();
886 if (!
m_mesh->itemFamilyNetwork())
887 info() <<
"Should have an IItemFamilyNetwork. Exiting.";
889 m_ghost_item_dest_ranks_map.resize(m_parallel_mng->commSize());
893 IItemFamilyNetwork::TopologicalOrder);
903 if (!
m_mesh->ghostLayerMng())
904 info() <<
"Should have a IGhostLayerMng. Exiting";
905 for (
int ghost_layer_index = 0; ghost_layer_index <
m_mesh->ghostLayerMng()->nbGhostLayer(); ++ghost_layer_index) {
908 _propagatesToChildConnectivities(family);
910 IItemFamilyNetwork::TopologicalOrder);
923_propagatesToChildConnectivities(
IItemFamily* family)
936 for (
const auto& child_connectivity : child_connectivities) {
937 if (child_connectivity) {
938 VariableItemInt32& conn_item_new_owner = child_connectivity->targetFamily()->itemsNewOwner();
942 _addDestRank(*item, family, item_new_owner[item]);
944 _addDestRank(*item, family, conn_item_new_owner[connected_item]);
948 _addDestRank(*connected_item, child_connectivity->targetFamily(), *item, family);
953 if (!
m_mesh->useMeshItemFamilyDependencies()) {
957 for (
Cell cell : item->cells())
958 _addDestRank(cell, m_cell_family, *item, family);
963 for (
Cell cell : item->cells())
964 _addDestRank(cell, m_cell_family, *item, family);
969 for (
Cell cell : item->cells())
970 _addDestRank(cell, m_cell_family, *item, family);
983_propagatesToChildDependencies(IItemFamily* family)
991 auto child_dependencies =
m_mesh->itemFamilyNetwork()->getChildDependencies(family);
992 for (
const auto& child_dependency : child_dependencies) {
993 if (child_dependency) {
994 auto accessor = IndexedItemConnectivityAccessor(child_dependency);
998 _addDestRank(*connected_item, child_dependency->targetFamily(), *item, family);
1009_addDestRank(
const Item& item, IItemFamily* item_family,
const Integer new_owner)
1011 ItemDestRankArray* item_dest_ranks =
nullptr;
1012 if (item.owner() == m_rank) {
1013 item_dest_ranks = m_item_dest_ranks_map[item_family];
1016 item_dest_ranks = m_ghost_item_dest_ranks_map[item.owner()][item_family];
1019 auto& item_ranks_internal = item_dest_ranks->at(item.localId());
1020 if (!item_ranks_internal.contains(new_owner))
1021 item_dest_ranks->at(item.localId()).add(new_owner);
1028_addDestRank(
const Item& item, IItemFamily* item_family,
const Item& followed_item, IItemFamily* followed_item_family)
1031 ItemDestRankArray* item_dest_ranks =
nullptr;
1032 if (item.owner() == m_rank) {
1033 item_dest_ranks = m_item_dest_ranks_map[item_family];
1036 item_dest_ranks = m_ghost_item_dest_ranks_map[item.owner()][item_family];
1038 ItemDestRankArray* followed_item_dest_ranks =
nullptr;
1039 if (followed_item.owner() == m_rank)
1040 followed_item_dest_ranks = m_item_dest_ranks_map[followed_item_family];
1042 followed_item_dest_ranks = m_ghost_item_dest_ranks_map[followed_item.owner()][followed_item_family];
1044 auto& new_dest_ranks = followed_item_dest_ranks->at(followed_item.localId());
1045 auto& current_dest_ranks = item_dest_ranks->at(item.localId());
1047 new_dest_rank_to_add.
reserve((new_dest_ranks.size()));
1048 for (
auto& new_dest_rank : new_dest_ranks) {
1049 if (!current_dest_ranks.contains(new_dest_rank))
1050 new_dest_rank_to_add.add(new_dest_rank);
1052 current_dest_ranks.addRange(new_dest_rank_to_add);
1059_allocData(IItemFamily* family)
1061 m_item_dest_ranks_map[family] =
new ItemDestRankArray(family->maxLocalId());
1062 for (
auto& ghost_item_map : m_ghost_item_dest_ranks_map) {
1063 ghost_item_map[family] =
new ItemDestRankArray(family->maxLocalId());
1072 info() <<
"-ENTERING NEW EXCHANGE DEBUG PRINT";
1073 for (
auto& item_dest_ranks : m_item_dest_ranks_map) {
1074 info() <<
"--PRINT NEW EXCHANGE INFO";
1075 info() <<
"---Destination rank for family " << item_dest_ranks.first->name();
1076 for (
int item_lid = 0; item_lid < item_dest_ranks.first->maxLocalId(); ++item_lid) {
1077 info() <<
"---Destination rank for item lid " << item_lid;
1078 for (
auto& item_dest_rank : item_dest_ranks.second->at(item_lid)) {
1079 info() <<
"---- Rank " << item_dest_rank;
1089_exchangeCellDataInfos3()
1095 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
1096 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i)
1097 sd_exchange->addSender(recv_sub_domains[i]);
1099 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
1101 UniqueArray<IItemFamily*> item_families;
1108 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
1109 ISerializeMessage* comm = sd_exchange->messageToSend(i);
1110 Int32 dest_sub_domain = comm->destination().value();
1111 ISerializer* sbuf = comm->serializer();
1112 item_families.clear();
1113 item_dest_ranks.clear();
1114 item_nb_dest_ranks.clear();
1115 family_nb_items.clear();
1117 for (
const auto& family_ghost_item_dest_ranks : m_ghost_item_dest_ranks_map[dest_sub_domain]) {
1120 item_families.add(family_ghost_item_dest_ranks.first);
1121 for (
Integer item_lid = 0; item_lid < family_ghost_item_dest_ranks.second->size(); ++item_lid) {
1122 if (family_ghost_item_dest_ranks.second->at(item_lid).size() == 0)
1124 item_lids.add(item_lid);
1125 item_dest_ranks.addRange(family_ghost_item_dest_ranks.second->at(item_lid));
1126 item_nb_dest_ranks.add(family_ghost_item_dest_ranks.second->at(item_lid).size());
1129 family_nb_items.add(family_nb_item);
1130 ENUMERATE_ITEM (item, family_ghost_item_dest_ranks.first->view(item_lids)) {
1131 item_uids.add(item->uniqueId().asInt64());
1134 sbuf->setMode(ISerializer::ModeReserve);
1135 sbuf->reserveInt64(1);
1136 for (
const auto& family : item_families)
1137 sbuf->
reserve(family->name());
1138 sbuf->reserveInteger(item_families.size());
1139 sbuf->reserveArray(item_uids);
1140 sbuf->reserveArray(family_nb_items);
1141 sbuf->reserveArray(item_nb_dest_ranks);
1142 sbuf->reserveArray(item_dest_ranks);
1144 sbuf->allocateBuffer();
1147 sbuf->putInt64(item_families.size());
1148 for (
const auto& family : item_families)
1149 sbuf->put(family->name());
1150 for (
const auto& family : item_families)
1151 sbuf->putInteger(family->itemKind());
1152 sbuf->putArray(item_uids);
1153 sbuf->putArray(family_nb_items);
1154 sbuf->putArray(item_nb_dest_ranks);
1155 sbuf->putArray(item_dest_ranks);
1158 sd_exchange->processExchange();
1160 for (
Integer i = 0, n = recv_sub_domains.size(); i < n; ++i) {
1161 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
1162 ISerializer* sbuf = comm->serializer();
1163 Int64 nb_families = sbuf->getInt64();
1166 for (
auto& family_name : item_family_names)
1167 sbuf->get(family_name);
1168 for (
auto& family_kind : item_family_kinds)
1169 family_kind = sbuf->getInteger();
1170 sbuf->getArray(item_uids);
1171 sbuf->getArray(family_nb_items);
1172 sbuf->getArray(item_nb_dest_ranks);
1173 sbuf->getArray(item_dest_ranks);
1175 Integer item_nb_dest_rank_index = 0;
1176 Integer item_dest_rank_index = 0;
1177 for (
int family_index = 0; family_index < nb_families; ++family_index) {
1178 IItemFamily* family =
m_mesh->findItemFamily(
eItemKind(item_family_kinds[family_index]),
1179 item_family_names[family_index],
false);
1181 item_lids.resize(family_item_uids.size());
1182 family->itemsUniqueIdToLocalId(item_lids, family_item_uids,
true);
1183 for (
const auto& item_lid : item_lids) {
1184 auto sub_view = item_dest_ranks.subView(item_dest_rank_index, item_nb_dest_ranks[item_nb_dest_rank_index]);
1185 m_item_dest_ranks_map[family]->at(item_lid).addRange(sub_view);
1186 item_dest_rank_index += item_nb_dest_ranks[item_nb_dest_rank_index++];
1188 item_uid_index += family_nb_items[family_index];
1193 for (
int ghost_layer_index = 0; ghost_layer_index <
m_mesh->ghostLayerMng()->nbGhostLayer(); ++ghost_layer_index) {
1195 m_mesh->itemFamilyNetwork()->schedule([&](IItemFamily* family) {
1196 _propagatesToChildConnectivities(family);
1198 IItemFamilyNetwork::TopologicalOrder);
1210_computeItemsToSend3()
1212 for (
const auto& iter : m_items_to_send)
1213 iter.second->resize(m_nb_rank);
1215 IItemFamily* node_family = mesh()->nodeFamily();
1216 IItemFamily* edge_family = mesh()->edgeFamily();
1217 IItemFamily* face_family = mesh()->faceFamily();
1218 IItemFamily* cell_family = m_cell_family;
1220 _setItemsToSend(node_family);
1221 _setItemsToSend(edge_family);
1222 _setItemsToSend(face_family);
1223 _setItemsToSend(cell_family);
1227 for (IItemFamily* family :
m_mesh->itemFamilies()) {
1228 IParticleFamily* particle_family = family->toParticleFamily();
1229 if (particle_family && particle_family->getEnableGhostItems() ==
true) {
1232 for (
const auto& dest_rank : m_item_dest_ranks_map[m_cell_family]->at(iparticle->cell().localId())) {
1233 to_send[dest_rank].insert(iparticle->localId());
1241 for (
const auto& iter : m_items_to_send)
1242 (*(iter.second))[m_rank].clear();
1256_setItemsToSend(IItemFamily* family)
1258 if (family->nbItem() == 0)
1260 auto iter = m_items_to_send.find(family);
1261 if (iter == m_items_to_send.end())
1262 ARCANE_FATAL(
"No items to send for family '{0}'", family->name());
1263 ArrayView<std::set<Int32>> items_to_send = iter->second->view();
1264 for (
Integer item_lid = 0; item_lid < m_item_dest_ranks_map[family]->size(); ++item_lid) {
1265 for (
const auto& dest_rank : m_item_dest_ranks_map[family]->at(item_lid)) {
1266 items_to_send[dest_rank].insert(item_lid);
1277 auto iter = m_items_to_send.find(family);
1278 if (iter == m_items_to_send.end())
1283 debug() <<
"= ITEM TO SEND FOR FAMILY " << family->
name();
1284 for (
const auto& owner_lids : items_to_send) {
1285 debug() <<
"== RANK " << rank++;
1286 for (
auto item_lid : owner_lids) {
1287 debug() <<
"=== has items " << item_lid;
1299 debug() <<
"= ITEM TO REMOVE FOR FAMILY " << family->
name();
1302 debug() <<
"== TO REMOVE ITEM " << item->uniqueId() <<
" kind " << item->kind();
1311 for (
const auto& item_dest_ranks_iter : m_item_dest_ranks_map) {
1313 IItemFamily* family = item_dest_ranks_iter.first;
1314 if (family->itemKind() ==
IK_DoF) {
1315 auto& item_new_owners = family->itemsNewOwner();
1320 item_dest_ranks = item_dest_ranks_iter.second->at(item->localId()).view();
1322 item_dest_ranks = m_ghost_item_dest_ranks_map[item->owner()][family]->at(item->localId()).view();
1324 if (!item_dest_ranks.contains(m_rank) && item_new_owners[item] != m_rank) {
1334_markRemovableItems(
bool with_cell_family)
1336 for (
const auto& item_dest_ranks_iter : m_item_dest_ranks_map) {
1338 IItemFamily* family = item_dest_ranks_iter.first;
1339 if (with_cell_family || family->name() != m_cell_family->name()) {
1340 auto& item_new_owners = family->itemsNewOwner();
1345 item_dest_ranks = item_dest_ranks_iter.second->at(item.localId()).view();
1347 item_dest_ranks = m_ghost_item_dest_ranks_map[item->owner()][family]->at(item.localId()).view();
1349 if (!item_dest_ranks.contains(m_rank) && item_new_owners[item] != m_rank) {
1378 ItemGroup all_items = m_cell_family->allItems();
1380 auto itemfamily_network =
m_mesh->itemFamilyNetwork();
1381 bool use_itemfamily_network = (itemfamily_network !=
nullptr && itemfamily_network->isActivated());
1384 if (use_active_cells)
1385 all_items = m_cell_family->allItems().activeCellGroup();
1389 Integer cell_local_id = cell.localId();
1390 if (cells_new_owner[cell_local_id] == m_rank)
1394 bool keep_cell = new_owners.
contains(m_rank);
1396 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
1397 keep_cell = extra_new_owners.
contains(m_rank);
1399 if (!keep_cell && use_itemfamily_network) {
1403 item_dest_ranks = m_item_dest_ranks_map[m_cell_family]->at(icell->localId()).view();
1405 item_dest_ranks = m_ghost_item_dest_ranks_map[icell->owner()][m_cell_family]->at(icell->localId()).view();
1407 keep_cell = item_dest_ranks.contains(m_rank);
1418_markRemovableParticles()
1420 for (IItemFamily* family :
m_mesh->itemFamilies()) {
1421 IParticleFamily* particle_family = family->toParticleFamily();
1422 if (particle_family && particle_family->getEnableGhostItems()) {
1423 mesh::NewItemOwnerBuilder owner_builder;
1426 Particle particle = *iparticle;
1427 Cell cell = owner_builder.connectedCellOfItem(particle);
1441_checkSubItemsDestRanks()
1445 m_mesh->itemFamilyNetwork()->schedule([
this](IItemFamily* family) {
1447 const auto& item_dest_ranks = m_item_dest_ranks_map[family]->at(item.localId());
1448 for (
const auto& child_dependency :
m_mesh->itemFamilyNetwork()->getChildDependencies(family)) {
1449 auto accessor = IndexedItemConnectivityAccessor(child_dependency);
1453 if (connected_item->isOwn()) {
1454 subitem_dest_ranks = m_item_dest_ranks_map[child_dependency->targetFamily()]->at(connected_item.localId()).constView();
1455 for (
auto dest_rank : item_dest_ranks) {
1456 if (!subitem_dest_ranks.contains(dest_rank))
1457 fatal() <<
"Dest Rank " << dest_rank <<
" for item " << item->kind() <<
" uid " << item->uniqueId()
1458 <<
" not present in subitem " << connected_item->kind() <<
" uid " << connected_item->uniqueId()
1459 <<
" dest ranks " << subitem_dest_ranks <<
" ower " << connected_item->owner();
1466 IItemFamilyNetwork::TopologicalOrder);
1473_exchangeGhostItemDataInfos()
1490 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
1491 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i)
1492 sd_exchange->addSender(recv_sub_domains[i]);
1494 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
1496 UniqueArray<IItemFamily*> item_families;
1502 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
1503 ISerializeMessage* comm = sd_exchange->messageToSend(i);
1504 Int32 dest_sub_domain = comm->destination().value();
1505 ISerializer* sbuf = comm->serializer();
1506 item_families.clear();
1507 item_dest_ranks.clear();
1508 item_nb_dest_ranks.clear();
1509 family_nb_items.clear();
1511 for (
const auto& family_item_dest_ranks : m_item_dest_ranks_map) {
1513 IItemFamily* family = family_item_dest_ranks.first;
1514 if (family->nbItem() == 0)
1516 item_families.add(family);
1518 auto subdomain_index = _getSubdomainIndexInCommunicatingRanks(dest_sub_domain, family->allItemsSynchronizer()->communicatingRanks());
1519 auto shared_item_lids = family->allItemsSynchronizer()->sharedItems(subdomain_index);
1520 for (
const auto& item_lid : shared_item_lids) {
1521 if (family_item_dest_ranks.second->at(item_lid).size() == 0)
1523 item_dest_ranks.addRange(family_item_dest_ranks.second->at(item_lid));
1524 item_nb_dest_ranks.add(family_item_dest_ranks.second->at(item_lid).size());
1527 family_nb_items.add(family_nb_item);
1528 ENUMERATE_ITEM (item, family_item_dest_ranks.first->view(shared_item_lids)) {
1529 item_uids.add(item->uniqueId().asInt64());
1532 sbuf->setMode(ISerializer::ModeReserve);
1534 sbuf->reserveInt64(1);
1535 for (
const auto& family : item_families)
1536 sbuf->
reserve(family->name());
1537 sbuf->reserveInt64(item_families.size());
1539 sbuf->reserveArray(item_uids);
1540 sbuf->reserveArray(family_nb_items);
1541 sbuf->reserveArray(item_nb_dest_ranks);
1542 sbuf->reserveArray(item_dest_ranks);
1544 sbuf->allocateBuffer();
1547 sbuf->putInt64(item_families.size());
1548 for (
const auto& family : item_families)
1549 sbuf->put(family->name());
1550 for (
const auto& family : item_families)
1551 sbuf->putInteger(family->itemKind());
1553 sbuf->putArray(item_uids);
1554 sbuf->putArray(family_nb_items);
1555 sbuf->putArray(item_nb_dest_ranks);
1556 sbuf->putArray(item_dest_ranks);
1559 sd_exchange->processExchange();
1561 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
1562 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
1563 ISerializer* sbuf = comm->serializer();
1564 Int64 nb_families = sbuf->getInt64();
1567 for (
auto& family_name : item_family_names)
1568 sbuf->get(family_name);
1569 for (
auto& family_kind : item_family_kinds)
1570 family_kind = sbuf->getInteger();
1571 sbuf->getArray(item_uids);
1572 sbuf->getArray(family_nb_items);
1573 sbuf->getArray(item_nb_dest_ranks);
1574 sbuf->getArray(item_dest_ranks);
1576 Integer item_nb_dest_rank_index = 0;
1577 Integer item_dest_rank_index = 0;
1578 for (
int family_index = 0; family_index < nb_families; ++family_index) {
1579 IItemFamily* family =
m_mesh->findItemFamily(
eItemKind(item_family_kinds[family_index]), item_family_names[family_index],
false);
1582 family->itemsUniqueIdToLocalId(item_lids, family_item_uids,
true);
1583 for (
const auto& item_lid : item_lids) {
1584 auto sub_view = item_dest_ranks.subView(item_dest_rank_index, item_nb_dest_ranks[item_nb_dest_rank_index]);
1585 Int32 dest_rank = comm->destination().value();
1586 m_ghost_item_dest_ranks_map[dest_rank][family]->at(item_lid).addRange(sub_view);
1587 item_dest_rank_index += item_nb_dest_ranks[item_nb_dest_rank_index++];
1589 item_uid_index += family_nb_items[family_index];
1602 while (communicating_ranks[i] != rank) {
1611ISubDomain* MeshExchange::
1614 return m_mesh->subDomain();
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Integer size() const
Number of elements in the vector.
Modifiable view of an array of type T.
constexpr ArrayView< T > subView(Integer abegin, Integer asize) noexcept
Sub-view starting from element abegin and containing asize elements.
void fill(ConstReferenceType value)
Fills the array with the value value.
void addRange(ConstReferenceType val, Int64 n)
Adds n elements of value val to the end of the array.
void clear()
Removes the elements from the array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
View of cell information.
Cell topHParent() const
level 0 parent for AMR
Constant view of an array of type T.
constexpr ConstArrayView< T > subView(Integer abegin, Integer asize) const noexcept
Sub-view (constant) starting from element abegin and containing asize elements.
bool contains(const_reference v) const
true if the array contains the element of value v
constexpr Integer size() const noexcept
Number of elements in the array.
virtual SharedArray< IIncrementalItemConnectivity * > getChildDependencies(IItemFamily *source_family)=0
Get the list of all dependencies, children of a family source_family or.
Interface of an entity family.
virtual ItemGroup allItems() const =0
Group of all entities.
virtual Int32 maxLocalId() const =0
virtual String name() const =0
Family name.
virtual eItemKind itemKind() const =0
Entity kind.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable containing the number of the new subdomain owning the entity.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Family network interface (connected families).
@ ModePut
The serializer expects reserve().
@ II_NeedRemove
The entity must be removed.
Index of an Item in a variable.
NodeConnectedListViewType nodes() const
List of nodes of the entity.
impl::MutableItemBase mutableItemBase() const
Mutable internal part of the entity.
constexpr Int32 localId() const
Local identifier of the entity in the processor subdomain.
void setFlags(Int32 f)
Sets the entity flags.
TraceAccessor(ITraceMng *m)
Constructs an accessor via the trace manager m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flow for a debug message.
TraceMessage fatal() const
Flow for a fatal error message.
TraceMessage info() const
Flow for an information message.
ITraceMng * traceMng() const
Trace manager.
1D data vector with value semantics (STL style).
ConstArrayView< std::set< Int32 > > getItemsToSend(IItemFamily *family) const
List of entities to send by subdomain for the family family.
void computeInfos()
Compute the info.
ArrayView< std::set< Int32 > > _getItemsToSend(IItemFamily *family)
List of entities to send by subdomain for the family family.
void _printItemToSend(IItemFamily *family)
Using ItemFamilyNetwork.
void _computeMeshConnectivityInfos2(Int32ConstArrayView cells_new_owner)
AMR.
void _computeMeshConnectivityInfos3()
AMR OFF.
ItemEnumeratorT< Node > NodeEnumerator
Enumerators over nodes.
ItemEnumeratorT< Face > FaceEnumerator
Enumerators over faces.
ItemEnumeratorT< Edge > EdgeEnumerator
Enumerators over edges.
ItemEnumeratorT< Cell > CellEnumerator
Enumerators over cells.
ItemVariableScalarRefT< Int32 > VariableItemInt32
32-bit integer type quantity
Ref< IParallelExchanger > createExchangerRef(IParallelMng *pm)
Returns an interface to transfer messages between ranks.
ArrayView< Int64 > Int64ArrayView
C equivalent of a 1D array of 64-bit integers.
UniqueArray< Int64 > Int64UniqueArray
Dynamic 1D array of 64-bit integers.
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
ArrayView< Int32 > Int32ArrayView
C equivalent of a 1D array of 32-bit integers.
eItemKind
Mesh entity type.
@ IK_Node
Node mesh entity.
@ IK_Cell
Cell mesh entity.
@ IK_Face
Face mesh entity.
@ IK_DoF
Degree of Freedom mesh entity.
@ IK_Edge
Edge mesh entity.
Array< Int32 > Int32Array
Dynamic one-dimensional array of 32-bit integers.
UniqueArray< String > StringUniqueArray
Dynamic 1D array of strings.
UniqueArray< Integer > IntegerUniqueArray
Dynamic 1D array of integers.
@ Cell
The mesh is AMR by cell.
std::int32_t Int32
Signed integer type of 32 bits.