12 #include "libmesh/replicated_mesh.h" 13 #include "libmesh/face_quad4.h" 14 #include "libmesh/mesh_modification.h" 15 #include "libmesh/serial_mesh.h" 16 #include "libmesh/boundary_info.h" 17 #include "libmesh/utility.h" 18 #include "libmesh/mesh_smoother_laplace.h" 30 "full top_right top_left bottom_left bottom_right right_half left_half top_half bottom_half",
33 "num_sectors % 2 = 0, num_sectors > 0" 34 "Number of azimuthal sectors in each quadrant" 35 "'num_sectors' must be an even number.");
36 params.
addRequiredParam<std::vector<Real>>(
"radii",
"Radii of major concentric circles");
38 "rings",
"Number of rings in each circle or in the enclosing square");
41 "It determines if meshes for a outer square are added to concentric circle meshes.");
46 "The enclosing square can be added to the completed concentric circle mesh." 47 "Elements are quad meshes.");
48 params.
addParam<
MooseEnum>(
"portion", portion,
"Control of which part of mesh is created");
50 "preserve_volumes",
"Volume of concentric circles can be preserved using this function.");
51 params.
addParam<
unsigned int>(
"smoothing_max_it", 1,
"Number of Laplacian smoothing iterations");
53 "This ConcentricCircleMeshGenerator source code is to generate concentric " 61 _num_sectors(getParam<unsigned
int>(
"num_sectors")),
62 _radii(getParam<
std::vector<
Real>>(
"radii")),
63 _rings(getParam<
std::vector<unsigned
int>>(
"rings")),
64 _has_outer_square(getParam<bool>(
"has_outer_square")),
65 _pitch(getParam<
Real>(
"pitch")),
66 _preserve_volumes(getParam<bool>(
"preserve_volumes")),
67 _smoothing_max_it(getParam<unsigned
int>(
"smoothing_max_it")),
73 paramError(
"num_sectors",
"must be an even number.");
76 for (
unsigned i = 0; i <
_radii.size() - 1; ++i)
79 paramError(
"radii",
"must be positive numbers.");
82 "must be provided in order by starting with the smallest radius providing the " 83 "following gradual radii.");
90 paramError(
"rings",
"The size of 'rings' must be equal to the size of 'radii' plus 1.");
95 paramError(
"rings",
"The size of 'rings' must be equal to the size of 'radii'.");
99 for (
unsigned i = 0; i <
_radii.size(); ++i)
101 paramError(
"pitch",
"The pitch / 2 must be larger than any radii.");
104 std::unique_ptr<MeshBase>
108 BoundaryInfo & boundary_info =
mesh->get_boundary_info();
112 std::vector<Real> total_concentric_circles;
127 total_concentric_circles.push_back(
_radii[j - 1] +
139 Real original_radius = 0.0;
140 for (
unsigned i = 0; i < total_concentric_circles.size(); ++i)
147 original_radius = total_concentric_circles[i];
148 total_concentric_circles[i] = modified_radius;
157 original_radius = total_concentric_circles[i];
158 total_concentric_circles[i] = modified_radius;
164 unsigned num_total_nodes = 0;
174 std::vector<Node *> nodes(num_total_nodes);
176 unsigned node_id = 0;
180 Point p1 = Point(xx, 0, 0);
181 Point p2 = Point(0, xx, 0);
189 Point p = p1 * fx * (1 - fy) + p2 * fy * (1 - fx) + p3 * fx * fy;
190 nodes[node_id] =
mesh->add_point(p, node_id);
196 Real current_radius = total_concentric_circles[0];
199 for (
unsigned layers = 0; layers < total_concentric_circles.size(); ++layers)
201 current_radius = total_concentric_circles[layers];
202 for (
unsigned num_outer_nodes = 0; num_outer_nodes <=
_num_sectors; ++num_outer_nodes)
204 const Real x = current_radius *
std::cos(num_outer_nodes * d_angle);
205 const Real y = current_radius *
std::sin(num_outer_nodes * d_angle);
206 nodes[node_id] =
mesh->add_point(Point(x, y, 0.0), node_id);
223 const Real a2 = total_concentric_circles.back() *
std::cos(M_PI / 2 - i * d_angle);
224 const Real b2 = total_concentric_circles.back() *
std::sin(M_PI / 2 - i * d_angle);
226 for (
unsigned j = 0; j <=
_rings.back(); ++j)
230 nodes[node_id] =
mesh->add_point(Point(x, y, 0.0), node_id);
236 for (
unsigned i = 1; i <=
_rings.back() + 1; ++i)
245 const Real a3 = total_concentric_circles.back() *
std::cos(M_PI / 4);
246 const Real b3 = total_concentric_circles.back() *
std::sin(M_PI / 4);
248 const Real a4 = ((
_rings.back() + 1 - k) * a3 + k * a2) / (
_rings.back() + 1);
249 const Real b4 = ((
_rings.back() + 1 - k) * b3 + k * b2) / (
_rings.back() + 1);
251 for (
unsigned j = 0; j <=
_rings.back() + 1; ++j)
255 nodes[node_id] =
mesh->add_point(Point(x, y, 0.0), node_id);
268 const Real a2 = total_concentric_circles.back() *
std::cos(M_PI / 4 - i * d_angle);
269 const Real b2 = total_concentric_circles.back() *
std::sin(M_PI / 4 - i * d_angle);
271 for (
unsigned j = 0; j <=
_rings.back(); ++j)
275 nodes[node_id] =
mesh->add_point(Point(x, y, 0.0), node_id);
290 int additional_term = 0;
291 int counter = standard;
294 counter = counter - 2;
295 additional_term = additional_term + counter;
297 limit = standard + additional_term;
299 else if (standard == 4)
303 std::vector<unsigned int> subdomainIDs;
306 for (
unsigned int i = 0; i <
_rings.size() - 1; ++i)
307 for (
unsigned int j = 0; j <
_rings[i]; ++j)
308 subdomainIDs.push_back(i + 1);
310 for (
unsigned int i = 0; i <
_rings.size(); ++i)
311 for (
unsigned int j = 0; j <
_rings[i]; ++j)
312 subdomainIDs.push_back(i + 1);
315 while (index <= limit)
318 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
319 elem->set_node(0) = nodes[index];
320 elem->set_node(1) = nodes[index +
_num_sectors / 2 + 1];
321 elem->set_node(2) = nodes[index +
_num_sectors / 2 + 2];
322 elem->set_node(3) = nodes[index + 1];
323 elem->subdomain_id() = subdomainIDs[0];
325 if (index < standard / 2)
326 boundary_info.add_side(elem, 3, 1);
327 if (index % (standard / 2 + 1) == 0)
328 boundary_info.add_side(elem, 0, 2);
333 if ((index - standard / 2) % (standard / 2 + 1) == 0)
341 while (index < limit)
344 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
345 elem->set_node(0) = nodes[index];
346 elem->set_node(1) = nodes[index +
_num_sectors / 2 + 1];
347 elem->set_node(2) = nodes[index +
_num_sectors / 2 + 2];
348 elem->set_node(3) = nodes[index + 1];
349 elem->subdomain_id() = subdomainIDs[0];
351 if (index == (standard / 2 + 1) * (standard / 2))
352 boundary_info.add_side(elem, 0, 2);
359 while (index != standard / 2)
362 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
363 elem->set_node(0) = nodes[index];
367 elem->set_node(3) = nodes[index -
_num_sectors / 2 - 1];
368 elem->subdomain_id() = subdomainIDs[0];
370 if (index == standard + 1)
371 boundary_info.add_side(elem, 2, 1);
381 (
_num_sectors + 1) * (total_concentric_circles.size() - 1);
383 int num_nodes_boundary =
Utility::pow<2>(standard / 2 + 1) + standard + 1;
385 while (index < limit)
387 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
388 elem->set_node(0) = nodes[index];
389 elem->set_node(1) = nodes[index + standard + 1];
390 elem->set_node(2) = nodes[index + standard + 2];
391 elem->set_node(3) = nodes[index + 1];
393 for (
int i = 0; i < static_cast<int>(subdomainIDs.size() - 1); ++i)
394 if (index < limit - (standard + 1) * i && index >= limit - (standard + 1) * (i + 1))
395 elem->subdomain_id() = subdomainIDs[subdomainIDs.size() - 1 - i];
400 if ((index - initial) % (standard + 1) == 0)
401 boundary_info.add_side(elem, 0, 2);
402 if ((index -
final) % (standard + 1) == 0)
403 boundary_info.add_side(elem, 2, 1);
405 if (index >= limit - (standard + 1))
406 boundary_info.add_side(elem, 1, 3);
413 if (index == (num_nodes_boundary + counter * (standard + 1)) - 1)
428 Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size();
431 Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size();
437 index =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size();
438 limit =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
441 while (index <= limit)
444 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
445 elem->set_node(0) = nodes[index];
446 elem->set_node(1) = nodes[index + 1];
447 elem->set_node(2) = nodes[index + 1 +
_rings.back() + 1];
448 elem->set_node(3) = nodes[index + 1 +
_rings.back()];
449 elem->subdomain_id() = subdomainIDs.back() + 1;
451 if (index < (initial2 + static_cast<int>(
_rings.back())))
452 boundary_info.add_side(elem, 0, 1);
454 if (index == initial)
455 boundary_info.add_side(elem, 3, 4);
461 if ((index - initial) % static_cast<int>(
_rings.back()) == 0)
464 initial = initial + (
static_cast<int>(
_rings.back()) + 1);
470 (standard + 1) * total_concentric_circles.size() +
471 (
_rings.back() + 1) * (standard / 2 + 1);
473 limit =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
477 while (index <= limit)
480 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
481 elem->set_node(3) = nodes[index];
482 elem->set_node(2) = nodes[index +
_rings.back() + 2];
483 elem->set_node(1) = nodes[index +
_rings.back() + 3];
484 elem->set_node(0) = nodes[index + 1];
485 elem->subdomain_id() = subdomainIDs.back() + 1;
487 if (index >= static_cast<int>(limit - (
_rings.back() + 1)))
488 boundary_info.add_side(elem, 1, 3);
490 if ((index - initial) % static_cast<int>(
_rings.back() + 2) == 0)
491 boundary_info.add_side(elem, 2, 4);
495 if ((index - initial) % static_cast<int>(
_rings.back() + 1) == 0)
498 initial = initial + (
static_cast<int>(
_rings.back()) + 2);
504 (standard + 1) * (total_concentric_circles.size() - 1) + standard / 2;
507 (standard + 1) * total_concentric_circles.size() +
512 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
513 elem->set_node(3) = nodes[index1];
514 elem->set_node(2) = nodes[index2];
515 elem->set_node(1) = nodes[index2 +
_rings.back() + 1];
516 elem->set_node(0) = nodes[index2 +
_rings.back() + 2];
517 elem->subdomain_id() = subdomainIDs.back() + 1;
521 (standard + 1) * (total_concentric_circles.size() - 1);
522 limit = index + standard / 2 - 1;
524 while (index <= limit)
527 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
528 elem->set_node(3) = nodes[index];
529 elem->set_node(2) = nodes[index + 1];
530 elem->set_node(1) = nodes[index2 -
_rings.back() - 1];
531 elem->set_node(0) = nodes[index2];
532 elem->subdomain_id() = subdomainIDs.back() + 1;
535 boundary_info.add_side(elem, 1, 1);
540 index2 = index2 -
_rings.back() - 1;
545 (standard + 1) * (total_concentric_circles.size() - 1);
547 (standard + 1) * total_concentric_circles.size() +
551 Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
555 elem =
mesh->add_elem(std::make_unique<Quad4>());
556 elem->set_node(0) = nodes[index1];
557 elem->set_node(1) = nodes[index1 - 1];
558 elem->set_node(2) = nodes[index2];
559 elem->set_node(3) = nodes[index3];
560 elem->subdomain_id() = subdomainIDs.back() + 1;
563 boundary_info.add_side(elem, 1, 2);
568 (standard + 1) * (total_concentric_circles.size() - 1) - 2;
570 (standard + 1) * total_concentric_circles.size() +
575 (standard + 1) * (total_concentric_circles.size() - 1) - standard / 2;
579 while (index >= limit)
582 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
583 elem->set_node(0) = nodes[index];
584 elem->set_node(1) = nodes[index1];
585 elem->set_node(2) = nodes[index1 - (
_rings.back() + 1)];
586 elem->set_node(3) = nodes[index + 1];
587 elem->subdomain_id() = subdomainIDs.back() + 1;
590 boundary_info.add_side(elem, 0, 2);
592 index1 = index1 + (
_rings.back() + 1);
597 index =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
600 index1 = index - (
_rings.back() + 2);
605 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
606 elem->set_node(3) = nodes[index];
607 elem->set_node(2) = nodes[index + 1];
608 elem->set_node(1) = nodes[index + 2];
609 elem->set_node(0) = nodes[index1];
610 elem->subdomain_id() = subdomainIDs.back() + 1;
612 boundary_info.add_side(elem, 2, 3);
615 boundary_info.add_side(elem, 1, 2);
618 index =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
622 limit =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
623 (
_rings.back() + 1) * (standard / 2) + (
_rings.back() + 2) * 2 - 2;
626 while (index > limit)
628 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
629 elem->set_node(3) = nodes[index];
630 elem->set_node(2) = nodes[index + (
_rings.back() + 2) * k + k + 1];
631 elem->set_node(1) = nodes[index + (
_rings.back() + 2) * k + k + 2];
632 elem->set_node(0) = nodes[index -
_rings.back() - 2];
633 elem->subdomain_id() = subdomainIDs.back() + 1;
634 index = index - (
_rings.back() + 2);
638 boundary_info.add_side(elem, 1, 2);
641 index =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
644 (standard + 1) * total_concentric_circles.size() +
646 limit =
Utility::pow<2>(standard / 2 + 1) + (standard + 1) * total_concentric_circles.size() +
651 (standard + 1) * total_concentric_circles.size() +
657 while (index < limit)
659 Elem * elem =
mesh->add_elem(std::make_unique<Quad4>());
660 elem->set_node(0) = nodes[index];
661 elem->set_node(1) = nodes[index + 1];
662 elem->set_node(2) = nodes[index + 1 +
_rings.back() + 1];
663 elem->set_node(3) = nodes[index + 1 +
_rings.back()];
664 elem->subdomain_id() = subdomainIDs.back() + 1;
666 if (index > initial2)
667 boundary_info.add_side(elem, 2, 2);
669 if ((index - initial) == 0)
670 boundary_info.add_side(elem, 3, 3);
674 if ((index - initial) % static_cast<int>(
_rings.back()) == 0)
677 initial = initial + (
static_cast<int>(
_rings.back()) + 1);
685 boundary_info.sideset_name(1) =
"left";
686 boundary_info.sideset_name(2) =
"bottom";
689 boundary_info.sideset_name(3) =
"outer";
692 boundary_info.sideset_name(3) =
"right";
693 boundary_info.sideset_name(4) =
"top";
698 MeshTools::Modification::rotate(*
mesh, 90, 0, 0);
699 boundary_info.sideset_name(1) =
"bottom";
700 boundary_info.sideset_name(2) =
"right";
703 boundary_info.sideset_name(3) =
"outer";
706 boundary_info.sideset_name(3) =
"top";
707 boundary_info.sideset_name(4) =
"left";
712 MeshTools::Modification::rotate(*
mesh, 180, 0, 0);
713 boundary_info.sideset_name(1) =
"right";
714 boundary_info.sideset_name(2) =
"top";
717 boundary_info.sideset_name(3) =
"outer";
720 boundary_info.sideset_name(3) =
"left";
721 boundary_info.sideset_name(4) =
"bottom";
724 else if (
_portion ==
"bottom_right")
726 MeshTools::Modification::rotate(*
mesh, 270, 0, 0);
727 boundary_info.sideset_name(1) =
"top";
728 boundary_info.sideset_name(2) =
"left";
731 boundary_info.sideset_name(3) =
"outer";
734 boundary_info.sideset_name(3) =
"bottom";
735 boundary_info.sideset_name(4) =
"right";
741 ReplicatedMesh other_mesh(*
mesh);
743 MeshTools::Modification::rotate(other_mesh, 90, 0, 0);
746 MeshTools::Modification::change_boundary_id(other_mesh, 1, 5);
747 MeshTools::Modification::change_boundary_id(other_mesh, 2, 6);
748 MeshTools::Modification::change_boundary_id(other_mesh, 3, 7);
749 MeshTools::Modification::change_boundary_id(other_mesh, 4, 1);
750 MeshTools::Modification::change_boundary_id(other_mesh, 5, 2);
751 MeshTools::Modification::change_boundary_id(other_mesh, 6, 3);
752 MeshTools::Modification::change_boundary_id(other_mesh, 7, 4);
753 mesh->prepare_for_use();
754 other_mesh.prepare_for_use();
755 mesh->stitch_meshes(other_mesh, 1, 3, TOLERANCE,
true,
false);
756 mesh->get_boundary_info().sideset_name(1) =
"left";
757 mesh->get_boundary_info().sideset_name(2) =
"bottom";
758 mesh->get_boundary_info().sideset_name(3) =
"right";
759 mesh->get_boundary_info().sideset_name(4) =
"top";
763 MeshTools::Modification::change_boundary_id(other_mesh, 1, 5);
764 MeshTools::Modification::change_boundary_id(other_mesh, 2, 1);
765 MeshTools::Modification::change_boundary_id(other_mesh, 5, 2);
766 mesh->prepare_for_use();
767 other_mesh.prepare_for_use();
768 mesh->stitch_meshes(other_mesh, 1, 1, TOLERANCE,
true,
false);
770 MeshTools::Modification::change_boundary_id(*
mesh, 2, 1);
771 MeshTools::Modification::change_boundary_id(*
mesh, 3, 2);
772 mesh->get_boundary_info().sideset_name(1) =
"bottom";
773 mesh->get_boundary_info().sideset_name(2) =
"outer";
780 ReplicatedMesh other_mesh(*
mesh);
782 MeshTools::Modification::rotate(other_mesh, 270, 0, 0);
785 MeshTools::Modification::change_boundary_id(other_mesh, 1, 5);
786 MeshTools::Modification::change_boundary_id(other_mesh, 2, 6);
787 MeshTools::Modification::change_boundary_id(other_mesh, 3, 7);
788 MeshTools::Modification::change_boundary_id(other_mesh, 4, 3);
789 MeshTools::Modification::change_boundary_id(other_mesh, 5, 4);
790 MeshTools::Modification::change_boundary_id(other_mesh, 6, 1);
791 MeshTools::Modification::change_boundary_id(other_mesh, 7, 2);
792 mesh->prepare_for_use();
793 other_mesh.prepare_for_use();
794 mesh->stitch_meshes(other_mesh, 2, 4, TOLERANCE,
true,
false);
795 mesh->get_boundary_info().sideset_name(1) =
"left";
796 mesh->get_boundary_info().sideset_name(2) =
"bottom";
797 mesh->get_boundary_info().sideset_name(3) =
"right";
798 mesh->get_boundary_info().sideset_name(4) =
"top";
802 MeshTools::Modification::change_boundary_id(other_mesh, 1, 5);
803 MeshTools::Modification::change_boundary_id(other_mesh, 2, 1);
804 MeshTools::Modification::change_boundary_id(other_mesh, 5, 2);
805 mesh->prepare_for_use();
806 other_mesh.prepare_for_use();
807 mesh->stitch_meshes(other_mesh, 2, 2, TOLERANCE,
true,
false);
809 MeshTools::Modification::change_boundary_id(*
mesh, 3, 2);
810 mesh->get_boundary_info().sideset_name(1) =
"left";
811 mesh->get_boundary_info().sideset_name(2) =
"outer";
817 ReplicatedMesh other_mesh(*
mesh);
820 MeshTools::Modification::rotate(other_mesh, 90, 0, 0);
821 MeshTools::Modification::rotate(*
mesh, 180, 0, 0);
825 MeshTools::Modification::change_boundary_id(other_mesh, 1, 5);
826 MeshTools::Modification::change_boundary_id(other_mesh, 2, 6);
827 MeshTools::Modification::change_boundary_id(other_mesh, 3, 7);
828 MeshTools::Modification::change_boundary_id(other_mesh, 4, 1);
829 MeshTools::Modification::change_boundary_id(other_mesh, 5, 2);
830 MeshTools::Modification::change_boundary_id(other_mesh, 6, 3);
831 MeshTools::Modification::change_boundary_id(other_mesh, 7, 4);
833 MeshTools::Modification::change_boundary_id(*
mesh, 1, 5);
834 MeshTools::Modification::change_boundary_id(*
mesh, 2, 6);
835 MeshTools::Modification::change_boundary_id(*
mesh, 3, 7);
836 MeshTools::Modification::change_boundary_id(*
mesh, 4, 2);
837 MeshTools::Modification::change_boundary_id(*
mesh, 5, 3);
838 MeshTools::Modification::change_boundary_id(*
mesh, 6, 4);
839 MeshTools::Modification::change_boundary_id(*
mesh, 7, 1);
840 mesh->prepare_for_use();
841 other_mesh.prepare_for_use();
842 mesh->stitch_meshes(other_mesh, 4, 2, TOLERANCE,
true,
false);
843 mesh->get_boundary_info().sideset_name(1) =
"left";
844 mesh->get_boundary_info().sideset_name(2) =
"bottom";
845 mesh->get_boundary_info().sideset_name(3) =
"right";
846 mesh->get_boundary_info().sideset_name(4) =
"top";
850 MeshTools::Modification::change_boundary_id(*
mesh, 1, 5);
851 MeshTools::Modification::change_boundary_id(*
mesh, 2, 1);
852 MeshTools::Modification::change_boundary_id(*
mesh, 5, 2);
853 mesh->prepare_for_use();
854 other_mesh.prepare_for_use();
855 mesh->stitch_meshes(other_mesh, 1, 1, TOLERANCE,
true,
false);
857 MeshTools::Modification::change_boundary_id(*
mesh, 2, 1);
858 MeshTools::Modification::change_boundary_id(*
mesh, 3, 2);
859 mesh->get_boundary_info().sideset_name(1) =
"right";
860 mesh->get_boundary_info().sideset_name(2) =
"outer";
866 ReplicatedMesh other_mesh(*
mesh);
868 MeshTools::Modification::rotate(other_mesh, 180, 0, 0);
869 MeshTools::Modification::rotate(*
mesh, 270, 0, 0);
873 MeshTools::Modification::change_boundary_id(other_mesh, 1, 5);
874 MeshTools::Modification::change_boundary_id(other_mesh, 2, 6);
875 MeshTools::Modification::change_boundary_id(other_mesh, 3, 7);
876 MeshTools::Modification::change_boundary_id(other_mesh, 4, 2);
877 MeshTools::Modification::change_boundary_id(other_mesh, 5, 3);
878 MeshTools::Modification::change_boundary_id(other_mesh, 6, 4);
879 MeshTools::Modification::change_boundary_id(other_mesh, 7, 1);
881 MeshTools::Modification::change_boundary_id(*
mesh, 1, 5);
882 MeshTools::Modification::change_boundary_id(*
mesh, 2, 6);
883 MeshTools::Modification::change_boundary_id(*
mesh, 3, 7);
884 MeshTools::Modification::change_boundary_id(*
mesh, 4, 3);
885 MeshTools::Modification::change_boundary_id(*
mesh, 5, 4);
886 MeshTools::Modification::change_boundary_id(*
mesh, 6, 1);
887 MeshTools::Modification::change_boundary_id(*
mesh, 7, 2);
888 mesh->prepare_for_use();
889 other_mesh.prepare_for_use();
890 mesh->stitch_meshes(other_mesh, 1, 3, TOLERANCE,
true,
false);
891 mesh->get_boundary_info().sideset_name(1) =
"left";
892 mesh->get_boundary_info().sideset_name(2) =
"bottom";
893 mesh->get_boundary_info().sideset_name(3) =
"right";
894 mesh->get_boundary_info().sideset_name(4) =
"top";
898 MeshTools::Modification::change_boundary_id(*
mesh, 1, 5);
899 MeshTools::Modification::change_boundary_id(*
mesh, 2, 1);
900 MeshTools::Modification::change_boundary_id(*
mesh, 5, 2);
901 mesh->prepare_for_use();
902 other_mesh.prepare_for_use();
903 mesh->stitch_meshes(other_mesh, 1, 1, TOLERANCE,
true,
false);
905 MeshTools::Modification::change_boundary_id(*
mesh, 2, 1);
906 MeshTools::Modification::change_boundary_id(*
mesh, 3, 2);
907 mesh->get_boundary_info().sideset_name(1) =
"top";
908 mesh->get_boundary_info().sideset_name(2) =
"outer";
914 ReplicatedMesh portion_two(*
mesh);
917 MeshTools::Modification::rotate(portion_two, 90, 0, 0);
922 MeshTools::Modification::change_boundary_id(portion_two, 1, 5);
923 MeshTools::Modification::change_boundary_id(portion_two, 2, 6);
924 MeshTools::Modification::change_boundary_id(portion_two, 3, 7);
925 MeshTools::Modification::change_boundary_id(portion_two, 4, 1);
926 MeshTools::Modification::change_boundary_id(portion_two, 5, 2);
927 MeshTools::Modification::change_boundary_id(portion_two, 6, 3);
928 MeshTools::Modification::change_boundary_id(portion_two, 7, 4);
929 mesh->prepare_for_use();
930 portion_two.prepare_for_use();
932 mesh->stitch_meshes(portion_two, 1, 3, TOLERANCE,
true,
false);
935 ReplicatedMesh portion_bottom(*
mesh);
936 MeshTools::Modification::rotate(portion_bottom, 180, 0, 0);
937 MeshTools::Modification::change_boundary_id(portion_bottom, 1, 5);
938 MeshTools::Modification::change_boundary_id(portion_bottom, 2, 6);
939 MeshTools::Modification::change_boundary_id(portion_bottom, 3, 7);
940 MeshTools::Modification::change_boundary_id(portion_bottom, 4, 2);
941 MeshTools::Modification::change_boundary_id(portion_bottom, 5, 3);
942 MeshTools::Modification::change_boundary_id(portion_bottom, 6, 4);
943 MeshTools::Modification::change_boundary_id(portion_bottom, 7, 1);
944 mesh->prepare_for_use();
945 portion_bottom.prepare_for_use();
947 mesh->stitch_meshes(portion_bottom, 2, 4, TOLERANCE,
true,
false);
949 mesh->get_boundary_info().sideset_name(1) =
"left";
950 mesh->get_boundary_info().sideset_name(2) =
"bottom";
951 mesh->get_boundary_info().sideset_name(3) =
"right";
952 mesh->get_boundary_info().sideset_name(4) =
"top";
953 portion_bottom.clear();
957 MeshTools::Modification::change_boundary_id(portion_two, 1, 5);
958 MeshTools::Modification::change_boundary_id(portion_two, 2, 1);
959 MeshTools::Modification::change_boundary_id(portion_two, 5, 2);
961 mesh->prepare_for_use();
962 portion_two.prepare_for_use();
963 mesh->stitch_meshes(portion_two, 1, 1, TOLERANCE,
true,
false);
965 ReplicatedMesh portion_bottom(*
mesh);
966 MeshTools::Modification::rotate(portion_bottom, 180, 0, 0);
968 mesh->prepare_for_use();
969 portion_bottom.prepare_for_use();
970 mesh->stitch_meshes(portion_bottom, 2, 2, TOLERANCE,
true,
false);
971 MeshTools::Modification::change_boundary_id(*
mesh, 3, 1);
972 mesh->get_boundary_info().sideset_name(1) =
"outer";
973 portion_bottom.clear();
980 mesh->prepare_for_use();
986 mesh->prepare_for_use();
unsigned int _smoothing_max_it
Iteration number for Laplace smoothing.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sin(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tan
registerMooseObject("MooseApp", ConcentricCircleMeshGenerator)
virtual void smooth() override
std::unique_ptr< ReplicatedMesh > buildReplicatedMesh(unsigned int dim=libMesh::invalid_uint)
Build a replicated mesh.
static InputParameters validParams()
bool _preserve_volumes
Volume preserving function is optional.
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
std::vector< Real > _radii
Radii of concentric circles.
Generates a mesh based on concentric circles, given all the parameters.
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
std::vector< unsigned int > _rings
Number of rings in each circle or in the enclosing square.
bool _has_outer_square
Adding the enclosing square is optional.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template cos(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(cos
MooseEnum _portion
Control of which portion of mesh will be developed.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
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 ...
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
ConcentricCircleMeshGenerator(const InputParameters ¶meters)
unsigned int _num_sectors
Number of sectors in one quadrant.
T & declareMeshProperty(const std::string &data_name, Args &&... args)
Methods for writing out attributes to the mesh meta-data store, which can be retrieved from most othe...
MeshGenerators are objects that can modify or add to an existing mesh.
void ErrorVector unsigned int
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template pow< 2 >(tan(_arg))+1.0) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(sqrt