52 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
59 std::vector<boundary_id_type> boundary_ids =
63 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
67 const processor_id_type my_n_proc =
mesh->n_processors();
68 const processor_id_type my_proc_id =
mesh->processor_id();
69 typedef std::vector<std::pair<dof_id_type, unsigned int>> vec_type;
70 std::vector<vec_type> queries(my_n_proc);
73 const std::vector<Point> & face_normals =
_fe_face->get_normals();
76 for (
const auto & elem :
mesh->active_element_ptr_range())
83 for (
const auto side : make_range(elem->n_sides()))
85 const auto * neighbor = elem->neighbor_ptr(side);
90 if (neighbor == remote_elem)
92 queries[elem->processor_id()].push_back(std::make_pair(elem->id(), side));
98 const Point & face_normal = face_normals[0];
103 boundary_info.remove_side(elem, side);
104 for (
const auto & boundary_id : boundary_ids)
105 boundary_info.add_side(elem, side, boundary_id);
111 if (!
mesh->is_serial())
113 const auto queries_tag =
mesh->comm().get_unique_tag(),
114 replies_tag =
mesh->comm().get_unique_tag();
116 std::vector<Parallel::Request> side_requests(my_n_proc - 1), reply_requests(my_n_proc - 1);
119 for (processor_id_type p = 0; p != my_n_proc; ++p)
124 Parallel::Request & request = side_requests[p - (p > my_proc_id)];
126 mesh->comm().send(p, queries[p], request, queries_tag);
130 std::vector<vec_type> responses(my_n_proc - 1);
132 for (processor_id_type p = 1; p != my_n_proc; ++p)
136 Parallel::Status status(
mesh->comm().probe(Parallel::any_source, queries_tag));
137 const processor_id_type source_pid = cast_int<processor_id_type>(status.source());
139 mesh->comm().receive(source_pid,
query, queries_tag);
141 Parallel::Request & request = reply_requests[p - 1];
143 for (
const auto & q :
query)
145 const Elem * elem =
mesh->elem_ptr(q.first);
146 const unsigned int side = q.second;
150 const Point & face_normal =
_fe_face->get_normals()[0];
153 responses[p - 1].push_back(std::make_pair(elem->id(), side));
156 mesh->comm().send(source_pid, responses[p - 1], request, replies_tag);
160 for (processor_id_type p = 1; p != my_n_proc; ++p)
162 Parallel::Status status(this->
comm().probe(Parallel::any_source, replies_tag));
163 const processor_id_type source_pid = cast_int<processor_id_type>(status.source());
167 this->
comm().
receive(source_pid, response, replies_tag);
169 for (
const auto & r : response)
171 const Elem * elem =
mesh->elem_ptr(r.first);
172 const unsigned int side = r.second;
175 boundary_info.remove_side(elem, side);
176 for (
const auto & boundary_id : boundary_ids)
177 boundary_info.add_side(elem, side, boundary_id);
181 Parallel::wait(side_requests);
182 Parallel::wait(reply_requests);
186 for (
unsigned int i = 0; i < boundary_ids.size(); ++i)
189 mesh->unset_is_prepared();
190 return dynamic_pointer_cast<MeshBase>(
mesh);
registerMooseObject("MooseApp", SideSetsAroundSubdomainGenerator)
Adds the faces on the boundary of given block to the sidesets specified by "boundary" Optionally,...
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
bool elemSideOnBoundary(const Elem *const elem, const unsigned int side) const
Determine whether the given side of an element resides on an external or internal boundary.
SideSetsAroundSubdomainGenerator(const InputParameters ¶meters)
std::vector< BoundaryID > getBoundaryIDs(const libMesh::MeshBase &mesh, const std::vector< BoundaryName > &boundary_name, bool generate_unknown, const std::set< BoundaryID > &mesh_boundary_ids)
Gets the boundary IDs with their names.