void FeatureFloodCount::FeatureData::merge(FeatureData && rhs) { mooseAssert(_var_index == rhs._var_index, "Mismatched variable index in merge"); mooseAssert(_id == rhs._id, "Mismatched auxiliary id in merge"); std::set<dof_id_type> set_union; /** * Even though we've determined that these two partial regions need to be merged, we don't necessarily know if the _ghost_ids intersect. * We could be in this branch because the periodic boundaries intersect but that doesn't tell us anything about whether or not the ghost_region * also intersects. If the _ghost_ids intersect, that means that we are merging along a periodic boundary, not across one. In this case the * bounding box(s) need to be expanded. */ std::set_union(_periodic_nodes.begin(), _periodic_nodes.end(), rhs._periodic_nodes.begin(), rhs._periodic_nodes.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); _periodic_nodes.swap(set_union); set_union.clear(); std::set_union(_local_ids.begin(), _local_ids.end(), rhs._local_ids.begin(), rhs._local_ids.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); _local_ids.swap(set_union); set_union.clear(); std::set_union(_halo_ids.begin(), _halo_ids.end(), rhs._halo_ids.begin(), rhs._halo_ids.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); _halo_ids.swap(set_union); set_union.clear(); std::set_union(_ghosted_ids.begin(), _ghosted_ids.end(), rhs._ghosted_ids.begin(), rhs._ghosted_ids.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); // Was there overlap in the physical region? bool physical_intersection = (_ghosted_ids.size() + rhs._ghosted_ids.size() > set_union.size()); _ghosted_ids.swap(set_union); /** * If we had a physical intersection, we need to expand boxes. If we had a virtual (periodic) intersection we need to preserve * all of the boxes from each of the regions' sets. */ if (physical_intersection) expandBBox(rhs); else std::move(rhs._bboxes.begin(), rhs._bboxes.end(), std::back_inserter(_bboxes)); // Keep track of the original ids so we can notify other processors of the local to global mapping _orig_ids.splice(_orig_ids.end(), std::move(rhs._orig_ids)); // Update the min feature id _min_entity_id = std::min(_min_entity_id, rhs._min_entity_id); _vol_count += rhs._vol_count; _centroid += rhs._centroid; }
void FeatureFloodCount::FeatureData::merge(FeatureData && rhs) { std::set<dof_id_type> set_union; /** * Even though we've determined that these two partial regions need to be merged, we don't necessarily know if the _ghost_ids intersect. * We could be in this branch because the periodic boundaries intersect but that doesn't tell us anything about whether or not the ghost_region * also intersects. If the _ghost_ids intersect, that means that we are merging along a periodic boundary, not across one. In this case the * bounding box(s) need to be expanded. */ std::set_union(_periodic_nodes.begin(), _periodic_nodes.end(), rhs._periodic_nodes.begin(), rhs._periodic_nodes.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); _periodic_nodes.swap(set_union); set_union.clear(); std::set_union(_local_ids.begin(), _local_ids.end(), rhs._local_ids.begin(), rhs._local_ids.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); _local_ids.swap(set_union); set_union.clear(); std::set_union(_halo_ids.begin(), _halo_ids.end(), rhs._halo_ids.begin(), rhs._halo_ids.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); _halo_ids.swap(set_union); set_union.clear(); std::set_union(_ghosted_ids.begin(), _ghosted_ids.end(), rhs._ghosted_ids.begin(), rhs._ghosted_ids.end(), std::insert_iterator<std::set<dof_id_type> >(set_union, set_union.begin())); // Was there overlap in the physical region? bool physical_intersection = (_ghosted_ids.size() + rhs._ghosted_ids.size() > set_union.size()); _ghosted_ids.swap(set_union); /** * If we had a physical intersection, we need to expand boxes. If we had a virtual (periodic) intersection we need to preserve * all of the boxes from each of the regions' sets. */ if (physical_intersection) expandBBox(rhs); else std::move(rhs._bboxes.begin(), rhs._bboxes.end(), std::back_inserter(_bboxes)); // Update the min feature id _min_entity_id = std::min(_min_entity_id, rhs._min_entity_id); }