43 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
49 if (!
mesh->is_prepared())
50 mesh->prepare_for_use();
53 std::set<Elem *> deleteable_elems;
56 for (
auto & elem :
mesh->element_ptr_range())
59 deleteable_elems.insert(elem);
63 for (
auto & elem :
mesh->element_ptr_range())
64 if (elem->dim() <
mesh->mesh_dimension() && deleteable_elems.count(elem->interior_parent()) > 0)
67 deleteable_elems.insert(elem);
69 elem->set_interior_parent(
nullptr);
77 dof_id_type pmax_elem_id =
mesh->max_elem_id();
78 mesh->comm().max(pmax_elem_id);
80 for (dof_id_type i = 0; i != pmax_elem_id; ++i)
82 Elem * elem =
mesh->query_elem_ptr(i);
83 bool is_deleteable = elem && deleteable_elems.count(elem);
85 libmesh_assert(
mesh->comm().semiverify(elem ? &is_deleteable : libmesh_nullptr));
90 boundary_id_type boundary_id = 0;
95 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
104 for (
auto & elem : deleteable_elems)
111 unsigned int n_sides = elem->n_sides();
112 for (
unsigned int n = 0; n != n_sides; ++n)
114 Elem * neighbor = elem->neighbor_ptr(n);
115 if (!neighbor || neighbor == remote_elem)
118 const unsigned int return_side = neighbor->which_neighbor_am_i(elem);
120 if (neighbor->neighbor_ptr(return_side) == elem)
122 neighbor->set_neighbor(return_side,
nullptr);
126 boundary_info.add_side(neighbor, return_side, boundary_id);
130 mesh->delete_elem(elem);
139 if (!
mesh->is_serial())
141 const processor_id_type my_n_proc =
mesh->n_processors();
142 const processor_id_type my_proc_id =
mesh->processor_id();
143 typedef std::vector<std::pair<dof_id_type, unsigned int>> vec_type;
144 std::vector<vec_type> queries(my_n_proc);
151 for (
const auto & elem :
mesh->element_ptr_range())
153 const processor_id_type pid = elem->processor_id();
154 if (pid == my_proc_id)
157 const unsigned int n_sides = elem->n_sides();
158 for (
unsigned int n = 0; n != n_sides; ++n)
159 if (elem->neighbor_ptr(n) == remote_elem)
160 queries[pid].push_back(std::make_pair(elem->id(), n));
163 if (elem->interior_parent() == remote_elem)
164 queries[pid].push_back(std::make_pair(elem->id(), n_sides));
167 const auto queries_tag =
mesh->comm().get_unique_tag(),
168 replies_tag =
mesh->comm().get_unique_tag();
170 std::vector<Parallel::Request> query_requests(my_n_proc - 1), reply_requests(my_n_proc - 1);
173 for (processor_id_type p = 0; p != my_n_proc; ++p)
178 Parallel::Request & request = query_requests[p - (p > my_proc_id)];
180 mesh->comm().send(p, queries[p], request, queries_tag);
184 std::vector<vec_type> responses(my_n_proc - 1);
186 for (processor_id_type p = 1; p != my_n_proc; ++p)
190 Parallel::Status status(
mesh->comm().probe(Parallel::any_source, queries_tag));
191 const processor_id_type source_pid = cast_int<processor_id_type>(status.source());
193 mesh->comm().receive(source_pid,
query, queries_tag);
195 Parallel::Request & request = reply_requests[p - 1];
197 for (
const auto & q :
query)
199 const Elem * elem =
mesh->elem_ptr(q.first);
200 const unsigned int side = q.second;
201 const Elem * target =
202 (side >= elem->n_sides()) ? elem->interior_parent() : elem->neighbor_ptr(side);
204 if (target ==
nullptr)
205 responses[p - 1].push_back(std::make_pair(elem->id(), side));
208 mesh->comm().send(source_pid, responses[p - 1], request, replies_tag);
212 for (processor_id_type p = 1; p != my_n_proc; ++p)
214 Parallel::Status status(this->
comm().probe(Parallel::any_source, replies_tag));
215 const processor_id_type source_pid = cast_int<processor_id_type>(status.source());
219 this->
comm().
receive(source_pid, response, replies_tag);
221 for (
const auto & r : response)
223 Elem * elem =
mesh->elem_ptr(r.first);
224 const unsigned int side = r.second;
226 if (side < elem->n_sides())
228 mooseAssert(elem->neighbor_ptr(side) == remote_elem,
"element neighbor != remote_elem");
230 elem->set_neighbor(side,
nullptr);
234 boundary_info.add_side(elem, side, boundary_id);
238 mooseAssert(side == elem->n_sides(),
"internal communication error");
239 mooseAssert(elem->interior_parent() == remote_elem,
"interior parent != remote_elem");
241 elem->set_interior_parent(
nullptr);
246 Parallel::wait(query_requests);
247 Parallel::wait(reply_requests);
263 mesh->prepare_for_use();
265 return dynamic_pointer_cast<MeshBase>(
mesh);