https://mooseframework.inl.gov
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 
64 std::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.set_isnt_prepared();
117 
118  return std::move(_input);
119 }
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...
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 &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:439
MeshBase & mesh
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
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...
std::unique_ptr< MeshBase > & _input
Mesh that possibly comes from another generator.
BoundaryElementConversionGenerator(const InputParameters &parameters)
const bool _external_boundaries_checking
Whether to check if the provided boundaries are external.
static InputParameters validParams()
Definition: MeshGenerator.C:23
Provides a way for users to bail out of the current solve.
registerMooseObject("MooseApp", BoundaryElementConversionGenerator)
const std::vector< BoundaryName > _boundary_names
The boundaries to convert the neighboring elements of.
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...
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...
MeshGenerators are objects that can modify or add to an existing mesh.
Definition: MeshGenerator.h:33
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 ErrorVector unsigned int