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::size_t const mesh_id, const unsigned comp_id, const unsigned comp_id_write) { _rows.resize(std::distance(first, last), _mesh_subsets.size()); // 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) { std::size_t const nnodes = (*e)->getNumberOfNodes(); LineIndex indices; indices.reserve(nnodes); for (unsigned n = 0; n < nnodes; n++) { MeshLib::Location l(mesh_id, MeshLib::MeshItemType::Node, (*e)->getNode(n)->getID()); indices.push_back(_mesh_component_map.getGlobalIndex(l, comp_id)); } _rows(elem_id, comp_id_write) = std::move(indices); } }
LineIndex* make_index(istream& input, vector<string> const& entries) { LineIndex* index = new LineIndex; for(EntryIt p = entries.begin(); p != entries.end(); ++p) (*index)[*p]; // causes insertion ? string line, word; int line_number = 0; // read a line from input at a time into a string while(getline(input, line)){ ++line_number; // make an istream from the string istrstream words(static_cast<const char*>(line.c_str())); // read a word at a time from string while(words >> word) { // use find() on map<string, vector<int>> to see // if it contains the word already, if it does, // save the line number in the map's vector LineIndex::iterator p = index->find(word); if(p != index->end()) (*p).second.push_back(line_number); } } }
int main() { vector<string> entries; entries.push_back("kernel"); entries.push_back("printf"); LineIndex* index = make_index(cin, entries); vector<string>::iterator p = entries.begin(); for(; p != entries.end(); ++p) { cout << "Word " << *p << " appears in lines "; LineIndex::iterator lines = index->find(*p); copy((*lines).second.begin(), (*lines).second.end(), ostream_iterator<int>(cout, ", ")); cout << ".\n"; } }
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); } }