void LocalToGlobalIndexMap::findGlobalIndicesWithElementID( ElementIterator first, ElementIterator last, std::vector<MeshLib::Node*> const& nodes, std::size_t const mesh_id, const int comp_id, const int comp_id_write) { std::unordered_set<MeshLib::Node*> const set_nodes(nodes.begin(), nodes.end()); // For each element find the global indices for node/element // components. for (ElementIterator e = first; e != last; ++e) { LineIndex indices; indices.reserve((*e)->getNumberOfNodes()); for (auto* n = (*e)->getNodes(); n < (*e)->getNodes()+(*e)->getNumberOfNodes(); ++n) { // Check if the element's node is in the given list of nodes. if (set_nodes.find(*n)==set_nodes.end()) continue; MeshLib::Location l( mesh_id, MeshLib::MeshItemType::Node, (*n)->getID()); indices.push_back(_mesh_component_map.getGlobalIndex(l, comp_id)); } indices.shrink_to_fit(); _rows((*e)->getID(), comp_id_write) = std::move(indices); } }
void LocalToGlobalIndexMap::findGlobalIndices( ElementIterator first, ElementIterator last, std::vector<MeshLib::Node*> const& nodes, std::size_t const mesh_id, const int comp_id, const int comp_id_write) { _rows.resize(std::distance(first, last), _mesh_subsets.size()); std::unordered_set<MeshLib::Node*> const set_nodes(nodes.begin(), nodes.end()); // For each element find the global indices for node/element // components. std::size_t elem_id = 0; for (ElementIterator e = first; e != last; ++e, ++elem_id) { LineIndex indices; indices.reserve((*e)->getNumberOfNodes()); for (auto* n = (*e)->getNodes(); n < (*e)->getNodes() + (*e)->getNumberOfNodes(); ++n) { // Check if the element's node is in the given list of nodes. if (set_nodes.find(*n)==set_nodes.end()) continue; MeshLib::Location l( mesh_id, MeshLib::MeshItemType::Node, (*n)->getID()); auto const global_index = _mesh_component_map.getGlobalIndex(l, comp_id); if (global_index == std::numeric_limits<GlobalIndexType>::max()) { continue; } indices.push_back(global_index); } indices.shrink_to_fit(); _rows(elem_id, comp_id_write) = std::move(indices); } }