28 #include "libmesh/boundary_info.h"
29 #include "libmesh/function_base.h"
30 #include "libmesh/cell_tet4.h"
31 #include "libmesh/cell_tet10.h"
32 #include "libmesh/face_tri3.h"
33 #include "libmesh/face_tri6.h"
34 #include "libmesh/libmesh_logging.h"
35 #include "libmesh/mesh_communication.h"
36 #include "libmesh/mesh_modification.h"
37 #include "libmesh/mesh_tools.h"
38 #include "libmesh/parallel.h"
39 #include "libmesh/remote_elem.h"
40 #include "libmesh/enum_to_string.h"
41 #include "libmesh/unstructured_mesh.h"
46 unsigned int diag_1_node_1,
47 unsigned int diag_1_node_2,
48 unsigned int diag_2_node_1,
49 unsigned int diag_2_node_2)
51 return ((elem->
node_id(diag_1_node_1) > elem->
node_id(diag_2_node_1) &&
67 const bool perturb_boundary)
73 LOG_SCOPE(
"distort()",
"MeshTools::Modification");
77 std::unordered_set<dof_id_type> boundary_node_ids;
78 if (!perturb_boundary)
85 std::numeric_limits<float>::max());
89 hmin[n.id()] = std::min(hmin[n.id()],
90 static_cast<float>(elem->
hmin()));
94 const unsigned int seed = 123456;
108 if ((perturb_boundary || !boundary_node_ids.count(n)) && hmin[n] < 1.e20)
111 Point dir (static_cast<Real>(std::rand())/static_cast<Real>(RAND_MAX),
112 (
mesh.
mesh_dimension() > 1) ? static_cast<Real>(std::rand())/static_cast<Real>(RAND_MAX) : 0.,
113 ((
mesh.
mesh_dimension() == 3) ? static_cast<Real>(std::rand())/static_cast<Real>(RAND_MAX) : 0.));
115 dir(0) = (dir(0)-.5)*2.;
118 dir(1) = (dir(1)-.5)*2.;
122 dir(2) = (dir(2)-.5)*2.;
131 (*node)(0) += dir(0)*factor*hmin[n];
134 (*node)(1) += dir(1)*factor*hmin[n];
138 (*node)(2) += dir(2)*factor*hmin[n];
152 LOG_SCOPE(
"redistribute()",
"MeshTools::Modification");
157 std::unique_ptr<FunctionBase<Real>> myfunc = mapfunc.
clone();
161 (*myfunc)(*node, output_vec);
163 (*node)(0) = output_vec(0);
165 (*node)(1) = output_vec(1);
168 (*node)(2) = output_vec(2);
180 const Point p(xt, yt, zt);
218 const Real sp = std::sin(p), cp = std::cos(p);
219 const Real st = std::sin(t), ct = std::cos(t);
220 const Real ss = std::sin(s), cs = std::cos(s);
228 const Point pt = *node;
229 const Real x = pt(0);
230 const Real y = pt(1);
231 const Real z = pt(2);
232 *node =
Point(( cp*cs-sp*ct*ss)*x + ( sp*cs+cp*ct*ss)*y + (st*ss)*z,
233 (-cp*ss-sp*ct*cs)*x + (-sp*ss+cp*ct*cs)*y + (st*cs)*z,
234 ( sp*st)*x + (-cp*st)*y + (ct)*z );
238 libmesh_error_msg(
"MeshTools::Modification::rotate() requires libMesh to be compiled with LIBMESH_DIM==3");
248 const Real x_scale = xs;
254 libmesh_assert_equal_to (zs, 0.);
256 y_scale = z_scale = x_scale;
261 (*node)(0) *= x_scale;
268 (*node)(1) *= y_scale;
275 (*node)(2) *= z_scale;
291 std::vector<Elem *> new_elements;
293 unsigned int max_subelems = 1;
299 new_elements.reserve (max_subelems*n_orig_elem);
309 std::vector<Elem *> new_bndry_elements;
310 std::vector<unsigned short int> new_bndry_sides;
311 std::vector<boundary_id_type> new_bndry_ids;
316 bool added_new_ghost_point =
false;
329 #ifdef LIBMESH_ENABLE_UNIQUE_ID
344 for (
unsigned int i = 0; i != max_subelems; ++i)
345 subelem[i] =
nullptr;
351 subelem[0] =
new Tri3;
352 subelem[1] =
new Tri3;
359 subelem[0]->set_node(1) = elem->
node_ptr(1);
360 subelem[0]->set_node(2) = elem->
node_ptr(2);
362 subelem[1]->set_node(0) = elem->
node_ptr(0);
363 subelem[1]->set_node(1) = elem->
node_ptr(2);
364 subelem[1]->set_node(2) = elem->
node_ptr(3);
369 subelem[0]->set_node(0) = elem->
node_ptr(0);
370 subelem[0]->set_node(1) = elem->
node_ptr(1);
371 subelem[0]->set_node(2) = elem->
node_ptr(3);
373 subelem[1]->set_node(0) = elem->
node_ptr(1);
374 subelem[1]->set_node(1) = elem->
node_ptr(2);
375 subelem[1]->set_node(2) = elem->
node_ptr(3);
385 added_new_ghost_point =
true;
387 subelem[0] =
new Tri6;
388 subelem[1] =
new Tri6;
402 subelem[0]->set_node(0) = elem->
node_ptr(0);
403 subelem[0]->set_node(1) = elem->
node_ptr(1);
404 subelem[0]->set_node(2) = elem->
node_ptr(2);
405 subelem[0]->set_node(3) = elem->
node_ptr(4);
406 subelem[0]->set_node(4) = elem->
node_ptr(5);
407 subelem[0]->set_node(5) = new_node;
409 subelem[1]->set_node(0) = elem->
node_ptr(0);
410 subelem[1]->set_node(1) = elem->
node_ptr(2);
411 subelem[1]->set_node(2) = elem->
node_ptr(3);
412 subelem[1]->set_node(3) = new_node;
413 subelem[1]->set_node(4) = elem->
node_ptr(6);
414 subelem[1]->set_node(5) = elem->
node_ptr(7);
420 subelem[0]->set_node(0) = elem->
node_ptr(3);
421 subelem[0]->set_node(1) = elem->
node_ptr(0);
422 subelem[0]->set_node(2) = elem->
node_ptr(1);
423 subelem[0]->set_node(3) = elem->
node_ptr(7);
424 subelem[0]->set_node(4) = elem->
node_ptr(4);
425 subelem[0]->set_node(5) = new_node;
427 subelem[1]->set_node(0) = elem->
node_ptr(1);
428 subelem[1]->set_node(1) = elem->
node_ptr(2);
429 subelem[1]->set_node(2) = elem->
node_ptr(3);
430 subelem[1]->set_node(3) = elem->
node_ptr(5);
431 subelem[1]->set_node(4) = elem->
node_ptr(6);
432 subelem[1]->set_node(5) = new_node;
440 subelem[0] =
new Tri6;
441 subelem[1] =
new Tri6;
448 subelem[0]->set_node(1) = elem->
node_ptr(1);
449 subelem[0]->set_node(2) = elem->
node_ptr(2);
450 subelem[0]->set_node(3) = elem->
node_ptr(4);
451 subelem[0]->set_node(4) = elem->
node_ptr(5);
452 subelem[0]->set_node(5) = elem->
node_ptr(8);
454 subelem[1]->set_node(0) = elem->
node_ptr(0);
455 subelem[1]->set_node(1) = elem->
node_ptr(2);
456 subelem[1]->set_node(2) = elem->
node_ptr(3);
457 subelem[1]->set_node(3) = elem->
node_ptr(8);
458 subelem[1]->set_node(4) = elem->
node_ptr(6);
459 subelem[1]->set_node(5) = elem->
node_ptr(7);
464 subelem[0]->set_node(0) = elem->
node_ptr(0);
465 subelem[0]->set_node(1) = elem->
node_ptr(1);
466 subelem[0]->set_node(2) = elem->
node_ptr(3);
467 subelem[0]->set_node(3) = elem->
node_ptr(4);
468 subelem[0]->set_node(4) = elem->
node_ptr(8);
469 subelem[0]->set_node(5) = elem->
node_ptr(7);
471 subelem[1]->set_node(0) = elem->
node_ptr(1);
472 subelem[1]->set_node(1) = elem->
node_ptr(2);
473 subelem[1]->set_node(2) = elem->
node_ptr(3);
474 subelem[1]->set_node(3) = elem->
node_ptr(5);
475 subelem[1]->set_node(4) = elem->
node_ptr(6);
476 subelem[1]->set_node(5) = elem->
node_ptr(8);
485 subelem[0] =
new Tet4;
486 subelem[1] =
new Tet4;
487 subelem[2] =
new Tet4;
505 if (split_first_diagonal(elem, 0,4, 1,3))
508 if (split_first_diagonal(elem, 0,5, 2,3))
511 if (split_first_diagonal(elem, 1,5, 2,4))
514 subelem[0]->set_node(1) = elem->
node_ptr(4);
515 subelem[0]->set_node(2) = elem->
node_ptr(5);
516 subelem[0]->set_node(3) = elem->
node_ptr(3);
518 subelem[1]->set_node(0) = elem->
node_ptr(0);
519 subelem[1]->set_node(1) = elem->
node_ptr(4);
520 subelem[1]->set_node(2) = elem->
node_ptr(1);
521 subelem[1]->set_node(3) = elem->
node_ptr(5);
523 subelem[2]->set_node(0) = elem->
node_ptr(0);
524 subelem[2]->set_node(1) = elem->
node_ptr(1);
525 subelem[2]->set_node(2) = elem->
node_ptr(2);
526 subelem[2]->set_node(3) = elem->
node_ptr(5);
532 subelem[0]->set_node(0) = elem->
node_ptr(0);
533 subelem[0]->set_node(1) = elem->
node_ptr(4);
534 subelem[0]->set_node(2) = elem->
node_ptr(5);
535 subelem[0]->set_node(3) = elem->
node_ptr(3);
537 subelem[1]->set_node(0) = elem->
node_ptr(0);
538 subelem[1]->set_node(1) = elem->
node_ptr(4);
539 subelem[1]->set_node(2) = elem->
node_ptr(2);
540 subelem[1]->set_node(3) = elem->
node_ptr(5);
542 subelem[2]->set_node(0) = elem->
node_ptr(0);
543 subelem[2]->set_node(1) = elem->
node_ptr(1);
544 subelem[2]->set_node(2) = elem->
node_ptr(2);
545 subelem[2]->set_node(3) = elem->
node_ptr(4);
555 subelem[0]->set_node(0) = elem->
node_ptr(0);
556 subelem[0]->set_node(1) = elem->
node_ptr(4);
557 subelem[0]->set_node(2) = elem->
node_ptr(2);
558 subelem[0]->set_node(3) = elem->
node_ptr(3);
560 subelem[1]->set_node(0) = elem->
node_ptr(3);
561 subelem[1]->set_node(1) = elem->
node_ptr(4);
562 subelem[1]->set_node(2) = elem->
node_ptr(2);
563 subelem[1]->set_node(3) = elem->
node_ptr(5);
565 subelem[2]->set_node(0) = elem->
node_ptr(0);
566 subelem[2]->set_node(1) = elem->
node_ptr(1);
567 subelem[2]->set_node(2) = elem->
node_ptr(2);
568 subelem[2]->set_node(3) = elem->
node_ptr(4);
576 if (split_first_diagonal(elem, 0,5, 2,3))
581 subelem[0]->set_node(0) = elem->
node_ptr(1);
582 subelem[0]->set_node(1) = elem->
node_ptr(3);
583 subelem[0]->set_node(2) = elem->
node_ptr(4);
584 subelem[0]->set_node(3) = elem->
node_ptr(5);
586 subelem[1]->set_node(0) = elem->
node_ptr(1);
587 subelem[1]->set_node(1) = elem->
node_ptr(0);
588 subelem[1]->set_node(2) = elem->
node_ptr(3);
589 subelem[1]->set_node(3) = elem->
node_ptr(5);
591 subelem[2]->set_node(0) = elem->
node_ptr(0);
592 subelem[2]->set_node(1) = elem->
node_ptr(1);
593 subelem[2]->set_node(2) = elem->
node_ptr(2);
594 subelem[2]->set_node(3) = elem->
node_ptr(5);
601 if (split_first_diagonal(elem, 1,5, 2,4))
603 subelem[0]->set_node(0) = elem->
node_ptr(0);
604 subelem[0]->set_node(1) = elem->
node_ptr(1);
605 subelem[0]->set_node(2) = elem->
node_ptr(2);
606 subelem[0]->set_node(3) = elem->
node_ptr(3);
608 subelem[1]->set_node(0) = elem->
node_ptr(3);
609 subelem[1]->set_node(1) = elem->
node_ptr(1);
610 subelem[1]->set_node(2) = elem->
node_ptr(2);
611 subelem[1]->set_node(3) = elem->
node_ptr(5);
613 subelem[2]->set_node(0) = elem->
node_ptr(1);
614 subelem[2]->set_node(1) = elem->
node_ptr(3);
615 subelem[2]->set_node(2) = elem->
node_ptr(4);
616 subelem[2]->set_node(3) = elem->
node_ptr(5);
622 subelem[0]->set_node(0) = elem->
node_ptr(0);
623 subelem[0]->set_node(1) = elem->
node_ptr(1);
624 subelem[0]->set_node(2) = elem->
node_ptr(2);
625 subelem[0]->set_node(3) = elem->
node_ptr(3);
627 subelem[1]->set_node(0) = elem->
node_ptr(2);
628 subelem[1]->set_node(1) = elem->
node_ptr(3);
629 subelem[1]->set_node(2) = elem->
node_ptr(4);
630 subelem[1]->set_node(3) = elem->
node_ptr(5);
632 subelem[2]->set_node(0) = elem->
node_ptr(3);
633 subelem[2]->set_node(1) = elem->
node_ptr(1);
634 subelem[2]->set_node(2) = elem->
node_ptr(2);
635 subelem[2]->set_node(3) = elem->
node_ptr(4);
645 subelem[0] =
new Tet10;
646 subelem[1] =
new Tet10;
647 subelem[2] =
new Tet10;
650 if (split_first_diagonal(elem, 0,4, 1,3))
653 if (split_first_diagonal(elem, 0,5, 2,3))
656 if (split_first_diagonal(elem, 1,5, 2,4))
659 subelem[0]->set_node(1) = elem->
node_ptr(4);
660 subelem[0]->set_node(2) = elem->
node_ptr(5);
661 subelem[0]->set_node(3) = elem->
node_ptr(3);
663 subelem[0]->set_node(4) = elem->
node_ptr(15);
664 subelem[0]->set_node(5) = elem->
node_ptr(13);
665 subelem[0]->set_node(6) = elem->
node_ptr(17);
666 subelem[0]->set_node(7) = elem->
node_ptr(9);
667 subelem[0]->set_node(8) = elem->
node_ptr(12);
668 subelem[0]->set_node(9) = elem->
node_ptr(14);
670 subelem[1]->set_node(0) = elem->
node_ptr(0);
671 subelem[1]->set_node(1) = elem->
node_ptr(4);
672 subelem[1]->set_node(2) = elem->
node_ptr(1);
673 subelem[1]->set_node(3) = elem->
node_ptr(5);
675 subelem[1]->set_node(4) = elem->
node_ptr(15);
676 subelem[1]->set_node(5) = elem->
node_ptr(10);
677 subelem[1]->set_node(6) = elem->
node_ptr(6);
678 subelem[1]->set_node(7) = elem->
node_ptr(17);
679 subelem[1]->set_node(8) = elem->
node_ptr(13);
680 subelem[1]->set_node(9) = elem->
node_ptr(16);
682 subelem[2]->set_node(0) = elem->
node_ptr(0);
683 subelem[2]->set_node(1) = elem->
node_ptr(1);
684 subelem[2]->set_node(2) = elem->
node_ptr(2);
685 subelem[2]->set_node(3) = elem->
node_ptr(5);
687 subelem[2]->set_node(4) = elem->
node_ptr(6);
688 subelem[2]->set_node(5) = elem->
node_ptr(7);
689 subelem[2]->set_node(6) = elem->
node_ptr(8);
690 subelem[2]->set_node(7) = elem->
node_ptr(17);
691 subelem[2]->set_node(8) = elem->
node_ptr(16);
692 subelem[2]->set_node(9) = elem->
node_ptr(11);
698 subelem[0]->set_node(0) = elem->
node_ptr(0);
699 subelem[0]->set_node(1) = elem->
node_ptr(4);
700 subelem[0]->set_node(2) = elem->
node_ptr(5);
701 subelem[0]->set_node(3) = elem->
node_ptr(3);
703 subelem[0]->set_node(4) = elem->
node_ptr(15);
704 subelem[0]->set_node(5) = elem->
node_ptr(13);
705 subelem[0]->set_node(6) = elem->
node_ptr(17);
706 subelem[0]->set_node(7) = elem->
node_ptr(9);
707 subelem[0]->set_node(8) = elem->
node_ptr(12);
708 subelem[0]->set_node(9) = elem->
node_ptr(14);
710 subelem[1]->set_node(0) = elem->
node_ptr(0);
711 subelem[1]->set_node(1) = elem->
node_ptr(4);
712 subelem[1]->set_node(2) = elem->
node_ptr(2);
713 subelem[1]->set_node(3) = elem->
node_ptr(5);
715 subelem[1]->set_node(4) = elem->
node_ptr(15);
716 subelem[1]->set_node(5) = elem->
node_ptr(16);
717 subelem[1]->set_node(6) = elem->
node_ptr(8);
718 subelem[1]->set_node(7) = elem->
node_ptr(17);
719 subelem[1]->set_node(8) = elem->
node_ptr(13);
720 subelem[1]->set_node(9) = elem->
node_ptr(11);
722 subelem[2]->set_node(0) = elem->
node_ptr(0);
723 subelem[2]->set_node(1) = elem->
node_ptr(1);
724 subelem[2]->set_node(2) = elem->
node_ptr(2);
725 subelem[2]->set_node(3) = elem->
node_ptr(4);
727 subelem[2]->set_node(4) = elem->
node_ptr(6);
728 subelem[2]->set_node(5) = elem->
node_ptr(7);
729 subelem[2]->set_node(6) = elem->
node_ptr(8);
730 subelem[2]->set_node(7) = elem->
node_ptr(15);
731 subelem[2]->set_node(8) = elem->
node_ptr(10);
732 subelem[2]->set_node(9) = elem->
node_ptr(16);
742 subelem[0]->set_node(0) = elem->
node_ptr(0);
743 subelem[0]->set_node(1) = elem->
node_ptr(4);
744 subelem[0]->set_node(2) = elem->
node_ptr(2);
745 subelem[0]->set_node(3) = elem->
node_ptr(3);
747 subelem[0]->set_node(4) = elem->
node_ptr(15);
748 subelem[0]->set_node(5) = elem->
node_ptr(16);
749 subelem[0]->set_node(6) = elem->
node_ptr(8);
750 subelem[0]->set_node(7) = elem->
node_ptr(9);
751 subelem[0]->set_node(8) = elem->
node_ptr(12);
752 subelem[0]->set_node(9) = elem->
node_ptr(17);
754 subelem[1]->set_node(0) = elem->
node_ptr(3);
755 subelem[1]->set_node(1) = elem->
node_ptr(4);
756 subelem[1]->set_node(2) = elem->
node_ptr(2);
757 subelem[1]->set_node(3) = elem->
node_ptr(5);
759 subelem[1]->set_node(4) = elem->
node_ptr(12);
760 subelem[1]->set_node(5) = elem->
node_ptr(16);
761 subelem[1]->set_node(6) = elem->
node_ptr(17);
762 subelem[1]->set_node(7) = elem->
node_ptr(14);
763 subelem[1]->set_node(8) = elem->
node_ptr(13);
764 subelem[1]->set_node(9) = elem->
node_ptr(11);
766 subelem[2]->set_node(0) = elem->
node_ptr(0);
767 subelem[2]->set_node(1) = elem->
node_ptr(1);
768 subelem[2]->set_node(2) = elem->
node_ptr(2);
769 subelem[2]->set_node(3) = elem->
node_ptr(4);
771 subelem[2]->set_node(4) = elem->
node_ptr(6);
772 subelem[2]->set_node(5) = elem->
node_ptr(7);
773 subelem[2]->set_node(6) = elem->
node_ptr(8);
774 subelem[2]->set_node(7) = elem->
node_ptr(15);
775 subelem[2]->set_node(8) = elem->
node_ptr(10);
776 subelem[2]->set_node(9) = elem->
node_ptr(16);
784 if (split_first_diagonal(elem, 0,5, 2,3))
789 subelem[0]->set_node(0) = elem->
node_ptr(1);
790 subelem[0]->set_node(1) = elem->
node_ptr(3);
791 subelem[0]->set_node(2) = elem->
node_ptr(4);
792 subelem[0]->set_node(3) = elem->
node_ptr(5);
794 subelem[0]->set_node(4) = elem->
node_ptr(15);
795 subelem[0]->set_node(5) = elem->
node_ptr(12);
796 subelem[0]->set_node(6) = elem->
node_ptr(10);
797 subelem[0]->set_node(7) = elem->
node_ptr(16);
798 subelem[0]->set_node(8) = elem->
node_ptr(14);
799 subelem[0]->set_node(9) = elem->
node_ptr(13);
801 subelem[1]->set_node(0) = elem->
node_ptr(1);
802 subelem[1]->set_node(1) = elem->
node_ptr(0);
803 subelem[1]->set_node(2) = elem->
node_ptr(3);
804 subelem[1]->set_node(3) = elem->
node_ptr(5);
806 subelem[1]->set_node(4) = elem->
node_ptr(6);
807 subelem[1]->set_node(5) = elem->
node_ptr(9);
808 subelem[1]->set_node(6) = elem->
node_ptr(15);
809 subelem[1]->set_node(7) = elem->
node_ptr(16);
810 subelem[1]->set_node(8) = elem->
node_ptr(17);
811 subelem[1]->set_node(9) = elem->
node_ptr(14);
813 subelem[2]->set_node(0) = elem->
node_ptr(0);
814 subelem[2]->set_node(1) = elem->
node_ptr(1);
815 subelem[2]->set_node(2) = elem->
node_ptr(2);
816 subelem[2]->set_node(3) = elem->
node_ptr(5);
818 subelem[2]->set_node(4) = elem->
node_ptr(6);
819 subelem[2]->set_node(5) = elem->
node_ptr(7);
820 subelem[2]->set_node(6) = elem->
node_ptr(8);
821 subelem[2]->set_node(7) = elem->
node_ptr(17);
822 subelem[2]->set_node(8) = elem->
node_ptr(16);
823 subelem[2]->set_node(9) = elem->
node_ptr(11);
830 if (split_first_diagonal(elem, 1,5, 2,4))
832 subelem[0]->set_node(0) = elem->
node_ptr(0);
833 subelem[0]->set_node(1) = elem->
node_ptr(1);
834 subelem[0]->set_node(2) = elem->
node_ptr(2);
835 subelem[0]->set_node(3) = elem->
node_ptr(3);
837 subelem[0]->set_node(4) = elem->
node_ptr(6);
838 subelem[0]->set_node(5) = elem->
node_ptr(7);
839 subelem[0]->set_node(6) = elem->
node_ptr(8);
840 subelem[0]->set_node(7) = elem->
node_ptr(9);
841 subelem[0]->set_node(8) = elem->
node_ptr(15);
842 subelem[0]->set_node(9) = elem->
node_ptr(17);
844 subelem[1]->set_node(0) = elem->
node_ptr(3);
845 subelem[1]->set_node(1) = elem->
node_ptr(1);
846 subelem[1]->set_node(2) = elem->
node_ptr(2);
847 subelem[1]->set_node(3) = elem->
node_ptr(5);
849 subelem[1]->set_node(4) = elem->
node_ptr(15);
850 subelem[1]->set_node(5) = elem->
node_ptr(7);
851 subelem[1]->set_node(6) = elem->
node_ptr(17);
852 subelem[1]->set_node(7) = elem->
node_ptr(14);
853 subelem[1]->set_node(8) = elem->
node_ptr(16);
854 subelem[1]->set_node(9) = elem->
node_ptr(11);
856 subelem[2]->set_node(0) = elem->
node_ptr(1);
857 subelem[2]->set_node(1) = elem->
node_ptr(3);
858 subelem[2]->set_node(2) = elem->
node_ptr(4);
859 subelem[2]->set_node(3) = elem->
node_ptr(5);
861 subelem[2]->set_node(4) = elem->
node_ptr(15);
862 subelem[2]->set_node(5) = elem->
node_ptr(12);
863 subelem[2]->set_node(6) = elem->
node_ptr(10);
864 subelem[2]->set_node(7) = elem->
node_ptr(16);
865 subelem[2]->set_node(8) = elem->
node_ptr(14);
866 subelem[2]->set_node(9) = elem->
node_ptr(13);
872 subelem[0]->set_node(0) = elem->
node_ptr(0);
873 subelem[0]->set_node(1) = elem->
node_ptr(1);
874 subelem[0]->set_node(2) = elem->
node_ptr(2);
875 subelem[0]->set_node(3) = elem->
node_ptr(3);
877 subelem[0]->set_node(4) = elem->
node_ptr(6);
878 subelem[0]->set_node(5) = elem->
node_ptr(7);
879 subelem[0]->set_node(6) = elem->
node_ptr(8);
880 subelem[0]->set_node(7) = elem->
node_ptr(9);
881 subelem[0]->set_node(8) = elem->
node_ptr(15);
882 subelem[0]->set_node(9) = elem->
node_ptr(17);
884 subelem[1]->set_node(0) = elem->
node_ptr(2);
885 subelem[1]->set_node(1) = elem->
node_ptr(3);
886 subelem[1]->set_node(2) = elem->
node_ptr(4);
887 subelem[1]->set_node(3) = elem->
node_ptr(5);
889 subelem[1]->set_node(4) = elem->
node_ptr(17);
890 subelem[1]->set_node(5) = elem->
node_ptr(12);
891 subelem[1]->set_node(6) = elem->
node_ptr(16);
892 subelem[1]->set_node(7) = elem->
node_ptr(11);
893 subelem[1]->set_node(8) = elem->
node_ptr(14);
894 subelem[1]->set_node(9) = elem->
node_ptr(13);
896 subelem[2]->set_node(0) = elem->
node_ptr(3);
897 subelem[2]->set_node(1) = elem->
node_ptr(1);
898 subelem[2]->set_node(2) = elem->
node_ptr(2);
899 subelem[2]->set_node(3) = elem->
node_ptr(4);
901 subelem[2]->set_node(4) = elem->
node_ptr(15);
902 subelem[2]->set_node(5) = elem->
node_ptr(7);
903 subelem[2]->set_node(6) = elem->
node_ptr(17);
904 subelem[2]->set_node(7) = elem->
node_ptr(12);
905 subelem[2]->set_node(8) = elem->
node_ptr(10);
906 subelem[2]->set_node(9) = elem->
node_ptr(16);
934 libMesh::err <<
"Error, encountered unimplemented element "
935 << Utility::enum_to_string<ElemType>(etype)
936 <<
" in MeshTools::Modification::all_tri()..."
938 libmesh_not_implemented();
945 for (
unsigned int i=0; i != max_subelems; ++i)
958 if (mesh_has_boundary_data || mesh_is_serial)
961 std::vector<boundary_id_type> bc_ids;
966 for (
const auto & b_id : bc_ids)
973 std::vector<dof_id_type> elem_side_nodes(elem_side->n_nodes());
974 for (
unsigned int esn=0,
975 n_esn = cast_int<unsigned int>(elem_side_nodes.size());
977 elem_side_nodes[esn] = elem_side->node_id(esn);
978 std::sort(elem_side_nodes.begin(), elem_side_nodes.end());
980 for (
unsigned int i=0; i != max_subelems; ++i)
983 for (
auto subside : subelem[i]->side_index_range())
985 std::unique_ptr<Elem> subside_elem = subelem[i]->build_side_ptr(subside);
993 std::vector<dof_id_type> subside_nodes(subside_elem->n_vertices());
994 for (
unsigned int ssn=0,
995 n_ssn = cast_int<unsigned int>(subside_nodes.size());
997 subside_nodes[ssn] = subside_elem->node_id(ssn);
998 std::sort(subside_nodes.begin(), subside_nodes.end());
1002 if (std::includes(elem_side_nodes.begin(), elem_side_nodes.end(),
1003 subside_nodes.begin(), subside_nodes.end()))
1007 new_bndry_ids.push_back(b_id);
1008 new_bndry_elements.push_back(subelem[i]);
1009 new_bndry_sides.push_back(subside);
1015 subelem[i]->set_neighbor(subside, const_cast<RemoteElem*>(
remote_elem));
1031 for (
unsigned int i=0; i != max_subelems; ++i)
1038 subelem[i]->set_id( max_orig_id + 6*elem->
id() + i );
1040 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1041 subelem[i]->set_unique_id() = max_unique_id + 2*elem->
unique_id() + i;
1045 new_elements.push_back(subelem[i]);
1056 for (
auto & elem : new_elements)
1059 if (mesh_has_boundary_data)
1072 bool nbe_nonempty = new_bndry_elements.size();
1080 libmesh_assert_equal_to (new_bndry_elements.size(), new_bndry_sides.size());
1081 libmesh_assert_equal_to (new_bndry_sides.size(), new_bndry_ids.size());
1096 mesh.
comm().max(added_new_ghost_point);
1098 if (added_new_ghost_point)
1112 const unsigned int n_iterations,
1123 std::unordered_set<dof_id_type> boundary_node_ids =
1126 for (
unsigned int iter=0; iter<n_iterations; iter++)
1132 for (
unsigned int refinement_level=0; refinement_level !=
n_levels;
1136 std::vector<Point> new_positions;
1137 std::vector<Real>
weight;
1151 if (refinement_level == 0)
1166 const Node & node0 = side->node_ref(0);
1167 const Node & node1 = side->node_ref(1);
1169 Real node_weight = 1.;
1173 Point diff = node0-node1;
1178 new_positions[id0].add_scaled( node1, node_weight );
1179 new_positions[id1].add_scaled( node0, node_weight );
1180 weight[id0] += node_weight;
1181 weight[id1] += node_weight;
1185 #ifdef LIBMESH_ENABLE_AMR
1221 new_positions[id] = point;
1225 #endif // #ifdef LIBMESH_ENABLE_AMR
1233 if (!boundary_node_ids.count(nid) &&
weight[nid] > 0.)
1243 const unsigned int son_begin = elem->
n_vertices();
1244 const unsigned int son_end = elem->
n_nodes();
1245 for (
unsigned int n=son_begin; n<son_end; n++)
1247 const unsigned int n_adjacent_vertices =
1251 for (
unsigned int v=0; v<n_adjacent_vertices; v++)
1264 #ifdef LIBMESH_ENABLE_AMR
1277 std::vector<Elem *> new_elements;
1280 std::vector<Elem *> saved_boundary_elements;
1281 std::vector<boundary_id_type> saved_bc_ids;
1282 std::vector<unsigned short int> saved_bc_sides;
1285 std::vector<boundary_id_type> bc_ids;
1309 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1322 for (
const auto & bc_id : bc_ids)
1325 saved_boundary_elements.push_back(copy);
1326 saved_bc_ids.push_back(bc_id);
1327 saved_bc_sides.push_back(s);
1336 new_elements.push_back(copy);
1341 libmesh_assert_equal_to (saved_boundary_elements.size(), saved_bc_ids.size());
1342 libmesh_assert_equal_to (saved_bc_ids.size(), saved_bc_sides.size());
1349 for (
auto & new_elem : new_elements)
1360 libmesh_assert_equal_to (orig_id, added_elem->
id());
1367 for (
auto e :
index_range(saved_boundary_elements))
1375 #endif // #ifdef LIBMESH_ENABLE_AMR
1383 if (old_id == new_id)
1394 std::vector<boundary_id_type> bndry_ids;
1398 if (std::get<1>(t) == old_id)
1407 std::replace(bndry_ids.begin(), bndry_ids.end(), old_id, new_id);
1419 std::vector<boundary_id_type> bndry_ids;
1423 if (std::get<2>(t) == old_id)
1429 unsigned short int edge = std::get<1>(t);
1435 std::replace(bndry_ids.begin(), bndry_ids.end(), old_id, new_id);
1441 bi.
add_edge(elem, edge, bndry_ids);
1447 std::vector<boundary_id_type> bndry_ids;
1451 if (std::get<2>(t) == old_id)
1457 unsigned short int shellface = std::get<1>(t);
1463 std::replace(bndry_ids.begin(), bndry_ids.end(), old_id, new_id);
1475 std::vector<boundary_id_type> bndry_ids;
1479 if (std::get<2>(t) == old_id)
1485 unsigned short int side = std::get<1>(t);
1491 std::replace(bndry_ids.begin(), bndry_ids.end(), old_id, new_id);
1497 bi.
add_side(elem, side, bndry_ids);
1512 if (old_id == new_id)