From b1fa9afb39374218e94990381481fad31f52a49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Fri, 2 Apr 2021 13:10:57 +0200 Subject: [PATCH] Add a few missing ingredients - Mesh::numberOfEdges() function - construction of edges and faces similarly to nodes in 1d - construction of edges similarly to faces in 1d --- src/mesh/Connectivity.cpp | 68 +++++++++++++++++++++++++++++++++++++-- src/mesh/Connectivity.hpp | 2 -- src/mesh/Mesh.hpp | 7 ++++ 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp index de8be5816..a542c35e0 100644 --- a/src/mesh/Connectivity.cpp +++ b/src/mesh/Connectivity.cpp @@ -82,7 +82,49 @@ Connectivity<Dimension>::_buildFrom(const ConnectivityDescriptor& descriptor) m_ref_node_list_vector = descriptor.template refItemListVector<ItemType::node>(); m_ref_cell_list_vector = descriptor.template refItemListVector<ItemType::cell>(); - if constexpr (Dimension > 1) { + if constexpr (Dimension == 1) { + // faces are similar to nodes + { + WeakFaceValue<int> face_number(*this); + face_number = convert_to_array(descriptor.node_number_vector); + m_face_number = face_number; + } + + { + WeakFaceValue<int> face_owner(*this); + face_owner = convert_to_array(descriptor.node_owner_vector); + m_face_owner = face_owner; + } + + { + const int rank = parallel::rank(); + WeakFaceValue<bool> face_is_owned(*this); + parallel_for( + this->numberOfFaces(), PUGS_LAMBDA(FaceId l) { face_is_owned[l] = (m_face_owner[l] == rank); }); + m_face_is_owned = face_is_owned; + } + + // edges are similar to nodes + { + WeakEdgeValue<int> edge_number(*this); + edge_number = convert_to_array(descriptor.node_number_vector); + m_edge_number = edge_number; + } + + { + WeakEdgeValue<int> edge_owner(*this); + edge_owner = convert_to_array(descriptor.node_owner_vector); + m_edge_owner = edge_owner; + } + + { + const int rank = parallel::rank(); + WeakEdgeValue<bool> edge_is_owned(*this); + parallel_for( + this->numberOfEdges(), PUGS_LAMBDA(EdgeId l) { edge_is_owned[l] = (m_edge_owner[l] == rank); }); + m_edge_is_owned = edge_is_owned; + } + } else { m_item_to_item_matrix[itemTId(ItemType::face)][itemTId(ItemType::node)] = descriptor.face_to_node_vector; m_item_to_item_matrix[itemTId(ItemType::cell)][itemTId(ItemType::face)] = descriptor.cell_to_face_vector; @@ -120,7 +162,29 @@ Connectivity<Dimension>::_buildFrom(const ConnectivityDescriptor& descriptor) m_ref_face_list_vector = descriptor.template refItemListVector<ItemType::face>(); - if constexpr (Dimension > 2) { + if constexpr (Dimension == 2) { + // edges are similar to faces + { + WeakEdgeValue<int> edge_number(*this); + edge_number = convert_to_array(descriptor.face_number_vector); + m_edge_number = edge_number; + } + + { + WeakEdgeValue<int> edge_owner(*this); + edge_owner = convert_to_array(descriptor.face_owner_vector); + m_edge_owner = edge_owner; + } + + { + const int rank = parallel::rank(); + WeakEdgeValue<bool> edge_is_owned(*this); + parallel_for( + this->numberOfEdges(), PUGS_LAMBDA(EdgeId l) { edge_is_owned[l] = (m_edge_owner[l] == rank); }); + m_edge_is_owned = edge_is_owned; + } + + } else { m_item_to_item_matrix[itemTId(ItemType::edge)][itemTId(ItemType::node)] = descriptor.edge_to_node_vector; m_item_to_item_matrix[itemTId(ItemType::face)][itemTId(ItemType::edge)] = descriptor.face_to_edge_vector; diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp index 0caec821a..5ca484b22 100644 --- a/src/mesh/Connectivity.hpp +++ b/src/mesh/Connectivity.hpp @@ -196,7 +196,6 @@ class Connectivity final : public IConnectivity const auto& edgeOwner() const { - throw NotImplementedError("edge owner not built"); return m_edge_owner; } @@ -242,7 +241,6 @@ class Connectivity final : public IConnectivity const auto& edgeIsOwned() const { - throw NotImplementedError("edge is owned not built"); return m_edge_is_owned; } diff --git a/src/mesh/Mesh.hpp b/src/mesh/Mesh.hpp index 21c100384..45f4c8d05 100644 --- a/src/mesh/Mesh.hpp +++ b/src/mesh/Mesh.hpp @@ -49,6 +49,13 @@ class Mesh final : public IMesh return m_connectivity->numberOfNodes(); } + PUGS_INLINE + size_t + numberOfEdges() const + { + return m_connectivity->numberOfEdges(); + } + PUGS_INLINE size_t numberOfFaces() const -- GitLab