diff --git a/MeshLib/MeshSearch/NodeSearch.cpp b/MeshLib/MeshSearch/NodeSearch.cpp index 81efa477843fe4a1fecdb72297ed2b8fedae32dc..32da085f6d50d68d7844f382bc713a9bb5062916 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 8a8df377faf2451ba521535ec333c3d7539b65fc..77d2a5a5cfc8316d44930e7594749036f4ee9f99 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);