https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
162std::unique_ptr<MeshBase>
164{
165 (*_build_mesh)->find_neighbors();
166 return std::move(*_build_mesh);
167}
const std::vector< double > y
const std::vector< double > x
registerMooseObject("ReactorApp", PeripheralTriangleMeshGenerator)
void ErrorVector unsigned int
InputParameters getValidParams(const std::string &name) const
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
void addRequiredParam(const std::string &name, 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)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
void declareMeshForSub(const std::string &param_name)
void addMeshSubgenerator(const std::string &type, const std::string &name, Ts... extra_input_parameters)
std::unique_ptr< MeshBase > & getMeshByName(const MeshGeneratorName &mesh_generator_name)
static InputParameters validParams()
Factory & getFactory()
bool isParamSetByUser(const std::string &name) const
bool isParamValid(const std::string &name) const
MooseApp & _app
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;.
const Real _desired_area
Desired (maximum) triangle area.
std::unique_ptr< MeshBase > generate() override
const Real _peripheral_ring_radius
Radius of the peripheral region's outer circular boundary.
PeripheralTriangleMeshGenerator(const InputParameters &parameters)
std::string _desired_area_func
Desired area as a function of (x,y)
const MeshGeneratorName _input_name
Name of the mesh generator to get the input mesh.
const bool _preserve_volumes
Whether to preserve the volume of the peripheral region by fixing the radius.
const unsigned int _peripheral_ring_num_segments
Number of segments in the peripheral region's outer circular boundary.