12 #include "libmesh/face_quad4.h" 13 #include "libmesh/face_tri3.h" 22 "nr", 1,
"nr>0",
"Number of elements in the radial direction");
24 "nt",
"nt>0",
"Number of elements in the angular direction");
28 "Inner radius. If rmin=0 then a disc mesh (with no central hole) will be created.");
32 "Minimum angle, measured in radians anticlockwise from x axis",
37 "Maximum angle, measured in radians anticlockwise from x axis. If " 38 "tmin=0 and tmax=2Pi an annular mesh is created. " 39 "Otherwise, only a sector of an annulus is created",
42 "dmin", 0.0,
"Minimum degree, measured in degrees anticlockwise from x axis");
45 "Maximum angle, measured in degrees anticlockwise from x axis. If " 46 "dmin=0 and dmax=360 an annular mesh is created. " 47 "Otherwise, only a sector of an annulus is created");
49 "growth_r", 1.0,
"growth_r>0.0",
"The ratio of radial sizes of successive rings of elements");
51 "quad_subdomain_id", 0,
"The subdomain ID given to the QUAD4 elements");
54 "The subdomain ID given to the TRI3 elements " 55 "(these exist only if rmin=0, and they exist " 56 "at the center of the disc");
57 params.
addClassDescription(
"For rmin>0: creates an annular mesh of QUAD4 elements. For rmin=0: " 58 "creates a disc mesh of QUAD4 and TRI3 elements. Boundary sidesets " 59 "are created at rmax and rmin, and given these names. If dmin!=0 and " 60 "dmax!=360, a sector of an annulus or disc is created. In this case " 61 "boundary sidesets are also created a dmin and dmax, and " 68 _nr(getParam<unsigned
int>(
"nr")),
69 _nt(getParam<unsigned
int>(
"nt")),
70 _rmin(getParam<
Real>(
"rmin")),
71 _rmax(getParam<
Real>(
"rmax")),
72 _dmin(parameters.isParamSetByUser(
"tmin") ? getParam<
Real>(
"tmin") / M_PI * 180.0
73 : getParam<
Real>(
"dmin")),
74 _dmax(parameters.isParamSetByUser(
"tmax") ? getParam<
Real>(
"tmax") / M_PI * 180.0
75 : getParam<
Real>(
"dmax")),
76 _radians((parameters.isParamSetByUser(
"tmin") || parameters.isParamSetByUser(
"tmax")) ? true
78 _growth_r(getParam<
Real>(
"growth_r")),
79 _len(_growth_r == 1.0 ? (_rmax - _rmin) / _nr
80 : (_rmax - _rmin) * (1.0 - _growth_r) / (1.0 -
std::
pow(_growth_r, _nr))),
81 _full_annulus(_dmin == 0.0 && _dmax == 360),
82 _quad_subdomain_id(getParam<
SubdomainID>(
"quad_subdomain_id")),
83 _tri_subdomain_id(getParam<
SubdomainID>(
"tri_subdomain_id")),
84 _dims_may_have_changed(false)
89 "You specified the angles using both degrees and radians. Please use degrees.");
92 paramError(
"rmax",
"rmax must be greater than rmin");
94 paramError(
"dmax",
"dmax must be greater than dmin");
96 paramError(
"dmax",
"dmax - dmin must be <= 360");
99 "nt must be greater than (dmax - dmin) / 180 in order to avoid inverted " 102 paramError(
"quad_subdomain_id",
"quad_subdomain_id must not equal tri_subdomain_id");
153 std::unique_ptr<MooseMesh>
156 return std::make_unique<AnnularMesh>(*this);
166 mesh.set_mesh_dimension(2);
167 mesh.set_spatial_dimension(2);
168 BoundaryInfo & boundary_info =
mesh.get_boundary_info();
171 const unsigned num_nodes =
172 (
_rmin > 0.0 ? (
_nr + 1) * num_angular_nodes :
_nr * num_angular_nodes + 1);
173 const unsigned min_nonzero_layer_num = (
_rmin > 0.0 ? 0 : 1);
174 std::vector<Node *> nodes(num_nodes);
175 unsigned node_id = 0;
179 for (
unsigned angle_num = 0; angle_num < num_angular_nodes; ++angle_num)
181 const Real angle =
_dmin + angle_num * dt;
182 const Real x = current_r *
std::cos(angle * M_PI / 180.0);
183 const Real y = current_r *
std::sin(angle * M_PI / 180.0);
184 nodes[node_id] =
mesh.add_point(Point(x, y, 0.0), node_id);
189 for (
unsigned layer_num =
_nr; layer_num > min_nonzero_layer_num; --layer_num)
197 nodes[node_id] =
mesh.add_point(Point(current_r *
std::cos(
_dmin * M_PI / 180.0),
202 for (
unsigned angle_num = 1; angle_num < num_angular_nodes; ++angle_num)
204 const Real angle =
_dmin + angle_num * dt;
205 const Real x = current_r *
std::cos(angle * M_PI / 180.0);
206 const Real y = current_r *
std::sin(angle * M_PI / 180.0);
207 nodes[node_id] =
mesh.add_point(Point(x, y, 0.0), node_id);
208 Elem *
elem =
mesh.add_elem(
new Quad4);
209 elem->set_node(0) = nodes[node_id];
210 elem->set_node(1) = nodes[node_id - 1];
211 elem->set_node(2) = nodes[node_id - num_angular_nodes - 1];
212 elem->set_node(3) = nodes[node_id - num_angular_nodes];
216 if (layer_num ==
_nr)
218 boundary_info.add_side(
elem, 2, 1);
221 boundary_info.add_side(
elem, 0, 0);
224 boundary_info.add_side(
elem, 1, 2);
227 boundary_info.add_side(
elem, 3, 3);
232 Elem *
elem =
mesh.add_elem(
new Quad4);
233 elem->set_node(0) = nodes[node_id - num_angular_nodes];
234 elem->set_node(1) = nodes[node_id - 1];
235 elem->set_node(2) = nodes[node_id - num_angular_nodes - 1];
236 elem->set_node(3) = nodes[node_id - 2 * num_angular_nodes];
239 if (layer_num ==
_nr)
241 boundary_info.add_side(
elem, 2, 1);
244 boundary_info.add_side(
elem, 0, 0);
251 nodes[node_id] =
mesh.add_point(Point(0.0, 0.0, 0.0), node_id);
252 boundary_info.add_node(node_id, 0);
253 for (
unsigned angle_num = 0; angle_num < num_angular_nodes - 1; ++angle_num)
255 Elem *
elem =
mesh.add_elem(
new Tri3);
256 elem->set_node(0) = nodes[node_id];
257 elem->set_node(1) = nodes[node_id - num_angular_nodes + angle_num];
258 elem->set_node(2) = nodes[node_id - num_angular_nodes + angle_num + 1];
263 Elem *
elem =
mesh.add_elem(
new Tri3);
264 elem->set_node(0) = nodes[node_id];
265 elem->set_node(1) = nodes[node_id - 1];
266 elem->set_node(2) = nodes[node_id - num_angular_nodes];
271 boundary_info.sideset_name(0) =
"rmin";
272 boundary_info.sideset_name(1) =
"rmax";
273 boundary_info.nodeset_name(0) =
"rmin";
274 boundary_info.nodeset_name(1) =
"rmax";
279 boundary_info.sideset_name(2) =
"tmin";
280 boundary_info.sideset_name(3) =
"tmax";
281 boundary_info.nodeset_name(2) =
"tmin";
282 boundary_info.nodeset_name(3) =
"tmax";
286 boundary_info.sideset_name(2) =
"dmin";
287 boundary_info.sideset_name(3) =
"dmax";
288 boundary_info.nodeset_name(2) =
"dmin";
289 boundary_info.nodeset_name(3) =
"dmax";
293 mesh.prepare_for_use();
virtual std::unique_ptr< MooseMesh > safeClone() const override
A safer version of the clone() method that hands back an allocated object wrapped in a smart pointer...
static InputParameters validParams()
Typical "Moose-style" constructor and copy constructor.
virtual void buildMesh() override
Must be overridden by child classes.
static InputParameters validParams()
virtual Real getMaxInDimension(unsigned int component) const
virtual Real getMinInDimension(unsigned int component) const
Returns the min or max of the requested dimension respectively.
bool prepared() const
Setter/getter for whether the mesh is prepared.
const Real _growth_r
Bias on radial meshing.
virtual Real getMinInDimension(unsigned int component) const override
Returns the min or max of the requested dimension respectively.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sin(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tan
const SubdomainID _tri_subdomain_id
Subdomain ID of created tri elements (that only exist if rmin=0)
const Real _rmin
Minimum radius.
const Real _rmax
Maximum radius.
const unsigned _nr
Number of elements in radial direction.
AnnularMesh(const InputParameters ¶meters)
const bool _radians
Bool to check if radians are given in the input file.
registerMooseObject("MooseApp", AnnularMesh)
const bool _full_annulus
Whether a full annulus (as opposed to a sector) will needs to generate.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template cos(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(cos
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
const SubdomainID _quad_subdomain_id
Subdomain ID of created quad elements.
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
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 ...
const Real _len
rmax = rmin + len + len*g + len*g^2 + len*g^3 + ... + len*g^(nr-1) = rmin + len*(1 - g^nr)/(1 - g) ...
Mesh generated from parameters.
virtual Real getMaxInDimension(unsigned int component) const override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Real _dmin
Minimum angle in degrees.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
const InputParameters & parameters() const
Get the parameters of the object.
virtual Elem * elem(const dof_id_type i)
Various accessors (pointers/references) for Elem "i".
bool _dims_may_have_changed
Boolean to indicate that dimensions may have changed.
const Real _dmax
Maximum angle in degrees.
MooseUnits pow(const MooseUnits &, int)
void ErrorVector unsigned int
const unsigned _nt
Number of elements in angular direction.