16 #include "libmesh/mesh.h" 17 #include "libmesh/mesh_generation.h" 18 #include "libmesh/mesh_serializer.h" 19 #include "libmesh/string_to_enum.h" 20 #include "libmesh/quadrature_gauss.h" 21 #include "libmesh/point_locator_base.h" 22 #include "libmesh/enum_point_locator_type.h" 23 #include "libmesh/distributed_mesh.h" 24 #include "libmesh/elem.h" 25 #include "libmesh/fe_base.h" 26 #include "libmesh/mesh_tools.h" 37 params.
addRequiredParam<MeshGeneratorName>(
"input",
"The mesh we want to modify");
38 params.
addClassDescription(
"Adds a new sideset starting at the specified point containing all " 39 "connected element faces with the same normal.");
41 "The name of the boundary to create");
43 "points",
"A list of points from which to start painting sidesets");
50 _input(getMesh(
"input")),
51 _boundary_names(getParam<
std::vector<BoundaryName>>(
"new_boundary")),
52 _points(getParam<
std::vector<Point>>(
"points"))
55 mooseError(
"point list and boundary list are not the same length");
58 std::unique_ptr<MeshBase>
61 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
65 MeshSerializer serial(*
mesh);
68 std::vector<BoundaryID> boundary_ids =
75 std::unique_ptr<PointLocatorBase> pl = PointLocatorBase::build(
TREE, *
mesh);
77 for (
unsigned int i = 0; i < boundary_ids.size(); ++i)
79 std::set<const Elem *> candidate_elements;
80 (*pl)(
_points[i], candidate_elements);
82 const Elem * elem_to_flood =
nullptr;
83 Point normal_to_flood;
85 for (
const Elem * elem : candidate_elements)
86 for (
unsigned int side = 0; side < elem->n_sides(); ++side)
88 if (elem->neighbor_ptr(side))
92 std::unique_ptr<const Elem> elem_side = elem->side_ptr(side);
94 if (elem_side->contains_point(
_points[i]))
98 const std::vector<Point> & normals =
_fe_face->get_normals();
103 if (elem_to_flood && (
std::abs(1.0 - normal_to_flood * normals[0]) >
_variance ||
105 mooseError(
"Two ambiguous potential sideset sources found for boundary `",
119 elem_to_flood = elem;
120 normal_to_flood = normals[0];
125 flood(elem_to_flood, normal_to_flood, boundary_ids[i], *
mesh);
129 MeshTools::libmesh_assert_valid_boundary_ids(*
mesh);
134 for (
unsigned int i = 0; i < boundary_ids.size(); ++i)
137 mesh->set_isnt_prepared();
const unsigned int invalid_uint
std::unique_ptr< MeshBase > & _input
the mesh to add the sidesets to
static InputParameters validParams()
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.
registerMooseObject("MooseApp", SideSetsFromPointsGenerator)
std::vector< Point > _points
holds the points used to generate sidesets
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
A mesh generator to generate new sidesets from all faces connected to points with the same normal as ...
SideSetsFromPointsGenerator(const InputParameters ¶meters)
std::unique_ptr< FEBase > _fe_face
void flood(const Elem *elem, Point normal, boundary_id_type side_id, MeshBase &mesh)
This method implements a recursive flood routine to paint a sideset of mesh to neighboring faces give...
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 finalize()
This method finalizes the object, setting names back in the boundary_info object and releasing memory...
static InputParameters validParams()
std::vector< BoundaryName > _boundary_names
holds the boundary names for the sidesets
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
std::map< boundary_id_type, std::set< const Elem * > > _visited
void setup(MeshBase &mesh)
This method is used to construct the FE object so we can compute normals of faces.