14#include "arcane/utils/HashTableMap.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/CheckedConvert.h"
17#include "arcane/utils/ValueConvert.h"
19#include "arcane/core/parallel/BitonicSortT.H"
21#include "arcane/core/IParallelExchanger.h"
22#include "arcane/core/ISerializeMessage.h"
23#include "arcane/core/SerializeBuffer.h"
24#include "arcane/core/ISerializer.h"
25#include "arcane/core/ItemPrinter.h"
26#include "arcane/core/Timer.h"
27#include "arcane/core/IGhostLayerMng.h"
28#include "arcane/core/IItemFamilyPolicyMng.h"
29#include "arcane/core/IItemFamilySerializer.h"
30#include "arcane/core/ParallelMngUtils.h"
32#include "arcane/mesh/DynamicMesh.h"
33#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
58 using ItemInternalMap = DynamicMeshKindInfos::ItemInternalMap;
75 bool m_is_verbose =
false;
76 bool m_is_allocate =
false;
78 bool m_use_optimized_node_layer =
true;
79 bool m_use_only_minimal_cell_uid =
true;
85 void _sendAndReceiveCells(SubDomainItemMap& cells_to_send);
98, m_mesh(mesh_builder->
mesh())
99, m_mesh_builder(mesh_builder)
100, m_parallel_mng(m_mesh->parallelMng())
101, m_is_allocate(is_allocate)
105 Int32 vv = v.value();
106 m_use_optimized_node_layer = (vv == 1 || vv == 3);
107 m_use_only_minimal_cell_uid = (v == 2 || vv == 3);
110 m_is_verbose = (v.value() != 0);
117void GhostLayerBuilder2::
140 using BasicType =
Int64;
141 static constexpr Int64 nbBasicTypeSize() {
return 3; }
147 Int32 message_size = messageSize(values);
149 auto* ptr =
reinterpret_cast<const Int64*
>(fsi_base);
155 Int32 message_size = messageSize(values);
157 auto* ptr =
reinterpret_cast<Int64*
>(fsi_base);
164 Int64 message_size_i64 = values.
size() * nbBasicTypeSize();
165 Int32 message_size = CheckedConvert::toInteger(message_size_i64);
171 if ((message_size % nbBasicTypeSize()) != 0)
172 ARCANE_FATAL(
"Message size '{0}' is not a multiple of basic size '{1}'", message_size, nbBasicTypeSize());
173 Int32 nb_element = message_size / nbBasicTypeSize();
183 size_t h1 = std::hash<Int64>{}(a.node_uid);
184 size_t h2 = std::hash<Int64>{}(a.cell_uid);
185 size_t h3 = std::hash<Int32>{}(a.cell_owner);
191 return (a.node_uid == b.node_uid && a.cell_uid == b.cell_uid && a.cell_owner == b.cell_owner);
196 Int64 node_uid = NULL_ITEM_UNIQUE_ID;
197 Int64 cell_uid = NULL_ITEM_UNIQUE_ID;
198 Int32 cell_owner = -1;
213 Int64 k1_node_uid = k1.node_uid;
214 Int64 k2_node_uid = k2.node_uid;
215 if (k1_node_uid < k2_node_uid)
217 if (k1_node_uid > k2_node_uid)
220 Int64 k1_cell_uid = k1.cell_uid;
221 Int64 k2_cell_uid = k2.cell_uid;
222 if (k1_cell_uid < k2_cell_uid)
224 if (k1_cell_uid > k2_cell_uid)
227 return (k1.cell_owner < k2.cell_owner);
232 auto buf_view = BoundaryNodeInfo::asBasicBuffer(values);
233 return pm->send(buf_view, rank,
false);
238 auto buf_view = BoundaryNodeInfo::asBasicBuffer(values);
239 return pm->
recv(buf_view, rank,
false);
244 return BoundaryNodeInfo::messageSize(values);
250 bni.node_uid = INT64_MAX;
251 bni.cell_uid = INT64_MAX;
258 return bni.node_uid != INT64_MAX;
304 Integer nb_ghost_layer = m_mesh->ghostLayerMng()->nbGhostLayer();
305 info() <<
"** GHOST LAYER BUILDER V" << m_version <<
" with sort (nb_ghost_layer=" << nb_ghost_layer <<
")";
314 if (nb_ghost_layer == 0)
318 const bool is_non_manifold = m_mesh->meshKind().isNonManifold();
319 if (is_non_manifold && (m_version != 3))
320 ARCANE_FATAL(
"Only version 3 of ghostlayer builder is supported for non manifold meshes");
322 ItemInternalMap& cells_map = m_mesh->cellsMap();
323 ItemInternalMap& nodes_map = m_mesh->nodesMap();
325 Integer boundary_nodes_uid_count = 0;
329 if (m_version == 3) {
336 warning() <<
"Invalid call to addGhostLayers() with version 3 because mesh "
337 <<
" already has '" << nb_ghost <<
"' ghost cells. The computed ghost cells"
338 <<
" may be wrong. Use version 4 of ghost layer builder if you want to handle this case";
344 if (m_version >= 4) {
347 if (node_layer[node.
localId()] == 1)
348 ++boundary_nodes_uid_count;
357 node_layer[node.
localId()] = 1;
358 ++boundary_nodes_uid_count;
363 info() <<
"NB BOUNDARY NODE=" << boundary_nodes_uid_count;
365 for (
Integer current_layer = 1; current_layer <= nb_ghost_layer; ++current_layer) {
367 info() <<
"Processing layer " << current_layer;
370 if (m_version >= 4 && cell.
owner() != my_rank)
374 if (cell_layer[cell_lid] != (-1))
376 bool is_current_layer =
false;
378 Integer layer = node_layer[inode_local_id];
380 if (layer == current_layer) {
381 is_current_layer =
true;
385 if (is_current_layer) {
386 cell_layer[cell_lid] = current_layer;
390 Integer layer = node_layer[inode_local_id];
393 node_layer[inode_local_id] = current_layer + 1;
405 if (m_use_optimized_node_layer) {
409 Int32 layer = node_layer[lid];
411 node_layer[lid] = nb_ghost_layer + 1;
415 info() <<
"Mark remaining nodes nb=" << nb_no_layer;
418 for (
Integer i = 1; i <= nb_ghost_layer; ++i)
419 _addGhostLayer(i, node_layer);
441 ItemInternalMap& faces_map = m_mesh->facesMap();
454 inode.mutableItemBase().addFlags(shared_and_boundary_flags);
455 node_layer[inode.localId()] = 1;
458 iedge.mutableItemBase().addFlags(shared_and_boundary_flags);
461 _markBoundaryNodesFromEdges(node_layer);
467void GhostLayerBuilder2::
470 info() <<
"Processing ghost layer " << current_layer
471 <<
" node_layer_size=" << node_layer.
size();
480 bool is_verbose = m_is_verbose;
485 Int64 nb_added_for_different_rank = 0;
486 Int64 nb_added_for_in_layer = 0;
494 const bool do_only_minimal_uid = m_use_only_minimal_cell_uid;
505 Int32 node_lid = node.localId();
507 if (cell.
owner() != my_rank) {
509 ++nb_added_for_different_rank;
512 Integer layer = node_layer[node_lid];
513 do_it = layer <= current_layer;
515 ++nb_added_for_in_layer;
518 Int32 node_lid = node.localId();
519 if (do_only_minimal_uid) {
520 Int64 current_uid = node_cell_uids[node_lid];
521 if ((current_uid == NULL_ITEM_UNIQUE_ID) || cell_uid < current_uid) {
522 node_cell_uids[node_lid] = cell_uid;
524 info() <<
"AddNode node_uid=" << node.uniqueId() <<
" cell=" << cell_uid;
527 info() <<
"AddNode node_uid=" << node.uniqueId() <<
" cell=" << cell_uid <<
" not done current=" << current_uid;
530 Int64 node_uid = node.uniqueId();
532 nci.node_uid = node_uid;
533 nci.cell_uid = cell_uid;
534 nci.cell_owner = my_rank;
535 boundary_node_list.
add(nci);
537 info() <<
"AddNode node_uid=" << node.uniqueId() <<
" cell=" << cell_uid;
543 if (do_only_minimal_uid) {
545 Int32 lid = node.localId();
546 Int64 cell_uid = node_cell_uids[lid];
547 if (cell_uid != NULL_ITEM_UNIQUE_ID) {
548 Int64 node_uid = node.uniqueId();
550 nci.node_uid = node_uid;
551 nci.cell_uid = cell_uid;
552 nci.cell_owner = my_rank;
553 boundary_node_list.
add(nci);
558 info() <<
"NB BOUNDARY NODE LIST=" << boundary_node_list.
size()
559 <<
" nb_added_for_different_rank=" << nb_added_for_different_rank
560 <<
" nb_added_for_in_layer=" << nb_added_for_in_layer
561 <<
" do_only_minimal=" << do_only_minimal_uid;
564 SharedArray<BoundaryNodeInfo> all_boundary_node_info = boundary_node_list;
566 UniqueArray<BoundaryNodeToSendInfo> node_list_to_send;
568 ConstArrayView<BoundaryNodeInfo> all_bni = all_boundary_node_info;
570 for (
Integer i = 0; i < bi_n; ++i) {
574 Int64 node_uid = bni.node_uid;
576 for (; last_i < bi_n; ++last_i)
577 if (all_bni[last_i].node_uid != node_uid)
579 Integer nb_same_node = (last_i - i);
581 info() <<
"NB_SAME_NODE uid=" << node_uid <<
" n=" << nb_same_node <<
" last_i=" << last_i;
585 Int32 owner = bni.cell_owner;
586 bool has_ghost =
false;
587 for (
Integer z = 0; z < nb_same_node; ++z)
588 if (all_bni[i + z].cell_owner != owner) {
595 si.m_nb_cell = nb_same_node;
596 node_list_to_send.add(si);
598 info() <<
"Add ghost uid=" << node_uid <<
" index=" << i <<
" nb_same_node=" << nb_same_node;
606 ConstArrayView<BoundaryNodeInfo> all_bni = all_boundary_node_info;
607 Integer nb_node_to_send = node_list_to_send.size();
608 std::set<Int32> ranks_done;
609 for (
Integer i = 0; i < nb_node_to_send; ++i) {
610 Integer index = node_list_to_send[i].m_index;
611 Integer nb_cell = node_list_to_send[i].m_nb_cell;
615 for (
Integer kz = 0; kz < nb_cell; ++kz) {
616 Int32 krank = all_bni[index + kz].cell_owner;
617 if (ranks_done.find(krank) == ranks_done.end()) {
618 ranks_done.insert(krank);
624 nb_info_to_send[krank] += (nb_cell * 2) + 2;
631 for (
Integer i = 0; i < nb_rank; ++i) {
632 Integer nb_to_send = nb_info_to_send[i];
634 info() <<
"NB_TO_SEND rank=" << i <<
" n=" << nb_to_send;
640 for (
Integer i = 0; i < nb_rank; ++i) {
641 nb_info_to_send_indexes[i] = total_nb_to_send;
642 total_nb_to_send += nb_info_to_send[i];
644 info() <<
"TOTAL_NB_TO_SEND=" << total_nb_to_send;
646 UniqueArray<Int64> resend_infos(total_nb_to_send);
648 ConstArrayView<BoundaryNodeInfo> all_bni = all_boundary_node_info;
649 Integer nb_node_to_send = node_list_to_send.size();
650 std::set<Int32> ranks_done;
651 for (
Integer i = 0; i < nb_node_to_send; ++i) {
652 Integer node_index = node_list_to_send[i].m_index;
653 Integer nb_cell = node_list_to_send[i].m_nb_cell;
654 Int64 node_uid = all_bni[node_index].node_uid;
658 for (
Integer kz = 0; kz < nb_cell; ++kz) {
659 Int32 krank = all_bni[node_index + kz].cell_owner;
660 if (ranks_done.find(krank) == ranks_done.end()) {
661 ranks_done.insert(krank);
662 Integer send_index = nb_info_to_send_indexes[krank];
663 resend_infos[send_index] = node_uid;
665 resend_infos[send_index] = nb_cell;
667 for (
Integer zz = 0; zz < nb_cell; ++zz) {
668 resend_infos[send_index] = all_bni[node_index + zz].cell_uid;
670 resend_infos[send_index] = all_bni[node_index + zz].cell_owner;
673 nb_info_to_send_indexes[krank] = send_index;
681 Timer::SimplePrinter sp(
traceMng(),
"Sending size with AllToAll");
682 pm->allToAll(nb_info_to_send, nb_info_to_recv, 1);
686 for (
Integer i = 0; i < nb_rank; ++i)
687 info() <<
"NB_TO_RECV: I=" << i <<
" n=" << nb_info_to_recv[i];
690 for (
Integer i = 0; i < nb_rank; ++i)
691 total_nb_to_recv += nb_info_to_recv[i];
698 UniqueArray<Int64> recv_infos;
705 Int32 total_send = 0;
706 Int32 total_recv = 0;
707 for (
Integer i = 0; i < nb_rank; ++i) {
708 send_counts[i] = (
Int32)(nb_info_to_send[i] * vsize);
709 recv_counts[i] = (
Int32)(nb_info_to_recv[i] * vsize);
710 send_indexes[i] = total_send;
711 recv_indexes[i] = total_recv;
712 total_send += send_counts[i];
713 total_recv += recv_counts[i];
715 recv_infos.resize(total_nb_to_recv);
720 info() <<
"BUF_SIZES: send=" << send_buf.size() <<
" recv=" << recv_buf.size();
722 Timer::SimplePrinter sp(
traceMng(),
"Send values with AllToAll");
723 pm->allToAllVariable(send_buf, send_counts, send_indexes, recv_buf, recv_counts, recv_indexes);
727 SubDomainItemMap cells_to_send(50,
true);
736 UniqueArray<Int32> my_cells;
737 SharedArray<Int32> ranks_to_send;
738 std::set<Int32> ranks_done;
739 while (index < total_nb_to_recv) {
740 Int64 node_uid = recv_infos[index];
742 Int64 nb_cell = recv_infos[index];
744 Node current_node(nodes_map.
findItem(node_uid));
746 info() <<
"NODE uid=" << node_uid <<
" nb_cell=" << nb_cell <<
" idx=" << (index - 2);
748 ranks_to_send.clear();
750 for (
Integer kk = 0; kk < nb_cell; ++kk) {
751 Int64 cell_uid = recv_infos[index];
753 Int32 cell_owner = CheckedConvert::toInt32(recv_infos[index]);
755 if (kk == 0 && current_layer == 1 && m_is_allocate)
761 info() <<
" CELL=" << cell_uid <<
" owner=" << cell_owner;
762 if (cell_owner == my_rank) {
763 impl::ItemBase dcell = cells_map.
tryFind(cell_uid);
765 ARCANE_FATAL(
"Internal error: cell uid={0} is not in our mesh", cell_uid);
766 if (do_only_minimal_uid) {
768 for (CellLocalId c : current_node.cellIds())
772 my_cells.add(dcell.localId());
775 if (ranks_done.find(cell_owner) == ranks_done.end()) {
776 ranks_to_send.add(cell_owner);
777 ranks_done.insert(cell_owner);
783 info() <<
"CELLS TO SEND: node_uid=" << node_uid
784 <<
" nb_rank=" << ranks_to_send.size()
785 <<
" nb_cell=" << my_cells.size();
786 info(4) <<
"CELLS TO SEND: node_uid=" << node_uid
787 <<
" rank=" << ranks_to_send
788 <<
" cell=" << my_cells;
791 for (
Integer zrank = 0, zn = ranks_to_send.size(); zrank < zn; ++zrank) {
792 Int32 send_rank = ranks_to_send[zrank];
793 SubDomainItemMap::Data* d = cells_to_send.lookupAdd(send_rank);
795 for (
Integer zid = 0, zid_size = my_cells.size(); zid < zid_size; ++zid) {
797 c.add(my_cells[zid]);
803 info() <<
"GHOST V3 SERIALIZE CELLS";
804 _sendAndReceiveCells(cells_to_send);
822 bool is_verbose = m_is_verbose;
825 boundary_node_sorter.setNeedIndexAndRank(
false);
829 boundary_node_sorter.
sort(boundary_node_list);
835 for (
Integer i = 0; i < n; ++i) {
837 info() <<
"NODES_KEY i=" << i
838 <<
" node=" << bni.node_uid
839 <<
" cell=" << bni.cell_uid
840 <<
" rank=" << bni.cell_owner;
859 Integer begin_own_list_index = 0;
860 if (n != 0 && my_rank != 0) {
861 if (BoundaryNodeBitonicSortTraits::isValid(all_bni[0])) {
862 Int64 node_uid = all_bni[0].node_uid;
863 for (
Integer i = 0; i < n; ++i) {
864 if (all_bni[i].node_uid != node_uid) {
865 begin_own_list_index = i;
869 end_node_list.
add(all_bni[i]);
873 info() <<
"BEGIN_OWN_LIST_INDEX=" << begin_own_list_index <<
" end_node_list_size=" << end_node_list.
size();
875 for (
Integer k = 0, kn = end_node_list.
size(); k < kn; ++k)
876 info() <<
" SEND node_uid=" << end_node_list[k].node_uid
877 <<
" cell_uid=" << end_node_list[k].cell_uid;
884 Integer send_message_size = BoundaryNodeBitonicSortTraits::messageSize(end_node_list);
887 if (my_rank != (nb_rank - 1)) {
893 info() <<
"Send size=" << send_message_size <<
" Recv size=" << recv_message_size;
897 if (recv_message_size != 0) {
898 Int32 nb_element = BoundaryNodeInfo::nbElement(recv_message_size);
899 end_node_list_recv.
resize(nb_element);
900 requests.
add(BoundaryNodeBitonicSortTraits::recv(pm, my_rank + 1, end_node_list_recv));
902 if (send_message_size != 0)
903 requests.
add(BoundaryNodeBitonicSortTraits::send(pm, my_rank - 1, end_node_list));
907 boundary_node_list.
clear();
908 boundary_node_list.
addRange(all_bni.
subConstView(begin_own_list_index, n - begin_own_list_index));
909 boundary_node_list.
addRange(end_node_list_recv);
916void GhostLayerBuilder2::
917_sendAndReceiveCells(SubDomainItemMap& cells_to_send)
921 const bool is_verbose = m_is_verbose;
924 for (SubDomainItemMap::Enumerator i_map(cells_to_send); ++i_map;) {
925 Int32 sd = i_map.data()->key();
931 std::sort(std::begin(items), std::end(items));
932 auto new_end = std::unique(std::begin(items), std::end(items));
933 items.
resize(CheckedConvert::toInteger(new_end - std::begin(items)));
935 info(4) <<
"CELLS TO SEND SD=" << sd <<
" Items=" << items;
937 info(4) <<
"CELLS TO SEND SD=" << sd <<
" nb=" << items.size();
938 exchanger->addSender(sd);
940 exchanger->initializeCommunicationsMessages();
941 for (
Integer i = 0, ns = exchanger->nbSender(); i < ns; ++i) {
942 ISerializeMessage* sm = exchanger->messageToSend(i);
943 Int32 rank = sm->destination().value();
944 ISerializer* s = sm->serializer();
948 exchanger->processExchange();
949 info(4) <<
"END EXCHANGE CELLS";
950 for (
Integer i = 0, ns = exchanger->nbReceiver(); i < ns; ++i) {
951 ISerializeMessage* sm = exchanger->messageToReceive(i);
952 ISerializer* s = sm->serializer();
955 m_mesh_builder->printStats();
972 ItemInternalMap& faces_map = m_mesh->facesMap();
978 bool is_sub_domain_boundary_face =
false;
980 is_sub_domain_boundary_face =
true;
984 is_sub_domain_boundary_face =
true;
986 if (is_sub_domain_boundary_face) {
989 inode.mutableItemBase().addFlags(shared_and_boundary_flags);
991 iedge.mutableItemBase().addFlags(shared_and_boundary_flags);
994 _markBoundaryNodesFromEdges(node_layer);
1000void GhostLayerBuilder2::
1004 if (!is_non_manifold)
1009 info() <<
"Mark boundary nodes from edges for non-manifold mesh";
1019 Int32 nb_dim2_cell = 0;
1020 Int32 nb_own_dim2_cell = 0;
1025 if (cell.
owner() == my_rank)
1029 if (nb_dim2_cell == nb_cell && nb_own_dim2_cell == 1) {
1031 for (Item inode : edge.
nodes()) {
1032 inode.mutableItemBase().addFlags(shared_and_boundary_flags);
1033 node_layer[inode.localId()] = 1;
1043_buildGhostLayerNewVersion(
DynamicMesh* mesh,
bool is_allocate,
Int32 version)
1046 glb.addGhostLayers();
#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 const_pointer data() const noexcept
Pointeur sur le début de la vue.
Tableau d'items de types quelconques.
void clear()
Supprime les éléments du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void addRange(ConstReferenceType val, Int64 n)
Ajoute n élément de valeur val à la fin du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr ConstArrayView< T > subConstView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
Classe template pour convertir un type.
CellConnectedListViewType cells() const
Liste des mailles de l'arête.
Int32 nbCell() const
Nombre de mailles connectées à l'arête.
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2).
EdgeConnectedListViewType edges() const
Liste des arêtes de la face.
Table de hachage pour tableaux associatifs.
virtual Int32 maxLocalId() const =0
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void waitAllRequests(ArrayView< Request > rvalues)=0
Bloque en attendant que les requêtes rvalues soient terminées.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
MutableItemBase toMutable()
Interface modifiable de cette entité
Int32 flags() const
Flags de l'entité
@ II_Shared
L'entité est partagée par un autre sous-domaine.
@ II_SubDomainBoundary
L'entité est à la frontière de deux sous-domaines.
@ II_Boundary
L'entité est sur la frontière.
Structure interne d'une entité de maillage.
Classe utilitaire pour imprimer les infos sur une entité.
Int16 dimension() const
Dimension de l'élément (<0 si inconnu).
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Classe de base d'un élément de maillage.
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
constexpr bool isOwn() const
true si l'entité est appartient au sous-domaine
impl::ItemBase itemBase() const
Partie interne de l'entité.
bool isNonManifold() const
Vrai si la structure du maillage est eMeshCellDimensionKind::NonManifold.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
void addFlags(Int32 added_flags)
Ajoute les flags added_flags à ceux de l'entité
Algorithme de tri bi-tonique parallèle.
ConstArrayView< KeyType > keys() const override
Après un tri, retourne la liste des éléments de ce rang.
void sort(ConstArrayView< KeyType > keys) override
Trie en parallèle les éléments de keys sur tous les rangs.
Vecteur 1D de données avec sémantique par référence.
Affiche le temps passé entre l'appel au constructeur et le destructeur.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage warning() const
Flot pour un message d'avertissement.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
Construction d'un maillage de manière incrémentale.
Implémentation d'un maillage.
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
IParallelMng * parallelMng() override
Gestionnaire de parallèlisme.
void serializeCells(ISerializer *buffer, Int32ConstArrayView cells_local_id) override
const MeshKind meshKind() const override
Caractéristiques du maillage.
Fonctor pour trier les BoundaryNodeInfo via le tri bitonic.
Structure contenant les informations des noeuds frontières.
Construction des couches fantômes.
void _sortBoundaryNodeList(Array< BoundaryNodeInfo > &boundary_node_list)
Trie parallèle de la liste des infos sur les noeuds frontières.
void _markBoundaryItems(ArrayView< Int32 > node_layer)
Marque les entitées au bord du sous-domaine.
GhostLayerBuilder2(DynamicMeshIncrementalBuilder *mesh_builder, bool is_allocate, Int32 version)
Construit une instance pour le maillage mesh.
void addGhostLayers()
Ajoute les couches de mailles fantomes.
void _markBoundaryNodes(ArrayView< Int32 > node_layer)
Détermine les noeuds frontières.
Tableau associatif de ItemInternal.
impl::ItemBase findItem(Int64 uid) const
Retourne l'entité de numéro unique uid.
void eachItem(const Lambda &lambda)
Fonction template pour itérer sur les entités de l'instance.
impl::ItemBase tryFind(Int64 key) const
Retourne l'entité associée à key si trouvé ou l'entité nulle sinon.
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.
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.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
std::int32_t Int32
Type entier signé sur 32 bits.