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.
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.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
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.
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()
MeshGenerator for breaking all boundaries based on which block they are attached to.
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