16 #include "libmesh/elem.h" 25 params.
addRequiredParam<MeshGeneratorName>(
"input",
"The mesh we want to modify");
26 params.
addClassDescription(
"Break boundaries based on the subdomains to which their sides are " 27 "attached. Naming convention for the new boundaries will be the old " 28 "boundary name plus \"_to_\" plus the subdomain name");
29 params.
addParam<std::vector<BoundaryName>>(
30 "boundaries",
"Boundaries to be broken. Default means to break all boundaries");
41 std::unique_ptr<MeshBase>
45 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
46 auto & boundary_info =
mesh->get_boundary_info();
49 std::set<boundary_id_type> breaking_boundary_ids;
52 auto & boundary_names = getParam<std::vector<BoundaryName>>(
"boundaries");
53 for (
auto & boundary_name : boundary_names)
57 paramError(
"boundaries",
"The boundary '", boundary_name,
"' was not found in the mesh");
59 breaking_boundary_ids.insert(boundary_info.get_id_by_name(boundary_name));
64 breaking_boundary_ids = boundary_info.get_boundary_ids();
67 if (!
mesh->is_replicated())
72 std::set<std::string> new_boundary_name_set;
73 std::vector<boundary_id_type> side_boundary_ids;
74 for (
const auto & elem :
mesh->active_element_ptr_range())
76 auto subdomain_id = elem->subdomain_id();
77 auto subdomain_name =
mesh->subdomain_name(subdomain_id);
78 if (subdomain_name ==
"")
79 subdomain_name = std::to_string(subdomain_id);
80 for (
unsigned int side = 0; side < elem->n_sides(); ++side)
82 boundary_info.boundary_ids(elem, side, side_boundary_ids);
83 for (
auto boundary_id : side_boundary_ids)
84 if (breaking_boundary_ids.count(boundary_id) > 0)
85 new_boundary_name_set.emplace(boundary_info.sideset_name(boundary_id) +
"_to_" +
92 if (!
mesh->is_replicated())
96 std::vector<BoundaryName> new_boundary_names(new_boundary_name_set.begin(),
97 new_boundary_name_set.end());
101 mooseAssert(new_boundary_ids.size() == new_boundary_names.size(),
102 "sizes of boundary names and boundary IDs mismatch");
103 for (MooseIndex(new_boundary_ids) i = 0; i < new_boundary_ids.size(); ++i)
105 boundary_info.sideset_name(new_boundary_ids[i]) = new_boundary_names[i];
106 boundary_info.nodeset_name(new_boundary_ids[i]) = new_boundary_names[i];
110 for (
const auto & elem :
mesh->active_element_ptr_range())
112 auto subdomain_id = elem->subdomain_id();
113 auto subdomain_name =
mesh->subdomain_name(subdomain_id);
114 if (subdomain_name ==
"")
115 subdomain_name = std::to_string(subdomain_id);
116 for (MooseIndex(elem->n_sides()) side = 0; side < elem->n_sides(); ++side)
118 std::vector<boundary_id_type> side_boundary_ids;
119 boundary_info.boundary_ids(elem, side, side_boundary_ids);
120 for (
auto boundary_id : side_boundary_ids)
122 if (breaking_boundary_ids.count(boundary_id) > 0)
124 BoundaryName bname = boundary_info.sideset_name(boundary_id) +
"_to_" + subdomain_name;
125 auto bid = boundary_info.get_id_by_name(bname);
126 boundary_info.add_side(elem, side, bid);
132 mesh->set_isnt_prepared();
bool hasBoundaryName(const MeshBase &input_mesh, const BoundaryName &name)
Whether a particular boundary name exists in the mesh.
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
static InputParameters validParams()
std::unique_ptr< MeshBase > & _input
the input mesh to be modified
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
const Parallel::Communicator & comm() const
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
BreakBoundaryOnSubdomainGenerator(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.
static InputParameters validParams()
MeshGenerator for breaking all boundaries based on which block they are attached to.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
registerMooseObject("MooseApp", BreakBoundaryOnSubdomainGenerator)
MeshGenerators are objects that can modify or add to an existing mesh.
void set_union(T &data, const unsigned int root_id) const