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 _addItemToSend(to_send, iparticle->localId(), iparticle->cell().localId(), use_itemfamily_network);
615 if (send_dof && family->itemKind() ==
IK_DoF) {
616 _setItemsToSend(family);
622 for (
const auto& iter : m_items_to_send)
623 (*(iter.second))[m_rank].clear();
625 const bool is_print =
false;
627 debug() <<
"PRINT ITEM TO SEND V1";
651 Integer cell_variable_size = m_cell_family->maxLocalId();
657 tmp_new_owner.
fill(NULL_ITEM_ID);
659 tmp_owner.
fill(NULL_ITEM_ID);
661 ENUMERATE_CELL (icell, m_cell_family->allItems().ownActiveCellGroup()) {
662 const Cell& cell = *icell;
665 tmp_owner[m_rank] = cell_local_id;
667 m_neighbour_cells_owner->beginIncrement(cell_local_id);
668 m_neighbour_cells_new_owner->beginIncrement(cell_local_id);
672 for (
CellEnumerator icell2((*inode)._internalActiveCells(local_ids)); icell2.hasNext(); ++icell2) {
673 Integer cell2_local_id = icell2.localId();
674 Integer cell2_new_owner = cells_new_owner[cell2_local_id];
675 Integer cell2_owner = icell2->owner();
677 if (tmp_new_owner[cell2_new_owner] != cell_local_id) {
678 tmp_new_owner[cell2_new_owner] = cell_local_id;
679 m_neighbour_cells_new_owner->addData(cell2_new_owner);
681 if (tmp_owner[cell2_owner] != cell_local_id) {
682 tmp_owner[cell2_owner] = cell_local_id;
683 m_neighbour_cells_owner->addData(cell2_owner);
688 m_neighbour_cells_owner->endIncrement();
689 m_neighbour_cells_new_owner->endIncrement();
697_addTreeCellToSend(
ArrayView<std::set<Int32>> items_to_send,
703 Cell cell(cells[local_id]);
704 if (cell.level() == 0) {
705 for (
Integer zz = 0, nb_new_owner = new_owners.
size(); zz < nb_new_owner; ++zz)
706 items_to_send[new_owners[zz]].insert(local_id);
708 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
709 for (
Integer zz = 0, nb_extra_new_owner = extra_new_owners.
size(); zz < nb_extra_new_owner; ++zz)
710 items_to_send[extra_new_owners[zz]].insert(local_id);
715 _familyTree(family, top_parent);
716 for (
Integer c = 0, cs = family.
size(); c < cs; c++) {
717 for (
Integer zz = 0, nb_new_owner = new_owners.
size(); zz < nb_new_owner; ++zz)
718 items_to_send[new_owners[zz]].insert(family[c]);
727_addTreeItemToSend(
Int32 cell_local_id, CellInfoListView cells)
733 Cell cell(cells[cell_local_id]);
738 _familyTree(family, top_parent);
740 IItemFamily* node_family = mesh()->nodeFamily();
741 IItemFamily* edge_family = mesh()->edgeFamily();
742 IItemFamily* face_family = mesh()->faceFamily();
744 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
745 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
746 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
750 for (
Integer c = 0, cs = family.size(); c < cs; c++)
751 for (
Integer zz = 0, nb_new_owner = new_owners.size(); zz < nb_new_owner; ++zz) {
752 Cell cell2 = cells[family[c]];
753 for (Node node : cell2.nodes())
754 nodes_to_send[new_owners[zz]].insert(node.localId());
755 for (Edge edge : cell2.edges())
756 edges_to_send[new_owners[zz]].insert(edge.localId());
757 for (Face face : cell2.faces())
758 faces_to_send[new_owners[zz]].insert(face.localId());
768 ARCANE_ASSERT((!item.itemBase().isSubactive()), (
"The family tree doesn't include subactive items"));
773 family.add(item.localId());
776 if (!item.isActive())
777 for (
Integer c = 0, cs = item.nbHChildren(); c < cs; c++) {
778 Item ichild = item.hChild(c);
780 _familyTree(family, ichild.toCell(),
false);
788_computeItemsToSend2()
790 for (
const auto& iter : m_items_to_send)
791 iter.second->resize(m_nb_rank);
793 IItemFamily* node_family = mesh()->nodeFamily();
794 IItemFamily* edge_family = mesh()->edgeFamily();
795 IItemFamily* face_family = mesh()->faceFamily();
797 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
798 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
799 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
800 ArrayView<std::set<Int32>> cells_to_send =
_getItemsToSend(m_cell_family);
805 CellInfoListView cells(m_cell_family);
806 ENUMERATE_CELL (icell, m_cell_family->allItems().ownActiveCellGroup()) {
808 _addTreeCellToSend(cells_to_send, icell.itemLocalId(), icell.itemLocalId(), cells);
810 if (cell.level() == 0) {
815 Integer node_local_id = node.localId();
819 _addItemToSend(nodes_to_send, node_local_id, icell2.localId());
827 Integer edge_local_id = edge.localId();
829 _addItemToSend(edges_to_send, edge_local_id, icell2.localId());
836 Integer face_local_id = face.localId();
838 _addItemToSend(faces_to_send, face_local_id, icell2.localId());
843 else if (cell.level() > 0)
844 _addTreeItemToSend(icell.itemLocalId(), cells);
847 for (IItemFamily* family :
m_mesh->itemFamilies()) {
848 IParticleFamily* particle_family = family->toParticleFamily();
849 if (particle_family && particle_family->getEnableGhostItems() ==
true) {
852 _addItemToSend(to_send, iparticle->localId(), iparticle->cell().localId());
858 for (
const auto& iter : m_items_to_send)
859 (*(iter.second))[m_rank].clear();
883 if (!
m_mesh->itemFamilyNetwork())
884 info() <<
"Should have an IItemFamilyNetwork. Exiting.";
886 m_ghost_item_dest_ranks_map.resize(m_parallel_mng->commSize());
890 IItemFamilyNetwork::TopologicalOrder);
900 if (!
m_mesh->ghostLayerMng())
901 info() <<
"Should have a IGhostLayerMng. Exiting";
902 for (
int ghost_layer_index = 0; ghost_layer_index <
m_mesh->ghostLayerMng()->nbGhostLayer(); ++ghost_layer_index) {
905 _propagatesToChildConnectivities(family);
907 IItemFamilyNetwork::TopologicalOrder);
920_propagatesToChildConnectivities(
IItemFamily* family)
933 for (
const auto& child_connectivity : child_connectivities) {
934 if (child_connectivity) {
935 VariableItemInt32& conn_item_new_owner = child_connectivity->targetFamily()->itemsNewOwner();
939 _addDestRank(*item, family, item_new_owner[item]);
941 _addDestRank(*item, family, conn_item_new_owner[connected_item]);
945 _addDestRank(*connected_item, child_connectivity->targetFamily(), *item, family);
950 if (!
m_mesh->useMeshItemFamilyDependencies()) {
954 for (
Cell cell : item->cells())
955 _addDestRank(cell, m_cell_family, *item, family);
960 for (
Cell cell : item->cells())
961 _addDestRank(cell, m_cell_family, *item, family);
966 for (
Cell cell : item->cells())
967 _addDestRank(cell, m_cell_family, *item, family);
980_propagatesToChildDependencies(IItemFamily* family)
988 auto child_dependencies =
m_mesh->itemFamilyNetwork()->getChildDependencies(family);
989 for (
const auto& child_dependency : child_dependencies) {
990 if (child_dependency) {
991 auto accessor = IndexedItemConnectivityAccessor(child_dependency);
995 _addDestRank(*connected_item, child_dependency->targetFamily(), *item, family);
1006_addDestRank(
const Item& item, IItemFamily* item_family,
const Integer new_owner)
1008 ItemDestRankArray* item_dest_ranks =
nullptr;
1009 if (item.owner() == m_rank) {
1010 item_dest_ranks = m_item_dest_ranks_map[item_family];
1013 item_dest_ranks = m_ghost_item_dest_ranks_map[item.owner()][item_family];
1016 auto& item_ranks_internal = item_dest_ranks->at(item.localId());
1017 if (!item_ranks_internal.contains(new_owner))
1018 item_dest_ranks->at(item.localId()).add(new_owner);
1025_addDestRank(
const Item& item, IItemFamily* item_family,
const Item& followed_item, IItemFamily* followed_item_family)
1028 ItemDestRankArray* item_dest_ranks =
nullptr;
1029 if (item.owner() == m_rank) {
1030 item_dest_ranks = m_item_dest_ranks_map[item_family];
1033 item_dest_ranks = m_ghost_item_dest_ranks_map[item.owner()][item_family];
1035 ItemDestRankArray* followed_item_dest_ranks =
nullptr;
1036 if (followed_item.owner() == m_rank)
1037 followed_item_dest_ranks = m_item_dest_ranks_map[followed_item_family];
1039 followed_item_dest_ranks = m_ghost_item_dest_ranks_map[followed_item.owner()][followed_item_family];
1041 auto& new_dest_ranks = followed_item_dest_ranks->at(followed_item.localId());
1042 auto& current_dest_ranks = item_dest_ranks->at(item.localId());
1044 new_dest_rank_to_add.
reserve((new_dest_ranks.size()));
1045 for (
auto& new_dest_rank : new_dest_ranks) {
1046 if (!current_dest_ranks.contains(new_dest_rank))
1047 new_dest_rank_to_add.add(new_dest_rank);
1049 current_dest_ranks.addRange(new_dest_rank_to_add);
1056_allocData(IItemFamily* family)
1058 m_item_dest_ranks_map[family] =
new ItemDestRankArray(family->maxLocalId());
1059 for (
auto& ghost_item_map : m_ghost_item_dest_ranks_map) {
1060 ghost_item_map[family] =
new ItemDestRankArray(family->maxLocalId());
1069 info() <<
"-ENTERING NEW EXCHANGE DEBUG PRINT";
1070 for (
auto& item_dest_ranks : m_item_dest_ranks_map) {
1071 info() <<
"--PRINT NEW EXCHANGE INFO";
1072 info() <<
"---Destination rank for family " << item_dest_ranks.first->name();
1073 for (
int item_lid = 0; item_lid < item_dest_ranks.first->maxLocalId(); ++item_lid) {
1074 info() <<
"---Destination rank for item lid " << item_lid;
1075 for (
auto& item_dest_rank : item_dest_ranks.second->at(item_lid)) {
1076 info() <<
"---- Rank " << item_dest_rank;
1086_exchangeCellDataInfos3()
1092 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
1093 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i)
1094 sd_exchange->addSender(recv_sub_domains[i]);
1096 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
1098 UniqueArray<IItemFamily*> item_families;
1105 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
1106 ISerializeMessage* comm = sd_exchange->messageToSend(i);
1107 Int32 dest_sub_domain = comm->destination().value();
1108 ISerializer* sbuf = comm->serializer();
1109 item_families.clear();
1110 item_dest_ranks.clear();
1111 item_nb_dest_ranks.clear();
1112 family_nb_items.clear();
1114 for (
const auto& family_ghost_item_dest_ranks : m_ghost_item_dest_ranks_map[dest_sub_domain]) {
1117 item_families.add(family_ghost_item_dest_ranks.first);
1118 for (
Integer item_lid = 0; item_lid < family_ghost_item_dest_ranks.second->size(); ++item_lid) {
1119 if (family_ghost_item_dest_ranks.second->at(item_lid).size() == 0)
1121 item_lids.add(item_lid);
1122 item_dest_ranks.addRange(family_ghost_item_dest_ranks.second->at(item_lid));
1123 item_nb_dest_ranks.add(family_ghost_item_dest_ranks.second->at(item_lid).size());
1126 family_nb_items.add(family_nb_item);
1127 ENUMERATE_ITEM (item, family_ghost_item_dest_ranks.first->view(item_lids)) {
1128 item_uids.add(item->uniqueId().asInt64());
1131 sbuf->setMode(ISerializer::ModeReserve);
1132 sbuf->reserveInt64(1);
1133 for (
const auto& family : item_families)
1134 sbuf->
reserve(family->name());
1135 sbuf->reserveInteger(item_families.size());
1136 sbuf->reserveArray(item_uids);
1137 sbuf->reserveArray(family_nb_items);
1138 sbuf->reserveArray(item_nb_dest_ranks);
1139 sbuf->reserveArray(item_dest_ranks);
1141 sbuf->allocateBuffer();
1144 sbuf->putInt64(item_families.size());
1145 for (
const auto& family : item_families)
1146 sbuf->put(family->name());
1147 for (
const auto& family : item_families)
1148 sbuf->putInteger(family->itemKind());
1149 sbuf->putArray(item_uids);
1150 sbuf->putArray(family_nb_items);
1151 sbuf->putArray(item_nb_dest_ranks);
1152 sbuf->putArray(item_dest_ranks);
1155 sd_exchange->processExchange();
1157 for (
Integer i = 0, n = recv_sub_domains.size(); i < n; ++i) {
1158 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
1159 ISerializer* sbuf = comm->serializer();
1160 Int64 nb_families = sbuf->getInt64();
1163 for (
auto& family_name : item_family_names)
1164 sbuf->get(family_name);
1165 for (
auto& family_kind : item_family_kinds)
1166 family_kind = sbuf->getInteger();
1167 sbuf->getArray(item_uids);
1168 sbuf->getArray(family_nb_items);
1169 sbuf->getArray(item_nb_dest_ranks);
1170 sbuf->getArray(item_dest_ranks);
1172 Integer item_nb_dest_rank_index = 0;
1173 Integer item_dest_rank_index = 0;
1174 for (
int family_index = 0; family_index < nb_families; ++family_index) {
1175 IItemFamily* family =
m_mesh->findItemFamily(
eItemKind(item_family_kinds[family_index]),
1176 item_family_names[family_index],
false);
1178 item_lids.resize(family_item_uids.size());
1179 family->itemsUniqueIdToLocalId(item_lids, family_item_uids,
true);
1180 for (
const auto& item_lid : item_lids) {
1181 auto sub_view = item_dest_ranks.subView(item_dest_rank_index, item_nb_dest_ranks[item_nb_dest_rank_index]);
1182 m_item_dest_ranks_map[family]->at(item_lid).addRange(sub_view);
1183 item_dest_rank_index += item_nb_dest_ranks[item_nb_dest_rank_index++];
1185 item_uid_index += family_nb_items[family_index];
1190 for (
int ghost_layer_index = 0; ghost_layer_index <
m_mesh->ghostLayerMng()->nbGhostLayer(); ++ghost_layer_index) {
1192 m_mesh->itemFamilyNetwork()->schedule([&](IItemFamily* family) {
1193 _propagatesToChildConnectivities(family);
1195 IItemFamilyNetwork::TopologicalOrder);
1207_computeItemsToSend3()
1209 for (
const auto& iter : m_items_to_send)
1210 iter.second->resize(m_nb_rank);
1212 IItemFamily* node_family = mesh()->nodeFamily();
1213 IItemFamily* edge_family = mesh()->edgeFamily();
1214 IItemFamily* face_family = mesh()->faceFamily();
1215 IItemFamily* cell_family = m_cell_family;
1217 _setItemsToSend(node_family);
1218 _setItemsToSend(edge_family);
1219 _setItemsToSend(face_family);
1220 _setItemsToSend(cell_family);
1224 for (IItemFamily* family :
m_mesh->itemFamilies()) {
1225 IParticleFamily* particle_family = family->toParticleFamily();
1226 if (particle_family && particle_family->getEnableGhostItems() ==
true) {
1229 for (
const auto& dest_rank : m_item_dest_ranks_map[m_cell_family]->at(iparticle->cell().localId())) {
1230 to_send[dest_rank].insert(iparticle->localId());
1238 for (
const auto& iter : m_items_to_send)
1239 (*(iter.second))[m_rank].clear();
1253_setItemsToSend(IItemFamily* family)
1255 if (family->nbItem() == 0)
1257 auto iter = m_items_to_send.find(family);
1258 if (iter == m_items_to_send.end())
1259 ARCANE_FATAL(
"No items to send for family '{0}'", family->name());
1260 ArrayView<std::set<Int32>> items_to_send = iter->second->view();
1261 for (
Integer item_lid = 0; item_lid < m_item_dest_ranks_map[family]->size(); ++item_lid) {
1262 for (
const auto& dest_rank : m_item_dest_ranks_map[family]->at(item_lid)) {
1263 items_to_send[dest_rank].insert(item_lid);
1274 auto iter = m_items_to_send.find(family);
1275 if (iter == m_items_to_send.end())
1280 debug() <<
"= ITEM TO SEND FOR FAMILY " << family->
name();
1281 for (
const auto& owner_lids : items_to_send) {
1282 debug() <<
"== RANK " << rank++;
1283 for (
auto item_lid : owner_lids) {
1284 debug() <<
"=== has items " << item_lid;
1296 debug() <<
"= ITEM TO REMOVE FOR FAMILY " << family->
name();
1299 debug() <<
"== TO REMOVE ITEM " << item->uniqueId() <<
" kind " << item->kind();
1308 for (
const auto& item_dest_ranks_iter : m_item_dest_ranks_map) {
1310 IItemFamily* family = item_dest_ranks_iter.first;
1311 if (family->itemKind() ==
IK_DoF) {
1312 auto& item_new_owners = family->itemsNewOwner();
1317 item_dest_ranks = item_dest_ranks_iter.second->at(item->localId()).view();
1319 item_dest_ranks = m_ghost_item_dest_ranks_map[item->owner()][family]->at(item->localId()).view();
1321 if (!item_dest_ranks.contains(m_rank) && item_new_owners[item] != m_rank) {
1331_markRemovableItems(
bool with_cell_family)
1333 for (
const auto& item_dest_ranks_iter : m_item_dest_ranks_map) {
1335 IItemFamily* family = item_dest_ranks_iter.first;
1336 if (with_cell_family || family->name() != m_cell_family->name()) {
1337 auto& item_new_owners = family->itemsNewOwner();
1342 item_dest_ranks = item_dest_ranks_iter.second->at(item.localId()).view();
1344 item_dest_ranks = m_ghost_item_dest_ranks_map[item->owner()][family]->at(item.localId()).view();
1346 if (!item_dest_ranks.contains(m_rank) && item_new_owners[item] != m_rank) {
1375 ItemGroup all_items = m_cell_family->allItems();
1377 auto itemfamily_network =
m_mesh->itemFamilyNetwork();
1378 bool use_itemfamily_network = (itemfamily_network !=
nullptr && itemfamily_network->isActivated());
1381 if (use_active_cells)
1382 all_items = m_cell_family->allItems().activeCellGroup();
1386 Integer cell_local_id = cell.localId();
1387 if (cells_new_owner[cell_local_id] == m_rank)
1391 bool keep_cell = new_owners.
contains(m_rank);
1393 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
1394 keep_cell = extra_new_owners.
contains(m_rank);
1396 if (!keep_cell && use_itemfamily_network) {
1400 item_dest_ranks = m_item_dest_ranks_map[m_cell_family]->at(icell->localId()).view();
1402 item_dest_ranks = m_ghost_item_dest_ranks_map[icell->owner()][m_cell_family]->at(icell->localId()).view();
1404 keep_cell = item_dest_ranks.contains(m_rank);
1415_markRemovableParticles()
1417 for (IItemFamily* family :
m_mesh->itemFamilies()) {
1418 IParticleFamily* particle_family = family->toParticleFamily();
1419 if (particle_family && particle_family->getEnableGhostItems() ==
true) {
1420 mesh::NewItemOwnerBuilder owner_builder;
1423 Particle particle = *iparticle;
1424 Cell cell = owner_builder.connectedCellOfItem(particle);
1435_checkSubItemsDestRanks()
1439 m_mesh->itemFamilyNetwork()->schedule([
this](IItemFamily* family) {
1441 const auto& item_dest_ranks = m_item_dest_ranks_map[family]->at(item.localId());
1442 for (
const auto& child_dependency :
m_mesh->itemFamilyNetwork()->getChildDependencies(family)) {
1443 auto accessor = IndexedItemConnectivityAccessor(child_dependency);
1447 if (connected_item->isOwn()) {
1448 subitem_dest_ranks = m_item_dest_ranks_map[child_dependency->targetFamily()]->at(connected_item.localId()).constView();
1449 for (
auto dest_rank : item_dest_ranks) {
1450 if (!subitem_dest_ranks.contains(dest_rank))
1451 fatal() <<
"Dest Rank " << dest_rank <<
" for item " << item->kind() <<
" uid " << item->uniqueId()
1452 <<
" not present in subitem " << connected_item->kind() <<
" uid " << connected_item->uniqueId()
1453 <<
" dest ranks " << subitem_dest_ranks <<
" ower " << connected_item->owner();
1460 IItemFamilyNetwork::TopologicalOrder);
1467_exchangeGhostItemDataInfos()
1484 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
1485 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i)
1486 sd_exchange->addSender(recv_sub_domains[i]);
1488 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
1490 UniqueArray<IItemFamily*> item_families;
1496 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
1497 ISerializeMessage* comm = sd_exchange->messageToSend(i);
1498 Int32 dest_sub_domain = comm->destination().value();
1499 ISerializer* sbuf = comm->serializer();
1500 item_families.clear();
1501 item_dest_ranks.clear();
1502 item_nb_dest_ranks.clear();
1503 family_nb_items.clear();
1505 for (
const auto& family_item_dest_ranks : m_item_dest_ranks_map) {
1507 IItemFamily* family = family_item_dest_ranks.first;
1508 if (family->nbItem() == 0)
1510 item_families.add(family);
1512 auto subdomain_index = _getSubdomainIndexInCommunicatingRanks(dest_sub_domain, family->allItemsSynchronizer()->communicatingRanks());
1513 auto shared_item_lids = family->allItemsSynchronizer()->sharedItems(subdomain_index);
1514 for (
const auto& item_lid : shared_item_lids) {
1515 if (family_item_dest_ranks.second->at(item_lid).size() == 0)
1517 item_dest_ranks.addRange(family_item_dest_ranks.second->at(item_lid));
1518 item_nb_dest_ranks.add(family_item_dest_ranks.second->at(item_lid).size());
1521 family_nb_items.add(family_nb_item);
1522 ENUMERATE_ITEM (item, family_item_dest_ranks.first->view(shared_item_lids)) {
1523 item_uids.add(item->uniqueId().asInt64());
1526 sbuf->setMode(ISerializer::ModeReserve);
1528 sbuf->reserveInt64(1);
1529 for (
const auto& family : item_families)
1530 sbuf->
reserve(family->name());
1531 sbuf->reserveInt64(item_families.size());
1533 sbuf->reserveArray(item_uids);
1534 sbuf->reserveArray(family_nb_items);
1535 sbuf->reserveArray(item_nb_dest_ranks);
1536 sbuf->reserveArray(item_dest_ranks);
1538 sbuf->allocateBuffer();
1541 sbuf->putInt64(item_families.size());
1542 for (
const auto& family : item_families)
1543 sbuf->put(family->name());
1544 for (
const auto& family : item_families)
1545 sbuf->putInteger(family->itemKind());
1547 sbuf->putArray(item_uids);
1548 sbuf->putArray(family_nb_items);
1549 sbuf->putArray(item_nb_dest_ranks);
1550 sbuf->putArray(item_dest_ranks);
1553 sd_exchange->processExchange();
1555 for (
Integer i = 0, is = recv_sub_domains.size(); i < is; ++i) {
1556 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
1557 ISerializer* sbuf = comm->serializer();
1558 Int64 nb_families = sbuf->getInt64();
1561 for (
auto& family_name : item_family_names)
1562 sbuf->get(family_name);
1563 for (
auto& family_kind : item_family_kinds)
1564 family_kind = sbuf->getInteger();
1565 sbuf->getArray(item_uids);
1566 sbuf->getArray(family_nb_items);
1567 sbuf->getArray(item_nb_dest_ranks);
1568 sbuf->getArray(item_dest_ranks);
1570 Integer item_nb_dest_rank_index = 0;
1571 Integer item_dest_rank_index = 0;
1572 for (
int family_index = 0; family_index < nb_families; ++family_index) {
1573 IItemFamily* family =
m_mesh->findItemFamily(
eItemKind(item_family_kinds[family_index]), item_family_names[family_index],
false);
1576 family->itemsUniqueIdToLocalId(item_lids, family_item_uids,
true);
1577 for (
const auto& item_lid : item_lids) {
1578 auto sub_view = item_dest_ranks.subView(item_dest_rank_index, item_nb_dest_ranks[item_nb_dest_rank_index]);
1579 Int32 dest_rank = comm->destination().value();
1580 m_ghost_item_dest_ranks_map[dest_rank][family]->at(item_lid).addRange(sub_view);
1581 item_dest_rank_index += item_nb_dest_ranks[item_nb_dest_rank_index++];
1583 item_uid_index += family_nb_items[family_index];
1596 while (communicating_ranks[i] != rank) {
1605ISubDomain* MeshExchange::
1608 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.