Skip to content
Snippets Groups Projects
Commit 9f5153df authored by Dmitri Naumov's avatar Dmitri Naumov
Browse files

[MeL] NodeSearcher split method.

parent 7ff2ab75
No related branches found
No related tags found
No related merge requests found
...@@ -24,40 +24,44 @@ NodeSearch::NodeSearch(const MeshLib::Mesh &mesh) ...@@ -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; 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::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::for_each(elements.begin(), elements.end(), [&](std::size_t eid)
[&](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++)
{ {
if (node_marked_counts[i] == _mesh.getNode(i)->getElements().size()) auto* e = _mesh.getElement(eid);
connected_nodes.push_back(i); for (unsigned i=0; i<e->getNBaseNodes(); i++) {
} node_marked_counts[e->getNodeIndex(i)]++;
} else { }
std::for_each(elements.begin(), elements.end(), });
[&](std::size_t eid) for (std::size_t i=0; i<node_marked_counts.size(); i++)
{ {
auto* e = _mesh.getElement(eid); if (node_marked_counts[i] == _mesh.getNode(i)->getElements().size())
for (unsigned i=0; i<e->getNBaseNodes(); i++) { connected_nodes.push_back(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));
} }
this->updateUnion(connected_nodes); return connected_nodes;
return connected_nodes.size(); }
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() std::size_t NodeSearch::searchUnused()
......
...@@ -30,12 +30,24 @@ public: ...@@ -30,12 +30,24 @@ public:
const std::vector<std::size_t>& getSearchedNodeIDs() const {return _marked_nodes; } const std::vector<std::size_t>& getSearchedNodeIDs() const {return _marked_nodes; }
/// Marks all nodes connecting to any of the given elements /// 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 /// Marks all unused nodes
std::size_t searchUnused(); std::size_t searchUnused();
private: 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. /// Updates the vector of marked items with values from vec.
void updateUnion(const std::vector<std::size_t> &vec); void updateUnion(const std::vector<std::size_t> &vec);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment