24 "A base class that contains common members for Reactor module mesh generators.");
34 std::unique_ptr<MeshBase>
41 std::unique_ptr<ReplicatedMesh>
44 const std::vector<unsigned int> ring_layers,
45 const std::vector<Real> ring_radial_biases,
48 std::vector<Real> ducts_center_dist,
49 const std::vector<unsigned int> ducts_layers,
50 const std::vector<Real> duct_radial_biases,
53 const Real primary_side_length,
54 const Real secondary_side_length,
55 const unsigned int num_sectors_per_side,
56 const unsigned int background_intervals,
57 const Real background_radial_bias,
61 const Real azimuthal_angle,
62 const std::vector<Real> azimuthal_tangent,
63 const unsigned int side_index,
64 const bool quad_center_elements,
65 const Real center_quad_factor,
66 const Real rotation_angle,
67 const bool generate_side_specific_boundaries)
69 const Real virtual_pitch = 2.0 * primary_side_length *
cos(azimuthal_angle / 360.0 * M_PI);
70 const Real virtual_side_number = 360.0 / azimuthal_angle;
71 const Real pitch_scale_factor = secondary_side_length / primary_side_length;
76 ring_inner_boundary_layer_params,
77 ring_outer_boundary_layer_params,
81 duct_inner_boundary_layer_params,
82 duct_outer_boundary_layer_params,
86 background_radial_bias,
87 background_inner_boundary_layer_params,
88 background_outer_boundary_layer_params,
89 node_id_background_meta,
100 generate_side_specific_boundaries);
101 MeshTools::Modification::rotate(*
mesh, rotation_angle, 0, 0);
105 std::unique_ptr<ReplicatedMesh>
108 const std::vector<unsigned int> ring_layers,
109 const std::vector<Real> ring_radial_biases,
112 std::vector<Real> ducts_center_dist,
113 const std::vector<unsigned int> ducts_layers,
114 const std::vector<Real> duct_radial_biases,
118 const unsigned int num_sectors_per_side,
119 const unsigned int background_intervals,
120 const Real background_radial_bias,
124 const unsigned int side_number,
125 const unsigned int side_index,
126 const std::vector<Real> azimuthal_tangent,
128 const bool quad_center_elements,
129 const Real center_quad_factor,
130 const bool create_inward_interface_boundaries,
131 const bool create_outward_interface_boundaries,
133 const bool generate_side_specific_boundaries,
140 ring_inner_boundary_layer_params,
141 ring_outer_boundary_layer_params,
145 duct_inner_boundary_layer_params,
146 duct_outer_boundary_layer_params,
148 num_sectors_per_side,
149 background_intervals,
150 background_radial_bias,
151 background_inner_boundary_layer_params,
152 background_outer_boundary_layer_params,
153 node_id_background_meta,
158 quad_center_elements,
160 create_inward_interface_boundaries,
161 create_outward_interface_boundaries,
164 generate_side_specific_boundaries,
169 std::unique_ptr<ReplicatedMesh>
172 const std::vector<unsigned int> ring_layers,
173 const std::vector<Real> ring_radial_biases,
176 std::vector<Real> ducts_center_dist,
177 const std::vector<unsigned int> ducts_layers,
178 const std::vector<Real> duct_radial_biases,
182 const unsigned int num_sectors_per_side,
183 const unsigned int background_intervals,
184 const Real background_radial_bias,
188 const Real virtual_side_number,
189 const unsigned int side_index,
190 const std::vector<Real> azimuthal_tangent,
192 const bool quad_center_elements,
193 const Real center_quad_factor,
194 const bool create_inward_interface_boundaries,
195 const bool create_outward_interface_boundaries,
197 const Real pitch_scale_factor,
198 const bool generate_side_specific_boundaries,
206 ", an incompatible elements type combination is used when calling " 207 "PolygonMeshGeneratorBase::buildSlice().");
213 std::vector<unsigned int> mod_ring_layers(ring_layers);
215 mod_ring_layers.begin(), mod_ring_layers.end(), [&order](
unsigned int & n) { n *= order; });
218 std::vector<Real> mod_ring_radial_biases(ring_radial_biases);
219 std::for_each(mod_ring_radial_biases.begin(),
220 mod_ring_radial_biases.end(),
223 std::vector<unsigned int> mod_ducts_layers(ducts_layers);
225 mod_ducts_layers.begin(), mod_ducts_layers.end(), [&order](
unsigned int & n) { n *= order; });
227 std::vector<Real> mod_duct_radial_biases(duct_radial_biases);
228 std::for_each(mod_duct_radial_biases.begin(),
229 mod_duct_radial_biases.end(),
232 const unsigned int mod_num_sectors_per_side = num_sectors_per_side * order;
233 const unsigned int mod_background_intervals = background_intervals * order;
235 const Real mod_background_radial_bias =
std::pow(background_radial_bias, 1.0 / order);
237 const auto mod_ring_inner_boundary_layer_params =
239 const auto mod_ring_outer_boundary_layer_params =
241 const auto mod_duct_inner_boundary_layer_params =
243 const auto mod_duct_outer_boundary_layer_params =
246 const auto mod_background_inner_boundary_layer_params =
248 const auto mod_background_outer_boundary_layer_params =
253 std::vector<Real> mod_ducts_center_dist(ducts_center_dist);
256 bool has_ducts(ducts_center_dist.size());
257 bool has_background(background_intervals);
262 const auto main_background_bias_terms =
264 const auto inner_background_bias_terms =
266 background_inner_boundary_layer_params.
intervals);
267 const auto outer_background_bias_terms =
269 background_outer_boundary_layer_params.
intervals);
272 ring_inner_boundary_layer_params,
273 ring_outer_boundary_layer_params);
276 duct_inner_boundary_layer_params,
277 duct_outer_boundary_layer_params);
279 const auto mod_main_background_bias_terms =
281 const auto mod_inner_background_bias_terms =
283 mod_background_inner_boundary_layer_params.intervals);
284 const auto mod_outer_background_bias_terms =
286 mod_background_outer_boundary_layer_params.intervals);
289 mod_ring_inner_boundary_layer_params,
290 mod_ring_outer_boundary_layer_params);
293 mod_duct_inner_boundary_layer_params,
294 mod_duct_outer_boundary_layer_params);
296 std::vector<unsigned int> total_ring_layers;
297 for (
unsigned int i = 0; i < ring_layers.size(); i++)
298 total_ring_layers.push_back(ring_layers[i] + ring_inner_boundary_layer_params.
intervals[i] +
299 ring_outer_boundary_layer_params.
intervals[i]);
301 if (background_inner_boundary_layer_params.
intervals)
303 total_ring_layers.push_back(background_inner_boundary_layer_params.
intervals);
304 rings_bias_terms.push_back(inner_background_bias_terms);
306 background_inner_boundary_layer_params.
width);
309 std::vector<unsigned int> mod_total_ring_layers;
310 for (
unsigned int i = 0; i < mod_ring_layers.size(); i++)
311 mod_total_ring_layers.push_back(mod_ring_layers[i] +
312 mod_ring_inner_boundary_layer_params.intervals[i] +
313 mod_ring_outer_boundary_layer_params.intervals[i]);
315 if (mod_background_inner_boundary_layer_params.intervals)
317 mod_total_ring_layers.push_back(mod_background_inner_boundary_layer_params.intervals);
318 mod_rings_bias_terms.push_back(mod_inner_background_bias_terms);
319 mod_ring_radii.push_back((mod_ring_radii.empty() ? 0.0 : mod_ring_radii.back()) +
320 mod_background_inner_boundary_layer_params.width);
324 std::vector<unsigned int> total_ducts_layers;
325 if (background_outer_boundary_layer_params.
intervals)
327 total_ducts_layers.push_back(background_outer_boundary_layer_params.
intervals);
328 duct_bias_terms.insert(duct_bias_terms.begin(), outer_background_bias_terms);
329 ducts_center_dist.insert(ducts_center_dist.begin(),
330 (ducts_center_dist.empty()
331 ?
pitch / 2.0 / std::cos(M_PI / virtual_side_number)
332 : ducts_center_dist.front()) -
333 background_outer_boundary_layer_params.
width);
336 for (
unsigned int i = 0; i < ducts_layers.size(); i++)
337 total_ducts_layers.push_back(ducts_layers[i] + duct_inner_boundary_layer_params.
intervals[i] +
338 duct_outer_boundary_layer_params.
intervals[i]);
340 std::vector<unsigned int> mod_total_ducts_layers;
341 if (mod_background_outer_boundary_layer_params.intervals)
343 mod_total_ducts_layers.push_back(mod_background_outer_boundary_layer_params.intervals);
344 mod_duct_bias_terms.insert(mod_duct_bias_terms.begin(), mod_outer_background_bias_terms);
345 mod_ducts_center_dist.insert(mod_ducts_center_dist.begin(),
346 (mod_ducts_center_dist.empty()
347 ?
pitch / 2.0 / std::cos(M_PI / virtual_side_number)
348 : mod_ducts_center_dist.front()) -
349 mod_background_outer_boundary_layer_params.width);
352 for (
unsigned int i = 0; i < mod_ducts_layers.size(); i++)
353 mod_total_ducts_layers.push_back(mod_ducts_layers[i] +
354 mod_duct_inner_boundary_layer_params.intervals[i] +
355 mod_duct_outer_boundary_layer_params.intervals[i]);
357 unsigned int angle_number = azimuthal_tangent.size() == 0
358 ? num_sectors_per_side
359 : ((azimuthal_tangent.size() - 1) / order);
360 unsigned int mod_angle_number =
361 azimuthal_tangent.size() == 0 ? mod_num_sectors_per_side : (azimuthal_tangent.size() - 1);
364 const Real corner_to_corner =
365 pitch / std::cos(M_PI / virtual_side_number);
366 const Real corner_p[2][2] = {
367 {0.0, 0.5 * corner_to_corner},
368 {0.5 * corner_to_corner * pitch_scale_factor * std::sin(2.0 * M_PI / virtual_side_number),
369 0.5 * corner_to_corner * pitch_scale_factor * std::cos(2.0 * M_PI / virtual_side_number)}};
370 const unsigned int div_num = angle_number / 2 + 1;
371 const unsigned int mod_div_num = mod_angle_number / 2 + 1;
374 std::vector<std::vector<Node *>> nodes(mod_div_num, std::vector<Node *>(mod_div_num));
375 if (quad_center_elements)
380 ring_radii_0 =
ring_radii.front() * mod_rings_bias_terms.front()[order - 1];
382 ring_radii_0 = mod_ducts_center_dist.front() * std::cos(M_PI / virtual_side_number) *
383 mod_main_background_bias_terms[order - 1];
385 ring_radii_0 =
pitch / 2.0 * mod_main_background_bias_terms[order - 1];
390 center_quad_factor == 0.0 ? (((
Real)div_num - 1.0) / (
Real)div_num) : center_quad_factor;
392 centerNodes(*
mesh, virtual_side_number, mod_div_num, ring_radii_0, nodes);
401 mod_total_ring_layers,
402 mod_rings_bias_terms,
403 mod_num_sectors_per_side,
413 Real background_corner_radial_interval_length;
414 Real background_corner_distance;
424 background_out = mod_ducts_center_dist.front();
425 background_corner_distance =
426 mod_ducts_center_dist
431 background_out = 0.5 * corner_to_corner;
432 background_corner_distance =
433 0.5 * corner_to_corner;
436 background_corner_radial_interval_length =
437 (background_out - background_in) / mod_background_intervals;
443 mod_num_sectors_per_side,
444 mod_background_intervals,
445 mod_main_background_bias_terms,
446 background_corner_distance,
447 background_corner_radial_interval_length,
457 &mod_ducts_center_dist,
458 mod_total_ducts_layers,
460 mod_num_sectors_per_side,
476 bool is_central_region_independent;
477 if (ring_layers.empty())
478 is_central_region_independent = mod_background_inner_boundary_layer_params.intervals +
479 mod_background_intervals +
480 mod_background_outer_boundary_layer_params.intervals ==
483 is_central_region_independent = mod_ring_layers[0] +
484 mod_ring_inner_boundary_layer_params.intervals[0] +
485 mod_ring_outer_boundary_layer_params.intervals[0] ==
491 if (quad_center_elements)
495 create_outward_interface_boundaries && is_central_region_independent,
498 (!has_rings) && (!has_ducts) && (background_intervals == 1),
503 generate_side_specific_boundaries,
508 num_sectors_per_side,
511 create_outward_interface_boundaries && is_central_region_independent,
513 ((!has_rings) && (!has_ducts) && (background_intervals == 1)) ||
514 ((!has_background) &&
515 (std::accumulate(total_ring_layers.begin(), total_ring_layers.end(), 0) == 1)),
519 generate_side_specific_boundaries,
527 std::vector<unsigned int> subdomain_rings;
530 subdomain_rings = total_ring_layers;
531 subdomain_rings.front() -= 1;
532 if (background_inner_boundary_layer_params.
intervals)
534 subdomain_rings.back() =
535 background_inner_boundary_layer_params.
intervals + background_intervals +
536 background_outer_boundary_layer_params.
intervals;
538 subdomain_rings.back() -= 1;
540 else if (has_background)
541 subdomain_rings.push_back(background_inner_boundary_layer_params.
intervals +
542 background_intervals +
543 background_outer_boundary_layer_params.
intervals);
547 subdomain_rings.push_back(
548 background_inner_boundary_layer_params.
intervals + background_intervals +
549 background_outer_boundary_layer_params.
intervals);
550 subdomain_rings[0] -= 1;
554 for (
unsigned int i = (background_outer_boundary_layer_params.
intervals > 0);
555 i < total_ducts_layers.size();
557 subdomain_rings.push_back(total_ducts_layers[i]);
560 num_sectors_per_side,
565 quad_center_elements ? (mod_div_num * mod_div_num - 1) : 0,
566 create_inward_interface_boundaries,
567 create_outward_interface_boundaries,
569 generate_side_specific_boundaries,
578 const Real virtual_side_number,
579 const unsigned int div_num,
580 const Real ring_radii_0,
581 std::vector<std::vector<Node *>> & nodes)
const 583 const std::pair<Real, Real> p_origin = std::make_pair(0.0, 0.0);
584 const std::pair<Real, Real> p_bottom =
585 std::make_pair(0.0, ring_radii_0 * std::cos(M_PI / virtual_side_number));
586 const std::pair<Real, Real> p_top =
587 std::make_pair(p_bottom.second * std::sin(2.0 * M_PI / virtual_side_number),
588 p_bottom.second * std::cos(2.0 * M_PI / virtual_side_number));
589 const std::pair<Real, Real> p_diag =
590 std::make_pair(ring_radii_0 * std::sin(M_PI / virtual_side_number),
591 ring_radii_0 * std::cos(M_PI / virtual_side_number));
627 for (
unsigned int i = 0; i < div_num; i++)
629 unsigned int id_x = 0;
630 unsigned int id_y = i;
631 for (
unsigned int j = 0;
j < 2 * i + 1;
j++)
633 std::pair<Real, Real> p1 = std::make_pair(
634 (p_origin.first * (div_num - 1 - id_x) + p_top.first * id_x) / (div_num - 1),
635 (p_origin.second * (div_num - 1 - id_x) + p_top.second * id_x) / (div_num - 1));
636 std::pair<Real, Real> p2 = std::make_pair(
637 (p_bottom.first * (div_num - 1 - id_x) + p_diag.first * id_x) / (div_num - 1),
638 (p_bottom.second * (div_num - 1 - id_x) + p_diag.second * id_x) / (div_num - 1));
639 std::pair<Real, Real> p3 = std::make_pair(
640 (p_origin.first * (div_num - 1 - id_y) + p_bottom.first * id_y) / (div_num - 1),
641 (p_origin.second * (div_num - 1 - id_y) + p_bottom.second * id_y) / (div_num - 1));
642 std::pair<Real, Real> p4 = std::make_pair(
643 (p_top.first * (div_num - 1 - id_y) + p_diag.first * id_y) / (div_num - 1),
644 (p_top.second * (div_num - 1 - id_y) + p_diag.second * id_y) / (div_num - 1));
658 const std::vector<unsigned int> ring_layers,
659 const std::vector<std::vector<Real>> biased_terms,
660 const unsigned int num_sectors_per_side,
661 const Real corner_p[2][2],
662 const Real corner_to_corner,
663 const std::vector<Real> azimuthal_tangent)
const 665 const unsigned int angle_number =
666 azimuthal_tangent.size() == 0 ? num_sectors_per_side : (azimuthal_tangent.size() - 1);
669 for (
unsigned int l = 0; l < ring_layers.size(); l++)
672 const Real pin_radius_interval_length =
677 for (
unsigned int k = 0;
k < ring_layers[l];
k++)
679 const Real bin_radial_distance =
680 l == 0 ? (biased_terms[l][
k] * ring_layers[l] *
681 pin_radius_interval_length)
684 biased_terms[l][
k] * ring_layers[l] * pin_radius_interval_length);
685 const Real pin_corner_p_x = corner_p[0][0] * bin_radial_distance / (0.5 * corner_to_corner);
686 const Real pin_corner_p_y = corner_p[0][1] * bin_radial_distance / (0.5 * corner_to_corner);
692 for (
unsigned int j = 1;
j <= angle_number;
j++)
694 const Real cell_boundary_p_x =
695 corner_p[0][0] + (corner_p[1][0] - corner_p[0][0]) *
696 (azimuthal_tangent.size() == 0 ? ((
Real)
j / (
Real)angle_number)
697 : (azimuthal_tangent[
j] / 2.0));
698 const Real cell_boundary_p_y =
699 corner_p[0][1] + (corner_p[1][1] - corner_p[0][1]) *
700 (azimuthal_tangent.size() == 0 ? ((
Real)
j / (
Real)angle_number)
701 : (azimuthal_tangent[
j] / 2.0));
704 const Real pin_azimuthal_p_x =
705 cell_boundary_p_x * bin_radial_distance /
706 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
707 const Real pin_azimuthal_p_y =
708 cell_boundary_p_y * bin_radial_distance /
709 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
721 const unsigned int num_sectors_per_side,
722 const unsigned int background_intervals,
723 const std::vector<Real> biased_terms,
724 const Real background_corner_distance,
725 const Real background_corner_radial_interval_length,
726 const Real corner_p[2][2],
727 const Real corner_to_corner,
728 const Real background_in,
729 const std::vector<Real> azimuthal_tangent)
const 731 unsigned int angle_number =
732 azimuthal_tangent.size() == 0 ? num_sectors_per_side : (azimuthal_tangent.size() - 1);
733 for (
unsigned int k = 0;
k < (background_intervals);
k++)
735 const Real background_corner_p_x =
736 background_corner_distance / (0.5 * corner_to_corner) * corner_p[0][0] *
738 biased_terms[
k] * background_intervals * background_corner_radial_interval_length) /
739 background_corner_distance;
740 const Real background_corner_p_y =
741 background_corner_distance / (0.5 * corner_to_corner) * corner_p[0][1] *
743 biased_terms[
k] * background_intervals * background_corner_radial_interval_length) /
744 background_corner_distance;
750 for (
unsigned int j = 1;
j <= angle_number;
j++)
752 const Real cell_boundary_p_x =
753 background_corner_distance / (0.5 * corner_to_corner) *
754 (corner_p[0][0] + (corner_p[1][0] - corner_p[0][0]) *
755 (azimuthal_tangent.size() == 0 ? ((
Real)
j / (
Real)angle_number)
756 : (azimuthal_tangent[
j] / 2.0)));
757 const Real cell_boundary_p_y =
758 background_corner_distance / (0.5 * corner_to_corner) *
759 (corner_p[0][1] + (corner_p[1][1] - corner_p[0][1]) *
760 (azimuthal_tangent.size() == 0 ? ((
Real)
j / (
Real)angle_number)
761 : (azimuthal_tangent[
j] / 2.0)));
764 const Real pin_boundary_p_x =
765 cell_boundary_p_x * background_in /
766 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
767 const Real pin_boundary_p_y =
768 cell_boundary_p_y * background_in /
769 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
772 const Real background_radial_interval =
773 std::sqrt(Utility::pow<2>(cell_boundary_p_x - pin_boundary_p_x) +
774 Utility::pow<2>(cell_boundary_p_y - pin_boundary_p_y)) /
775 background_intervals;
776 const Real background_azimuthal_p_x =
778 (background_in + biased_terms[
k] * background_intervals * background_radial_interval) /
779 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
780 const Real background_azimuthal_p_y =
782 (background_in + biased_terms[
k] * background_intervals * background_radial_interval) /
783 std::sqrt(Utility::pow<2>(cell_boundary_p_x) + Utility::pow<2>(cell_boundary_p_y));
793 std::vector<Real> *
const ducts_center_dist,
794 const std::vector<unsigned int> ducts_layers,
795 const std::vector<std::vector<Real>> biased_terms,
796 const unsigned int num_sectors_per_side,
797 const Real corner_p[2][2],
798 const Real corner_to_corner,
799 const std::vector<Real> azimuthal_tangent)
const 801 unsigned int angle_number =
802 azimuthal_tangent.size() == 0 ? num_sectors_per_side : (azimuthal_tangent.size() - 1);
805 .push_back(0.5 * corner_to_corner);
806 std::vector<Real> duct_radius_interval_length(ducts_layers.size());
808 Real bin_radial_distance;
809 for (
unsigned int l = 0; l < ducts_layers.size(); l++)
811 duct_radius_interval_length[l] =
812 ((*ducts_center_dist)[l + 1] - (*ducts_center_dist)[l]) /
816 for (
unsigned int k = 0;
k < ducts_layers[l];
k++)
818 bin_radial_distance = ((*ducts_center_dist)[l] +
819 biased_terms[l][
k] * ducts_layers[l] * duct_radius_interval_length[l]);
820 const Real pin_corner_p_x = corner_p[0][0] * bin_radial_distance / (0.5 * corner_to_corner);
821 const Real pin_corner_p_y = corner_p[0][1] * bin_radial_distance / (0.5 * corner_to_corner);
827 for (
unsigned int j = 1;
j <= angle_number;
j++)
829 const Real cell_boundary_p_x =
830 corner_p[0][0] + (corner_p[1][0] - corner_p[0][0]) *
831 (azimuthal_tangent.size() == 0 ? ((
Real)
j / (
Real)angle_number)
832 : (azimuthal_tangent[
j] / 2.0));
833 const Real cell_boundary_p_y =
834 corner_p[0][1] + (corner_p[1][1] - corner_p[0][1]) *
835 (azimuthal_tangent.size() == 0 ? ((
Real)
j / (
Real)angle_number)
836 : (azimuthal_tangent[
j] / 2.0));
839 const Real pin_azimuthal_p_x =
840 cell_boundary_p_x * bin_radial_distance / (0.5 * corner_to_corner);
841 const Real pin_azimuthal_p_y =
842 cell_boundary_p_y * bin_radial_distance / (0.5 * corner_to_corner);
854 const unsigned int div_num,
856 const bool create_outward_interface_boundaries,
858 std::vector<std::vector<Node *>> & nodes,
859 const bool assign_external_boundary,
860 const unsigned int side_index,
861 const bool generate_side_specific_boundaries,
868 for (
unsigned int i = 0; i < div_num - 1; i++)
870 unsigned int id_x = 0;
871 unsigned int id_y = i;
872 for (
unsigned int j = 0;
j < 2 * i + 1;
j++)
874 std::unique_ptr<Elem> new_elem;
877 new_elem = std::make_unique<Quad4>();
878 new_elem->set_node(0, nodes[id_x][id_y]);
879 new_elem->set_node(3, nodes[id_x][id_y + 1]);
880 new_elem->set_node(2, nodes[id_x + 1][id_y + 1]);
881 new_elem->set_node(1, nodes[id_x + 1][id_y]);
882 new_elem->subdomain_id() = 1 + block_id_shift;
886 new_elem = std::make_unique<Quad8>();
889 new_elem = std::make_unique<Quad9>();
890 new_elem->set_node(8, nodes[id_x * 2 + 1][id_y * 2 + 1]);
892 new_elem->set_node(0, nodes[id_x * 2][id_y * 2]);
893 new_elem->set_node(3, nodes[id_x * 2][id_y * 2 + 2]);
894 new_elem->set_node(2, nodes[id_x * 2 + 2][id_y * 2 + 2]);
895 new_elem->set_node(1, nodes[id_x * 2 + 2][id_y * 2]);
896 new_elem->set_node(4, nodes[id_x * 2 + 1][id_y * 2]);
897 new_elem->set_node(5, nodes[id_x * 2 + 2][id_y * 2 + 1]);
898 new_elem->set_node(6, nodes[id_x * 2 + 1][id_y * 2 + 2]);
899 new_elem->set_node(7, nodes[id_x * 2][id_y * 2 + 1]);
900 new_elem->subdomain_id() = 1 + block_id_shift;
915 for (
unsigned int i = (div_num - 1) * (div_num - 1); i < div_num * div_num - 1; i++)
917 std::unique_ptr<Elem> new_elem;
920 new_elem = std::make_unique<Quad4>();
922 new_elem->set_node(3,
mesh.
node_ptr(i + 2 * div_num - 1));
928 new_elem = std::make_unique<Quad8>();
931 new_elem = std::make_unique<Quad9>();
932 new_elem->set_node(8,
934 (i - (div_num - 1) * (div_num - 1)) * 2 + 1 +
935 ((div_num - 1) * 4 + 1)));
937 new_elem->set_node(0,
939 (i - (div_num - 1) * (div_num - 1)) * 2));
940 new_elem->set_node(3,
942 (i - (div_num - 1) * (div_num - 1)) * 2 +
943 ((div_num - 1) * 4 + 1) * 2));
944 new_elem->set_node(2,
946 (i - (div_num - 1) * (div_num - 1)) * 2 + 2 +
947 ((div_num - 1) * 4 + 1) * 2));
948 new_elem->set_node(1,
950 (i - (div_num - 1) * (div_num - 1)) * 2 + 2));
951 new_elem->set_node(4,
953 (i - (div_num - 1) * (div_num - 1)) * 2 + 1));
954 new_elem->set_node(5,
956 (i - (div_num - 1) * (div_num - 1)) * 2 + 2 +
957 ((div_num - 1) * 4 + 1)));
958 new_elem->set_node(6,
960 (i - (div_num - 1) * (div_num - 1)) * 2 + 1 +
961 ((div_num - 1) * 4 + 1) * 2));
962 new_elem->set_node(7,
964 (i - (div_num - 1) * (div_num - 1)) * 2 +
965 ((div_num - 1) * 4 + 1)));
970 if (create_outward_interface_boundaries)
971 boundary_info.
add_side(elem_Quad, 2, 1 + boundary_id_shift);
972 if (i == (div_num - 1) * (div_num - 1))
974 if (i == div_num * div_num - 2)
976 if (assign_external_boundary)
979 if (generate_side_specific_boundaries)
990 const unsigned int num_sectors_per_side,
991 const std::vector<Real> azimuthal_tangent,
993 const bool create_outward_interface_boundaries,
995 const bool assign_external_boundary,
996 const unsigned int side_index,
997 const bool generate_side_specific_boundaries,
1001 unsigned int angle_number = azimuthal_tangent.size() == 0
1002 ? num_sectors_per_side
1003 : ((azimuthal_tangent.size() - 1) / order);
1006 for (
unsigned int i = 1; i <= angle_number; i++)
1008 std::unique_ptr<Elem> new_elem;
1011 new_elem = std::make_unique<Tri3>();
1018 new_elem = std::make_unique<Tri6>();
1021 new_elem = std::make_unique<Tri7>();
1025 new_elem->set_node(2,
mesh.
node_ptr(i * 2 + angle_number * order));
1026 new_elem->set_node(1,
mesh.
node_ptr((i + 1) * 2 + angle_number * order));
1029 new_elem->set_node(4,
mesh.
node_ptr(i * 2 + 1 + angle_number * order));
1033 if (create_outward_interface_boundaries)
1034 boundary_info.
add_side(elem, 1, 1 + boundary_id_shift);
1038 if (i == angle_number)
1040 if (assign_external_boundary)
1043 if (generate_side_specific_boundaries)
1054 const unsigned int num_sectors_per_side,
1055 const std::vector<unsigned int> subdomain_rings,
1056 const unsigned int side_index,
1057 const std::vector<Real> azimuthal_tangent,
1060 const bool create_inward_interface_boundaries,
1061 const bool create_outward_interface_boundaries,
1063 const bool generate_side_specific_boundaries,
1067 unsigned int angle_number = azimuthal_tangent.size() == 0
1068 ? num_sectors_per_side
1069 : ((azimuthal_tangent.size() - 1) / order);
1073 for (
unsigned int k = 0;
k < (subdomain_rings.size());
k++)
1075 for (
unsigned int m = 0; m < subdomain_rings[
k]; m++)
1077 for (
unsigned int i = 1; i <= angle_number; i++)
1079 std::unique_ptr<Elem> new_elem;
1082 new_elem = std::make_unique<Quad4>();
1083 new_elem->set_node(0,
mesh.
node_ptr(nodeid_shift + i + (angle_number + 1) *
j));
1084 new_elem->set_node(1,
mesh.
node_ptr(nodeid_shift + i + 1 + (angle_number + 1) *
j));
1085 new_elem->set_node(2,
mesh.
node_ptr(nodeid_shift + i + (angle_number + 1) * (
j + 1) + 1));
1086 new_elem->set_node(3,
mesh.
node_ptr(nodeid_shift + i + (angle_number + 1) * (
j + 1)));
1090 new_elem = std::make_unique<Quad8>();
1093 new_elem = std::make_unique<Quad9>();
1095 8,
mesh.
node_ptr(nodeid_shift + i * 2 + (angle_number * 2 + 1) * (
j * 2 + 2)));
1099 mesh.
node_ptr(nodeid_shift + (i - 1) * 2 + 1 + (angle_number * 2 + 1) * (
j * 2 + 1)));
1101 1,
mesh.
node_ptr(nodeid_shift + i * 2 + 1 + (angle_number * 2 + 1) * (
j * 2 + 1)));
1103 2,
mesh.
node_ptr(nodeid_shift + i * 2 + 1 + (angle_number * 2 + 1) * (
j * 2 + 3)));
1106 mesh.
node_ptr(nodeid_shift + (i - 1) * 2 + 1 + (angle_number * 2 + 1) * (
j * 2 + 3)));
1108 4,
mesh.
node_ptr(nodeid_shift + i * 2 + (angle_number * 2 + 1) * (
j * 2 + 1)));
1110 5,
mesh.
node_ptr(nodeid_shift + i * 2 + 1 + (angle_number * 2 + 1) * (
j * 2 + 2)));
1112 6,
mesh.
node_ptr(nodeid_shift + i * 2 + (angle_number * 2 + 1) * (
j * 2 + 3)));
1115 mesh.
node_ptr(nodeid_shift + (i - 1) * 2 + 1 + (angle_number * 2 + 1) * (
j * 2 + 2)));
1120 if (i == angle_number)
1123 if (subdomain_rings[0] == 0)
1128 if (m == 0 && create_inward_interface_boundaries &&
k > 0)
1129 boundary_info.
add_side(elem, 0,
k * 2 + boundary_id_shift);
1130 if (m == (subdomain_rings[
k] - 1))
1132 if (
k == (subdomain_rings.size() - 1))
1135 if (generate_side_specific_boundaries)
1137 if (i <= angle_number / 2)
1143 else if (create_outward_interface_boundaries)
1144 boundary_info.
add_side(elem, 2,
k * 2 + 1 + boundary_id_shift);
1152 std::unique_ptr<ReplicatedMesh>
1154 const unsigned int num_sectors_per_side,
1155 const unsigned int peripheral_invervals,
1156 const std::vector<std::pair<Real, Real>> & positions_inner,
1157 const std::vector<std::pair<Real, Real>> & d_positions_outer,
1160 const bool create_inward_interface_boundaries,
1161 const bool create_outward_interface_boundaries)
1164 std::pair<Real, Real> positions_p;
1167 for (
unsigned int i = 0; i <= peripheral_invervals; i++)
1169 for (
unsigned int j = 0;
j <= num_sectors_per_side / 2;
j++)
1172 positions_inner[0].second,
1173 d_positions_outer[0].first,
1174 d_positions_outer[0].second,
1175 positions_inner[1].first,
1176 positions_inner[1].second,
1177 d_positions_outer[1].first,
1178 d_positions_outer[1].second,
1181 num_sectors_per_side,
1182 peripheral_invervals);
1185 for (
unsigned int j = 1;
j <= num_sectors_per_side / 2;
j++)
1188 positions_inner[1].second,
1189 d_positions_outer[1].first,
1190 d_positions_outer[1].second,
1191 positions_inner[2].first,
1192 positions_inner[2].second,
1193 d_positions_outer[2].first,
1194 d_positions_outer[2].second,
1197 num_sectors_per_side,
1198 peripheral_invervals);
1206 for (
unsigned int i = 0; i < peripheral_invervals; i++)
1208 for (
unsigned int j = 0;
j < num_sectors_per_side;
j++)
1210 std::unique_ptr<Elem> new_elem;
1212 new_elem = std::make_unique<Quad4>();
1213 new_elem->set_node(0,
mesh->
node_ptr(
j + (num_sectors_per_side + 1) * (i)));
1214 new_elem->set_node(1,
mesh->
node_ptr(
j + 1 + (num_sectors_per_side + 1) * (i)));
1215 new_elem->set_node(2,
mesh->
node_ptr(
j + 1 + (num_sectors_per_side + 1) * (i + 1)));
1216 new_elem->set_node(3,
mesh->
node_ptr(
j + (num_sectors_per_side + 1) * (i + 1)));
1225 if (create_inward_interface_boundaries)
1228 if (i == peripheral_invervals - 1)
1231 if (create_outward_interface_boundaries)
1236 if (
j == num_sectors_per_side - 1)
1260 std::set<dof_id_type> elem_set;
1261 for (
auto side_item : side_list)
1267 elem_set.insert(elem_id);
1271 for (
const auto elem_id : elem_set)
1292 std::pair<Real, Real>
1295 const Real d_po_1_x,
1296 const Real d_po_1_y,
1299 const Real d_po_2_x,
1300 const Real d_po_2_y,
1301 const unsigned int i,
1302 const unsigned int j,
1303 const unsigned int num_sectors_per_side,
1304 const unsigned int peripheral_intervals)
const 1306 auto position_px_inner =
1307 (pi_1_x * (num_sectors_per_side / 2.0 -
j) + pi_2_x *
j) / (num_sectors_per_side / 2.0);
1308 auto position_py_inner =
1309 (pi_1_y * (num_sectors_per_side / 2.0 -
j) + pi_2_y *
j) / (num_sectors_per_side / 2.0);
1310 auto position_px_outer =
1311 (d_po_1_x * (num_sectors_per_side / 2.0 -
j) + d_po_2_x *
j) / (num_sectors_per_side / 2.0);
1312 auto position_py_outer =
1313 (d_po_1_y * (num_sectors_per_side / 2.0 -
j) + d_po_2_y *
j) / (num_sectors_per_side / 2.0);
1314 auto position_px = position_px_inner + position_px_outer * i / peripheral_intervals;
1315 auto position_py = position_py_inner + position_py_outer * i / peripheral_intervals;
1316 return std::make_pair(position_px, position_py);
1322 const Real x_tmp =
x;
1323 const Real y_tmp =
y;
1324 x = x_tmp * std::cos(theta * M_PI / 180.0) - y_tmp * std::sin(theta * M_PI / 180.0);
1325 y = x_tmp * std::sin(theta * M_PI / 180.0) + y_tmp * std::cos(theta * M_PI / 180.0);
1330 const Real orientation,
1334 const unsigned int mesh_type,
1335 const Real unit_angle,
1336 const Real tols)
const 1341 Real &
x = (*node_ptr)(0);
1342 Real &
y = (*node_ptr)(1);
1346 if (
x >= 0.0 &&
y > y_max_0)
1347 y =
y - y_max_0 + y_max_n;
1348 else if (
x >= 0.0 &&
y >= y_min)
1349 y = (
y - y_min) / (y_max_0 - y_min) * (y_max_n - y_min) + y_min;
1350 else if (
y > -
x / std::tan(unit_angle / 360.0 * M_PI) + tols &&
y > y_max_0)
1353 y =
y - y_max_0 + y_max_n;
1356 else if (
y > -
x / std::tan(unit_angle / 360.0 * M_PI) + tols &&
y >= y_min)
1359 y = (
y - y_min) / (y_max_0 - y_min) * (y_max_n - y_min) + y_min;
1365 if (x <= 0 && y > y_max_0)
1366 y =
y - y_max_0 + y_max_n;
1367 else if (x <= 0 && y >= y_min)
1368 y = (
y - y_min) / (y_max_0 - y_min) * (y_max_n - y_min) + y_min;
1369 else if (
y >=
x / std::tan(unit_angle / 360.0 * M_PI) - tols &&
y > y_max_0)
1372 y =
y - y_max_0 + y_max_n;
1375 else if (
y >=
x / std::tan(unit_angle / 360.0 * M_PI) - tols &&
y >= y_min)
1378 y = (
y - y_min) / (y_max_0 - y_min) * (y_max_n - y_min) + y_min;
1387 y =
y - y_max_0 + y_max_n;
1388 else if (
y >= y_min)
1389 y = (
y - y_min) / (y_max_0 - y_min) * (y_max_n - y_min) + y_min;
1395 std::pair<Real, Real>
1397 const std::pair<Real, Real> & p2,
1398 const std::pair<Real, Real> & p3,
1399 const std::pair<Real, Real> & p4)
const 1401 const Real x1 = p1.first;
1402 const Real y1 = p1.second;
1403 const Real x2 = p2.first;
1404 const Real y2 = p2.second;
1405 const Real x3 = p3.first;
1406 const Real y3 = p3.second;
1407 const Real x4 = p4.first;
1408 const Real y4 = p4.second;
1410 Real x = -((x1 - x2) * (y3 * x4 - x3 * y4) - (x3 - x4) * (y1 * x2 - x1 * y2)) /
1411 ((y1 - y2) * (x3 - x4) - (y3 - y4) * (x1 - x2));
1412 Real y = -((y1 - y2) * (y3 * x4 - x3 * y4) - (y3 - y4) * (y1 * x2 - x1 * y2)) /
1413 ((y1 - y2) * (x3 - x4) - (y3 - y4) * (x1 - x2));
1415 return std::make_pair(
x,
y);
1420 std::vector<Point> & boundary_points,
1421 const Real lower_azi,
1422 const Real upper_azi,
1423 const unsigned int return_type,
1424 const unsigned int num_sides,
1426 const bool calculate_origin,
1427 const Real input_origin_x,
1428 const Real input_origin_y,
1429 const Real
tol)
const 1431 std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>> side_list =
1434 std::vector<std::tuple<dof_id_type, boundary_id_type>> node_list =
1437 std::vector<Real> bd_x_list;
1438 std::vector<Real> bd_y_list;
1439 std::vector<Point> bd_p_list;
1440 Real origin_x = 0.0;
1441 Real origin_y = 0.0;
1443 const Real mid_azi = lower_azi <= upper_azi ? (lower_azi + upper_azi) / 2.0
1444 : (lower_azi + upper_azi + 360.0) / 2.0;
1445 for (
unsigned int i = 0; i < node_list.size(); ++i)
1446 if (std::get<1>(node_list[i]) == bid)
1448 bd_x_list.push_back((
mesh.
node_ref(std::get<0>(node_list[i])))(0));
1449 bd_y_list.push_back((
mesh.
node_ref(std::get<0>(node_list[i])))(1));
1450 bd_p_list.push_back((
mesh.
node_ref(std::get<0>(node_list[i]))));
1453 if (calculate_origin)
1456 origin_x = origin_pt(0);
1457 origin_y = origin_pt(1);
1461 origin_x = input_origin_x;
1462 origin_y = input_origin_y;
1465 std::vector<std::pair<Real, Point>> azi_point_pairs;
1467 for (
unsigned int i = 0; i < bd_x_list.size(); ++i)
1469 tmp_azi = atan2(bd_y_list[i] - origin_y, bd_x_list[i] - origin_x) * 180.0 / M_PI;
1470 if ((lower_azi <= upper_azi && (tmp_azi >= lower_azi -
tol && tmp_azi <= upper_azi +
tol)) ||
1471 (lower_azi > upper_azi && (tmp_azi >= lower_azi -
tol || tmp_azi <= upper_azi +
tol)))
1473 azi_point_pairs.push_back(
1475 ? (tmp_azi - mid_azi)
1476 : (1.0 + std::cos(M_PI / num_sides) / std::sin(M_PI / num_sides) *
1477 std::tan((tmp_azi - mid_azi) / 180.0 * M_PI)),
1481 std::sort(azi_point_pairs.begin(), azi_point_pairs.end());
1483 std::vector<Real> azimuthal_output;
1484 for (
auto it = std::make_move_iterator(azi_point_pairs.begin()),
1485 end = std::make_move_iterator(azi_point_pairs.end());
1489 azimuthal_output.push_back(std::move(it->first));
1490 boundary_points.push_back(std::move(it->second));
1493 return azimuthal_output;
1498 const Real lower_azi,
1499 const Real upper_azi,
1500 const unsigned int return_type,
1501 const unsigned int num_sides,
1503 const bool calculate_origin,
1504 const Real input_origin_x,
1505 const Real input_origin_y,
1506 const Real
tol)
const 1508 std::vector<Point> boundary_points;
1522 std::vector<std::vector<Real>>
1524 const std::vector<Real> radial_biases,
1525 const std::vector<unsigned int> intervals,
1529 std::vector<std::vector<Real>> bias_terms_vec;
1530 for (
unsigned int i = 0; i < radial_biases.size(); i++)
1534 inner_boundary_layer_params.
fractions[i],
1535 inner_boundary_layer_params.
intervals[i],
1536 inner_boundary_layer_params.
biases[i]},
1538 outer_boundary_layer_params.
fractions[i],
1539 outer_boundary_layer_params.
intervals[i],
1540 outer_boundary_layer_params.
biases[i]}));
1541 return bias_terms_vec;
1546 const Real radial_bias,
1547 const unsigned int intervals,
1563 std::vector<Real> biased_terms;
1564 for (
unsigned int i = 0; i < inner_boundary_layer_params.
intervals; i++)
1565 biased_terms.push_back(
1567 ? ((
Real)(i + 1) * inner_boundary_layer_params.
fraction /
1572 inner_boundary_layer_params.
fraction));
1573 for (
unsigned int i = 0; i < intervals; i++)
1574 biased_terms.push_back(inner_boundary_layer_params.
fraction +
1577 (1.0 - inner_boundary_layer_params.
fraction -
1578 outer_boundary_layer_params.
fraction) /
1582 (1.0 - inner_boundary_layer_params.
fraction -
1583 outer_boundary_layer_params.
fraction))));
1584 for (
unsigned int i = 0; i < outer_boundary_layer_params.
intervals; i++)
1585 biased_terms.push_back(
1586 1.0 - outer_boundary_layer_params.
fraction +
1588 ? ((
Real)(i + 1) * outer_boundary_layer_params.
fraction /
1593 outer_boundary_layer_params.
fraction)));
1594 return biased_terms;
1600 params.
addParam<std::string>(
"sector_id_name",
1601 "Name of integer (reporting) ID for sector regions to use the " 1602 "reporting ID for azimuthal sector regions of ring geometry block.");
1603 params.
addParam<std::string>(
"ring_id_name",
1604 "Name of integer (reporting) ID for ring regions to use the " 1605 "reporting ID for annular regions of ring geometry block.");
1606 MooseEnum ring_id_option(
"block_wise ring_wise",
"block_wise");
1608 "ring_id_assign_type", ring_id_option,
"Type of ring ID assignment: block_wise or ring_wise");
1609 params.
addParamNamesToGroup(
"sector_id_name ring_id_name ring_id_assign_type",
"Ring/Sector IDs");
1614 const std::string id_name,
1615 const unsigned int num_sides,
1616 const std::vector<unsigned int> num_sectors_per_side)
1620 auto elem_it =
mesh.elements_begin();
1621 unsigned int id = 1;
1623 for (
unsigned int is = 0;
is < num_sides; ++
is)
1626 unsigned int nelem_sector =
1628 (accumulate(num_sectors_per_side.begin(), num_sectors_per_side.end(), 0));
1630 for (
unsigned i = 0; i < nelem_sector; ++i, ++elem_it)
1631 (*elem_it)->set_extra_integer(extra_id_index,
id);
1639 const std::string id_name,
1640 const unsigned int num_sides,
1641 const std::vector<unsigned int> num_sectors_per_side,
1642 const std::vector<unsigned int> ring_intervals,
1643 const bool ring_wise_id,
1644 const bool quad_center_elements)
1649 auto elem_it =
mesh.elements_begin();
1650 for (
unsigned int is = 0;
is < num_sides; ++
is)
1653 unsigned int nelem =
mesh.
n_elem() * num_sectors_per_side[
is] /
1654 (accumulate(num_sectors_per_side.begin(), num_sectors_per_side.end(), 0));
1657 for (
unsigned int ir :
index_range(ring_intervals))
1660 unsigned int nelem_annular_ring = num_sectors_per_side[
is] * ring_intervals[ir];
1663 if (quad_center_elements && ir == 0)
1664 nelem_annular_ring = num_sectors_per_side[
is] * (ring_intervals[ir] - 1) +
1665 num_sectors_per_side[
is] * num_sectors_per_side[
is] / 4;
1667 for (
unsigned i = 0; i < nelem_annular_ring; ++i, ++elem_it)
1668 (*elem_it)->set_extra_integer(extra_id_index, ir + 1);
1670 nelem -= nelem_annular_ring;
1675 unsigned int ir = 0;
1676 for (
unsigned int ir0 :
index_range(ring_intervals))
1678 for (
unsigned int ir1 = 0; ir1 < ring_intervals[ir0]; ++ir1)
1681 unsigned int nelem_annular_ring = num_sectors_per_side[
is];
1684 if (quad_center_elements && ir == 0)
1685 nelem_annular_ring = num_sectors_per_side[
is] * num_sectors_per_side[
is] / 4;
1687 for (
unsigned i = 0; i < nelem_annular_ring; ++i, ++elem_it)
1688 (*elem_it)->set_extra_integer(extra_id_index, ir + 1);
1692 nelem -= nelem_annular_ring;
1697 for (
unsigned i = 0; i < nelem; ++i, ++elem_it)
1698 (*elem_it)->set_extra_integer(extra_id_index, 0);
1705 const std::set<boundary_id_type> & boundary_ids,
1708 const std::set<boundary_id_type> existing_boundary_ids =
1710 for (
const auto id : boundary_ids)
1715 auto it = existing_boundary_ids.find(old_id);
1716 if (it != existing_boundary_ids.end())
1721 std::set<boundary_id_type>
1723 const std::vector<std::vector<unsigned int>> & pattern,
1724 const std::vector<std::vector<boundary_id_type>> & interface_boundary_id_shift_pattern,
1725 const std::set<boundary_id_type> & boundary_ids,
1726 const std::vector<std::set<boundary_id_type>> & input_interface_boundary_ids,
1727 const bool use_interface_boundary_id_shift,
1728 const bool create_interface_boundary_id,
1729 const unsigned int num_extra_layers)
const 1731 std::set<boundary_id_type> interface_boundary_ids;
1733 if (use_interface_boundary_id_shift)
1735 for (
const auto i :
make_range(pattern.size()))
1736 for (
const auto j :
make_range(pattern[i].size()))
1738 const auto & ids = input_interface_boundary_ids[pattern[i][
j]];
1739 for (
const auto &
id : ids)
1742 auto it = boundary_ids.find(new_id);
1743 if (it != boundary_ids.end())
1744 interface_boundary_ids.insert(new_id);
1750 for (
const auto & ids : input_interface_boundary_ids)
1751 for (
const auto &
id : ids)
1753 auto it = boundary_ids.find(
id);
1754 if (it != boundary_ids.end())
1755 interface_boundary_ids.insert(
id);
1759 if (create_interface_boundary_id)
1760 for (
const auto i :
make_range(num_extra_layers))
1763 auto it = boundary_ids.find(
id);
1764 if (it != boundary_ids.end())
1765 interface_boundary_ids.insert(
id);
1767 it = boundary_ids.find(
id);
1768 if (it != boundary_ids.end())
1769 interface_boundary_ids.insert(
id);
1771 return interface_boundary_ids;
1779 std::for_each(mod_multi_bdry_layer_params.
intervals.begin(),
1780 mod_multi_bdry_layer_params.
intervals.end(),
1781 [&order](
unsigned int & n) { n *= order; });
1782 std::for_each(mod_multi_bdry_layer_params.
biases.begin(),
1783 mod_multi_bdry_layer_params.
biases.end(),
1785 return mod_multi_bdry_layer_params;
1793 mod_single_bdry_layer_params.
intervals *= order;
1794 mod_single_bdry_layer_params.
bias =
std::pow(mod_single_bdry_layer_params.
bias, 1.0 / order);
1795 return mod_single_bdry_layer_params;
1800 const std::vector<MeshGeneratorName> & input_names,
1801 const std::vector<Real> & metadata_vals,
1802 const std::string & metadata_name)
const 1805 for (
unsigned int i = 0; i < input_names.size(); i++)
1808 table.
addData<std::string>(
"input name", (std::string)input_names[i]);
1809 table.
addData<
Real>(metadata_name, metadata_vals[i]);
1812 std::stringstream detailed_error;
1814 return "\n" + detailed_error.str();
virtual Point true_centroid() const
std::vector< Real > fractions
std::pair< Real, Real > fourPointIntercept(const std::pair< Real, Real > &p1, const std::pair< Real, Real > &p2, const std::pair< Real, Real > &p3, const std::pair< Real, Real > &p4) const
Finds the center of a quadrilateral based on four vertices.
std::unique_ptr< ReplicatedMesh > buildGeneralSlice(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 primary_side_length, const Real secondary_side_length, 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 Real azimuthal_angle, const std::vector< Real > azimuthal_tangent, const unsigned int side_index, const bool quad_center_elements, const Real center_quad_factor, const Real rotation_angle, const bool generate_side_specific_boundaries=true)
Creates a mesh of a general polygon slice with a triangular shape and circular regions on one of its ...
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
std::vector< unsigned int > intervals
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
void build_node_list_from_side_list()
std::unique_ptr< ReplicatedMesh > buildReplicatedMesh(unsigned int dim=libMesh::invalid_uint)
void remove_orphaned_nodes()
void cenTriElemDef(ReplicatedMesh &mesh, const unsigned int num_sectors_per_side, const std::vector< Real > azimuthal_tangent=std::vector< Real >(), const subdomain_id_type block_id_shift=0, const bool create_outward_interface_boundaries=true, const boundary_id_type boundary_id_shift=0, const bool assign_external_boundary=false, const unsigned int side_index=0, const bool generate_side_specific_boundaries=true, const TRI_ELEM_TYPE tri_elem_type=TRI_ELEM_TYPE::TRI3) const
Defines triangular elements in the very central region of the polygon.
Contains multiple blocks's boundary layer related parameters.
std::vector< Real > biases
unsigned int add_elem_integer(std::string name, bool allocate_data=true, dof_id_type default_value=DofObject::invalid_id)
std::unique_ptr< ReplicatedMesh > buildSlice(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 Real virtual_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 Real pitch_scale_factor=1.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)
Generates a mesh of a polygon slice, which is the foundation of both buildGeneralSlice and buildSimpl...
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
const std::vector< double > y
multiBdryLayerParams modifiedMultiBdryLayerParamsCreator(const multiBdryLayerParams &original_multi_bdry_layer_params, const unsigned int order) const
Modifies the input multi boundary layer parameters for node generation, especially for the quadratic ...
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
Contains a single block's boundary layer related parameters.
void changeBoundaryId(const boundary_id_type old_id, const boundary_id_type new_id, bool delete_prev)
const BoundaryInfo & get_boundary_info() const
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.
virtual const std::string & name() const
virtual Node * add_point(const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id)=0
void nodeCoordRotate(Real &x, Real &y, const Real theta) const
Calculates x and y coordinates after rotating by theta angle.
void build_side_list(std::vector< dof_id_type > &element_id_list, std::vector< unsigned short int > &side_list, std::vector< boundary_id_type > &bc_id_list) const
std::vector< std::vector< Real > > biasTermsCalculator(const std::vector< Real > radial_biases, const std::vector< unsigned int > intervals, const multiBdryLayerParams inner_boundary_layer_params, const multiBdryLayerParams outer_boundary_layer_params) const
Creates bias terms for multiple blocks.
void adjustPeripheralQuadraticElements(MeshBase &out_mesh, const QUAD_ELEM_TYPE boundary_quad_elem_type) const
Adjusts the mid-edge node locations in boundary regions when using quadratic elements with uniform bo...
void build_node_list(std::vector< dof_id_type > &node_id_list, std::vector< boundary_id_type > &bc_id_list) const
static InputParameters validParams()
void cenQuadElemDef(ReplicatedMesh &mesh, const unsigned int div_num, const subdomain_id_type block_id_shift, const bool create_outward_interface_boundaries, const boundary_id_type boundary_id_shift, std::vector< std::vector< Node *>> &nodes, const bool assign_external_boundary=false, const unsigned int side_index=0, const bool generate_side_specific_boundaries=true, const QUAD_ELEM_TYPE quad_elem_type=QUAD_ELEM_TYPE::QUAD4) const
Defines quad elements in the very central region of the polygon.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template cos(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(cos
std::string pitchMetaDataErrorGenerator(const std::vector< MeshGeneratorName > &input_names, const std::vector< Real > &metadata_vals, const std::string &metadata_name) const
Generate a string that contains the detailed metadata information for inconsistent input mesh metadat...
const std::vector< double > x
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
virtual Elem * add_elem(Elem *e)=0
static const std::string pitch
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
void backgroundNodes(ReplicatedMesh &mesh, const unsigned int num_sectors_per_side, const unsigned int background_intervals, const std::vector< Real > biased_terms, const Real background_corner_distance, const Real background_corner_radial_interval_length, const Real corner_p[2][2], const Real corner_to_corner, const Real background_in, const std::vector< Real > azimuthal_tangent=std::vector< Real >()) const
Creates nodes for the ring-to-polygon transition region (i.e., background) of a single slice...
PetscErrorCode PetscInt const PetscInt IS * is
void ringNodes(ReplicatedMesh &mesh, const std::vector< Real > ring_radii, const std::vector< unsigned int > ring_layers, const std::vector< std::vector< Real >> biased_terms, const unsigned int num_sectors_per_side, const Real corner_p[2][2], const Real corner_to_corner, const std::vector< Real > azimuthal_tangent=std::vector< Real >()) const
Creates nodes for the ring-geometry region of a single slice.
static InputParameters validParams()
virtual std::unique_ptr< MeshBase > generate() override
static void addRingAndSectorIDParams(InputParameters ¶ms)
Add InputParameters which are used by ring and sector IDs.
void centerNodes(ReplicatedMesh &mesh, const Real virtual_side_number, const unsigned int div_num, const Real ring_radii_0, std::vector< std::vector< Node *>> &nodes) const
Creates nodes of the very central mesh layer of the polygon for quad central elements.
std::pair< Real, Real > pointInterpolate(const Real pi_1_x, const Real pi_1_y, const Real po_1_x, const Real po_1_y, const Real pi_2_x, const Real pi_2_y, const Real po_2_x, const Real po_2_y, const unsigned int i, const unsigned int j, const unsigned int num_sectors_per_side, const unsigned int peripheral_intervals) const
Calculates the point coordinates of within a parallelogram region using linear interpolation.
const std::set< boundary_id_type > & get_boundary_ids() const
virtual const Elem * elem_ptr(const dof_id_type i) const=0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string ring_radii
subdomain_id_type subdomain_id() const
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.
const Node * node_ptr(const unsigned int i) const
void ductNodes(ReplicatedMesh &mesh, std::vector< Real > *const ducts_center_dist, const std::vector< unsigned int > ducts_layers, const std::vector< std::vector< Real >> biased_terms, const unsigned int num_sectors_per_side, const Real corner_p[2][2], const Real corner_to_corner, const std::vector< Real > azimuthal_tangent=std::vector< Real >()) const
Creates nodes for the duct-geometry region of a single slice.
void add_side(const dof_id_type elem, const unsigned short int side, const boundary_id_type id)
IntRange< T > make_range(T beg, T end)
void all_second_order(const bool full_ordered=true)
void mooseError(Args &&... args) const
singleBdryLayerParams modifiedSingleBdryLayerParamsCreator(const singleBdryLayerParams &original_single_bdry_layer_params, const unsigned int order) const
Modifies the input single boundary layer parameters for node generation, especially for the quadratic...
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
virtual const Node & node_ref(const dof_id_type i) const
Point meshCentroidCalculator(const MeshBase &mesh)
virtual dof_id_type n_elem() const=0
virtual const Node * node_ptr(const dof_id_type i) const=0
void reassignBoundaryIDs(MeshBase &mesh, const boundary_id_type id_shift, const std::set< boundary_id_type > &boundary_ids, const bool reverse=false)
reassign interface boundary IDs on the input mesh by applying the boundary ID shift ...
MooseUnits pow(const MooseUnits &, int)
const Point & point(const unsigned int i) const
static const std::string k
auto index_range(const T &sizable)
PolygonMeshGeneratorBase(const InputParameters ¶meters)
virtual dof_id_type n_nodes() const=0
std::unique_ptr< ReplicatedMesh > buildSimplePeripheral(const unsigned int num_sectors_per_side, const unsigned int peripheral_invervals, const std::vector< std::pair< Real, Real >> &position_inner, const std::vector< std::pair< Real, Real >> &d_position_outer, const subdomain_id_type id_shift, const QUAD_ELEM_TYPE quad_elem_type, const bool create_inward_interface_boundaries=false, const bool create_outward_interface_boundaries=true)
Creates peripheral area mesh for the patterned hexagon mesh.
void quadElemDef(ReplicatedMesh &mesh, const unsigned int num_sectors_per_side, const std::vector< unsigned int > subdomain_rings, const unsigned int side_index, const std::vector< Real > azimuthal_tangent=std::vector< Real >(), const subdomain_id_type block_id_shift=0, const dof_id_type nodeid_shift=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 QUAD_ELEM_TYPE quad_elem_type=QUAD_ELEM_TYPE::QUAD4) const
Defines general quad elements for the polygon.
std::set< boundary_id_type > getInterfaceBoundaryIDs(const std::vector< std::vector< unsigned int >> &pattern, const std::vector< std::vector< boundary_id_type >> &interface_boundary_id_shift_pattern, const std::set< boundary_id_type > &boundary_ids, const std::vector< std::set< boundary_id_type >> &input_interface_boundary_ids, const bool use_interface_boundary_id_shift, const bool create_interface_boundary_id, const unsigned int num_extra_layers) const
returns a list of interface boundary IDs on the mesh generated by this mesh generator ...
void cutOffPolyDeform(MeshBase &mesh, const Real orientation, const Real y_max_0, const Real y_max_n, const Real y_min, const unsigned int mesh_type, const Real unit_angle=60.0, const Real tols=1E-5) const
Deforms peripheral region when the external side of a polygon assembly of stitched meshes cuts off th...