diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp index de8be58168d312e083516e2824e5eec45a484e3c..a542c35e0a90463dd6c86af5672c0fbf45bf3244 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 0caec821a7443276bfce1cf9c7057d3c5f74efcf..5ca484b2258adfbe64b11cb6913c126442846447 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 21c100384ef2072e43af54dda74eda8d6021c2ea..45f4c8d050d7fd7c63e44caf002b6bbcb1c7599a 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