From 9f5153df29ee06bdfb83224fb2e41ea92affdb8d Mon Sep 17 00:00:00 2001 From: "Dmitry Yu. Naumov" <github@naumov.de> Date: Tue, 14 Jul 2015 18:34:46 +0000 Subject: [PATCH] [MeL] NodeSearcher split method. --- MeshLib/MeshSearch/NodeSearch.cpp | 64 ++++++++++++++++--------------- MeshLib/MeshSearch/NodeSearch.h | 14 ++++++- 2 files changed, 47 insertions(+), 31 deletions(-) diff --git a/MeshLib/MeshSearch/NodeSearch.cpp b/MeshLib/MeshSearch/NodeSearch.cpp index 81efa477843..32da085f6d5 100644 --- a/MeshLib/MeshSearch/NodeSearch.cpp +++ b/MeshLib/MeshSearch/NodeSearch.cpp @@ -24,40 +24,44 @@ NodeSearch::NodeSearch(const MeshLib::Mesh &mesh) { } -std::size_t NodeSearch::searchByElementIDs(const std::vector<std::size_t> &elements, bool only_match_all_connected_elements) +std::vector<std::size_t> NodeSearch::searchByElementIDsMatchAllConnectedElements(const std::vector<std::size_t> &elements) { std::vector<std::size_t> connected_nodes; - if (only_match_all_connected_elements) - { - std::vector<std::size_t> node_marked_counts(_mesh.getNNodes(), 0); //this approach is not optimum for memory size - std::for_each(elements.begin(), elements.end(), - [&](std::size_t eid) - { - auto* e = _mesh.getElement(eid); - for (unsigned i=0; i<e->getNBaseNodes(); i++) { - node_marked_counts[e->getNodeIndex(i)]++; - } - }); - for (std::size_t i=0; i<node_marked_counts.size(); i++) + + std::vector<std::size_t> node_marked_counts(_mesh.getNNodes(), 0); //this approach is not optimum for memory size + std::for_each(elements.begin(), elements.end(), + [&](std::size_t eid) { - if (node_marked_counts[i] == _mesh.getNode(i)->getElements().size()) - connected_nodes.push_back(i); - } - } else { - std::for_each(elements.begin(), elements.end(), - [&](std::size_t eid) - { - auto* e = _mesh.getElement(eid); - for (unsigned i=0; i<e->getNBaseNodes(); i++) { - connected_nodes.push_back(e->getNodeIndex(i)); - } - }); - std::sort(connected_nodes.begin(), connected_nodes.end()); - auto it = std::unique(connected_nodes.begin(), connected_nodes.end()); - connected_nodes.resize(std::distance(connected_nodes.begin(),it)); + auto* e = _mesh.getElement(eid); + for (unsigned i=0; i<e->getNBaseNodes(); i++) { + node_marked_counts[e->getNodeIndex(i)]++; + } + }); + for (std::size_t i=0; i<node_marked_counts.size(); i++) + { + if (node_marked_counts[i] == _mesh.getNode(i)->getElements().size()) + connected_nodes.push_back(i); } - this->updateUnion(connected_nodes); - return connected_nodes.size(); + return connected_nodes; +} + +std::vector<std::size_t> NodeSearch::searchByElementIDsNotMatchAllConnectedElements(const std::vector<std::size_t> &elements) +{ + std::vector<std::size_t> connected_nodes; + + std::for_each(elements.begin(), elements.end(), + [&](std::size_t eid) + { + auto* e = _mesh.getElement(eid); + for (unsigned i=0; i<e->getNBaseNodes(); i++) { + connected_nodes.push_back(e->getNodeIndex(i)); + } + }); + std::sort(connected_nodes.begin(), connected_nodes.end()); + auto it = std::unique(connected_nodes.begin(), connected_nodes.end()); + connected_nodes.resize(std::distance(connected_nodes.begin(),it)); + + return connected_nodes; } std::size_t NodeSearch::searchUnused() diff --git a/MeshLib/MeshSearch/NodeSearch.h b/MeshLib/MeshSearch/NodeSearch.h index 8a8df377faf..77d2a5a5cfc 100644 --- a/MeshLib/MeshSearch/NodeSearch.h +++ b/MeshLib/MeshSearch/NodeSearch.h @@ -30,12 +30,24 @@ public: const std::vector<std::size_t>& getSearchedNodeIDs() const {return _marked_nodes; } /// Marks all nodes connecting to any of the given elements - std::size_t searchByElementIDs(const std::vector<std::size_t> &element_ids, bool only_match_all_connected_elements = false); + std::size_t searchByElementIDs(const std::vector<std::size_t> &element_ids, bool only_match_all_connected_elements = false) + { + std::vector<std::size_t> connected_nodes = + (only_match_all_connected_elements + ? searchByElementIDsMatchAllConnectedElements(element_ids) + : searchByElementIDsNotMatchAllConnectedElements(element_ids)); + + this->updateUnion(connected_nodes); + return connected_nodes.size(); + } /// Marks all unused nodes std::size_t searchUnused(); private: + std::vector<std::size_t> searchByElementIDsMatchAllConnectedElements(const std::vector<std::size_t> &element_ids); + std::vector<std::size_t> searchByElementIDsNotMatchAllConnectedElements(const std::vector<std::size_t> &element_ids); + /// Updates the vector of marked items with values from vec. void updateUnion(const std::vector<std::size_t> &vec); -- GitLab