11#include "libmesh/mesh_smoother_laplace.h"
16#include "libmesh/parsed_function.h"
17#include "libmesh/poly2tri_triangulator.h"
26 "num_sectors_per_side",
27 "num_sectors_per_side>0",
28 "Number of azimuthal sectors per polygon side (rotating counterclockwise from top right "
31 "background_intervals",
33 "background_intervals>0",
34 "Number of radial meshing intervals in background region (area "
35 "between rings and ducts) excluding the background's boundary layers.");
37 "background_radial_bias",
39 "background_radial_bias>0",
40 "Value used to create biasing in radial meshing for background region.");
42 "background_inner_boundary_layer_width",
44 "background_inner_boundary_layer_width>=0",
45 "Width of background region that is assigned to be the inner boundary layer.");
47 "background_inner_boundary_layer_intervals",
49 "background_inner_boundary_layer_intervals>0",
50 "Number of radial intervals of the background inner boundary layer");
52 "background_inner_boundary_layer_bias",
54 "background_inner_boundary_layer_bias>0",
55 "Growth factor used for mesh biasing of the background inner boundary layer.");
57 "background_outer_boundary_layer_width",
59 "background_outer_boundary_layer_width>=0",
60 "Width of background region that is assigned to be the outer boundary layer.");
62 "background_outer_boundary_layer_intervals",
64 "background_outer_boundary_layer_intervals>0",
65 "Number of radial intervals of the background outer boundary layer");
67 "background_outer_boundary_layer_bias",
69 "background_outer_boundary_layer_bias>0",
70 "Growth factor used for mesh biasing of the background outer boundary layer.");
71 params.
addParam<std::vector<subdomain_id_type>>(
72 "background_block_ids",
"Optional customized block id for the background block.");
73 params.
addParam<std::vector<SubdomainName>>(
74 "background_block_names",
"Optional customized block names for the background block.");
76 "duct_sizes",
"Distance(s) from polygon center to duct(s) inner boundaries.");
77 MooseEnum duct_sizes_style(
"apothem radius",
"radius");
81 "Style in which polygon center to duct inner boundary distance is "
82 "given (apothem = center to face, radius = center to vertex). Options: " +
83 duct_sizes_style.getRawNames());
87 "Number of meshing intervals in each enclosing duct excluding duct boundary layers.");
90 "duct_radial_biases>0",
91 "Values used to create biasing in radial meshing for duct regions.");
93 "duct_inner_boundary_layer_widths",
94 "duct_inner_boundary_layer_widths>=0",
95 "Widths of duct regions that are assigned to be the inner boundary layers.");
96 params.
addParam<std::vector<unsigned int>>(
97 "duct_inner_boundary_layer_intervals",
98 "Number of radial intervals of the duct inner boundary layers");
100 "duct_inner_boundary_layer_biases",
101 "duct_inner_boundary_layer_biases>0",
102 "Growth factors used for mesh biasing of the duct inner boundary layers.");
104 "duct_outer_boundary_layer_widths",
105 "duct_outer_boundary_layer_widths>=0",
106 "Widths of duct regions that are assigned to be the outer boundary layers.");
107 params.
addParam<std::vector<unsigned int>>(
108 "duct_outer_boundary_layer_intervals",
109 "Number of radial intervals of the duct outer boundary layers");
111 "duct_outer_boundary_layer_biases",
112 "duct_outer_boundary_layer_biases>0",
113 "Growth factors used for mesh biasing of the duct outer boundary layers.");
114 params.
addParam<std::vector<subdomain_id_type>>(
115 "duct_block_ids",
"Optional customized block ids for each duct geometry block.");
116 params.
addParam<std::vector<SubdomainName>>(
117 "duct_block_names",
"Optional customized block names for each duct geometry block.");
118 params.
addParam<
bool>(
"uniform_mesh_on_sides",
120 "Whether the side elements are reorganized to have a uniform size.");
121 params.
addParam<
unsigned int>(
"smoothing_max_it",
123 "Number of Laplacian smoothing iterations. This number is "
124 "disregarded when duct_sizes is present.");
128 "Whether to rotate the generated polygon mesh to ensure that one flat side faces up.");
131 "quad_center_elements",
false,
"Whether the center elements are quad or triangular.");
133 "center_quad_factor",
134 "center_quad_factor>0¢er_quad_factor<1",
135 "A fractional radius factor used to determine the radial positions of transition nodes in "
136 "the center region meshed by quad elements.");
137 params.
addParam<
bool>(
"replace_inner_ring_with_delaunay_mesh",
139 "True to replace the inner ring mesh with a Delaunay unstructured mesh");
141 "inner_ring_desired_area",
143 "Desired area as a function of x,y; omit to use the default constant area (square of the "
144 "smallest side length on the ring circle)");
147 "background_block_ids background_block_names duct_block_ids duct_block_names",
148 "Customized Subdomain/Boundary");
150 "uniform_mesh_on_sides",
151 "General Mesh Density");
153 "replace_inner_ring_with_delaunay_mesh inner_ring_desired_area ",
157 params.
addClassDescription(
"This PolygonConcentricCircleMeshGeneratorBase object is a base class "
158 "to be inherited for polygon mesh generators.");
166 _num_sides(isParamValid(
"num_sides")
167 ? getParam<unsigned
int>(
"num_sides")
168 : (isParamValid(
"hexagon_size") ? (unsigned
int)HEXAGON_NUM_SIDES
169 : (unsigned
int)SQUARE_NUM_SIDES)),
171 _duct_sizes(isParamValid(
"duct_sizes") ? getParam<
std::vector<Real>>(
"duct_sizes")
172 :
std::vector<Real>()),
173 _duct_intervals(isParamValid(
"duct_intervals")
174 ? getParam<
std::vector<unsigned
int>>(
"duct_intervals")
175 :
std::vector<unsigned
int>()),
176 _duct_radial_biases(isParamValid(
"duct_radial_biases")
177 ? getParam<
std::vector<Real>>(
"duct_radial_biases")
178 :
std::vector<Real>(_duct_intervals.size(), 1.0)),
179 _duct_inner_boundary_layer_params(
181 ? getParam<std::vector<Real>>(
"duct_inner_boundary_layer_widths")
185 ? getParam<std::vector<unsigned int>>(
"duct_inner_boundary_layer_intervals")
188 ? getParam<std::vector<Real>>(
"duct_inner_boundary_layer_biases")
190 _duct_outer_boundary_layer_params(
191 {isParamValid(
"duct_outer_boundary_layer_widths")
192 ? getParam<std::vector<Real>>(
"duct_outer_boundary_layer_widths")
193 :
std::vector<Real>(_duct_intervals.size(), 0.0),
195 isParamValid(
"duct_outer_boundary_layer_intervals")
196 ? getParam<
std::vector<unsigned
int>>(
"duct_outer_boundary_layer_intervals")
197 :
std::vector<unsigned
int>(_duct_intervals.size(), 0),
198 isParamValid(
"duct_outer_boundary_layer_biases")
199 ? getParam<
std::vector<Real>>(
"duct_outer_boundary_layer_biases")
200 :
std::vector<Real>(_duct_intervals.size(), 0.0)}),
201 _duct_block_ids(isParamValid(
"duct_block_ids")
202 ? getParam<
std::vector<subdomain_id_type>>(
"duct_block_ids")
203 :
std::vector<subdomain_id_type>()),
204 _duct_block_names(isParamValid(
"duct_block_names")
205 ? getParam<
std::vector<SubdomainName>>(
"duct_block_names")
206 :
std::vector<SubdomainName>()),
207 _has_rings(isParamValid(
"ring_radii")),
208 _has_ducts(isParamValid(
"duct_sizes")),
210 isParamValid(
"polygon_size_style")
211 ? getParam<
MooseEnum>(
"polygon_size_style").template getEnum<PolygonSizeStyle>()
212 : (isParamValid(
"hexagon_size_style")
213 ? getParam<
MooseEnum>(
"hexagon_size_style").template getEnum<PolygonSizeStyle>()
214 : getParam<
MooseEnum>(
"square_size_style")
215 .template getEnum<PolygonSizeStyle>())),
216 _polygon_size(isParamValid(
"polygon_size")
217 ? getParam<Real>(
"polygon_size")
218 : (isParamValid(
"hexagon_size") ? getParam<Real>(
"hexagon_size")
219 : (getParam<Real>(
"square_size") /
221 _num_sectors_per_side(getParam<
std::vector<unsigned
int>>(
"num_sectors_per_side")),
222 _background_intervals(getParam<unsigned
int>(
"background_intervals")),
225 _background_radial_bias(getParam<Real>(
"background_radial_bias")),
226 _background_inner_boundary_layer_params(
227 {getParam<Real>(
"background_inner_boundary_layer_width"),
229 getParam<Real>(
"background_inner_boundary_layer_width") > 0.0
230 ? getParam<unsigned int>(
"background_inner_boundary_layer_intervals")
232 getParam<Real>(
"background_inner_boundary_layer_bias")}),
234 {getParam<Real>(
"background_outer_boundary_layer_width"),
236 getParam<Real>(
"background_outer_boundary_layer_width") > 0.0
237 ? getParam<unsigned int>(
"background_outer_boundary_layer_intervals")
239 getParam<Real>(
"background_outer_boundary_layer_bias")}),
241 ?
getParam<
std::vector<subdomain_id_type>>(
"background_block_ids")
242 :
std::vector<subdomain_id_type>()),
244 ?
getParam<
std::vector<SubdomainName>>(
"background_block_names")
245 :
std::vector<SubdomainName>()),
253 :
std::vector<unsigned
int>()),
257 declareMeshProperty<bool>(
"flat_side_up", getParam<bool>(
"flat_side_up"));
258 declareMeshProperty<unsigned int>(
"background_intervals_meta", 0);
259 declareMeshProperty<Real>(
"pattern_pitch_meta", 0.0);
260 declareMeshProperty<std::vector<Real>>(
"azimuthal_angle_meta", std::vector<Real>());
261 declareMeshProperty<Real>(
"max_radius_meta", 0.0);
272 if (tri_order != quad_order)
280 if (tri_order != quad_order)
283 else if (tri_order != quad_order)
285 "the element types of triangular and quadrilateral elements must be compatible if "
286 "both types of elements are generated.");
291 paramError(
"sides_to_adapt",
"If provided, the generated mesh must be a hexagon or a square.");
295 declareMeshProperty<Real>(
"pitch_meta",
_pitch);
299 "If provided, the length of this parameter must be identical to the total number of "
303 paramError(
"outward_interface_boundary_names",
304 "If provided, the length of this parameter must be identical to the total number of "
306 const unsigned int num_total_background_layers =
311 "background_block_ids",
312 "This parameter must be either unset or have a unity length when ring_radii is "
313 "provided or the number of background intervals (including boundary layers) is unity.");
316 "background_block_names",
317 "This parameter must be either unset or have a unity length when ring_radii is "
318 "provided or the number of background intervals (including boundary layers) is unity.");
325 "This parameter must be either unset or have a length of two when ring_radii is not "
326 "provided and background intervals (including boundary layers) is not unity. It can "
327 "optionally to have a unity length if `quad_center_elements` is enabled.");
335 "This parameter must be either unset or have a length of two when ring_radii is not "
336 "provided and background intervals (including boundary layers) is not unity. It can "
337 "optionally have a unity length if `quad_center_elements` is enabled.");
340 "This parameter must have a length that is consistent with num_sides.");
343 paramError(
"num_sectors_per_side",
"This parameter must be even.");
346 if (!getParam<bool>(
"replace_inner_ring_with_delaunay_mesh") &&
349 "inner_ring_desired_area",
350 "This parameter should be set only when 'replace_inner_ring_with_delaunay_mesh=true'");
354 const unsigned int num_innermost_ring_layers =
364 (
_ring_intervals.size() + (
unsigned int)(num_innermost_ring_layers != 1)))
367 std::ostringstream debug_info;
370 debug_info <<
"ring_block_ids size is : " <<
_ring_block_ids.size() << std::endl;
371 debug_info <<
"ring_intervals size is : " <<
_ring_intervals.size() << std::endl;
372 debug_info <<
"number of innermost ring layers is : " << num_innermost_ring_layers
380 "This parameter must have the appropriate size if it is provided: "
381 "Since the number of the innermost ring layers (" +
382 std::to_string(num_innermost_ring_layers) +
383 " :first ring interval and inner/outer boundaries of the first ring) is more than "
384 "one, and we have non-quad central elements, the size of 'ring_block_ids' must be "
385 "equal to the size of 'ring_intervals' + 1.\n",
392 "This parameter must have the appropriate size if it is provided: "
393 "Since the number of the innermost ring layers (" +
394 std::to_string(num_innermost_ring_layers) +
395 " :first ring interval and inner/outer boundaries of the first ring) is more than "
396 "one, and we have quad central elements, the size of 'ring_block_ids' can be either"
397 "equal to the size of 'ring_intervals' or 'ring_intervals' + 1.\n",
408 (
_ring_intervals.size() + (
unsigned int)(num_innermost_ring_layers != 1)))
411 std::ostringstream debug_info;
414 debug_info <<
"ring_block_names size is : " <<
_ring_block_names.size() << std::endl;
415 debug_info <<
"ring_intervals size is : " <<
_ring_intervals.size() << std::endl;
416 debug_info <<
"number of innermost ring layers is : " << num_innermost_ring_layers
424 "This parameter must have the appropriate size if it is provided: "
425 "Since the number of the innermost ring layers (" +
426 std::to_string(num_innermost_ring_layers) +
427 " :first ring interval and inner/outer boundaries of the first ring) is more than "
428 "one, and we have non-quad central elements, the size of 'ring_block_names' must "
429 "be equal to the size of 'ring_intervals' + 1.\n",
436 "This parameter must have the appropriate size if it is provided: "
437 "Since the number of the innermost ring layers (" +
438 std::to_string(num_innermost_ring_layers) +
439 " :first ring interval and inner/outer boundaries of the first ring) is more than "
440 "one, and we have quad central elements, the size of 'ring_block_names' can be "
441 "either equal to the size of 'ring_intervals' or 'ring_intervals' + 1.\n",
445 for (
unsigned int i = 0; i <
_ring_radii.size(); i++)
456 paramError(
"ring_inner_boundary_layer_intervals",
457 "Ring inner boundary layer must have zero interval if its thickness is zero.");
461 paramError(
"ring_inner_boundary_layer_intervals",
462 "Ring inner boundary layer must have non-zero interval if its thickness is "
468 paramError(
"ring_outer_boundary_layer_intervals",
469 "Ring outer boundary layer must have zero interval if its thickness is zero.");
473 paramError(
"ring_outer_boundary_layer_intervals",
474 "Ring outer boundary layer must have non-zero interval if its thickness is "
479 paramError(
"ring_inner_boundary_layer_widths",
480 "Summation of ring_inner_boundary_layer_widths and "
481 "ring_outer_boundary_layer_widths cannot exceeds the ring layer width.");
486 paramError(
"duct_sizes",
"This parameter and duct_intervals must have the same length.");
488 paramError(
"duct_sizes",
"This parameter and duct_radial_biases must have the same length.");
491 "This parameter must have the same length as duct_intervals if set.");
494 "This parameter must have the same length as duct_intervals if set.");
502 "The inner and outer duct boundary layer parameters must have the same sizes as "
507 for (
unsigned int i = 0; i <
_duct_sizes.size(); i++)
509 for (
unsigned int i = 1; i <
_duct_sizes.size(); i++)
511 paramError(
"duct_sizes",
"This parameter must be strictly ascending.");
515 "This parameter must be positive and ensures no overlapping with rings.");
518 "This parameter must ensure that ducts are smaller than the polygon size.");
520 paramError(
"duct_intervals",
"Elements of this parameter must be positive.");
522 for (
unsigned int i = 0; i <
_duct_sizes.size(); i++)
527 for (
unsigned int i = 0; i <
_duct_sizes.size(); i++)
529 const Real layer_width =
541 paramError(
"duct_inner_boundary_layer_intervals",
542 "Duct inner boundary layer must have zero interval if its thickness is zero.");
546 paramError(
"duct_inner_boundary_layer_intervals",
547 "Duct inner boundary layer must have non-zero interval if its thickness is "
553 paramError(
"duct_outer_boundary_layer_intervals",
554 "Duct outer boundary layer must have zero interval if its thickness is zero.");
558 paramError(
"duct_outer_boundary_layer_intervals",
559 "Duct outer boundary layer must have non-zero interval if its thickness is "
564 paramError(
"duct_inner_boundary_layer_widths",
565 "Summation of duct_inner_boundary_layer_widths and "
566 "duct_outer_boundary_layer_widths cannot exceeds the duct layer width.");
573 const Real min_background_thickness =
581 min_background_thickness)
582 paramError(
"background_inner_boundary_layer_width",
583 "The summation of background_inner_boundary_layer_width and "
584 "background_outer_boundary_layer_width must be less than the minimum thickness of "
585 "the background region.");
591 "this parameter is only applicable if quad_center_elements is set true.");
593 declareMeshProperty<subdomain_id_type>(
594 "quad_center_block_id",
599 declareMeshProperty<subdomain_id_type>(
"quad_center_block_id",
600 libMesh::Elem::invalid_subdomain_id);
603 declareMeshProperty<bool>(
"interface_boundaries",
false);
604 declareMeshProperty<std::set<boundary_id_type>>(
"interface_boundary_ids", {});
607std::unique_ptr<MeshBase>
610 std::vector<std::unique_ptr<ReplicatedMesh>> input(
_input_ptrs.size());
613 input[i] = dynamic_pointer_cast<ReplicatedMesh>(std::move(*
_input_ptrs[i]));
615 mooseError(
"A non-replicated mesh input was supplied but replicated meshes are required.");
616 if ((
_order == 1 && (*input[i]->elements_begin())->default_order() != FIRST) ||
617 (
_order == 2 && (*input[i]->elements_begin())->default_order() == FIRST))
619 "The order of the input mesh to be adapted to does not match the order of the "
620 "mesh to be generated.");
623 unsigned int mesh_input_counter = 0;
625 std::vector<Real> azimuthal_list;
627 for (
unsigned int mesh_index = 0; mesh_index <
_num_sides; mesh_index++)
640 _num_sides == 6 ? ((Real)mesh_index * 60.0 - 150.0) : ((Real)mesh_index * 90.0 - 135.0);
641 Real upper_azi =
_num_sides == 6 ? ((Real)((mesh_index + 1) % 6) * 60.0 - 150.0)
642 : ((Real)((mesh_index + 1) % 4) * 90.0 - 135.0);
649 azimuthal_list.push_back(
651 ? ((Real)mesh_index * 60.0 - 150.0 +
654 : ((Real)mesh_index * 90.0 - 135.0 +
657 mesh_input_counter++;
664 azimuthal_list.push_back(
673 std::vector<Real> ring_radii_corr;
680 for (
unsigned int i = 0; i <
_ring_radii.size(); i++)
681 ring_radii_corr.push_back(
_ring_radii[i] * corr_factor);
685 if (ring_radii_corr.back() >=
_pitch / 2.0)
687 "Elements of this parameter must be smaller than polygon apothem (after volume "
688 "preserve correction if applicable).");
722 for (
unsigned int mesh_index = 1; mesh_index <
_num_sides; mesh_index++)
754 ReplicatedMesh other_mesh(*mesh_tmp);
755 MeshTools::Modification::rotate(other_mesh, 360.0 /
_num_sides * mesh_index, 0, 0);
756 mesh0->prepare_for_use();
757 other_mesh.prepare_for_use();
778 const Real angle_tol = 1.0e-5;
779 std::vector<std::pair<Real, unsigned int>> node_azi_list;
780 MeshTools::Modification::rotate(*mesh0, -(270.0 - 360.0 / (Real)
_num_sides), 0.0, 0.0);
781 std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>> side_list =
782 mesh0->get_boundary_info().build_side_list();
783 mesh0->get_boundary_info().build_node_list_from_side_list();
784 std::vector<std::tuple<dof_id_type, boundary_id_type>> node_list =
785 mesh0->get_boundary_info().build_node_list();
787 for (
unsigned int i = 0; i < node_list.size(); ++i)
791 node_azi_list.push_back(
792 std::make_pair(atan2((*mesh0->node_ptr(std::get<0>(node_list[i])))(1),
793 (*mesh0->node_ptr(std::get<0>(node_list[i])))(0)) *
795 std::get<0>(node_list[i])));
796 if (std::abs(node_azi_list.back().first + 180.0) <= angle_tol)
797 node_azi_list.back().first = 180.0;
800 std::sort(node_azi_list.begin(), node_azi_list.end());
807 Real x_tmp =
_pitch / 2.0;
808 Real y_tmp = x_tmp * std::tan(azi_corr_tmp);
811 Point p_tmp = Point(x_tmp, y_tmp, 0.0);
814 node_azi_list[std::accumulate(
820 MeshTools::Modification::rotate(*mesh0, (270.0 - 360.0 / (Real)
_num_sides), 0.0, 0.0);
832 unsigned int block_it = 0;
833 unsigned ring_block_num = 0;
834 std::vector<subdomain_id_type> block_ids_old;
835 std::vector<subdomain_id_type> block_ids_new;
836 std::vector<SubdomainName> block_names;
849 ? (SubdomainName)std::to_string(block_ids_new.back())
858 ? (SubdomainName)std::to_string(block_ids_new.back())
868 ? (SubdomainName)std::to_string(block_ids_new.back())
875 *mesh0, block_ids_old, block_ids_new, block_names,
"ConcentricCircleMeshGenerator");
881 mesh0->get_boundary_info().sideset_name(
884 mesh0->get_boundary_info().nodeset_name(
899 getParam<std::string>(
"ring_id_name"),
903 getParam<MooseEnum>(
"ring_id_assign_type") ==
"ring_wise",
911 std::set<boundary_id_type> boundary_ids = mesh0->get_boundary_info().get_boundary_ids();
912 std::set<boundary_id_type> interface_boundary_ids;
915 const unsigned int num_boundary_ids = boundary_ids.size();
916 for (
const auto i : make_range(num_boundary_ids))
919 auto it = boundary_ids.find(
id);
920 if (it != boundary_ids.end())
922 boundary_ids.erase(it);
923 interface_boundary_ids.insert(
id);
929 const unsigned int num_boundary_ids = boundary_ids.size();
930 for (
const auto i : make_range(num_boundary_ids))
933 auto it = boundary_ids.find(
id);
934 if (it != boundary_ids.end())
936 boundary_ids.erase(it);
937 interface_boundary_ids.insert(
id);
944 bool flat_side_up = getMeshProperty<bool>(
"flat_side_up",
name());
946 MeshTools::Modification::rotate(*mesh0, 180.0 / (Real)
_num_sides, 0.0, 0.0);
947 mesh0->unset_is_prepared();
949 if (
_has_rings && getParam<bool>(
"replace_inner_ring_with_delaunay_mesh"))
953 "Should not be set because the center elements of the inner ring will be replaced "
954 "by a Delaunay mesh with 'replace_inner_ring_with_delaunay_mesh=true'");
957 std::set<Elem *> deleteable_elems;
958 for (
auto & elem : mesh0->element_ptr_range())
959 if (elem->vertex_average().norm() < ring_radii_corr[0])
960 deleteable_elems.insert(elem);
963 BoundaryInfo & boundary_info = mesh0->get_boundary_info();
964 for (
auto & elem : deleteable_elems)
966 unsigned int n_sides = elem->n_sides();
967 for (
unsigned int n = 0; n != n_sides; ++n)
969 Elem * neighbor = elem->neighbor_ptr(n);
973 const unsigned int return_side = neighbor->which_neighbor_am_i(elem);
975 if (neighbor->neighbor_ptr(return_side) == elem)
977 neighbor->set_neighbor(return_side,
nullptr);
978 boundary_info.add_side(neighbor, return_side, boundary_id);
982 mesh0->delete_elem(elem);
987 Real min_side = std::numeric_limits<Real>::max();
988 for (
auto & elem : poly_mesh->element_ptr_range())
990 Real l = elem->volume();
1001 const auto desired_area = getParam<std::string>(
"inner_ring_desired_area");
1002 if (desired_area !=
"")
1014 poly2tri.
elem_type() = libMesh::ElemType::TRI6;
1017 poly2tri.
elem_type() = libMesh::ElemType::TRI7;
1026 for (
auto elem : poly_mesh->element_ptr_range())
1027 elem->subdomain_id() = block_ids_new[0];
1031 if (
_ring_intervals[0] != 1 && getParam<MooseEnum>(
"ring_id_assign_type") ==
"ring_wise")
1032 paramError(
"replace_inner_ring_with_delaunay_mesh",
1033 "Inner ring has multple intervals with each being assigned with a different "
1034 "ring id, replacing inner ring with Delaunay mesh will remove this ring id "
1035 "assign type. Either change 'ring_id_assign_type' to block_wise or set the "
1036 "first element of 'ring_intervals' to 1 or set "
1037 "'replace_inner_ring_with_delaunay_mesh' to false to avoid this error.");
1038 auto id_name = getParam<std::string>(
"ring_id_name");
1039 const auto extra_id_index = poly_mesh->add_elem_integer(id_name);
1040 for (
auto elem : poly_mesh->element_ptr_range())
1041 elem->set_extra_integer(extra_id_index, 1);
1046 auto id_name = getParam<std::string>(
"sector_id_name");
1047 const auto extra_id_index = poly_mesh->add_elem_integer(id_name);
1048 for (
auto elem : poly_mesh->element_ptr_range())
1049 elem->set_extra_integer(extra_id_index, 0);
1053 mesh0->stitch_meshes(*poly_mesh, boundary_id, 0, TOLERANCE,
true,
false);
1056 return dynamic_pointer_cast<MeshBase>(mesh0);
void ErrorVector unsigned int
This ConcentricCircleGeneratorBase object is a base class to be inherited for mesh generators that in...
unsigned short _order
Order of the elements to be generated.
const std::vector< Real > _ring_radial_biases
Bias values used to induce biasing to radial meshing in ring regions.
const boundary_id_type _interface_boundary_id_shift
Shift in default boundary IDs of interfaces to avert potential conflicts.
QUAD_ELEM_TYPE _quad_elem_type
Type of quadrilateral elements to be generated.
std::vector< subdomain_id_type > _ring_block_ids
Subdomain IDs of the ring regions.
const BoundaryName _external_boundary_name
Boundary Name of the mesh's external boundary.
multiBdryLayerParams _ring_inner_boundary_layer_params
Widths, fractions, radial sectors and growth factors of the inner boundary layers of the ring regions...
const std::vector< std::string > _inward_interface_boundary_names
Boundary Names of the mesh's inward interface boundaries.
const boundary_id_type _external_boundary_id
Boundary ID of the mesh's external boundary.
const bool _preserve_volumes
Volume preserving function is optional.
std::vector< SubdomainName > _ring_block_names
Subdomain Names of the ring regions.
const subdomain_id_type _block_id_shift
Shift in default subdomain IDs to avert potential conflicts with other meshes.
const std::vector< std::string > _outward_interface_boundary_names
Boundary Names of the mesh's outward interface boundaries.
multiBdryLayerParams _ring_outer_boundary_layer_params
Widths, fractions, radial sectors and growth factors of the outer boundary layers of the ring regions...
static InputParameters validParams()
const std::vector< unsigned int > _ring_intervals
Number of rings in each circle or in the enclosing square.
void ringBlockIdsNamesPreparer(unsigned int &block_counter, unsigned int &ring_block_num, std::vector< subdomain_id_type > &block_ids_old, std::vector< subdomain_id_type > &block_ids_new, std::vector< SubdomainName > &block_names) const
Prepare user-defined ring block IDs and names to replace the default ones.
const std::vector< Real > _ring_radii
Radii of concentric circles.
const bool _generate_side_specific_boundaries
Whether the side-specific external boundaries are generated or not.
void assignInterfaceBoundaryNames(ReplicatedMesh &mesh) const
Assign interface boundary names to the mesh if applicable.
const bool _create_inward_interface_boundaries
Whether inward interface boundaries are created.
void assignBlockIdsNames(ReplicatedMesh &mesh, std::vector< subdomain_id_type > &block_ids_old, std::vector< subdomain_id_type > &block_ids_new, std::vector< SubdomainName > &block_names, const std::string &generator_name) const
Assign block IDs and names to the mesh if applicable.
const bool _create_outward_interface_boundaries
Whether outward interface boundaries are created.
TRI_ELEM_TYPE _tri_elem_type
Type of triangular elements to be generated.
T & setMeshProperty(const std::string &data_name, Args &&... args)
T & declareMeshProperty(const std::string &data_name, Args &&... args)
const std::string & name() const
void paramError(const std::string ¶m, Args... args) const
bool isParamSetByUser(const std::string &name) const
void mooseError(Args &&... args) const
const T & getParam(const std::string &name) const
bool isParamValid(const std::string &name) const
const std::vector< SubdomainName > _duct_block_names
Subdomain Names of the duct regions.
const bool _quad_center_elements
Whether the central elements need to be QUAD4.
const bool _has_ducts
Whether the generated mesh contains duct regions.
multiBdryLayerParams _duct_outer_boundary_layer_params
Widths, fractions, radial sectors and growth factors of the inner boundary layers of the duct regions...
bool _is_general_polygon
MeshMetaData: whether this produced mesh is a general polygon (or a hexagon)
const Real _center_quad_factor
A fractional radius factor used to determine the radial positions of transition nodes in the center r...
const std::vector< subdomain_id_type > _duct_block_ids
Subdomain IDs of the duct regions.
std::vector< SubdomainName > _background_block_names
Subdomain Names of the background regions.
singleBdryLayerParams _background_inner_boundary_layer_params
Width, fraction, radiation sectors and growth factor of the inner boundary layer of the background re...
std::vector< Real > _duct_sizes
Size parameters of the duct regions.
const bool _uniform_mesh_on_sides
Whether the nodes on the external boundary needs to be uniformly distributed.
const bool _has_rings
Whether the generated mesh contains ring regions.
singleBdryLayerParams _background_outer_boundary_layer_params
Width, fraction, radiation sectors and growth factor of the outer boundary layer of the background re...
std::vector< subdomain_id_type > _background_block_ids
Subdomain IDs of the background regions.
const Real _background_radial_bias
Bias value used to induce biasing to radial meshing in background region.
const PolygonSizeStyle _duct_sizes_style
Thickness of each enclosing duct.
const PolygonSizeStyle _polygon_size_style
Type of polygon size parameter.
const std::vector< unsigned int > _num_sectors_per_side
Mesh sector number of each polygon side.
const std::vector< unsigned int > _duct_intervals
Number of layers in each enclosing duct.
const Real _polygon_size
Polygon size parameter.
dof_id_type & _node_id_background_meta
MeshMetaData: maximum node id of the background region.
multiBdryLayerParams _duct_inner_boundary_layer_params
Widths, fractions, radial sectors and growth factors of the inner boundary layers of the duct regions...
const unsigned int _num_sides
Number of polygon sides.
const std::vector< Real > _duct_radial_biases
Bias values used to induce biasing to radial meshing in duct regions.
std::vector< std::unique_ptr< MeshBase > * > _input_ptrs
Pointers to input mesh pointers.
Real _pitch
Pitch size of the produced polygon.
const unsigned int _background_intervals
Numbers of radial intervals of the background regions.
bool & _is_control_drum_meta
MeshMetaData: whether this produced mesh is a control drum.
std::unique_ptr< MeshBase > generate() override
static InputParameters validParams()
const unsigned int _smoothing_max_it
Maximum smooth iteration number.
std::vector< std::vector< Real > > _azimuthal_angles_array
Azimuthal angles of all radial nodes for volume preservation.
const std::vector< unsigned int > _sides_to_adapt
Indices of the hexagon sides that need to adapt.
PolygonConcentricCircleMeshGeneratorBase(const InputParameters ¶meters)
std::vector< Real > azimuthalAnglesCollector(ReplicatedMesh &mesh, std::vector< Point > &boundary_points, const Real lower_azi=-30.0, const Real upper_azi=30.0, const unsigned int return_type=ANGLE_TANGENT, const unsigned int num_sides=6, const boundary_id_type bid=OUTER_SIDESET_ID, const bool calculate_origin=true, const Real input_origin_x=0.0, const Real input_origin_y=0.0, const Real tol=1.0E-10) const
Collects sorted azimuthal angles of the external boundary.
void setRingExtraIDs(MeshBase &mesh, const std::string id_name, const unsigned int num_sides, const std::vector< unsigned int > num_sectors_per_side, const std::vector< unsigned int > ring_intervals, const bool ring_wise_id, const bool quad_center_elements)
assign ring extra ids to polygon mesh
PolygonSizeStyle
An enum class for style of input polygon size.
static void addRingAndSectorIDParams(InputParameters ¶ms)
Add InputParameters which are used by ring and sector IDs.
void nodeCoordRotate(Real &x, Real &y, const Real theta) const
Calculates x and y coordinates after rotating by theta angle.
void setSectorExtraIDs(MeshBase &mesh, const std::string id_name, const unsigned int num_sides, const std::vector< unsigned int > num_sectors_per_side)
assign sector extra ids to polygon mesh
std::unique_ptr< ReplicatedMesh > buildSimpleSlice(std::vector< Real > ring_radii, const std::vector< unsigned int > ring_layers, const std::vector< Real > ring_radial_biases, const multiBdryLayerParams &ring_inner_boundary_layer_params, const multiBdryLayerParams &ring_outer_boundary_layer_params, std::vector< Real > ducts_center_dist, const std::vector< unsigned int > ducts_layers, const std::vector< Real > duct_radial_biases, const multiBdryLayerParams &duct_inner_boundary_layer_params, const multiBdryLayerParams &duct_outer_boundary_layer_params, const Real pitch, const unsigned int num_sectors_per_side, const unsigned int background_intervals, const Real background_radial_bias, const singleBdryLayerParams &background_inner_boundary_layer_params, const singleBdryLayerParams &background_outer_boundary_layer_params, dof_id_type &node_id_background_meta, const unsigned int side_number, const unsigned int side_index, const std::vector< Real > azimuthal_tangent=std::vector< Real >(), const subdomain_id_type block_id_shift=0, const bool quad_center_elements=false, const Real center_quad_factor=0.0, const bool create_inward_interface_boundaries=false, const bool create_outward_interface_boundaries=true, const boundary_id_type boundary_id_shift=0, const bool generate_side_specific_boundaries=true, const TRI_ELEM_TYPE tri_elem_type=TRI_ELEM_TYPE::TRI3, const QUAD_ELEM_TYPE quad_elem_type=QUAD_ELEM_TYPE::QUAD4)
Creates a mesh of a slice that corresponds to a single side of the polygon to be generated.
virtual void smooth() override
virtual void set_refine_boundary_allowed(bool refine_bdy_allowed) override
virtual void set_desired_area_function(FunctionBase< Real > *desired) override
virtual void triangulate() override
TriangulationType & triangulation_type()
bool & smooth_after_generating()
void set_verify_hole_boundaries(bool v)
void set_fixup_tri7_center_nodes(bool v)
void set_interpolate_boundary_points(int n_points)
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template cos(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(cos
std::unique_ptr< ReplicatedMesh > buildBoundaryMesh(const MeshBase &input_mesh, const boundary_id_type boundary_id)
std::vector< BoundaryID > getBoundaryIDs(const libMesh::MeshBase &mesh, const std::vector< BoundaryName > &boundary_name, bool generate_unknown, const std::set< BoundaryID > &mesh_boundary_ids)
Real radiusCorrectionFactor(const std::vector< Real > &azimuthal_list, const bool full_circle=true, const unsigned int order=1, const bool is_first_value_vertex=true)
Makes radial correction to preserve ring area.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< Real > widths
std::vector< unsigned int > intervals
std::vector< Real > biases
std::vector< Real > fractions