https://mooseframework.inl.gov
PeripheralTriangleMeshGenerator.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 
11 
12 // Moose headers
13 #include "MooseApp.h"
14 #include "MooseMeshUtils.h"
15 #include "Factory.h"
16 #include "libmesh/elem.h"
17 
19 
22 {
24  params.addRequiredParam<MeshGeneratorName>("input", "The input mesh to be modified.");
25  params.addRequiredRangeCheckedParam<Real>("peripheral_ring_radius",
26  "peripheral_ring_radius>0",
27  "Radius of the peripheral ring to be added.");
28  params.addRequiredRangeCheckedParam<unsigned int>("peripheral_ring_num_segments",
29  "peripheral_ring_num_segments>0",
30  "Number of segments of the peripheral ring.");
31  params.addRangeCheckedParam<Real>(
32  "desired_area",
33  0,
34  "desired_area>=0",
35  "Desired (maximum) triangle area, or 0 to skip uniform refinement");
36  params.addParam<std::string>(
37  "desired_area_func",
38  std::string(),
39  "Desired area as a function of x,y; omit to skip non-uniform refinement");
40 
41  params.addParam<bool>(
42  "use_auto_area_func", false, "Use the automatic area function in the peripheral region.");
43  params.addParam<Real>(
44  "auto_area_func_default_size",
45  0,
46  "Background size for automatic area function, or 0 to use non background size");
47  params.addParam<Real>("auto_area_func_default_size_dist",
48  -1.0,
49  "Effective distance of background size for automatic area "
50  "function, or negative to use non background size");
51  params.addParam<unsigned int>("auto_area_function_num_points",
52  10,
53  "Maximum number of nearest points used for the inverse distance "
54  "interpolation algorithm for automatic area function calculation.");
55  params.addRangeCheckedParam<Real>(
56  "auto_area_function_power",
57  1.0,
58  "auto_area_function_power>0",
59  "Polynomial power of the inverse distance interpolation algorithm for automatic area "
60  "function calculation.");
61 
62  params.addParam<SubdomainName>(
63  "peripheral_ring_block_name", "", "The block name assigned to the created peripheral layer.");
64  params.addParam<BoundaryName>("external_boundary_name",
65  "Optional customized external boundary name.");
66  MooseEnum tri_elem_type("TRI3 TRI6 TRI7 DEFAULT", "DEFAULT");
67  params.addParam<MooseEnum>(
68  "tri_element_type", tri_elem_type, "Type of the triangular elements to be generated.");
69  params.addParam<bool>(
70  "preserve_volumes",
71  false,
72  "Whether the volume of the peripheral region is preserved by fixing the radius.");
73  params.addClassDescription("This PeripheralTriangleMeshGenerator object is designed to generate "
74  "a triangulated mesh between a generated outer circle boundary "
75  "and a provided inner mesh.");
76  params.addParamNamesToGroup("desired_area desired_area_func use_auto_area_func "
77  "auto_area_func_default_size auto_area_func_default_size_dist "
78  "auto_area_function_num_points auto_area_function_power",
79  "Peripheral Area Delaunay");
80  return params;
81 }
82 
84  : MeshGenerator(parameters),
85  _input_name(getParam<MeshGeneratorName>("input")),
86  _peripheral_ring_radius(getParam<Real>("peripheral_ring_radius")),
87  _peripheral_ring_num_segments(getParam<unsigned int>("peripheral_ring_num_segments")),
88  _desired_area(getParam<Real>("desired_area")),
89  _desired_area_func(getParam<std::string>("desired_area_func")),
90  _preserve_volumes(getParam<bool>("preserve_volumes"))
91 {
92  // Calculate outer boundary points
93 
94  std::vector<libMesh::Point> outer_polyline;
95  // radial spacing
96  Real d_theta = 2.0 * M_PI / _peripheral_ring_num_segments;
97  for (unsigned int i = 0; i < _peripheral_ring_num_segments; i++)
98  {
99  // sqrt{2 * pi / Sigma_i [sin (azi_i)]}
100  const Real radius_correction_factor =
101  _preserve_volumes ? std::sqrt(2. * M_PI / _peripheral_ring_num_segments /
102  std::sin(2. * M_PI / _peripheral_ring_num_segments))
103  : 1.0;
104 
105  // rotation angle
106  Real theta = i * d_theta;
107  // calculate (x, y) coords
108  Real x = _peripheral_ring_radius * std::cos(theta) * radius_correction_factor;
109  Real y = _peripheral_ring_radius * std::sin(theta) * radius_correction_factor;
110 
111  // add to outer boundary list
112  outer_polyline.emplace_back(x, y, 0);
113  }
114 
115  // Generate outer boundary polyline
116  {
117  auto params = _app.getFactory().getValidParams("PolyLineMeshGenerator");
118  params.set<std::vector<Point>>("points") = outer_polyline;
119  params.set<std::vector<unsigned int>>("nums_edges_between_points") = {1};
120  params.set<bool>("loop") = true;
121  addMeshSubgenerator("PolyLineMeshGenerator", _input_name + "_periphery_polyline", params);
122  }
123 
124  // Generate periphery region
125  {
126  declareMeshForSub("input");
127  auto params = _app.getFactory().getValidParams("XYDelaunayGenerator");
128  params.set<MeshGeneratorName>("boundary") =
129  (MeshGeneratorName)_input_name + "_periphery_polyline";
130  params.set<std::vector<MeshGeneratorName>>("holes") =
131  std::vector<MeshGeneratorName>{_input_name};
132  params.set<unsigned int>("add_nodes_per_boundary_segment") = 0;
133  params.set<Real>("desired_area") = _desired_area;
134  params.set<std::string>("desired_area_func") = _desired_area_func;
135  params.set<bool>("use_auto_area_func") = getParam<bool>("use_auto_area_func");
136  if (isParamSetByUser("auto_area_func_default_size"))
137  params.set<Real>("auto_area_func_default_size") =
138  getParam<Real>("auto_area_func_default_size");
139  if (isParamSetByUser("auto_area_func_default_size_dist"))
140  params.set<Real>("auto_area_func_default_size_dist") =
141  getParam<Real>("auto_area_func_default_size_dist");
142  if (isParamSetByUser("auto_area_function_num_points"))
143  params.set<unsigned int>("auto_area_function_num_points") =
144  getParam<unsigned int>("auto_area_function_num_points");
145  if (isParamSetByUser("auto_area_function_power"))
146  params.set<Real>("auto_area_function_power") = getParam<Real>("auto_area_function_power");
147  params.set<bool>("refine_boundary") = false;
148  params.set<std::vector<bool>>("refine_holes") = std::vector<bool>{false};
149  params.set<std::vector<bool>>("stitch_holes") = std::vector<bool>{true};
150  if (isParamValid("external_boundary_name"))
151  params.set<BoundaryName>("output_boundary") =
152  getParam<BoundaryName>("external_boundary_name");
153  params.set<SubdomainName>("output_subdomain_name") =
154  getParam<SubdomainName>("peripheral_ring_block_name");
155  params.set<MooseEnum>("tri_element_type") = getParam<MooseEnum>("tri_element_type");
156  params.set<bool>("verbose_stitching") = false;
157  addMeshSubgenerator("XYDelaunayGenerator", _input_name + "_periphery", params);
158  _build_mesh = &getMeshByName(_input_name + "_periphery");
159  }
160 }
161 
162 std::unique_ptr<MeshBase>
164 {
165  (*_build_mesh)->find_neighbors();
166  return std::move(*_build_mesh);
167 }
const Real _peripheral_ring_radius
Radius of the peripheral region&#39;s outer circular boundary.
std::unique_ptr< MeshBase > & getMeshByName(const MeshGeneratorName &mesh_generator_name)
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const unsigned int _peripheral_ring_num_segments
Number of segments in the peripheral region&#39;s outer circular boundary.
T & set(const std::string &name, bool quiet_mode=false)
InputParameters getValidParams(const std::string &name) const
const std::vector< double > y
const bool _preserve_volumes
Whether to preserve the volume of the peripheral region by fixing the radius.
void addRequiredParam(const std::string &name, const std::string &doc_string)
Factory & getFactory()
PeripheralTriangleMeshGenerator(const InputParameters &parameters)
void declareMeshForSub(const std::string &param_name)
registerMooseObject("ReactorApp", PeripheralTriangleMeshGenerator)
const std::vector< double > x
void addMeshSubgenerator(const std::string &type, const std::string &name, Ts... extra_input_parameters)
std::string _desired_area_func
Desired area as a function of (x,y)
static InputParameters validParams()
const Real _desired_area
Desired (maximum) triangle area.
This PeripheralTriangleMeshGenerator object adds a circular peripheral region to the input mesh...
std::unique_ptr< MeshBase > * _build_mesh
The final mesh that is generated by the subgenerators;.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
MooseApp & _app
const MeshGeneratorName _input_name
Name of the mesh generator to get the input mesh.
void addClassDescription(const std::string &doc_string)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
bool isParamValid(const std::string &name) const
bool isParamSetByUser(const std::string &name) const
void ErrorVector unsigned int
std::unique_ptr< MeshBase > generate() override
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)