24 "mesh generator creating the mesh on which to create the boundary transition layer on.");
26 "boundary_names",
"Boundaries that need to be converted to form a transition layer.");
28 "conversion_element_layer_number",
30 "The number of layers of elements to be converted. The farthest layer of the elements from " 31 "the given boundary are converted to elements compatible with the remainder of the mesh, " 32 "while the other layers of elements are converted into TET4.");
33 params.
addParam<SubdomainName>(
"converted_tet_element_subdomain_name_suffix",
35 "The suffix to be added to the original subdomain name for the " 36 "subdomains containing the elements converted to TET4.");
38 "converted_pyramid_element_subdomain_name_suffix",
40 "The suffix to be added to the original subdomain name for the subdomains containing the " 41 "elements converted to PYRAMID5.");
42 params.
addParam<
bool>(
"external_boundaries_checking",
44 "Whether to check if provided boundaries are external.");
46 params.
addClassDescription(
"Convert the elements involved in a set of external boundaries to " 47 "ensure that the boundary set only contains TRI3 elements");
55 _input(getMesh(
"input")),
56 _boundary_names(getParam<
std::vector<BoundaryName>>(
"boundary_names")),
57 _conversion_element_layer_number(getParam<unsigned
int>(
"conversion_element_layer_number")),
58 _external_boundaries_checking(getParam<bool>(
"external_boundaries_checking"))
62 std::unique_ptr<MeshBase>
65 auto replicated_mesh_ptr =
dynamic_cast<ReplicatedMesh *
>(
_input.get());
66 if (!replicated_mesh_ptr)
67 paramError(
"input",
"Input is not a replicated mesh, which is required");
69 ReplicatedMesh &
mesh = *replicated_mesh_ptr;
72 std::set<subdomain_id_type> original_subdomain_ids;
73 for (
auto elem_it =
mesh.active_elements_begin(); elem_it !=
mesh.active_elements_end();
76 original_subdomain_ids.emplace((*elem_it)->subdomain_id());
86 if (((std::string)e.
what()).compare(
"subdomain id overflow") == 0)
88 "Some subdomain ids of the input mesh are too large and cause overflow when " 89 "assigning new subdomain ids during element conversion. Please consider lowering " 90 "the subdomain ids using RenameBlockGenerator.");
91 else if (((std::string)e.
what()).compare(13, 8,
"boundary") == 0)
101 original_subdomain_ids,
102 *original_subdomain_ids.rbegin() + 1,
103 getParam<SubdomainName>(
"converted_tet_element_subdomain_name_suffix"),
104 getParam<SubdomainName>(
"converted_pyramid_element_subdomain_name_suffix"));
106 catch (
const std::exception & e)
108 if (((std::string)e.what()).compare(26, 4,
"TET4") == 0)
109 paramError(
"converted_tet_element_subdomain_name_suffix", e.what());
111 paramError(
"converted_pyramid_element_subdomain_name_suffix", e.what());
static InputParameters validParams()
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
Convert the elements involved in a set of external boundaries to ensure that the boundary set only co...
const unsigned int _conversion_element_layer_number
Number of layers of elements to be converted.
virtual const char * what() const
Get out the error message.
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 ...
std::unique_ptr< MeshBase > & _input
Mesh that possibly comes from another generator.
BoundaryElementConversionGenerator(const InputParameters ¶meters)
const bool _external_boundaries_checking
Whether to check if the provided boundaries are external.
static InputParameters validParams()
Provides a way for users to bail out of the current solve.
void assignConvertedElementsSubdomainNameSuffix(ReplicatedMesh &mesh, const std::set< subdomain_id_type > &original_subdomain_ids, const subdomain_id_type sid_shift_base, const SubdomainName &tet_suffix, const SubdomainName &pyramid_suffix)
Assign a subdomain name suffix to the converted elements created during transition layer generation...
registerMooseObject("MooseApp", BoundaryElementConversionGenerator)
const std::vector< BoundaryName > _boundary_names
The boundaries to convert the neighboring elements of.
MeshGenerators are objects that can modify or add to an existing mesh.
void ErrorVector unsigned int
void transitionLayerGenerator(ReplicatedMesh &mesh, const std::vector< BoundaryName > &boundary_names, const unsigned int conversion_element_layer_number, const bool external_boundaries_checking)
Generate a transition layer of elements with TRI3 surfaces on the given boundaries.