12#include "arcane/mesh/DualUniqueIdMng.h"
13#include "arcane/mesh/GraphDoFs.h"
15#include "arcane/utils/ArgumentException.h"
17#include "arcane/core/IMesh.h"
18#include "arcane/core/IItemConnectivity.h"
19#include "arcane/core/IIncrementalItemConnectivity.h"
22#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
33GraphIncrementalConnectivity::
34GraphIncrementalConnectivity(
GraphDoFs* graph)
35: m_dualnode_family(graph->dualNodeFamily())
36, m_link_family(graph->linkFamily())
37, m_dualnode_connectivity(graph->m_dualnodes_incremental_connectivity)
38, m_link_connectivity(graph->m_links_incremental_connectivity)
39, m_dualitem_connectivities(graph->m_incremental_connectivities)
40, m_dualnode_to_connectivity_index(graph->m_dual_node_to_connectivity_index)
48GraphDoFs(IMesh* mesh, String particle_family_name)
49: TraceAccessor(mesh->traceMng())
52, m_connectivity_mng(m_dof_mng.connectivityMng())
53, m_dual_node_family(m_dof_mng.getFamily(GraphDoFs::dualNodeFamilyName(), true))
54, m_link_family(m_dof_mng.getFamily(GraphDoFs::linkFamilyName(), true))
55, m_update_sync_info(false)
56, m_particle_family_name(particle_family_name)
63 if (m_graph_allocated)
66 auto connectivity_index = 0;
67 m_connectivity_indexes_per_type.resize(NB_BASIC_ITEM_TYPE, -1);
68 m_connectivity_indexes_per_type[IT_DualNode] = connectivity_index++;
69 m_connectivity_indexes_per_type[IT_DualEdge] = connectivity_index++;
70 m_connectivity_indexes_per_type[IT_DualFace] = connectivity_index++;
71 m_connectivity_indexes_per_type[IT_DualCell] = connectivity_index++;
72 m_connectivity_indexes_per_type[IT_DualParticle] = connectivity_index++;
74 m_item_family_network = m_mesh->itemFamilyNetwork();
75 if (m_item_family_network ==
nullptr)
76 ARCANE_FATAL(
"ARCANE_GRAPH_CONNECTIVITY_POLICY need to be activated");
78 m_graph_id = m_item_family_network->registerConnectedGraph(
this);
80 m_dualnodes_incremental_connectivity =
81 new IncrementalItemConnectivity(dualNodeFamily(),
83 mesh::connectivityName(dualNodeFamily(), linkFamily()));
85 m_connectivity_mng->registerConnectivity(m_dualnodes_incremental_connectivity);
87 if (m_item_family_network)
88 m_item_family_network->addRelation(dualNodeFamily(), linkFamily(), m_dualnodes_incremental_connectivity);
90 m_links_incremental_connectivity =
91 new IncrementalItemConnectivity(linkFamily(),
93 mesh::connectivityName(linkFamily(), dualNodeFamily()));
94 m_connectivity_mng->registerConnectivity(m_links_incremental_connectivity);
96 if (m_item_family_network)
98 m_item_family_network->addDependency(linkFamily(), dualNodeFamily(), m_links_incremental_connectivity,
false);
100 m_incremental_connectivities.resize(NB_DUAL_ITEM_TYPE,
nullptr);
101 std::array<int, NB_DUAL_ITEM_TYPE> dual_node_kinds = { IT_DualCell, IT_DualFace, IT_DualEdge, IT_DualNode, IT_DualParticle };
102 for (
auto dual_node_kind : dual_node_kinds) {
103 IItemFamily* dual_item_family = _dualItemFamily(dualItemKind(dual_node_kind));
104 if (dual_item_family) {
105 auto dof2dual_incremental_connectivity =
106 new IncrementalItemConnectivity(dualNodeFamily(),
108 mesh::connectivityName(dualNodeFamily(), dual_item_family));
110 m_connectivity_mng->registerConnectivity(dof2dual_incremental_connectivity);
111 m_incremental_connectivities[_connectivityIndex(dual_node_kind)] = dof2dual_incremental_connectivity;
112 if (m_item_family_network)
113 m_item_family_network->addDependency(dualNodeFamily(), dual_item_family, dof2dual_incremental_connectivity,
false);
116 m_graph_connectivity.reset(
new GraphIncrementalConnectivity(dualNodeFamily(),
118 m_dualnodes_incremental_connectivity,
119 m_links_incremental_connectivity,
120 m_incremental_connectivities,
121 m_dual_node_to_connectivity_index));
123 for (
auto& obs : m_connectivity_observer)
125 obs->notifyUpdateConnectivity();
127 m_update_sync_info =
false;
128 m_graph_allocated =
true;
136 Integer nb_dual_nodes_per_link,
141 if (!m_graph_allocated)
144 IDoFFamily* link_family = m_dof_mng.getFamily(GraphDoFs::linkFamilyName());
145 IDoFFamily* dual_node_family = m_dof_mng.getFamily(GraphDoFs::dualNodeFamilyName());
150 connected_dual_node_uids.
reserve(nb_link * nb_dual_nodes_per_link);
151 for (
auto links_infos_index = 0; links_infos_index < links_infos.
size();) {
152 auto link_uid = links_infos[links_infos_index++];
153 link_uids.
add(link_uid);
155 links_infos.
subConstView(links_infos_index, nb_dual_nodes_per_link));
156 links_infos_index += nb_dual_nodes_per_link;
160 link_family->
addDoFs(link_uids, link_lids);
165 Int32UniqueArray connected_dual_nodes_lids(nb_link * nb_dual_nodes_per_link);
167 connected_dual_nodes_lids.
view(), connected_dual_node_uids.
constView(),
true);
171 m_links_incremental_connectivity->notifySourceItemAdded(
ItemLocalId(*inewlink));
172 for (
auto lid : connected_dual_nodes_lids.
subConstView(link_index, nb_dual_nodes_per_link)) {
176 link_index += nb_dual_nodes_per_link;
178 m_connectivity_mng->setUpToDate(m_links_incremental_connectivity);
179 m_connectivity_mng->setUpToDate(m_dualnodes_incremental_connectivity);
181 m_update_sync_info =
false;
188addDualNodes(
Integer graph_nb_dual_node,
194 if (!m_graph_allocated)
200 dual_node_uids.
reserve(graph_nb_dual_node);
201 dual_item_uids.
reserve(graph_nb_dual_node);
202 for (
auto infos_index = 0; infos_index < dual_nodes_infos.
size();) {
203 dual_node_uids.
add(dual_nodes_infos[infos_index++]);
204 dual_item_uids.
add(dual_nodes_infos[infos_index++]);
208 auto* dual_node_family = m_dof_mng.getFamily(GraphDoFs::dualNodeFamilyName());
209 dual_node_family->addDoFs(dual_node_uids, dual_node_lids);
210 dual_node_family->endUpdate();
212 IItemFamily* dual_item_family = _dualItemFamily(dualItemKind(dual_node_kind));
214 auto incremental_dual_item_connectivity = m_incremental_connectivities[_connectivityIndex(dual_node_kind)];
215 if (incremental_dual_item_connectivity ==
nullptr) {
216 incremental_dual_item_connectivity =
219 mesh::connectivityName(dualNodeFamily(), dual_item_family));
221 m_connectivity_mng->registerConnectivity(incremental_dual_item_connectivity);
222 m_incremental_connectivities[_connectivityIndex(dual_node_kind)] = incremental_dual_item_connectivity;
223 if (m_item_family_network)
224 m_item_family_network->addDependency(dualNodeFamily(), dual_item_family, incremental_dual_item_connectivity,
false);
229 ENUMERATE_DOF (idual_node, dual_node_family->itemFamily()->view(dual_node_lids)) {
230 incremental_dual_item_connectivity->notifySourceItemAdded(
ItemLocalId(*idual_node));
231 incremental_dual_item_connectivity->addConnectedItem(
ItemLocalId(*idual_node),
ItemLocalId(dual_item_lids[idual_node.index()]));
233 m_connectivity_mng->setUpToDate(incremental_dual_item_connectivity);
235 m_update_sync_info =
false;
240addDualNodes(
Integer graph_nb_dual_node,
245 if (!m_graph_allocated)
249 bool is_parallel = m_mesh->parallelMng()->isParallel();
250 Integer domain_rank = m_mesh->parallelMng()->commRank();
252 std::map<Int64, std::pair<Int64UniqueArray, Int64UniqueArray>> dual_info_per_kind;
253 for (
auto infos_index = 0; infos_index < dual_nodes_infos.
size();) {
254 Int64 dual_node_kind = dual_nodes_infos[infos_index++];
255 auto&
info = dual_info_per_kind[dual_node_kind];
256 auto& dual_node_uids =
info.first;
257 auto& dual_item_uids =
info.second;
258 if (dual_node_uids.size() == 0) {
259 dual_node_uids.reserve(graph_nb_dual_node);
260 dual_item_uids.reserve(graph_nb_dual_node);
262 dual_node_uids.add(dual_nodes_infos[infos_index++]);
263 dual_item_uids.add(dual_nodes_infos[infos_index++]);
266 for (
Integer index = 0; index < NB_DUAL_ITEM_TYPE; ++index) {
267 Integer dual_node_kind = m_dualnode_kinds[index];
268 auto&
info = dual_info_per_kind[dual_node_kind];
269 auto& dual_node_uids =
info.first;
270 auto& dual_item_uids =
info.second;
272 auto* dual_node_family = m_dof_mng.getFamily(GraphDoFs::dualNodeFamilyName());
275 IItemFamily* dual_item_family = _dualItemFamily(dualItemKind(dual_node_kind));
276 if (dual_item_family) {
279 auto dual_item_view = dual_item_family->
view(dual_item_lids);
285 for (
auto const& item : dual_item_view)
286 if (item.owner() == domain_rank)
288 local_dual_node_lids.
resize(local_size);
289 local_dual_node_uids.
reserve(local_size);
291 Integer ghost_size = dual_node_uids.size() - local_size;
295 ghost_dual_node_lids.
resize(ghost_size);
296 ghost_dual_node_uids.
reserve(ghost_size);
297 ghost_dual_node_owner.
reserve(ghost_size);
300 for (
auto const& item : dual_item_view) {
301 if (item.owner() == domain_rank) {
302 local_dual_node_uids.
add(dual_node_uids[icount]);
305 ghost_dual_node_uids.
add(dual_node_uids[icount]);
306 ghost_dual_node_owner.
add(item.owner());
311 dual_node_family->addDoFs(local_dual_node_uids, local_dual_node_lids);
312 dual_node_family->addGhostDoFs(ghost_dual_node_uids, ghost_dual_node_lids, ghost_dual_node_owner);
313 dual_node_family->endUpdate();
318 for (
auto const& item : dual_item_view) {
319 if (item.owner() == domain_rank)
320 dual_node_lids[icount] = local_dual_node_lids[local_icount++];
322 dual_node_lids[icount] = ghost_dual_node_lids[ghost_icount++];
328 dual_node_family->addDoFs(dual_node_uids, dual_node_lids);
329 dual_node_family->endUpdate();
332 IItemFamily* dual_item_family = _dualItemFamily(dualItemKind(dual_node_kind));
333 if (dual_item_family) {
335 auto incremental_dual_item_connectivity = m_incremental_connectivities[index];
336 if (incremental_dual_item_connectivity ==
nullptr) {
337 incremental_dual_item_connectivity =
340 mesh::connectivityName(dualNodeFamily(), dual_item_family));
342 m_connectivity_mng->registerConnectivity(incremental_dual_item_connectivity);
343 m_incremental_connectivities[index] = incremental_dual_item_connectivity;
344 if (m_item_family_network)
345 m_item_family_network->addDependency(dualNodeFamily(), dual_item_family, incremental_dual_item_connectivity,
false);
350 ENUMERATE_DOF (idual_node, dual_node_family->itemFamily()->view(dual_node_lids)) {
351 incremental_dual_item_connectivity->notifySourceItemAdded(
ItemLocalId(*idual_node));
352 incremental_dual_item_connectivity->addConnectedItem(
ItemLocalId(*idual_node),
ItemLocalId(dual_item_lids[idual_node.index()]));
357 m_connectivity_mng->setUpToDate(incremental_dual_item_connectivity);
361 m_update_sync_info =
false;
372 m_dof_mng.getFamily(GraphDoFs::dualNodeFamilyName())->removeDoFs(dual_node_local_ids);
373 if (dual_node_local_ids.
size() > 0)
374 m_update_sync_info =
false;
385 m_dof_mng.getFamily(GraphDoFs::linkFamilyName())->removeDoFs(link_local_ids);
386 if (link_local_ids.
size() > 0)
387 m_update_sync_info =
false;
393 std::set<Int32> cell_to_remove_set;
394 std::set<Int32> node_to_remove_set;
395 std::set<Int32> face_to_remove_set;
396 auto cell_family = m_mesh->cellFamily();
399 cell_to_remove_set.insert(icell->localId());
400 for (
auto face : icell->faces()) {
401 if (face.itemBase().isSuppressed())
402 face_to_remove_set.insert(face.localId());
404 for (
auto node : icell->nodes()) {
405 if (node.itemBase().isSuppressed())
406 node_to_remove_set.insert(node.localId());
410 std::set<Int32> link_to_remove_set;
413 for (
auto ilink : linkFamily()->itemsInternal()) {
414 if (ilink->isSuppressed())
417 bool to_remove =
false;
419 auto dual_item = m_graph_connectivity->dualItem(*idual_node);
420 switch (dual_item.kind()) {
422 if (cell_to_remove_set.find(dual_item->localId()) != cell_to_remove_set.end())
426 if (face_to_remove_set.find(dual_item->localId()) != face_to_remove_set.end())
430 if (node_to_remove_set.find(dual_item->localId()) != node_to_remove_set.end())
434 if (dual_item.itemBase().isSuppressed())
442 link_to_remove_set.insert(link_lid);
444 m_dualnodes_incremental_connectivity->removeConnectedItem(
ItemLocalId(idual_node->localId()), link_lid);
448 m_detached_link_lids.resize(link_to_remove_set.size());
449 std::copy(std::begin(link_to_remove_set), std::end(link_to_remove_set), std::begin(m_detached_link_lids));
453 m_detached_link_lids.clear();
456 auto incremental_dof2cell_connectivity = m_incremental_connectivities[m_connectivity_indexes_per_type[IT_DualCell]];
457 auto incremental_dof2face_connectivity = m_incremental_connectivities[m_connectivity_indexes_per_type[IT_DualFace]];
458 auto incremental_dof2node_connectivity = m_incremental_connectivities[m_connectivity_indexes_per_type[IT_DualNode]];
459 auto incremental_dof2part_connectivity = m_incremental_connectivities[m_connectivity_indexes_per_type[IT_DualParticle]];
466 for (
auto idualnode : dualNodeFamily()->itemsInternal()) {
467 if (idualnode->isSuppressed())
471 auto dual_item = m_graph_connectivity->dualItem(
DoF(idualnode));
472 switch (dual_item.kind()) {
474 if (cell_to_remove_set.find(dual_item.localId()) != cell_to_remove_set.end()) {
475 incremental_dof2cell_connectivity->replaceConnectedItem(dualnode_lid, 0,
ItemLocalId(-1));
476 m_detached_dualnode_lids.add(dualnode_lid);
481 if (face_to_remove_set.find(dual_item.localId()) != face_to_remove_set.end()) {
482 incremental_dof2face_connectivity->replaceConnectedItem(dualnode_lid, 0,
ItemLocalId(-1));
483 m_detached_dualnode_lids.add(dualnode_lid);
488 if (node_to_remove_set.find(dual_item.localId()) != node_to_remove_set.end()) {
489 incremental_dof2node_connectivity->replaceConnectedItem(dualnode_lid, 0,
ItemLocalId(-1));
490 m_detached_dualnode_lids.add(dualnode_lid);
495 if (dual_item.itemBase().isSuppressed()) {
496 incremental_dof2part_connectivity->replaceConnectedItem(dualnode_lid, 0,
ItemLocalId(-1));
497 m_detached_dualnode_lids.add(dualnode_lid);
505 m_detached_dualnode_lids.clear();
507 m_update_sync_info =
false;
515 if (!m_graph_allocated)
518 for (
Integer index = 0; index < NB_DUAL_ITEM_TYPE; ++index) {
519 Integer dual_node_kind = m_dualnode_kinds[index];
520 auto dof2dual_incremental_connectivity = m_incremental_connectivities[_connectivityIndex(dual_node_kind)];
522 if (dof2dual_incremental_connectivity && !m_connectivity_mng->isUpToDate(dof2dual_incremental_connectivity))
523 m_update_sync_info =
false;
525 if (!m_connectivity_mng->isUpToDate(m_dualnodes_incremental_connectivity))
526 m_update_sync_info =
false;
528 if (!m_connectivity_mng->isUpToDate(m_links_incremental_connectivity))
529 m_update_sync_info =
false;
532 Integer sync_info = (m_update_sync_info ? 0 : 1);
534 m_update_sync_info = sync_info == 0;
536 return m_update_sync_info;
542 if (!m_graph_allocated)
545 auto dualnode_family = dualNodeFamily();
546 auto link_family = linkFamily();
548 DualUniqueIdMng dual_uid_mng(traceMng());
549 for (Integer index = 0; index < NB_DUAL_ITEM_TYPE; ++index) {
550 Integer dual_node_kind = m_dualnode_kinds[index];
552 IItemFamily* dual_item_family = _dualItemFamily(dual_item_kind);
554 if (dual_item_family ==
nullptr || dual_item_family->nbItem() == 0)
557 auto dof2dual_incremental_connectivity = m_incremental_connectivities[_connectivityIndex(dual_node_kind)];
558 if (dof2dual_incremental_connectivity && !m_connectivity_mng->isUpToDate(dof2dual_incremental_connectivity)) {
561 Int32ArrayView source_family_added_items_lids;
562 Int32ArrayView source_family_removed_items_lids;
563 m_connectivity_mng->getSourceFamilyModifiedItems(dof2dual_incremental_connectivity, source_family_added_items_lids, source_family_removed_items_lids);
565 info() <<
" NUMBER OF REMOVE ITEMS : " << source_family_removed_items_lids.
size();
566 info() <<
" NUMBER OF ADDED ITEMS : " << source_family_added_items_lids.size();
567 Int64UniqueArray dual_item_uids;
568 dual_item_uids.
reserve(source_family_added_items_lids.size());
569 IntegerUniqueArray dual_node_lids;
570 dual_node_lids.
reserve(source_family_added_items_lids.size());
572 ItemVector source_family_added_items(dualnode_family, source_family_added_items_lids);
574 auto value = dual_uid_mng.uniqueIdOfDualItem(*idof);
575 if (std::get<0>(value) == dual_item_kind) {
576 dual_node_lids.add(idof->localId());
577 dual_item_uids.add(std::get<1>(value));
582 dual_item_family->itemsUniqueIdToLocalId(dual_item_lids, dual_item_uids);
584 ENUMERATE_DOF (idual_node, dualnode_family->view(dual_node_lids)) {
585 dof2dual_incremental_connectivity->notifySourceItemAdded(ItemLocalId(*idual_node));
586 dof2dual_incremental_connectivity->addConnectedItem(ItemLocalId(*idual_node), ItemLocalId(dual_item_lids[idual_node.index()]));
604 m_connectivity_mng->setUpToDate(dof2dual_incremental_connectivity);
608 if (!m_connectivity_mng->isUpToDate(m_links_incremental_connectivity)) {
614 m_connectivity_mng->getSourceFamilyModifiedItems(m_links_incremental_connectivity, source_family_added_items_lids, source_family_removed_items_lids);
616 info() <<
" NUMBER OF REMOVE ITEMS : " << source_family_removed_items_lids.
size();
617 info() <<
" NUMBER OF ADDED ITEMS : " << source_family_added_items_lids.size();
618 ItemVector source_family_added_items(link_family, source_family_added_items_lids);
621 link_uids.
reserve(source_family_added_items_lids.size());
623 dualnode_uids.
reserve(2 * source_family_added_items_lids.size());
625 link_uids.add(ilink->uniqueId());
626 auto value = dual_uid_mng.uniqueIdOfPairOfDualItems(*ilink);
627 eItemKind dualitem_kind_1 = std::get<0>(value.first);
628 Int64 dualitem_uid_1 = std::get<1>(value.first);
629 Int64 dof_uid_1 = dual_uid_mng.uniqueIdOf(dualitem_kind_1, dualitem_uid_1);
630 dualnode_uids.add(dof_uid_1);
632 eItemKind dualitem_kind_2 = std::get<0>(value.second);
633 Int64 dualitem_uid_2 = std::get<1>(value.second);
634 Int64 dof_uid_2 = dual_uid_mng.uniqueIdOf(dualitem_kind_2, dualitem_uid_2);
635 dualnode_uids.add(dof_uid_2);
642 Integer nb_dual_nodes_per_link = 2;
645 dualnode_family->itemsUniqueIdToLocalId(connected_dual_nodes_lids.view(), dualnode_uids);
649 m_links_incremental_connectivity->notifySourceItemAdded(ItemLocalId(*inewlink));
650 for (
auto lid : connected_dual_nodes_lids.subConstView(link_index, nb_dual_nodes_per_link)) {
651 m_links_incremental_connectivity->addConnectedItem(ItemLocalId(*inewlink), ItemLocalId(lid));
652 m_dualnodes_incremental_connectivity->addConnectedItem(ItemLocalId(lid), ItemLocalId(*inewlink));
654 link_index += nb_dual_nodes_per_link;
658 m_connectivity_mng->setUpToDate(m_links_incremental_connectivity);
659 m_connectivity_mng->setUpToDate(m_dualnodes_incremental_connectivity);
662 dualnode_family->computeSynchronizeInfos();
663 link_family->computeSynchronizeInfos();
664 m_update_sync_info =
true;
666 updateAfterMeshChanged();
668 auto* x =
new GraphIncrementalConnectivity(dualNodeFamily(),
670 m_dualnodes_incremental_connectivity,
671 m_links_incremental_connectivity,
672 m_incremental_connectivities,
673 m_dual_node_to_connectivity_index);
674 m_graph_connectivity.reset(x);
676 for (
auto& obs : m_connectivity_observer) {
678 obs->notifyUpdateConnectivity();
681 for (
auto& obs : m_graph_observer) {
694updateAfterMeshChanged()
696 if (!m_graph_allocated)
699 auto* dual_node_family = m_dof_mng.getFamily(GraphDoFs::dualNodeFamilyName());
700 m_dual_node_to_connectivity_index.resize(dual_node_family->itemFamily(), -1);
702 for (Integer index = 0; index < m_incremental_connectivities.size(); ++index) {
703 auto connectivity = m_incremental_connectivities[index];
704 if (connectivity && (connectivity->maxNbConnectedItem() > 0)) {
705 ConnectivityItemVector accessor(connectivity);
706 if (accessor.connectedItems(*idof).size() > 0) {
707 m_dual_node_to_connectivity_index[*idof] = index;
719printDualNodes()
const
722 info() <<
"DualNode : lid = " << idualnode->localId();
723 info() <<
" uid = " << idualnode->uniqueId();
724 info() <<
" owner = " << idualnode->owner();
725 auto dual_item = m_graph_connectivity->dualItem(*idualnode);
726 info() <<
" DualItem : lid = " << dual_item.localId();
727 info() <<
" uid = " << dual_item.uniqueId();
728 info() <<
" kind = " << dual_item.kind();
729 info() <<
" owner = " << dual_item.owner();
730 auto links = m_graph_connectivity->links(*idualnode);
731 for (
auto const& link : links) {
732 info() <<
" Connected link : lid = " << link.localId();
733 info() <<
" uid = " << link.uniqueId();
734 info() <<
" owner = " << link.owner();
746 info() <<
"Link : LID = " << ilink.localId();
747 info() <<
" UID = " << ilink->uniqueId();
748 info() <<
" OWNER = " << ilink->owner();
749 ENUMERATE_DOF (idual_node, m_graph_connectivity->dualNodes(*ilink)) {
750 info() <<
" Dof : index = " << idual_node.index();
751 info() <<
" Dof : LID = " << idual_node->localId();
752 info() <<
" UID = " << idual_node->uniqueId();
753 info() <<
" OWNER = " << idual_node->owner();
754 auto dual_item = m_graph_connectivity->dualItem(*idual_node);
755 info() <<
" dual item UID = " << dual_item.uniqueId();
756 info() <<
" KIND = " << dual_item.kind();
757 info() <<
" OWNER = " << dual_item.owner();
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Various mathematical functions.
Integer size() const
Number of elements in the vector.
constexpr Integer size() const noexcept
Returns the size of the array.
void addRange(ConstReferenceType val, Int64 n)
Adds n elements of value val to the end of the array.
void resize(Int64 s)
Changes the number of elements in the array to s.
ConstArrayView< T > subConstView(Int64 abegin, Int32 asize) const
Sub-view starting from element abegin and containing asize elements.
void add(ConstReferenceType val)
Adds element val to the end of the array.
ConstArrayView< T > constView() const
Constant view of this array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
ArrayView< T > view() const
Mutable view of this array.
Manages the retrieval of connectivity information.
ItemVectorView connectedItems(ItemLocalId item)
Returns the entities connected to item.
constexpr Integer size() const noexcept
Number of elements in the array.
constexpr ConstArrayView< T > subConstView(Integer abegin, Integer asize) const noexcept
Sub-view (constant) starting from element abegin and containing asize elements.
Interface of a DoF family.
virtual DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)=0
Input is the DoF uids and we retrieve their lids.
virtual void endUpdate()=0
Interface of an entity family.
virtual ItemVectorView view(Int32ConstArrayView local_ids)=0
View on the entities.
virtual void itemsUniqueIdToLocalId(Int32ArrayView local_ids, Int64ConstArrayView unique_ids, bool do_fatal=true) const =0
Converts an array of unique numbers to local numbers.
Index of an Item in a variable.
TraceMessage info() const
Flow for an information message.
ITraceMng * traceMng() const
Trace manager.
void removeLinks(Int32ConstArrayView link_local_ids) override
Removes dual links from the graph.
void removeDualNodes(Int32ConstArrayView dual_node_local_ids) override
Removes dual nodes from the graph.
Incremental item->item[] connectivity.
ItemVectorViewT< Cell > CellVectorView
View over a vector of cells.
@ ReduceSum
Sum of values.
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.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
SharedArray< Int32 > Int32SharedArray
Dynamic 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_Particle
Particle mesh entity.
@ IK_Node
Node mesh entity.
@ IK_Cell
Cell mesh entity.
@ IK_Face
Face mesh entity.