18 #include "libmesh/mesh_generation.h" 19 #include "libmesh/mesh.h" 20 #include "libmesh/string_to_enum.h" 21 #include "libmesh/quadrature_gauss.h" 22 #include "libmesh/point_locator_base.h" 23 #include "libmesh/distributed_mesh.h" 24 #include "libmesh/elem.h" 25 #include "libmesh/fe_base.h" 36 params.
addRequiredParam<MeshGeneratorName>(
"input",
"The mesh we want to modify");
38 "Adds a new named sideset to the mesh for all faces matching the specified normal.");
40 "The names of the boundaries to create");
42 "normals",
"A list of normals for which to start painting sidesets");
43 params.
addParam<
Real>(
"tolerance", 1e-5,
"Tolerance for comparing the face nornmal");
50 _input(getMesh(
"input")),
51 _normals(getParam<
std::vector<Point>>(
"normals")),
52 _boundary_to_normal_map(
54 _tolerance(getParam<
Real>(
"tolerance"))
60 mooseError(
"normal list and boundary list are not the same length");
65 if (normal.norm() < 1e-5)
67 normal /= normal.norm();
71 std::unique_ptr<MeshBase>
74 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
76 mooseError(
"SideSetsFromNormalsGenerator is not implemented for distributed meshes when " 77 "fixed_normal = false");
79 std::vector<BoundaryID> boundary_ids =
88 for (
const auto & elem :
mesh->element_ptr_range())
89 for (
unsigned int side = 0; side < elem->n_sides(); ++side)
91 if (elem->neighbor_ptr(side))
94 const std::vector<Point> & normals =
_fe_face->get_normals();
97 for (
unsigned int i = 0; i < boundary_ids.size(); ++i)
106 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
107 for (
unsigned int i = 0; i < boundary_ids.size(); ++i)
115 mesh->set_isnt_prepared();
std::unique_ptr< MeshBase > & _input
the mesh to add the sidesets to
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.
std::vector< Point > _normals
holds the normals used to generate sidesets
bool hasBreakMeshByBlockGenerator() const
SideSetsFromNormalsGenerator(const InputParameters ¶meters)
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
static InputParameters validParams()
boundary_id_type BoundaryID
const Real _tolerance
a tolerance for comparing normals
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.
MooseApp & _app
The MOOSE application this is associated with.
void finalize()
This method finalizes the object, setting names back in the boundary_info object and releasing memory...
registerMooseObject("MooseApp", SideSetsFromNormalsGenerator)
static InputParameters validParams()
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< BoundaryName > _boundary_names
holds the boundary names for the sidesets
A mesh generator to generate new sidesets from all faces matching the normal.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
std::map< BoundaryID, RealVectorValue > & _boundary_to_normal_map
a map from the boundaries to the normals
MeshGeneratorSystem & getMeshGeneratorSystem()
Gets the system that manages the MeshGenerators.
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.