https://mooseframework.inl.gov
Loading...
Searching...
No Matches
BoundaryElementConversionGenerator.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
12#include "CastUniquePointer.h"
13#include "MooseMeshUtils.h"
14
15#include "libmesh/mesh_serializer.h"
16
18
21{
23
24 params.addParam<MeshGeneratorName>(
25 "input",
26 "mesh generator creating the mesh on which to create the boundary transition layer on.");
27 params.addRequiredParam<std::vector<BoundaryName>>(
28 "boundary_names", "Boundaries that need to be converted to form a transition layer.");
29 params.addParam<unsigned int>(
30 "conversion_element_layer_number",
31 1,
32 "The number of layers of elements to be converted. The farthest layer of the elements from "
33 "the given boundary are converted to elements compatible with the remainder of the mesh, "
34 "while the other layers of elements are converted into TET4.");
35 params.addParam<SubdomainName>("converted_tet_element_subdomain_name_suffix",
36 "to_tet",
37 "The suffix to be added to the original subdomain name for the "
38 "subdomains containing the elements converted to TET4.");
39 params.addParam<SubdomainName>(
40 "converted_pyramid_element_subdomain_name_suffix",
41 "to_pyramid",
42 "The suffix to be added to the original subdomain name for the subdomains containing the "
43 "elements converted to PYRAMID5.");
44 params.addParam<bool>("external_boundaries_checking",
45 false,
46 "Whether to check if provided boundaries are external.");
47
48 params.addClassDescription("Convert the elements involved in a set of external boundaries to "
49 "ensure that the boundary set only contains TRI3 elements");
50
51 return params;
52}
53
55 const InputParameters & parameters)
56 : MeshGenerator(parameters),
57 _input(getMesh("input")),
58 _boundary_names(getParam<std::vector<BoundaryName>>("boundary_names")),
59 _conversion_element_layer_number(getParam<unsigned int>("conversion_element_layer_number")),
60 _external_boundaries_checking(getParam<bool>("external_boundaries_checking"))
61{
62}
63
64std::unique_ptr<MeshBase>
66{
67 UnstructuredMesh & mesh = dynamic_cast<UnstructuredMesh &>(*_input);
68
69 libMesh::MeshSerializer serial_mesh(mesh);
70
71 // collect the subdomain ids of the original mesh
72 std::set<subdomain_id_type> original_subdomain_ids;
73 for (auto elem_it = mesh.active_elements_begin(); elem_it != mesh.active_elements_end();
74 elem_it++)
75 {
76 original_subdomain_ids.emplace((*elem_it)->subdomain_id());
77 }
78 try
79 {
82 }
83 catch (const MooseException & e)
84 {
85 if (((std::string)e.what()).compare("subdomain id overflow") == 0)
86 paramError("input",
87 "Some subdomain ids of the input mesh are too large and cause overflow when "
88 "assigning new subdomain ids during element conversion. Please consider lowering "
89 "the subdomain ids using RenameBlockGenerator.");
90 else if (((std::string)e.what()).compare(13, 8, "boundary") == 0)
91 paramError("boundary_names", e.what());
92 else
93 paramError("input", e.what());
94 }
95 try
96 {
98 mesh,
99 original_subdomain_ids,
100 *original_subdomain_ids.rbegin() + 1,
101 getParam<SubdomainName>("converted_tet_element_subdomain_name_suffix"),
102 getParam<SubdomainName>("converted_pyramid_element_subdomain_name_suffix"));
103 }
104 catch (const std::exception & e)
105 {
106 if (((std::string)e.what()).compare(26, 4, "TET4") == 0)
107 paramError("converted_tet_element_subdomain_name_suffix", e.what());
108 else // if (((std::string)e.what()).compare(26, 7, "PYRAMID5") == 0)
109 paramError("converted_pyramid_element_subdomain_name_suffix", e.what());
110 }
111
112 // MeshSerializer's destructor calls delete_remote_elements()
113 if (!mesh.is_replicated())
114 mesh.prepare_for_use();
115 else
116 mesh.unset_is_prepared();
117
118 return std::move(_input);
119}
registerMooseObject("MooseApp", BoundaryElementConversionGenerator)
void ErrorVector unsigned int
Convert the elements involved in a set of external boundaries to ensure that the boundary set only co...
std::unique_ptr< MeshBase > & _input
Mesh that possibly comes from another generator.
const unsigned int _conversion_element_layer_number
Number of layers of elements to be converted.
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
const bool _external_boundaries_checking
Whether to check if the provided boundaries are external.
BoundaryElementConversionGenerator(const InputParameters &parameters)
const std::vector< BoundaryName > _boundary_names
The boundaries to convert the neighboring elements of.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
MeshGenerators are objects that can modify or add to an existing mesh.
static InputParameters validParams()
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Definition MooseBase.h:457
Provides a way for users to bail out of the current solve.
virtual const char * what() const
Get out the error message.
MeshBase & mesh
void transitionLayerGenerator(MeshBase &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.
void assignConvertedElementsSubdomainNameSuffix(MeshBase &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.