void performNodalMeshReduction( stk::mesh::Part &samplePart, stk::mesh::BulkData& bulkData) { const stk::mesh::EntityRank nodeEntityRank(0); const stk::mesh::MetaData &metaData = stk::mesh::MetaData::get(bulkData); std::vector<stk::mesh::Entity *> sampleNodes; stk::mesh::get_selected_entities(samplePart, bulkData.buckets(nodeEntityRank), sampleNodes); const stk::mesh::Selector locallyOwned = stk::mesh::MetaData::get(bulkData).locally_owned_part(); std::vector<stk::mesh::Entity *> relatedEntities; typedef boost::indirect_iterator<std::vector<stk::mesh::Entity *>::const_iterator> EntityIterator; for (EntityIterator it(sampleNodes.begin()), it_end(sampleNodes.end()); it != it_end; ++it) { const stk::mesh::PairIterRelation relations = it->relations(); typedef stk::mesh::PairIterRelation::first_type RelationIterator; for (RelationIterator rel_it = relations.first, rel_it_end = relations.second; rel_it != rel_it_end; ++rel_it) { const Teuchos::Ptr<stk::mesh::Entity> relatedEntity(rel_it->entity()); if (Teuchos::nonnull(relatedEntity) && locallyOwned(*relatedEntity)) { relatedEntities.push_back(relatedEntity.get()); } } } std::sort(relatedEntities.begin(), relatedEntities.end(), stk::mesh::EntityLess()); relatedEntities.erase( std::unique(relatedEntities.begin(), relatedEntities.end(), stk::mesh::EntityEqual()), relatedEntities.end()); std::vector<stk::mesh::Entity *> sampleClosure; stk::mesh::find_closure(bulkData, relatedEntities, sampleClosure); // Keep only the closure, remove the rest, by decreasing entityRanks { const stk::mesh::Selector ownedOrShared = metaData.locally_owned_part() | metaData.globally_shared_part(); typedef boost::indirect_iterator<std::vector<stk::mesh::Entity *>::const_iterator> EntityIterator; EntityIterator allKeepersEnd(sampleClosure.end()); const EntityIterator allKeepersBegin(sampleClosure.begin()); for (stk::mesh::EntityRank candidateRankCount = metaData.entity_rank_count(); candidateRankCount > 0; --candidateRankCount) { const stk::mesh::EntityRank candidateRank = candidateRankCount - 1; const EntityIterator keepersBegin = std::lower_bound(allKeepersBegin, allKeepersEnd, stk::mesh::EntityKey(candidateRank, 0), stk::mesh::EntityLess()); const EntityIterator keepersEnd = allKeepersEnd; std::vector<stk::mesh::Entity *> candidates; stk::mesh::get_selected_entities(ownedOrShared, bulkData.buckets(candidateRank), candidates); { BulkModification modification(bulkData); std::set_difference(candidates.begin(), candidates.end(), keepersBegin.base(), keepersEnd.base(), EntityDestructor(modification), stk::mesh::EntityLess()); } allKeepersEnd = keepersBegin; } } }
void performNodalMeshReduction( stk::mesh::Part &samplePart, stk::mesh::BulkData& bulkData) { const stk::mesh::MetaData &metaData = stk::mesh::MetaData::get(bulkData); std::vector<stk::mesh::Entity> sampleNodes; stk::mesh::get_selected_entities(samplePart, bulkData.buckets(stk::topology::NODE_RANK), sampleNodes); const stk::mesh::Selector locallyOwned = stk::mesh::MetaData::get(bulkData).locally_owned_part(); std::vector<stk::mesh::Entity> relatedEntities; typedef std::vector<stk::mesh::Entity>::const_iterator EntityIterator; for (EntityIterator it(sampleNodes.begin()), it_end(sampleNodes.end()); it != it_end; ++it) { for (stk::mesh::EntityRank r = stk::topology::NODE_RANK; r < metaData.entity_rank_count(); ++r) { stk::mesh::Entity const* relations = bulkData.begin(*it, r); const int num_rels = bulkData.num_connectivity(*it, r); for (int i = 0; i < num_rels; ++i) { stk::mesh::Entity relatedEntity = relations[i]; if (bulkData.is_valid(relatedEntity) && locallyOwned(bulkData.bucket(relatedEntity))) { relatedEntities.push_back(relatedEntity); } } } } std::sort(relatedEntities.begin(), relatedEntities.end(), stk::mesh::EntityLess(bulkData)); relatedEntities.erase( std::unique(relatedEntities.begin(), relatedEntities.end()), relatedEntities.end()); std::vector<stk::mesh::Entity> sampleClosure; stk::mesh::find_closure(bulkData, relatedEntities, sampleClosure); // Keep only the closure, remove the rest, by decreasing entityRanks { const stk::mesh::Selector ownedOrShared = metaData.locally_owned_part() | metaData.globally_shared_part(); EntityIterator allKeepersEnd(sampleClosure.end()); const EntityIterator allKeepersBegin(sampleClosure.begin()); for (size_t candidateRankCount = metaData.entity_rank_count(); candidateRankCount > 0; --candidateRankCount) { const stk::mesh::EntityRank candidateRank = static_cast<stk::mesh::EntityRank>(candidateRankCount - 1); const EntityIterator keepersBegin = std::lower_bound(allKeepersBegin, allKeepersEnd, stk::mesh::EntityKey(candidateRank, 0), stk::mesh::EntityLess(bulkData)); const EntityIterator keepersEnd = allKeepersEnd; std::vector<stk::mesh::Entity> candidates; stk::mesh::get_selected_entities(ownedOrShared, bulkData.buckets(candidateRank), candidates); { BulkModification modification(bulkData); std::set_difference(candidates.begin(), candidates.end(), keepersBegin.base(), keepersEnd.base(), EntityDestructor(modification), stk::mesh::EntityLess(bulkData)); } allKeepersEnd = keepersBegin; } } }