16 #include "libmesh/mesh_generation.h" 17 #include "libmesh/mesh.h" 18 #include "libmesh/string_to_enum.h" 19 #include "libmesh/quadrature_gauss.h" 20 #include "libmesh/point_locator_base.h" 21 #include "libmesh/elem.h" 27 params.
addRequiredParam<MeshGeneratorName>(
"input",
"The mesh we want to modify");
29 "new_boundary",
"The list of boundary names to create on the supplied subdomain");
30 params.
addParam<
bool>(
"fixed_normal",
32 "This Boolean determines whether we fix our normal " 33 "or allow it to vary to \"paint\" around curves");
37 "If true, replace the old sidesets. If false, the current sidesets (if " 38 "any) will be preserved.");
40 params.
addParam<std::vector<BoundaryName>>(
41 "included_boundaries",
42 "A set of boundary names or ids whose sides will be included in the new sidesets");
43 params.
addParam<std::vector<SubdomainName>>(
44 "included_subdomains",
45 "A set of subdomain names or ids whose sides will be included in the new sidesets");
46 params.
addParam<std::vector<SubdomainName>>(
"included_neighbors",
47 "A set of neighboring subdomain names or ids. A face " 48 "is only added if the subdomain id of the " 49 "neighbor is in this set");
51 "include_only_external_sides",
53 "Whether to only include external sides when considering sides to add to the sideset");
57 "If supplied, only faces with normal equal to this, up to " 58 "normal_tol, will be added to the sidesets specified");
61 "normal_tol>=0 & normal_tol<=2",
62 "If normal is supplied then faces are " 63 "only added if face_normal.normal_hat >= " 64 "1 - normal_tol, where normal_hat = " 67 "The variance allowed when comparing normals",
68 "Deprecated, use 'normal_tol' instead");
73 "include_only_external_sides normal normal_tol",
74 "Sideset restrictions");
81 _input(getMesh(
"input")),
82 _boundary_names(
std::vector<BoundaryName>()),
83 _fixed_normal(getParam<bool>(
"fixed_normal")),
84 _replace(getParam<bool>(
"replace")),
85 _check_boundaries(isParamValid(
"included_boundaries")),
86 _check_subdomains(isParamValid(
"included_subdomains")),
87 _check_neighbor_subdomains(isParamValid(
"included_neighbors")),
91 _include_only_external_sides(getParam<bool>(
"include_only_external_sides")),
92 _using_normal(isParamSetByUser(
"normal")),
93 _normal(_using_normal ? Point(getParam<Point>(
"normal") / getParam<Point>(
"normal").
norm())
94 : getParam<Point>(
"normal")),
95 _normal_tol(getParam<
Real>(
"normal_tol"))
106 mooseAssert(
_fe_face ==
nullptr,
"FE Face has already been initialized");
109 if (!
mesh.is_prepared())
110 mesh.prepare_for_use();
111 const auto dim =
mesh.mesh_dimension();
114 FEType fe_type(Utility::string_to_enum<Order>(
"CONSTANT"),
115 Utility::string_to_enum<FEFamily>(
"MONOMIAL"));
122 paramError(
"include_only_external_sides",
"External sides dont have neighbors");
126 const auto & included_boundaries = getParam<std::vector<BoundaryName>>(
"included_boundaries");
128 if (std::find(included_boundaries.begin(), included_boundaries.end(), boundary_name) !=
129 included_boundaries.end())
132 "A boundary cannot be both the new boundary and be included in the list of included " 133 "boundaries. If you are trying to restrict an existing boundary, you must use a " 134 "different name for 'new_boundary', delete the old boundary, and then rename the " 135 "new boundary to the old boundary.");
144 included_boundaries[i],
145 "' was not found within the mesh");
152 const auto subdomains = getParam<std::vector<SubdomainName>>(
"included_subdomains");
153 for (
const auto &
name : subdomains)
155 paramError(
"included_subdomains",
"The block '",
name,
"' was not found in the mesh");
163 const auto subdomains = getParam<std::vector<SubdomainName>>(
"included_neighbors");
164 for (
const auto &
name : subdomains)
166 paramError(
"included_neighbors",
"The block '",
name,
"' was not found in the mesh");
189 const Point & normal,
202 for (
const auto side :
make_range(elem->n_sides()))
207 const Point face_normal =
_fe_face->get_normals()[0];
213 mesh.get_boundary_info().remove_side(elem, side);
215 mesh.get_boundary_info().add_side(elem, side,
side_id);
216 for (
const auto neighbor :
make_range(elem->n_sides()))
229 const Point & normal_2,
230 const Real & tol)
const 232 return (1.0 - normal_1 * normal_2) <= tol;
237 const Elem *
const elem,
const std::vector<subdomain_id_type> & subdomain_id_list)
const 240 return std::find(subdomain_id_list.begin(), subdomain_id_list.end(), curr_subdomain) !=
241 subdomain_id_list.end();
246 const unsigned int side,
247 const MeshBase & mesh)
const 250 if (
mesh.get_boundary_info().has_boundary_id(elem, side, bid))
257 const unsigned int side,
258 const MeshBase & mesh,
259 const Point & desired_normal,
260 const Point & face_normal)
273 const Elem *
const neighbor = elem->neighbor_ptr(side);
bool elementSubdomainIdInList(const Elem *const elem, const std::vector< subdomain_id_type > &subdomain_id_list) const
Determines whether the given element's subdomain id is in the given subdomain_id_list.
const bool _fixed_normal
Whether to fix the normal or allow it to vary to "paint" around curves.
bool elemSideSatisfiesRequirements(const Elem *const elem, const unsigned int side, const MeshBase &mesh, const Point &normal, const Point &face_normal)
Determines whether the given element's side satisfies the following parameters: include_only_external...
const Real _normal_tol
if normal is specified, then faces are only added if face_normal.normal_hat <= 1 - normal_tol where n...
const BoundaryID INVALID_BOUNDARY_ID
std::vector< subdomain_id_type > _included_neighbor_subdomain_ids
A list of included neighbor subdomain ids that the sides' neighbor element must be a part of...
const boundary_id_type side_id
SideSetsGeneratorBase(const InputParameters ¶meters)
const bool _replace
Whether or not to remove the old sidesets (all of them, if any) when adding sidesets.
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
bool normalsWithinTol(const Point &normal_1, const Point &normal_2, const Real &tol) const
Determines whether two normal vectors are within normal_tol of each other.
std::vector< BoundaryName > _boundary_names
The list of new boundary names.
std::vector< subdomain_id_type > getSubdomainIDs(const libMesh::MeshBase &mesh, const std::vector< SubdomainName > &subdomain_name)
Get the associated subdomainIDs for the subdomain names that are passed in.
virtual const std::string & name() const
Get the name of the class.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
std::vector< subdomain_id_type > _included_subdomain_ids
A list of included subdomain ids that the side has to be part of, extracted from the included_subdoma...
std::unique_ptr< QGauss > _qface
const bool _include_only_external_sides
Whether to only include external side when considering sides to add to the sideset.
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 elementSideInIncludedBoundaries(const Elem *const elem, const unsigned int side, const MeshBase &mesh) const
Determines whether the given side of an element belongs to any boundaries in the included_boundaries ...
std::unique_ptr< FEBase > _fe_face
bool hasSubdomainName(MeshBase &input_mesh, const SubdomainName &name)
Whether a particular subdomain name exists in the mesh.
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.
const bool _check_boundaries
whether to check boundary ids when adding sides or not
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()
void finalize()
This method finalizes the object, setting names back in the boundary_info object and releasing memory...
virtual ~SideSetsGeneratorBase()
static InputParameters validParams()
bool _using_normal
true if only faces close to "normal" will be added
const bool _check_subdomains
whether to check subdomain ids of the element in the (element, side, boundary id) tuple when adding s...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
const InputParameters & parameters() const
Get the parameters of the object.
const bool _check_neighbor_subdomains
whether to check the subdomain ids of the neighbor element (on the other 'side' of the side) when add...
std::map< boundary_id_type, std::set< const Elem * > > _visited
MeshGenerators are objects that can modify or add to an existing mesh.
void setup(MeshBase &mesh)
This method is used to construct the FE object so we can compute normals of faces.
std::vector< boundary_id_type > _restricted_boundary_ids
A list of included boundary ids that the side has to be part of, extracted from the included_boundari...