53 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
58 std::vector<boundary_id_type> boundary_ids =
62 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
66 const processor_id_type my_n_proc =
mesh->n_processors();
67 const processor_id_type my_proc_id =
mesh->processor_id();
68 typedef std::vector<std::pair<dof_id_type, unsigned int>> vec_type;
69 std::vector<vec_type> queries(my_n_proc);
72 const std::vector<Point> & face_normals =
_fe_face->get_normals();
74 for (
const auto & elem :
mesh->active_element_ptr_range())
81 for (
const auto & side : make_range(elem->n_sides()))
83 const Elem * neighbor = elem->neighbor_ptr(side);
88 if (neighbor == remote_elem)
90 queries[elem->processor_id()].push_back(std::make_pair(elem->id(), side));
92 else if (neighbor != NULL)
96 const Point & face_normal = face_normals[0];
102 boundary_info.remove_side(elem, side);
103 for (
const auto & boundary_id : boundary_ids)
104 boundary_info.add_side(elem, side, boundary_id);
110 if (!
mesh->is_serial())
112 const auto queries_tag =
mesh->comm().get_unique_tag(),
113 replies_tag =
mesh->comm().get_unique_tag();
115 std::vector<Parallel::Request> side_requests(my_n_proc - 1), reply_requests(my_n_proc - 1);
118 for (
const auto & p : make_range(my_n_proc))
123 Parallel::Request & request = side_requests[p - (p > my_proc_id)];
125 mesh->comm().send(p, queries[p], request, queries_tag);
129 std::vector<vec_type> responses(my_n_proc - 1);
131 for (
const auto & p : make_range(uint(1), my_n_proc))
135 Parallel::Status status(
mesh->comm().probe(Parallel::any_source, queries_tag));
136 const processor_id_type source_pid = cast_int<processor_id_type>(status.source());
138 mesh->comm().receive(source_pid,
query, queries_tag);
140 Parallel::Request & request = reply_requests[p - 1];
142 for (
const auto & q :
query)
144 const Elem * elem =
mesh->elem_ptr(q.first);
145 const unsigned int side = q.second;
146 const Elem * neighbor = elem->neighbor_ptr(side);
148 if (neighbor != NULL)
152 const Point & face_normal =
_fe_face->get_normals()[0];
155 responses[p - 1].push_back(std::make_pair(elem->id(), side));
159 mesh->comm().send(source_pid, responses[p - 1], request, replies_tag);
163 for (processor_id_type p = 1; p != my_n_proc; ++p)
165 Parallel::Status status(this->
comm().probe(Parallel::any_source, replies_tag));
166 const processor_id_type source_pid = cast_int<processor_id_type>(status.source());
170 this->
comm().
receive(source_pid, response, replies_tag);
172 for (
const auto & r : response)
174 const Elem * elem =
mesh->elem_ptr(r.first);
175 const unsigned int side = r.second;
178 boundary_info.remove_side(elem, side);
179 for (
const auto & boundary_id : boundary_ids)
180 boundary_info.add_side(elem, side, boundary_id);
184 Parallel::wait(side_requests);
185 Parallel::wait(reply_requests);
188 for (
const auto & i : make_range(boundary_ids.size()))
191 mesh->unset_is_prepared();
192 return dynamic_pointer_cast<MeshBase>(
mesh);
registerMooseObject("MooseApp", SideSetsBetweenSubdomainsGenerator)
MeshGenerator that creates a sideset composed of the nodes located between two or more subdomains.
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
SideSetsBetweenSubdomainsGenerator(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.