From bcceef9b88ab8d220e9df7b78951be6197a7365b Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Thu, 16 Sep 2021 17:16:50 +0200 Subject: [PATCH 1/2] [MeL] Use local info for detecting base nodes. --- MeshGeoToolsLib/MeshNodesOnPoint.cpp | 2 +- MeshLib/Mesh.h | 3 --- ProcessLib/LIE/Common/MeshUtils.cpp | 5 ++--- Tests/MeshLib/TestQuadraticMesh.cpp | 16 ++++++++-------- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/MeshGeoToolsLib/MeshNodesOnPoint.cpp b/MeshGeoToolsLib/MeshNodesOnPoint.cpp index 30d0e93113..edeabd3664 100644 --- a/MeshGeoToolsLib/MeshNodesOnPoint.cpp +++ b/MeshGeoToolsLib/MeshNodesOnPoint.cpp @@ -30,7 +30,7 @@ MeshNodesOnPoint::MeshNodesOnPoint(MeshLib::Mesh const& mesh, { for (auto id : vec_ids) { - if (mesh.isBaseNode(id)) + if (isBaseNode(*mesh.getNode(id))) { _msh_node_ids.push_back(id); } diff --git a/MeshLib/Mesh.h b/MeshLib/Mesh.h index 0cca934b12..e0b445050a 100644 --- a/MeshLib/Mesh.h +++ b/MeshLib/Mesh.h @@ -122,9 +122,6 @@ public: /// Get the number of base nodes std::size_t getNumberOfBaseNodes() const { return _n_base_nodes; } - /// Return true if the given node is a basic one (i.e. linear order node) - bool isBaseNode(std::size_t node_idx) const {return node_idx < _n_base_nodes; } - /// Return true if the mesh has any nonlinear nodes bool isNonlinear() const { return (getNumberOfNodes() != getNumberOfBaseNodes()); } diff --git a/ProcessLib/LIE/Common/MeshUtils.cpp b/ProcessLib/LIE/Common/MeshUtils.cpp index cf4fa79523..8eae30a0db 100644 --- a/ProcessLib/LIE/Common/MeshUtils.cpp +++ b/ProcessLib/LIE/Common/MeshUtils.cpp @@ -29,7 +29,7 @@ class IsCrackTip { public: explicit IsCrackTip(MeshLib::Mesh const& mesh) - : _mesh(mesh), _fracture_element_dim(mesh.getDimension() - 1) + : _fracture_element_dim(mesh.getDimension() - 1) { _is_internal_node.resize(mesh.getNumberOfNodes(), true); @@ -43,7 +43,7 @@ public: bool operator()(MeshLib::Node const& node) const { - if (!_is_internal_node[node.getID()] || !_mesh.isBaseNode(node.getID())) + if (!_is_internal_node[node.getID()] || !isBaseNode(node)) { return false; } @@ -59,7 +59,6 @@ public: } private: - MeshLib::Mesh const& _mesh; unsigned const _fracture_element_dim; std::vector _is_internal_node; }; diff --git a/Tests/MeshLib/TestQuadraticMesh.cpp b/Tests/MeshLib/TestQuadraticMesh.cpp index 0b53e41fed..68b525b4ae 100644 --- a/Tests/MeshLib/TestQuadraticMesh.cpp +++ b/Tests/MeshLib/TestQuadraticMesh.cpp @@ -40,12 +40,12 @@ TEST(MeshLib, QuadraticOrderMesh_Line) for (unsigned i = 0; i < e->getNumberOfBaseNodes(); i++) { - ASSERT_TRUE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_TRUE(isBaseNode(*e->getNode(i))); } for (unsigned i = e->getNumberOfBaseNodes(); i < e->getNumberOfNodes(); i++) { - ASSERT_FALSE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_FALSE(isBaseNode(*e->getNode(i))); } } @@ -85,12 +85,12 @@ TEST(MeshLib, QuadraticOrderMesh_Quad8) for (unsigned i = 0; i < e->getNumberOfBaseNodes(); i++) { - ASSERT_TRUE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_TRUE(isBaseNode(*e->getNode(i))); } for (unsigned i = e->getNumberOfBaseNodes(); i < e->getNumberOfNodes(); i++) { - ASSERT_FALSE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_FALSE(isBaseNode(*e->getNode(i))); } } @@ -147,12 +147,12 @@ TEST(MeshLib, QuadraticOrderMesh_Quad9) for (unsigned i = 0; i < e->getNumberOfBaseNodes(); i++) { - ASSERT_TRUE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_TRUE(isBaseNode(*e->getNode(i))); } for (unsigned i = e->getNumberOfBaseNodes(); i < e->getNumberOfNodes(); i++) { - ASSERT_FALSE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_FALSE(isBaseNode(*e->getNode(i))); } } @@ -243,12 +243,12 @@ TEST(MeshLib, QuadraticOrderMesh_LineQuad) for (unsigned i = 0; i < e->getNumberOfBaseNodes(); i++) { - ASSERT_TRUE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_TRUE(isBaseNode(*e->getNode(i))); } for (unsigned i = e->getNumberOfBaseNodes(); i < e->getNumberOfNodes(); i++) { - ASSERT_FALSE(mesh->isBaseNode(getNodeIndex(*e, i))); + ASSERT_FALSE(isBaseNode(*e->getNode(i))); } } -- GitLab From 4ca900d44467b44632892bf49bf7f0caf6e966f2 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov Date: Thu, 16 Sep 2021 18:23:23 +0200 Subject: [PATCH 2/2] [App/U] partmesh; Use local info for base nodes. --- .../PartitionMesh/NodeWiseMeshPartitioner.cpp | 31 +++++-------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp index fa06808efe..e5f7f91325 100644 --- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp +++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp @@ -137,15 +137,10 @@ std::pair, std::vector> findRegularNodesInPartition( std::size_t const part_id, const bool is_mixed_high_order_linear_elems, - std::size_t const n_base_nodes, std::vector const& nodes, std::vector const& partition_ids, std::vector const* node_id_mapping = nullptr) { - auto node_id = [&node_id_mapping](MeshLib::Node const& n) { - return nodeIdBulkMesh(n, node_id_mapping); - }; - // Find nodes belonging to a given partition id. std::vector partition_nodes; copy_if(begin(nodes), end(nodes), std::back_inserter(partition_nodes), @@ -166,13 +161,11 @@ findRegularNodesInPartition( // order mesh, and realloc needed for higher order element meshes. // Split the nodes into base nodes and extra nodes. - std::partition_copy(begin(partition_nodes), end(partition_nodes), - std::back_inserter(base_nodes), - std::back_inserter(higher_order_nodes), - [&](MeshLib::Node* const n) { - return !is_mixed_high_order_linear_elems || - node_id(*n) > n_base_nodes; - }); + std::partition_copy( + begin(partition_nodes), end(partition_nodes), + std::back_inserter(base_nodes), std::back_inserter(higher_order_nodes), + [&](MeshLib::Node* const n) + { return !is_mixed_high_order_linear_elems || isBaseNode(*n); }); return {base_nodes, higher_order_nodes}; } @@ -237,16 +230,11 @@ std::tuple, std::vector> findGhostNodesInPartition( std::size_t const part_id, const bool is_mixed_high_order_linear_elems, - std::size_t const number_of_base_nodes, std::vector const& nodes, std::vector const& ghost_elements, std::vector const& partition_ids, std::vector const* node_id_mapping = nullptr) { - auto node_id = [&node_id_mapping](MeshLib::Node const& n) { - return nodeIdBulkMesh(n, node_id_mapping); - }; - std::vector base_nodes; std::vector ghost_nodes; @@ -263,8 +251,7 @@ findGhostNodesInPartition( if (partitionLookup(*n, partition_ids, node_id_mapping) != part_id) { - if (!is_mixed_high_order_linear_elems || - node_id(*n) > number_of_base_nodes) + if (!is_mixed_high_order_linear_elems || isBaseNode(*n)) { base_nodes.push_back(nodes[n->getID()]); } @@ -287,7 +274,6 @@ void NodeWiseMeshPartitioner::processPartition( std::vector higher_order_regular_nodes; std::tie(partition.nodes, higher_order_regular_nodes) = findRegularNodesInPartition(part_id, is_mixed_high_order_linear_elems, - _mesh->getNumberOfBaseNodes(), _mesh->getNodes(), _nodes_partition_ids); partition.number_of_regular_base_nodes = partition.nodes.size(); @@ -301,7 +287,6 @@ void NodeWiseMeshPartitioner::processPartition( std::vector higher_order_ghost_nodes; std::tie(base_ghost_nodes, higher_order_ghost_nodes) = findGhostNodesInPartition(part_id, is_mixed_high_order_linear_elems, - _mesh->getNumberOfBaseNodes(), _mesh->getNodes(), partition.ghost_elements, _nodes_partition_ids); @@ -685,8 +670,7 @@ std::vector NodeWiseMeshPartitioner::partitionOtherMesh( std::vector higher_order_regular_nodes; std::tie(partition.nodes, higher_order_regular_nodes) = findRegularNodesInPartition( - part_id, is_mixed_high_order_linear_elems, - mesh.getNumberOfBaseNodes(), mesh.getNodes(), + part_id, is_mixed_high_order_linear_elems, mesh.getNodes(), _nodes_partition_ids, bulk_node_ids); partition.number_of_regular_base_nodes = partition.nodes.size(); @@ -702,7 +686,6 @@ std::vector NodeWiseMeshPartitioner::partitionOtherMesh( std::vector higher_order_ghost_nodes; std::tie(base_ghost_nodes, higher_order_ghost_nodes) = findGhostNodesInPartition(part_id, is_mixed_high_order_linear_elems, - mesh.getNumberOfBaseNodes(), mesh.getNodes(), partition.ghost_elements, _nodes_partition_ids, bulk_node_ids); -- GitLab