19#include "libmesh/mesh_generation.h"
20#include "libmesh/mesh.h"
21#include "libmesh/string_to_enum.h"
22#include "libmesh/quadrature_gauss.h"
23#include "libmesh/point_locator_base.h"
24#include "libmesh/distributed_mesh.h"
25#include "libmesh/elem.h"
26#include "libmesh/fe_base.h"
38 "Adds a new named sideset to the mesh for all faces matching the specified normal.");
40 "normals",
"A list of normals for which to start painting sidesets");
58 _normals(getParam<
std::vector<Point>>(
"normals")),
59 _boundary_to_normal_map(
60 declareMeshProperty<
std::map<
BoundaryID, RealVectorValue>>(
"boundary_normals"))
64 mooseError(
"normal list and boundary list are not the same length");
69 if (normal.norm() < 1e-5)
71 normal /= normal.norm();
77std::unique_ptr<MeshBase>
80 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
82 mooseError(
"SideSetsFromNormalsGenerator is not implemented for distributed meshes when "
83 "fixed_normal = false");
85 std::vector<BoundaryID> boundary_ids =
93 const std::vector<Point> & face_normals =
_fe_face->get_normals();
97 for (
const auto & elem :
mesh->element_ptr_range())
98 for (
const auto side : make_range(elem->n_sides()))
100 if (elem->neighbor_ptr(side))
106 const Point & face_normal = face_normals[0];
108 for (
const auto i : make_range(boundary_ids.size()))
117 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
118 for (
const auto i : make_range(boundary_ids.size()))
124 mesh->unset_is_prepared();
125 return dynamic_pointer_cast<MeshBase>(
mesh);
boundary_id_type BoundaryID
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
registerMooseObject("MooseApp", SideSetsFromNormalsGenerator)
A mesh generator to generate new sidesets from all faces matching the normal.
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
static InputParameters validParams()
std::vector< Point > _normals
holds the normals used to generate sidesets
std::map< BoundaryID, RealVectorValue > & _boundary_to_normal_map
a map from the boundaries to the normals
SideSetsFromNormalsGenerator(const InputParameters ¶meters)
void setup(MeshBase &mesh)
This method is used to construct the FE object so we can compute normals of faces.
const Real _normal_tol
if normal is specified, then faces are only added if face_normal.normal_hat <= 1 - normal_tol where n...
std::unique_ptr< libMesh::FEBase > _fe_face
std::vector< BoundaryName > _boundary_names
The list of new boundary names.
static InputParameters validParams()
std::unique_ptr< MeshBase > & _input
the mesh to add the sidesets to
void flood(const Elem *elem, const Point &normal, const boundary_id_type &side_id, MeshBase &mesh)
This method implements a recursive flood routine to paint a sideset of mesh to neighboring faces give...
bool _using_normal
true if only faces close to "normal" will be added
void finalize()
This method finalizes the object, setting names back in the boundary_info object and releasing memory...
const bool _fixed_normal
Whether to fix the normal or allow it to vary to "paint" around curves.
std::map< boundary_id_type, std::set< const Elem * > > _visited
bool normalsWithinTol(const Point &normal_1, const Point &normal_2, const Real tol)
Determines whether two normal vectors are within normal_tol of each other.
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.