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), m_current_size(0), m_index(size, -1),
66 IncrementalUnorderedMultiArray()
67 : m_current_increment(-1), m_current_size(0) {}
69 inline void resize(
Integer size)
71 m_index.resize(size, -1);
72 m_size.resize(size, 0);
77 return m_index.size();
80 inline void dataReserve(
Integer size)
85 inline void addData(
const T data)
96 inline void beginIncrement(
Integer id)
98 ARCANE_ASSERT((m_current_increment == -1),(
"call endIncrement before begin"));
99 m_current_increment = id;
101 m_index[m_current_increment] = m_data.size();
104 inline void endIncrement()
106 m_size[m_current_increment] = m_current_size;
107 m_current_increment = -1;
113 return m_data.
subView(m_index[
id],m_size[
id]);
118 return m_data.
subView(m_index[
id],m_size[
id]);
137 DynamicMultiArray(
Integer size)
140 DynamicMultiArray() {}
142 inline void resize(
Integer size) {
147 return m_data.size();
150 inline void addData(
Integer id,
const T data) {
151 m_data[id].add(data);
172MeshExchange(
IMesh* mesh)
175, m_parallel_mng(mesh->parallelMng())
176, m_nb_rank(m_parallel_mng->commSize())
177, m_rank(m_parallel_mng->commRank())
178, m_cell_family(mesh->itemFamily(
IK_Cell))
179, m_neighbour_cells_owner(NULL)
180, m_neighbour_cells_new_owner(NULL)
181, m_neighbour_extra_cells_owner(NULL)
182, m_neighbour_extra_cells_new_owner(NULL)
192 for(
const auto& itosend : m_items_to_send )
193 delete itosend.second;
194 delete m_neighbour_cells_owner;
195 delete m_neighbour_cells_new_owner;
196 delete m_neighbour_extra_cells_owner;
197 delete m_neighbour_extra_cells_new_owner;
198 for(
const auto& idestrank : m_item_dest_ranks_map)
199 delete idestrank.second;
200 for (
const auto& ighostdestrank_map : m_ghost_item_dest_ranks_map)
201 for (
const auto& ighostdestrank : ighostdestrank_map)
202 delete ighostdestrank.second;
212 auto iter = m_items_to_send.find(family);
213 if (iter==m_items_to_send.end())
215 return iter->second->constView();
225 auto iter = m_items_to_send.find(family);
226 if (iter==m_items_to_send.end())
228 return iter->second->view();
240 m_items_to_send.insert(std::make_pair(family,
new UniqueArray< std::set<Int32> >));
245 if(
m_mesh->isAmrActivated()){
247 _computeGraphConnectivityInfos();
248 _exchangeCellDataInfos(cells_new_owner,
true);
249 _markRemovableCells(cells_new_owner,
true);
250 _markRemovableParticles();
251 _computeItemsToSend2();
253 else if (
m_mesh->itemFamilyNetwork() &&
m_mesh->itemFamilyNetwork()->isActivated())
255 if(
m_mesh->useMeshItemFamilyDependencies())
258 _computeGraphConnectivityInfos();
259 _exchangeCellDataInfos3();
260 _exchangeGhostItemDataInfos();
261 _markRemovableItems();
262 _markRemovableParticles();
263 _computeItemsToSend3();
268 _computeMeshConnectivityInfos(cells_new_owner);
270 _computeGraphConnectivityInfos();
271 _exchangeCellDataInfos(cells_new_owner,
false);
272 _exchangeCellDataInfos3();
275 _markRemovableDoFs();
276 _markRemovableCells(cells_new_owner,
false);
277 _markRemovableParticles();
278 _computeItemsToSend(
true);
283 _computeMeshConnectivityInfos(cells_new_owner);
284 _computeGraphConnectivityInfos();
285 _exchangeCellDataInfos(cells_new_owner,
false);
286 _markRemovableCells(cells_new_owner,
false);
287 _markRemovableParticles();
288 _computeItemsToSend();
296_computeGraphConnectivityInfos()
301 tmp_new_owner.fill(NULL_ITEM_ID);
303 tmp_owner.fill(NULL_ITEM_ID);
306 tmp_link_new_owner.fill(NULL_ITEM_ID);
308 tmp_link_owner.fill(NULL_ITEM_ID);
310 mesh::NewItemOwnerBuilder owner_builder;
312 m_neighbour_extra_cells_owner =
new DynamicMultiArray<Int32>(cell_variable_size);
313 m_neighbour_extra_cells_new_owner =
new DynamicMultiArray<Int32>(cell_variable_size);
317 _addGraphConnectivityToNewConnectivityInfo();
325_addGraphConnectivityToNewConnectivityInfo()
328 Int32Array& extra_new_owners = m_neighbour_extra_cells_new_owner->at(icell.localId());
329 Int32Array& extra_owners = m_neighbour_extra_cells_owner->at(icell.localId());
330 ItemDestRankArray* item_dest_ranks =
nullptr;
332 item_dest_ranks = m_item_dest_ranks_map[m_cell_family];
334 item_dest_ranks= m_ghost_item_dest_ranks_map[icell->owner()][m_cell_family];
335 item_dest_ranks->at(icell.localId()).
addRange(extra_new_owners);
336 item_dest_ranks->at(icell.localId()).addRange(extra_owners);
339 _propagatesToChildDependencies(m_cell_family);
348 Integer cell_variable_size = m_cell_family->maxLocalId();
354 tmp_new_owner.fill(NULL_ITEM_ID);
356 tmp_owner.fill(NULL_ITEM_ID);
360 Integer cell_local_id = cell.localId();
362 tmp_owner[m_rank] = cell_local_id;
364 m_neighbour_cells_owner->beginIncrement(cell_local_id);
365 m_neighbour_cells_new_owner->beginIncrement(cell_local_id);
369 Integer cell2_local_id = icell2.localId();
370 Integer cell2_new_owner = cells_new_owner[cell2_local_id];
371 Integer cell2_owner = icell2->owner();
374 if (tmp_new_owner[cell2_new_owner]!=cell_local_id){
375 tmp_new_owner[cell2_new_owner] = cell_local_id;
376 m_neighbour_cells_new_owner->addData(cell2_new_owner);
378 if (tmp_owner[cell2_owner]!=cell_local_id){
379 tmp_owner[cell2_owner] = cell_local_id;
380 m_neighbour_cells_owner->addData(cell2_owner);
384 m_neighbour_cells_owner->endIncrement();
385 m_neighbour_cells_new_owner->endIncrement();
393_exchangeCellDataInfos([[maybe_unused]]
Int32ConstArrayView cells_new_owner,
bool use_active_cells)
398 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
399 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i )
400 sd_exchange->addSender(recv_sub_domains[i]);
402 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
404 UniqueArray<Int64> cells_to_comm_uid;
405 UniqueArray<Int32> cells_to_comm_owner;
406 UniqueArray<Int32> cells_to_comm_owner_size;
407 UniqueArray<Int32> cells_to_comm_new_owner;
408 UniqueArray<Int32> cells_to_comm_new_owner_size;
410 ItemGroup own_items = m_cell_family->allItems().own();
411 ItemGroup all_items = m_cell_family->allItems();
413 if (use_active_cells){
414 own_items = m_cell_family->allItems().ownActiveCellGroup();
415 all_items = m_cell_family->allItems().activeCellGroup();
418 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i ){
419 ISerializeMessage* comm = sd_exchange->messageToSend(i);
420 Int32 dest_sub_domain = comm->destination().value();
421 ISerializer* sbuf = comm->serializer();
423 cells_to_comm_uid.clear();
424 cells_to_comm_owner.clear();
425 cells_to_comm_owner_size.clear();
426 cells_to_comm_new_owner.clear();
427 cells_to_comm_new_owner_size.clear();
431 Integer cell_local_id = cell.localId();
433 bool need_send = owners.
contains(dest_sub_domain);
436 need_send = extra_owners.contains(dest_sub_domain);
443 const Integer nb_owner = owners.size();
445 Int32ConstArrayView extra_new_owner = m_neighbour_extra_cells_new_owner->at(cell_local_id);
446 const Integer nb_extra_new_owner = extra_new_owner.
size();
448 cells_to_comm_uid.add(cell.uniqueId().asInt64());
449 cells_to_comm_owner_size.add(nb_owner);
450 cells_to_comm_new_owner_size.add(nb_new_owner+nb_extra_new_owner);
451 for(
Integer zz=0; zz<nb_owner; ++zz )
452 cells_to_comm_owner.add(owners[zz]);
453 for(
Integer zz=0; zz<nb_new_owner; ++zz )
454 cells_to_comm_new_owner.add(new_owners[zz]);
455 for(
Integer zz=0; zz<nb_extra_new_owner; ++zz )
456 cells_to_comm_new_owner.add(extra_new_owner[zz]);
458 sbuf->setMode(ISerializer::ModeReserve);
460 sbuf->reserveInt64(1);
461 sbuf->reserveArray(cells_to_comm_uid);
462 sbuf->reserveArray(cells_to_comm_owner_size);
463 sbuf->reserveArray(cells_to_comm_owner);
464 sbuf->reserveArray(cells_to_comm_new_owner_size);
465 sbuf->reserveArray(cells_to_comm_new_owner);
467 sbuf->allocateBuffer();
470 sbuf->putInt64(cells_to_comm_uid.size());
471 sbuf->putArray(cells_to_comm_uid);
472 sbuf->putArray(cells_to_comm_owner_size);
473 sbuf->putArray(cells_to_comm_owner);
474 sbuf->putArray(cells_to_comm_new_owner_size);
475 sbuf->putArray(cells_to_comm_new_owner);
478 sd_exchange->processExchange();
481 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i ){
482 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
483 ISerializer* sbuf = comm->serializer();
486 Int64 nb_cell = sbuf->getInt64();
487 sbuf->getArray(cells_to_comm_uid);
488 sbuf->getArray(cells_to_comm_owner_size);
489 sbuf->getArray(cells_to_comm_owner);
490 sbuf->getArray(cells_to_comm_new_owner_size);
491 sbuf->getArray(cells_to_comm_new_owner);
492 cells_to_comm_local_id.resize(nb_cell);
493 m_cell_family->itemsUniqueIdToLocalId(cells_to_comm_local_id,cells_to_comm_uid);
494 for(
Integer icell=0; icell<nb_cell; ++icell ){
495 Integer cell_local_id = cells_to_comm_local_id[icell];
496 Integer cell_nb_owner = cells_to_comm_owner_size[icell];
497 Integer cell_nb_new_owner = cells_to_comm_new_owner_size[icell];
499 info()<<
" cell "<<icell
500 <<
" lid=" <<cell_local_id
501 <<
" uid=" <<cells_to_comm_uid[icell]
502 <<
" ind=" <<m_neighbour_cells_owner->index(cell_local_id);
504 if (m_neighbour_cells_owner->index(cell_local_id)!=(-1))
505 fatal() <<
"Cell uid=" << cells_to_comm_uid[icell] <<
" already has neighbours 'owner'!";
506 if (m_neighbour_cells_new_owner->index(cell_local_id)!=(-1))
507 fatal() <<
"Cell uid=" << cells_to_comm_uid[icell] <<
" already has neighbours 'new_owner'!";
508 m_neighbour_cells_owner->beginIncrement(cell_local_id);
509 m_neighbour_cells_new_owner->beginIncrement(cell_local_id);
511 info()<<
" cell "<< icell
512 <<
" lid=" << cell_local_id
513 <<
" uid=" << cells_to_comm_uid[icell]
514 <<
" ind=" << m_neighbour_cells_owner->index(cell_local_id);
516 for(
Integer zz=0; zz<cell_nb_owner; ++zz )
517 m_neighbour_cells_owner->addData(cells_to_comm_owner[owner_index+zz]);
518 owner_index += cell_nb_owner;
519 m_neighbour_cells_owner->endIncrement();
521 for(
Integer zz=0; zz<cell_nb_new_owner; ++zz )
522 m_neighbour_cells_new_owner->addData(cells_to_comm_new_owner[new_owner_index+zz]);
523 new_owner_index += cell_nb_new_owner;
524 m_neighbour_cells_new_owner->endIncrement();
533_addItemToSend(ArrayView< std::set<Int32> > items_to_send,
535 bool use_itemfamily_network)
538 for(
Integer zz=0, nb_new_owner = new_owners.size(); zz<nb_new_owner; ++zz )
539 items_to_send[new_owners[zz]].insert(local_id);
541 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
542 for(
Integer zz=0, nb_extra_new_owner = extra_new_owners.size(); zz<nb_extra_new_owner; ++zz )
543 items_to_send[extra_new_owners[zz]].insert(local_id);
545 if(use_itemfamily_network)
547 Int32ConstArrayView network_new_owners = m_item_dest_ranks_map[m_cell_family]->at(cell_local_id);
548 for(
Integer zz=0, nb_network_new_owner = network_new_owners.size(); zz<nb_network_new_owner; ++zz )
550 items_to_send[network_new_owners[zz]].insert(local_id);
559_computeItemsToSend(
bool send_dof)
561 for(
const auto& iter : m_items_to_send )
562 iter.second->resize(m_nb_rank);
564 IItemFamily* node_family = mesh()->nodeFamily();
565 IItemFamily* edge_family = mesh()->edgeFamily();
566 IItemFamily* face_family = mesh()->faceFamily();
567 IItemFamily* cell_family = m_cell_family;
569 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
570 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
571 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
572 ArrayView<std::set<Int32>> cells_to_send =
_getItemsToSend(cell_family);
576 bool use_itemfamily_network =
m_mesh->itemFamilyNetwork() &&
m_mesh->itemFamilyNetwork()->isActivated() ;
578 _addItemToSend(cells_to_send,icell.itemLocalId(),icell.itemLocalId(),use_itemfamily_network);
583 Integer node_local_id = node.localId();
585 _addItemToSend(nodes_to_send,node_local_id,icell.localId(),use_itemfamily_network);
590 Integer edge_local_id = edge.localId();
592 _addItemToSend(edges_to_send,edge_local_id,icell.localId(),use_itemfamily_network);
597 Integer face_local_id = face.localId();
599 _addItemToSend(faces_to_send,face_local_id,icell.localId(),use_itemfamily_network);
604 for( IItemFamily* family :
m_mesh->itemFamilies())
606 IParticleFamily* particle_family = family->toParticleFamily();
607 if (particle_family && particle_family->getEnableGhostItems()==
true){
610 Cell cell = iparticle->cell();
613 _addItemToSend(to_send, iparticle->localId(), cell.localId(), use_itemfamily_network);
616 if(send_dof && family->itemKind()==
IK_DoF)
618 _setItemsToSend(family);
624 for(
const auto& iter : m_items_to_send )
625 (*(iter.second))[m_rank].clear();
627 const bool is_print =
false;
629 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();
681 if (tmp_new_owner[cell2_new_owner]!=cell_local_id){
682 tmp_new_owner[cell2_new_owner] = cell_local_id;
683 m_neighbour_cells_new_owner->addData(cell2_new_owner);
685 if (tmp_owner[cell2_owner]!=cell_local_id){
686 tmp_owner[cell2_owner] = cell_local_id;
687 m_neighbour_cells_owner->addData(cell2_owner);
692 m_neighbour_cells_owner->endIncrement();
693 m_neighbour_cells_new_owner->endIncrement();
701_addTreeCellToSend(
ArrayView< std::set<Int32> > items_to_send,
707 Cell cell(cells[local_id]);
708 if(cell.level() == 0){
709 for(
Integer zz=0, nb_new_owner = new_owners.
size(); zz<nb_new_owner; ++zz )
710 items_to_send[new_owners[zz]].insert(local_id);
712 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
713 for(
Integer zz=0, nb_extra_new_owner = extra_new_owners.
size(); zz<nb_extra_new_owner; ++zz )
714 items_to_send[extra_new_owners[zz]].insert(local_id);
719 _familyTree(family,top_parent);
721 for(
Integer zz=0, nb_new_owner = new_owners.
size(); zz<nb_new_owner; ++zz )
722 items_to_send[new_owners[zz]].insert(family[c]);
731_addTreeItemToSend(
Int32 cell_local_id,CellInfoListView cells)
737 Cell cell(cells[cell_local_id]);
742 _familyTree(family,top_parent);
744 IItemFamily* node_family = mesh()->nodeFamily();
745 IItemFamily* edge_family = mesh()->edgeFamily();
746 IItemFamily* face_family = mesh()->faceFamily();
748 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
749 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
750 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
754 for(
Integer c=0,cs=family.size();c<cs;c++)
755 for(
Integer zz=0, nb_new_owner = new_owners.size(); zz<nb_new_owner; ++zz ){
756 Cell cell2 = cells[family[c]];
757 for( Node node : cell2.nodes() )
758 nodes_to_send[new_owners[zz]].insert(node.localId());
759 for( Edge edge : cell2.edges() )
760 edges_to_send[new_owners[zz]].insert(edge.localId());
761 for( Face face : cell2.faces() )
762 faces_to_send[new_owners[zz]].insert(face.localId());
772 ARCANE_ASSERT((!item.itemBase().isSubactive()),(
"The family tree doesn't include subactive items"));
777 family.add(item.localId());
780 if (!item.isActive())
781 for (
Integer c=0, cs=item.nbHChildren(); c<cs; c++){
782 Item ichild = item.hChild(c);
784 _familyTree (family,ichild.toCell(),
false);
792_computeItemsToSend2()
794 for(
const auto& iter : m_items_to_send )
795 iter.second->resize(m_nb_rank);
797 IItemFamily* node_family = mesh()->nodeFamily();
798 IItemFamily* edge_family = mesh()->edgeFamily();
799 IItemFamily* face_family = mesh()->faceFamily();
801 ArrayView<std::set<Int32>> nodes_to_send =
_getItemsToSend(node_family);
802 ArrayView<std::set<Int32>> edges_to_send =
_getItemsToSend(edge_family);
803 ArrayView<std::set<Int32>> faces_to_send =
_getItemsToSend(face_family);
804 ArrayView<std::set<Int32>> cells_to_send =
_getItemsToSend(m_cell_family);
809 CellInfoListView cells(m_cell_family);
810 ENUMERATE_CELL(icell,m_cell_family->allItems().ownActiveCellGroup()){
812 _addTreeCellToSend(cells_to_send,icell.itemLocalId(),icell.itemLocalId(),cells);
814 if(cell.level() == 0){
819 Integer node_local_id = node.localId();
823 _addItemToSend(nodes_to_send,node_local_id,icell2.localId());
831 Integer edge_local_id = edge.localId();
833 _addItemToSend(edges_to_send,edge_local_id,icell2.localId());
840 Integer face_local_id = face.localId();
842 _addItemToSend(faces_to_send,face_local_id,icell2.localId());
848 else if(cell.level() > 0)
849 _addTreeItemToSend(icell.itemLocalId(),cells);
852 for( IItemFamily* family :
m_mesh->itemFamilies()){
853 IParticleFamily* particle_family = family->toParticleFamily();
854 if (particle_family && particle_family->getEnableGhostItems()==
true){
857 _addItemToSend(to_send,iparticle->localId(),iparticle->cell().localId());
863 for(
const auto& iter : m_items_to_send )
864 (*(iter.second))[m_rank].clear();
888 if (!
m_mesh->itemFamilyNetwork())
info() <<
"Should have an IItemFamilyNetwork. Exiting.";
890 m_ghost_item_dest_ranks_map.resize(m_parallel_mng->commSize());
894 IItemFamilyNetwork::TopologicalOrder);
904 if (!
m_mesh->ghostLayerMng())
info() <<
"Should have a IGhostLayerMng. Exiting";
905 for (
int ghost_layer_index = 0; ghost_layer_index <
m_mesh->ghostLayerMng()->nbGhostLayer(); ++ghost_layer_index)
909 _propagatesToChildConnectivities(family);
911 IItemFamilyNetwork::TopologicalOrder);
924_propagatesToChildConnectivities(
IItemFamily* family)
937 for (
const auto& child_connectivity : child_connectivities){
938 if(child_connectivity)
940 VariableItemInt32& conn_item_new_owner = child_connectivity->targetFamily()->itemsNewOwner();
944 _addDestRank(*item,family,item_new_owner[item]);
946 _addDestRank(*item,family,conn_item_new_owner[connected_item]);
950 _addDestRank(*connected_item,child_connectivity->targetFamily(),*item,family);
955 if(!
m_mesh->useMeshItemFamilyDependencies()){
959 for(
Cell cell : item->cells())
960 _addDestRank(cell,m_cell_family,*item,family);
965 for(
Cell cell : item->cells() )
966 _addDestRank(cell,m_cell_family,*item,family);
971 for(
Cell cell : item->cells())
972 _addDestRank(cell,m_cell_family,*item,family);
985_propagatesToChildDependencies(IItemFamily* family)
993 auto child_dependencies =
m_mesh->itemFamilyNetwork()->getChildDependencies(family);
994 for (
const auto& child_dependency :child_dependencies){
997 auto accessor = IndexedItemConnectivityAccessor(child_dependency);
1001 _addDestRank(*connected_item,child_dependency->targetFamily(),*item, family);
1012_addDestRank(
const Item& item, IItemFamily* item_family,
const Integer new_owner)
1014 ItemDestRankArray* item_dest_ranks =
nullptr;
1015 if (item.owner() == m_rank) {
1016 item_dest_ranks = m_item_dest_ranks_map[item_family];
1019 item_dest_ranks= m_ghost_item_dest_ranks_map[item.owner()][item_family];
1022 auto& item_ranks_internal = item_dest_ranks->at(item.localId());
1023 if (!item_ranks_internal.contains(new_owner))
1024 item_dest_ranks->at(item.localId()).add(new_owner);
1031_addDestRank(
const Item& item, IItemFamily* item_family,
const Item& followed_item, IItemFamily* followed_item_family)
1034 ItemDestRankArray* item_dest_ranks =
nullptr;
1035 if (item.owner() == m_rank)
1037 item_dest_ranks = m_item_dest_ranks_map[item_family];
1041 item_dest_ranks= m_ghost_item_dest_ranks_map[item.owner()][item_family];
1043 ItemDestRankArray* followed_item_dest_ranks =
nullptr;
1044 if (followed_item.owner() == m_rank)
1045 followed_item_dest_ranks = m_item_dest_ranks_map[followed_item_family];
1047 followed_item_dest_ranks= m_ghost_item_dest_ranks_map[followed_item.owner()][followed_item_family];
1049 auto& new_dest_ranks = followed_item_dest_ranks->at(followed_item.localId());
1050 auto& current_dest_ranks = item_dest_ranks->at(item.localId());
1052 new_dest_rank_to_add.
reserve((new_dest_ranks.size()));
1053 for (
auto& new_dest_rank : new_dest_ranks){
1054 if (!current_dest_ranks.contains(new_dest_rank))
1055 new_dest_rank_to_add.add(new_dest_rank);
1057 current_dest_ranks.addRange(new_dest_rank_to_add);
1064_allocData(IItemFamily* family)
1066 m_item_dest_ranks_map[family] =
new ItemDestRankArray(family->maxLocalId());
1067 for (
auto& ghost_item_map : m_ghost_item_dest_ranks_map) {
1068 ghost_item_map[family] =
new ItemDestRankArray(family->maxLocalId());
1077 info() <<
"-ENTERING NEW EXCHANGE DEBUG PRINT";
1078 for(
auto& item_dest_ranks : m_item_dest_ranks_map){
1079 info() <<
"--PRINT NEW EXCHANGE INFO";
1080 info() <<
"---Destination rank for family " << item_dest_ranks.first->name();
1081 for (
int item_lid = 0; item_lid < item_dest_ranks.first->maxLocalId(); ++item_lid) {
1082 info() <<
"---Destination rank for item lid " << item_lid;
1083 for (
auto& item_dest_rank : item_dest_ranks.second->at(item_lid)) {
1084 info() <<
"---- Rank " << item_dest_rank;
1094_exchangeCellDataInfos3()
1100 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
1101 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i )
1102 sd_exchange->addSender(recv_sub_domains[i]);
1104 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
1106 UniqueArray<IItemFamily*> item_families;
1113 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i ){
1114 ISerializeMessage* comm = sd_exchange->messageToSend(i);
1115 Int32 dest_sub_domain = comm->destination().value();
1116 ISerializer* sbuf = comm->serializer();
1117 item_families.clear();
1118 item_dest_ranks.clear();
1119 item_nb_dest_ranks.clear();
1120 family_nb_items.clear();
1122 for (
const auto& family_ghost_item_dest_ranks : m_ghost_item_dest_ranks_map[dest_sub_domain]) {
1125 item_families.add(family_ghost_item_dest_ranks.first);
1126 for (
Integer item_lid = 0; item_lid < family_ghost_item_dest_ranks.second->size(); ++item_lid)
1128 if (family_ghost_item_dest_ranks.second->at(item_lid).size() == 0)
continue;
1129 item_lids.add(item_lid);
1130 item_dest_ranks.addRange(family_ghost_item_dest_ranks.second->at(item_lid));
1131 item_nb_dest_ranks.add(family_ghost_item_dest_ranks.second->at(item_lid).size());
1134 family_nb_items.add(family_nb_item);
1135 ENUMERATE_ITEM(item, family_ghost_item_dest_ranks.first->view(item_lids))
1137 item_uids.add(item->uniqueId().asInt64());
1140 sbuf->setMode(ISerializer::ModeReserve);
1141 sbuf->reserveInt64(1);
1142 for (
const auto& family: item_families)
1143 sbuf->
reserve(family->name());
1144 sbuf->reserveInteger(item_families.size());
1145 sbuf->reserveArray(item_uids);
1146 sbuf->reserveArray(family_nb_items);
1147 sbuf->reserveArray(item_nb_dest_ranks);
1148 sbuf->reserveArray(item_dest_ranks);
1150 sbuf->allocateBuffer();
1153 sbuf->putInt64(item_families.size());
1154 for (
const auto& family: item_families)
1155 sbuf->put(family->name());
1156 for (
const auto& family: item_families)
1157 sbuf->putInteger(family->itemKind());
1158 sbuf->putArray(item_uids);
1159 sbuf->putArray(family_nb_items);
1160 sbuf->putArray(item_nb_dest_ranks);
1161 sbuf->putArray(item_dest_ranks);
1164 sd_exchange->processExchange();
1166 for(
Integer i=0, n=recv_sub_domains.size(); i<n; ++i ){
1167 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
1168 ISerializer* sbuf = comm->serializer();
1169 Int64 nb_families = sbuf->getInt64();
1172 for (
auto& family_name: item_family_names)
1173 sbuf->get(family_name);
1174 for (
auto& family_kind: item_family_kinds)
1175 family_kind = sbuf->getInteger();
1176 sbuf->getArray(item_uids);
1177 sbuf->getArray(family_nb_items);
1178 sbuf->getArray(item_nb_dest_ranks);
1179 sbuf->getArray(item_dest_ranks);
1181 Integer item_nb_dest_rank_index = 0;
1182 Integer item_dest_rank_index = 0;
1183 for (
int family_index = 0; family_index < nb_families; ++family_index)
1185 IItemFamily* family =
m_mesh->findItemFamily(
eItemKind(item_family_kinds[family_index]),
1186 item_family_names[family_index],
false);
1188 item_lids.resize(family_item_uids.size());
1189 family->itemsUniqueIdToLocalId(item_lids,family_item_uids,
true);
1190 for (
const auto& item_lid : item_lids){
1191 auto sub_view = item_dest_ranks.subView(item_dest_rank_index,item_nb_dest_ranks[item_nb_dest_rank_index]);
1192 m_item_dest_ranks_map[family]->at(item_lid).addRange(sub_view);
1193 item_dest_rank_index+= item_nb_dest_ranks[item_nb_dest_rank_index++];
1195 item_uid_index+= family_nb_items[family_index];
1200 for (
int ghost_layer_index = 0; ghost_layer_index <
m_mesh->ghostLayerMng()->nbGhostLayer(); ++ghost_layer_index)
1203 m_mesh->itemFamilyNetwork()->schedule([&](IItemFamily* family){
1204 _propagatesToChildConnectivities(family);
1206 IItemFamilyNetwork::TopologicalOrder);
1218_computeItemsToSend3()
1220 for(
const auto& iter : m_items_to_send )
1221 iter.second->resize(m_nb_rank);
1223 IItemFamily* node_family = mesh()->nodeFamily();
1224 IItemFamily* edge_family = mesh()->edgeFamily();
1225 IItemFamily* face_family = mesh()->faceFamily();
1226 IItemFamily* cell_family = m_cell_family;
1228 _setItemsToSend(node_family);
1229 _setItemsToSend(edge_family);
1230 _setItemsToSend(face_family);
1231 _setItemsToSend(cell_family);
1235 for( IItemFamily* family :
m_mesh->itemFamilies()){
1236 IParticleFamily* particle_family = family->toParticleFamily();
1237 if (particle_family && particle_family->getEnableGhostItems()==
true){
1240 for (
const auto& dest_rank : m_item_dest_ranks_map[m_cell_family]->at(iparticle->cell().localId())) {
1241 to_send[dest_rank].insert(iparticle->localId());
1249 for(
const auto& iter : m_items_to_send )
1250 (*(iter.second))[m_rank].clear();
1264_setItemsToSend(IItemFamily* family)
1266 if(family->nbItem()==0)
1268 auto iter = m_items_to_send.find(family);
1269 if (iter==m_items_to_send.end())
1270 ARCANE_FATAL(
"No items to send for family '{0}'",family->name());
1271 ArrayView<std::set<Int32>> items_to_send = iter->second->view();
1272 for (
Integer item_lid = 0 ; item_lid < m_item_dest_ranks_map[family]->size(); ++item_lid){
1273 for (
const auto& dest_rank : m_item_dest_ranks_map[family]->at(item_lid)){
1274 items_to_send[dest_rank].insert(item_lid);
1285 auto iter = m_items_to_send.find(family);
1286 if (iter==m_items_to_send.end())
1291 debug() <<
"= ITEM TO SEND FOR FAMILY " << family->
name();
1292 for (
const auto& owner_lids : items_to_send) {
1293 debug() <<
"== RANK " << rank++;
1294 for (
auto item_lid : owner_lids){
1295 debug() <<
"=== has items " << item_lid;
1307 debug() <<
"= ITEM TO REMOVE FOR FAMILY " << family->
name();
1310 debug() <<
"== TO REMOVE ITEM " << item->uniqueId() <<
" kind " << item->kind();
1319 for (
const auto& item_dest_ranks_iter : m_item_dest_ranks_map){
1321 IItemFamily* family = item_dest_ranks_iter.first;
1322 if(family->itemKind() ==
IK_DoF ){
1323 auto & item_new_owners = family->itemsNewOwner();
1328 item_dest_ranks = item_dest_ranks_iter.second->at(item->localId()).view();
1330 item_dest_ranks = m_ghost_item_dest_ranks_map[item->owner()][family]->at(item->localId()).view();
1332 if (!item_dest_ranks.contains(m_rank) && item_new_owners[item] != m_rank){
1342_markRemovableItems(
bool with_cell_family)
1344 for (
const auto& item_dest_ranks_iter : m_item_dest_ranks_map){
1346 IItemFamily* family = item_dest_ranks_iter.first;
1347 if(with_cell_family || family->name()!=m_cell_family->name() ){
1348 auto & item_new_owners = family->itemsNewOwner();
1353 item_dest_ranks = item_dest_ranks_iter.second->at(item.localId()).view();
1355 item_dest_ranks = m_ghost_item_dest_ranks_map[item->owner()][family]->at(item.localId()).view();
1357 if (!item_dest_ranks.contains(m_rank) && item_new_owners[item] != m_rank){
1386 ItemGroup all_items = m_cell_family->allItems();
1388 auto itemfamily_network =
m_mesh->itemFamilyNetwork() ;
1389 bool use_itemfamily_network = ( itemfamily_network!=
nullptr && itemfamily_network->isActivated() );
1392 if (use_active_cells)
1393 all_items = m_cell_family->allItems().activeCellGroup();
1397 Integer cell_local_id = cell.localId();
1398 if (cells_new_owner[cell_local_id]==m_rank)
1402 bool keep_cell = new_owners.
contains(m_rank);
1404 Int32ConstArrayView extra_new_owners = m_neighbour_extra_cells_new_owner->at(cell_local_id);
1405 keep_cell = extra_new_owners.
contains(m_rank);
1407 if(!keep_cell && use_itemfamily_network)
1412 item_dest_ranks = m_item_dest_ranks_map[m_cell_family]->at(icell->localId()).view();
1414 item_dest_ranks = m_ghost_item_dest_ranks_map[icell->owner()][m_cell_family]->at(icell->localId()).view();
1416 keep_cell = item_dest_ranks.contains(m_rank) ;
1428_markRemovableParticles()
1430 for( IItemFamily* family :
m_mesh->itemFamilies()){
1431 IParticleFamily* particle_family = family->toParticleFamily();
1432 if (particle_family && particle_family->getEnableGhostItems()) {
1433 mesh::NewItemOwnerBuilder owner_builder;
1436 Particle particle = *iparticle;
1437 Cell cell = owner_builder.connectedCellOfItem(particle);
1441 particle.mutableItemBase().setFlags(cell.itemBase().flags());
1451_checkSubItemsDestRanks()
1455 m_mesh->itemFamilyNetwork()->schedule([
this](IItemFamily* family){
1457 const auto& item_dest_ranks = m_item_dest_ranks_map[family]->at(item.localId());
1458 for (
const auto& child_dependency :
m_mesh->itemFamilyNetwork()->getChildDependencies(family))
1460 auto accessor = IndexedItemConnectivityAccessor(child_dependency);
1464 if (connected_item->isOwn()) {
1465 subitem_dest_ranks = m_item_dest_ranks_map[child_dependency->targetFamily()]->at(connected_item.localId()).constView();
1466 for (
auto dest_rank : item_dest_ranks) {
1467 if (! subitem_dest_ranks.contains(dest_rank))
1468 fatal() <<
"Dest Rank " << dest_rank <<
" for item " << item->kind() <<
" uid "<< item->uniqueId()
1469 <<
" not present in subitem " << connected_item->kind() <<
" uid " << connected_item->uniqueId()
1470 <<
" dest ranks " << subitem_dest_ranks <<
" ower " << connected_item->owner();
1476 }, IItemFamilyNetwork::TopologicalOrder);
1484_exchangeGhostItemDataInfos()
1501 m_cell_family->getCommunicatingSubDomains(recv_sub_domains);
1502 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i )
1503 sd_exchange->addSender(recv_sub_domains[i]);
1505 sd_exchange->initializeCommunicationsMessages(recv_sub_domains);
1507 UniqueArray<IItemFamily*> item_families;
1513 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i ){
1514 ISerializeMessage* comm = sd_exchange->messageToSend(i);
1515 Int32 dest_sub_domain = comm->destination().value();
1516 ISerializer* sbuf = comm->serializer();
1517 item_families.clear();
1518 item_dest_ranks.clear();
1519 item_nb_dest_ranks.clear();
1520 family_nb_items.clear();
1522 for (
const auto& family_item_dest_ranks : m_item_dest_ranks_map){
1524 IItemFamily* family = family_item_dest_ranks.first;
1525 if (family->nbItem() == 0)
continue;
1526 item_families.add(family);
1528 auto subdomain_index = _getSubdomainIndexInCommunicatingRanks(dest_sub_domain, family->allItemsSynchronizer()->communicatingRanks());
1529 auto shared_item_lids = family->allItemsSynchronizer()->sharedItems(subdomain_index);
1530 for (
const auto& item_lid : shared_item_lids){
1531 if (family_item_dest_ranks.second->at(item_lid).size() == 0)
continue;
1532 item_dest_ranks.addRange(family_item_dest_ranks.second->at(item_lid));
1533 item_nb_dest_ranks.add(family_item_dest_ranks.second->at(item_lid).size());
1536 family_nb_items.add(family_nb_item);
1537 ENUMERATE_ITEM(item, family_item_dest_ranks.first->view(shared_item_lids)) {
1538 item_uids.add(item->uniqueId().asInt64());
1541 sbuf->setMode(ISerializer::ModeReserve);
1543 sbuf->reserveInt64(1);
1544 for (
const auto& family: item_families)
1545 sbuf->
reserve(family->name());
1546 sbuf->reserveInt64(item_families.size());
1548 sbuf->reserveArray(item_uids);
1549 sbuf->reserveArray(family_nb_items);
1550 sbuf->reserveArray(item_nb_dest_ranks);
1551 sbuf->reserveArray(item_dest_ranks);
1553 sbuf->allocateBuffer();
1556 sbuf->putInt64(item_families.size());
1557 for (
const auto& family: item_families)
1558 sbuf->put(family->name());
1559 for (
const auto& family: item_families)
1560 sbuf->putInteger(family->itemKind());
1562 sbuf->putArray(item_uids);
1563 sbuf->putArray(family_nb_items);
1564 sbuf->putArray(item_nb_dest_ranks);
1565 sbuf->putArray(item_dest_ranks);
1568 sd_exchange->processExchange();
1570 for(
Integer i=0, is=recv_sub_domains.size(); i<is; ++i ){
1571 ISerializeMessage* comm = sd_exchange->messageToReceive(i);
1572 ISerializer* sbuf = comm->serializer();
1573 Int64 nb_families = sbuf->getInt64();
1576 for (
auto& family_name: item_family_names)
1577 sbuf->get(family_name);
1578 for (
auto& family_kind: item_family_kinds)
1579 family_kind = sbuf->getInteger();
1580 sbuf->getArray(item_uids);
1581 sbuf->getArray(family_nb_items);
1582 sbuf->getArray(item_nb_dest_ranks);
1583 sbuf->getArray(item_dest_ranks);
1585 Integer item_nb_dest_rank_index = 0;
1586 Integer item_dest_rank_index = 0;
1587 for (
int family_index = 0; family_index < nb_families; ++family_index) {
1588 IItemFamily* family =
m_mesh->findItemFamily(
eItemKind(item_family_kinds[family_index]),item_family_names[family_index],
false);
1591 family->itemsUniqueIdToLocalId(item_lids,family_item_uids,
true);
1592 for (
const auto& item_lid : item_lids) {
1593 auto sub_view = item_dest_ranks.subView(item_dest_rank_index,item_nb_dest_ranks[item_nb_dest_rank_index]);
1594 Int32 dest_rank = comm->destination().value();
1595 m_ghost_item_dest_ranks_map[dest_rank][family]->at(item_lid).addRange(sub_view);
1596 item_dest_rank_index+= item_nb_dest_ranks[item_nb_dest_rank_index++];
1598 item_uid_index+= family_nb_items[family_index];
1611 while (communicating_ranks[i]!=rank) {
1620ISubDomain* MeshExchange::
1623 return m_mesh->subDomain();
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
constexpr ArrayView< T > subView(Integer abegin, Integer asize) noexcept
Sous-vue à partir de l'élément abegin et contenant asize éléments.
void fill(const DataType &data)
Remplissage du tableau.
void clear()
Supprime les éléments du tableau.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void addRange(ConstReferenceType val, Int64 n)
Ajoute n élément de valeur val à la fin du tableau.
Vue sur les informations des mailles.
Cell topHParent() const
parent de niveau 0 pour l'AMR
Vue constante d'un tableau de type T.
constexpr ConstArrayView< T > subView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
bool contains(const_reference v) const
true si le tableau contient l'élément de valeur v
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
virtual SharedArray< IIncrementalItemConnectivity * > getChildDependencies(IItemFamily *source_family)=0
Obtenir la liste de toutes les dépendances, filles d'une famille source_family ou parentes d'une fami...
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual Int32 maxLocalId() const =0
virtual String name() const =0
Nom de la famille.
virtual eItemKind itemKind() const =0
Genre des entités.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées).
@ ModePut
Le sérialiseur attend des reserve().
@ II_NeedRemove
L'entité doit être supprimé
Index d'un Item dans une variable.
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
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.
ArrayView< std::set< Int32 > > _getItemsToSend(IItemFamily *family)
Liste par sous-domaine des entités à envoyer pour la famille family.
void _printItemToSend(IItemFamily *family)
Utilisant ItemFamilyNetwork.
void _computeMeshConnectivityInfos2(Int32ConstArrayView cells_new_owner)
AMR.
void _computeMeshConnectivityInfos3()
AMR OFF.
ItemEnumeratorT< Node > NodeEnumerator
Enumérateurs sur des noeuds.
ItemEnumeratorT< Face > FaceEnumerator
Enumérateurs sur des faces.
ItemEnumeratorT< Edge > EdgeEnumerator
Enumérateurs sur des arêtes.
ItemEnumeratorT< Cell > CellEnumerator
Enumérateurs sur des mailles.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
Ref< IParallelExchanger > createExchangerRef(IParallelMng *pm)
Retourne une interface pour transférer des messages entre rangs.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
@ Cell
Le maillage est AMR par maille.
std::int32_t Int32
Type entier signé sur 32 bits.