282 std::vector<Elem *> new_elements;
284 unsigned int max_subelems = 1;
285 if (
mesh.mesh_dimension() == 2)
287 if (
mesh.mesh_dimension() == 3)
290 new_elements.reserve (max_subelems*n_orig_elem);
297 const bool mesh_has_boundary_data = (
mesh.get_boundary_info().n_boundary_conds() > 0);
300 std::vector<Elem *> new_bndry_elements;
301 std::vector<unsigned short int> new_bndry_sides;
302 std::vector<boundary_id_type> new_bndry_ids;
307 bool added_new_ghost_point =
false;
320 #ifdef LIBMESH_ENABLE_UNIQUE_ID 324 for (
auto & elem :
mesh.element_ptr_range())
326 const ElemType etype = elem->type();
329 libmesh_assert (!elem->parent());
335 for (
unsigned int i = 0; i != max_subelems; ++i)
336 subelem[i] =
nullptr;
342 subelem[0] =
new Tri3;
343 subelem[1] =
new Tri3;
346 if ((elem->point(0) - elem->point(2)).norm() <
347 (elem->point(1) - elem->point(3)).norm())
349 subelem[0]->set_node(0) = elem->node_ptr(0);
350 subelem[0]->set_node(1) = elem->node_ptr(1);
351 subelem[0]->set_node(2) = elem->node_ptr(2);
353 subelem[1]->set_node(0) = elem->node_ptr(0);
354 subelem[1]->set_node(1) = elem->node_ptr(2);
355 subelem[1]->set_node(2) = elem->node_ptr(3);
360 subelem[0]->set_node(0) = elem->node_ptr(0);
361 subelem[0]->set_node(1) = elem->node_ptr(1);
362 subelem[0]->set_node(2) = elem->node_ptr(3);
364 subelem[1]->set_node(0) = elem->node_ptr(1);
365 subelem[1]->set_node(1) = elem->node_ptr(2);
366 subelem[1]->set_node(2) = elem->node_ptr(3);
375 if (elem->processor_id() !=
mesh.processor_id())
376 added_new_ghost_point =
true;
378 subelem[0] =
new Tri6;
379 subelem[1] =
new Tri6;
382 Node * new_node =
mesh.add_point((
mesh.point(elem->node_id(0)) +
383 mesh.point(elem->node_id(1)) +
384 mesh.point(elem->node_id(2)) +
385 mesh.point(elem->node_id(3)))/4,
386 DofObject::invalid_id,
387 elem->processor_id());
390 if ((elem->point(0) - elem->point(2)).norm() <
391 (elem->point(1) - elem->point(3)).norm())
393 subelem[0]->set_node(0) = elem->node_ptr(0);
394 subelem[0]->set_node(1) = elem->node_ptr(1);
395 subelem[0]->set_node(2) = elem->node_ptr(2);
396 subelem[0]->set_node(3) = elem->node_ptr(4);
397 subelem[0]->set_node(4) = elem->node_ptr(5);
398 subelem[0]->set_node(5) = new_node;
400 subelem[1]->set_node(0) = elem->node_ptr(0);
401 subelem[1]->set_node(1) = elem->node_ptr(2);
402 subelem[1]->set_node(2) = elem->node_ptr(3);
403 subelem[1]->set_node(3) = new_node;
404 subelem[1]->set_node(4) = elem->node_ptr(6);
405 subelem[1]->set_node(5) = elem->node_ptr(7);
411 subelem[0]->set_node(0) = elem->node_ptr(3);
412 subelem[0]->set_node(1) = elem->node_ptr(0);
413 subelem[0]->set_node(2) = elem->node_ptr(1);
414 subelem[0]->set_node(3) = elem->node_ptr(7);
415 subelem[0]->set_node(4) = elem->node_ptr(4);
416 subelem[0]->set_node(5) = new_node;
418 subelem[1]->set_node(0) = elem->node_ptr(1);
419 subelem[1]->set_node(1) = elem->node_ptr(2);
420 subelem[1]->set_node(2) = elem->node_ptr(3);
421 subelem[1]->set_node(3) = elem->node_ptr(5);
422 subelem[1]->set_node(4) = elem->node_ptr(6);
423 subelem[1]->set_node(5) = new_node;
431 subelem[0] =
new Tri6;
432 subelem[1] =
new Tri6;
435 if ((elem->point(0) - elem->point(2)).norm() <
436 (elem->point(1) - elem->point(3)).norm())
438 subelem[0]->set_node(0) = elem->node_ptr(0);
439 subelem[0]->set_node(1) = elem->node_ptr(1);
440 subelem[0]->set_node(2) = elem->node_ptr(2);
441 subelem[0]->set_node(3) = elem->node_ptr(4);
442 subelem[0]->set_node(4) = elem->node_ptr(5);
443 subelem[0]->set_node(5) = elem->node_ptr(8);
445 subelem[1]->set_node(0) = elem->node_ptr(0);
446 subelem[1]->set_node(1) = elem->node_ptr(2);
447 subelem[1]->set_node(2) = elem->node_ptr(3);
448 subelem[1]->set_node(3) = elem->node_ptr(8);
449 subelem[1]->set_node(4) = elem->node_ptr(6);
450 subelem[1]->set_node(5) = elem->node_ptr(7);
455 subelem[0]->set_node(0) = elem->node_ptr(0);
456 subelem[0]->set_node(1) = elem->node_ptr(1);
457 subelem[0]->set_node(2) = elem->node_ptr(3);
458 subelem[0]->set_node(3) = elem->node_ptr(4);
459 subelem[0]->set_node(4) = elem->node_ptr(8);
460 subelem[0]->set_node(5) = elem->node_ptr(7);
462 subelem[1]->set_node(0) = elem->node_ptr(1);
463 subelem[1]->set_node(1) = elem->node_ptr(2);
464 subelem[1]->set_node(2) = elem->node_ptr(3);
465 subelem[1]->set_node(3) = elem->node_ptr(5);
466 subelem[1]->set_node(4) = elem->node_ptr(6);
467 subelem[1]->set_node(5) = elem->node_ptr(8);
476 subelem[0] =
new Tet4;
477 subelem[1] =
new Tet4;
478 subelem[2] =
new Tet4;
496 if (split_first_diagonal(elem, 0,4, 1,3))
499 if (split_first_diagonal(elem, 0,5, 2,3))
502 if (split_first_diagonal(elem, 1,5, 2,4))
504 subelem[0]->set_node(0) = elem->node_ptr(0);
505 subelem[0]->set_node(1) = elem->node_ptr(4);
506 subelem[0]->set_node(2) = elem->node_ptr(5);
507 subelem[0]->set_node(3) = elem->node_ptr(3);
509 subelem[1]->set_node(0) = elem->node_ptr(0);
510 subelem[1]->set_node(1) = elem->node_ptr(4);
511 subelem[1]->set_node(2) = elem->node_ptr(1);
512 subelem[1]->set_node(3) = elem->node_ptr(5);
514 subelem[2]->set_node(0) = elem->node_ptr(0);
515 subelem[2]->set_node(1) = elem->node_ptr(1);
516 subelem[2]->set_node(2) = elem->node_ptr(2);
517 subelem[2]->set_node(3) = elem->node_ptr(5);
521 libmesh_assert (split_first_diagonal(elem, 2,4, 1,5));
523 subelem[0]->set_node(0) = elem->node_ptr(0);
524 subelem[0]->set_node(1) = elem->node_ptr(4);
525 subelem[0]->set_node(2) = elem->node_ptr(5);
526 subelem[0]->set_node(3) = elem->node_ptr(3);
528 subelem[1]->set_node(0) = elem->node_ptr(0);
529 subelem[1]->set_node(1) = elem->node_ptr(4);
530 subelem[1]->set_node(2) = elem->node_ptr(2);
531 subelem[1]->set_node(3) = elem->node_ptr(5);
533 subelem[2]->set_node(0) = elem->node_ptr(0);
534 subelem[2]->set_node(1) = elem->node_ptr(1);
535 subelem[2]->set_node(2) = elem->node_ptr(2);
536 subelem[2]->set_node(3) = elem->node_ptr(4);
541 libmesh_assert (split_first_diagonal(elem, 2,3, 0,5));
544 libmesh_assert (split_first_diagonal(elem, 2,4, 1,5));
546 subelem[0]->set_node(0) = elem->node_ptr(0);
547 subelem[0]->set_node(1) = elem->node_ptr(4);
548 subelem[0]->set_node(2) = elem->node_ptr(2);
549 subelem[0]->set_node(3) = elem->node_ptr(3);
551 subelem[1]->set_node(0) = elem->node_ptr(3);
552 subelem[1]->set_node(1) = elem->node_ptr(4);
553 subelem[1]->set_node(2) = elem->node_ptr(2);
554 subelem[1]->set_node(3) = elem->node_ptr(5);
556 subelem[2]->set_node(0) = elem->node_ptr(0);
557 subelem[2]->set_node(1) = elem->node_ptr(1);
558 subelem[2]->set_node(2) = elem->node_ptr(2);
559 subelem[2]->set_node(3) = elem->node_ptr(4);
564 libmesh_assert (split_first_diagonal(elem, 1,3, 0,4));
567 if (split_first_diagonal(elem, 0,5, 2,3))
570 libmesh_assert (split_first_diagonal(elem, 1,5, 2,4));
572 subelem[0]->set_node(0) = elem->node_ptr(1);
573 subelem[0]->set_node(1) = elem->node_ptr(3);
574 subelem[0]->set_node(2) = elem->node_ptr(4);
575 subelem[0]->set_node(3) = elem->node_ptr(5);
577 subelem[1]->set_node(0) = elem->node_ptr(1);
578 subelem[1]->set_node(1) = elem->node_ptr(0);
579 subelem[1]->set_node(2) = elem->node_ptr(3);
580 subelem[1]->set_node(3) = elem->node_ptr(5);
582 subelem[2]->set_node(0) = elem->node_ptr(0);
583 subelem[2]->set_node(1) = elem->node_ptr(1);
584 subelem[2]->set_node(2) = elem->node_ptr(2);
585 subelem[2]->set_node(3) = elem->node_ptr(5);
589 libmesh_assert (split_first_diagonal(elem, 2,3, 0,5));
592 if (split_first_diagonal(elem, 1,5, 2,4))
594 subelem[0]->set_node(0) = elem->node_ptr(0);
595 subelem[0]->set_node(1) = elem->node_ptr(1);
596 subelem[0]->set_node(2) = elem->node_ptr(2);
597 subelem[0]->set_node(3) = elem->node_ptr(3);
599 subelem[1]->set_node(0) = elem->node_ptr(3);
600 subelem[1]->set_node(1) = elem->node_ptr(1);
601 subelem[1]->set_node(2) = elem->node_ptr(2);
602 subelem[1]->set_node(3) = elem->node_ptr(5);
604 subelem[2]->set_node(0) = elem->node_ptr(1);
605 subelem[2]->set_node(1) = elem->node_ptr(3);
606 subelem[2]->set_node(2) = elem->node_ptr(4);
607 subelem[2]->set_node(3) = elem->node_ptr(5);
611 libmesh_assert (split_first_diagonal(elem, 2,4, 1,5));
613 subelem[0]->set_node(0) = elem->node_ptr(0);
614 subelem[0]->set_node(1) = elem->node_ptr(1);
615 subelem[0]->set_node(2) = elem->node_ptr(2);
616 subelem[0]->set_node(3) = elem->node_ptr(3);
618 subelem[1]->set_node(0) = elem->node_ptr(2);
619 subelem[1]->set_node(1) = elem->node_ptr(3);
620 subelem[1]->set_node(2) = elem->node_ptr(4);
621 subelem[1]->set_node(3) = elem->node_ptr(5);
623 subelem[2]->set_node(0) = elem->node_ptr(3);
624 subelem[2]->set_node(1) = elem->node_ptr(1);
625 subelem[2]->set_node(2) = elem->node_ptr(2);
626 subelem[2]->set_node(3) = elem->node_ptr(4);
636 subelem[0] =
new Tet10;
637 subelem[1] =
new Tet10;
638 subelem[2] =
new Tet10;
641 if (split_first_diagonal(elem, 0,4, 1,3))
644 if (split_first_diagonal(elem, 0,5, 2,3))
647 if (split_first_diagonal(elem, 1,5, 2,4))
649 subelem[0]->set_node(0) = elem->node_ptr(0);
650 subelem[0]->set_node(1) = elem->node_ptr(4);
651 subelem[0]->set_node(2) = elem->node_ptr(5);
652 subelem[0]->set_node(3) = elem->node_ptr(3);
654 subelem[0]->set_node(4) = elem->node_ptr(15);
655 subelem[0]->set_node(5) = elem->node_ptr(13);
656 subelem[0]->set_node(6) = elem->node_ptr(17);
657 subelem[0]->set_node(7) = elem->node_ptr(9);
658 subelem[0]->set_node(8) = elem->node_ptr(12);
659 subelem[0]->set_node(9) = elem->node_ptr(14);
661 subelem[1]->set_node(0) = elem->node_ptr(0);
662 subelem[1]->set_node(1) = elem->node_ptr(4);
663 subelem[1]->set_node(2) = elem->node_ptr(1);
664 subelem[1]->set_node(3) = elem->node_ptr(5);
666 subelem[1]->set_node(4) = elem->node_ptr(15);
667 subelem[1]->set_node(5) = elem->node_ptr(10);
668 subelem[1]->set_node(6) = elem->node_ptr(6);
669 subelem[1]->set_node(7) = elem->node_ptr(17);
670 subelem[1]->set_node(8) = elem->node_ptr(13);
671 subelem[1]->set_node(9) = elem->node_ptr(16);
673 subelem[2]->set_node(0) = elem->node_ptr(0);
674 subelem[2]->set_node(1) = elem->node_ptr(1);
675 subelem[2]->set_node(2) = elem->node_ptr(2);
676 subelem[2]->set_node(3) = elem->node_ptr(5);
678 subelem[2]->set_node(4) = elem->node_ptr(6);
679 subelem[2]->set_node(5) = elem->node_ptr(7);
680 subelem[2]->set_node(6) = elem->node_ptr(8);
681 subelem[2]->set_node(7) = elem->node_ptr(17);
682 subelem[2]->set_node(8) = elem->node_ptr(16);
683 subelem[2]->set_node(9) = elem->node_ptr(11);
687 libmesh_assert (split_first_diagonal(elem, 2,4, 1,5));
689 subelem[0]->set_node(0) = elem->node_ptr(0);
690 subelem[0]->set_node(1) = elem->node_ptr(4);
691 subelem[0]->set_node(2) = elem->node_ptr(5);
692 subelem[0]->set_node(3) = elem->node_ptr(3);
694 subelem[0]->set_node(4) = elem->node_ptr(15);
695 subelem[0]->set_node(5) = elem->node_ptr(13);
696 subelem[0]->set_node(6) = elem->node_ptr(17);
697 subelem[0]->set_node(7) = elem->node_ptr(9);
698 subelem[0]->set_node(8) = elem->node_ptr(12);
699 subelem[0]->set_node(9) = elem->node_ptr(14);
701 subelem[1]->set_node(0) = elem->node_ptr(0);
702 subelem[1]->set_node(1) = elem->node_ptr(4);
703 subelem[1]->set_node(2) = elem->node_ptr(2);
704 subelem[1]->set_node(3) = elem->node_ptr(5);
706 subelem[1]->set_node(4) = elem->node_ptr(15);
707 subelem[1]->set_node(5) = elem->node_ptr(16);
708 subelem[1]->set_node(6) = elem->node_ptr(8);
709 subelem[1]->set_node(7) = elem->node_ptr(17);
710 subelem[1]->set_node(8) = elem->node_ptr(13);
711 subelem[1]->set_node(9) = elem->node_ptr(11);
713 subelem[2]->set_node(0) = elem->node_ptr(0);
714 subelem[2]->set_node(1) = elem->node_ptr(1);
715 subelem[2]->set_node(2) = elem->node_ptr(2);
716 subelem[2]->set_node(3) = elem->node_ptr(4);
718 subelem[2]->set_node(4) = elem->node_ptr(6);
719 subelem[2]->set_node(5) = elem->node_ptr(7);
720 subelem[2]->set_node(6) = elem->node_ptr(8);
721 subelem[2]->set_node(7) = elem->node_ptr(15);
722 subelem[2]->set_node(8) = elem->node_ptr(10);
723 subelem[2]->set_node(9) = elem->node_ptr(16);
728 libmesh_assert (split_first_diagonal(elem, 2,3, 0,5));
731 libmesh_assert (split_first_diagonal(elem, 2,4, 1,5));
733 subelem[0]->set_node(0) = elem->node_ptr(0);
734 subelem[0]->set_node(1) = elem->node_ptr(4);
735 subelem[0]->set_node(2) = elem->node_ptr(2);
736 subelem[0]->set_node(3) = elem->node_ptr(3);
738 subelem[0]->set_node(4) = elem->node_ptr(15);
739 subelem[0]->set_node(5) = elem->node_ptr(16);
740 subelem[0]->set_node(6) = elem->node_ptr(8);
741 subelem[0]->set_node(7) = elem->node_ptr(9);
742 subelem[0]->set_node(8) = elem->node_ptr(12);
743 subelem[0]->set_node(9) = elem->node_ptr(17);
745 subelem[1]->set_node(0) = elem->node_ptr(3);
746 subelem[1]->set_node(1) = elem->node_ptr(4);
747 subelem[1]->set_node(2) = elem->node_ptr(2);
748 subelem[1]->set_node(3) = elem->node_ptr(5);
750 subelem[1]->set_node(4) = elem->node_ptr(12);
751 subelem[1]->set_node(5) = elem->node_ptr(16);
752 subelem[1]->set_node(6) = elem->node_ptr(17);
753 subelem[1]->set_node(7) = elem->node_ptr(14);
754 subelem[1]->set_node(8) = elem->node_ptr(13);
755 subelem[1]->set_node(9) = elem->node_ptr(11);
757 subelem[2]->set_node(0) = elem->node_ptr(0);
758 subelem[2]->set_node(1) = elem->node_ptr(1);
759 subelem[2]->set_node(2) = elem->node_ptr(2);
760 subelem[2]->set_node(3) = elem->node_ptr(4);
762 subelem[2]->set_node(4) = elem->node_ptr(6);
763 subelem[2]->set_node(5) = elem->node_ptr(7);
764 subelem[2]->set_node(6) = elem->node_ptr(8);
765 subelem[2]->set_node(7) = elem->node_ptr(15);
766 subelem[2]->set_node(8) = elem->node_ptr(10);
767 subelem[2]->set_node(9) = elem->node_ptr(16);
772 libmesh_assert (split_first_diagonal(elem, 1,3, 0,4));
775 if (split_first_diagonal(elem, 0,5, 2,3))
778 libmesh_assert (split_first_diagonal(elem, 1,5, 2,4));
780 subelem[0]->set_node(0) = elem->node_ptr(1);
781 subelem[0]->set_node(1) = elem->node_ptr(3);
782 subelem[0]->set_node(2) = elem->node_ptr(4);
783 subelem[0]->set_node(3) = elem->node_ptr(5);
785 subelem[0]->set_node(4) = elem->node_ptr(15);
786 subelem[0]->set_node(5) = elem->node_ptr(12);
787 subelem[0]->set_node(6) = elem->node_ptr(10);
788 subelem[0]->set_node(7) = elem->node_ptr(16);
789 subelem[0]->set_node(8) = elem->node_ptr(14);
790 subelem[0]->set_node(9) = elem->node_ptr(13);
792 subelem[1]->set_node(0) = elem->node_ptr(1);
793 subelem[1]->set_node(1) = elem->node_ptr(0);
794 subelem[1]->set_node(2) = elem->node_ptr(3);
795 subelem[1]->set_node(3) = elem->node_ptr(5);
797 subelem[1]->set_node(4) = elem->node_ptr(6);
798 subelem[1]->set_node(5) = elem->node_ptr(9);
799 subelem[1]->set_node(6) = elem->node_ptr(15);
800 subelem[1]->set_node(7) = elem->node_ptr(16);
801 subelem[1]->set_node(8) = elem->node_ptr(17);
802 subelem[1]->set_node(9) = elem->node_ptr(14);
804 subelem[2]->set_node(0) = elem->node_ptr(0);
805 subelem[2]->set_node(1) = elem->node_ptr(1);
806 subelem[2]->set_node(2) = elem->node_ptr(2);
807 subelem[2]->set_node(3) = elem->node_ptr(5);
809 subelem[2]->set_node(4) = elem->node_ptr(6);
810 subelem[2]->set_node(5) = elem->node_ptr(7);
811 subelem[2]->set_node(6) = elem->node_ptr(8);
812 subelem[2]->set_node(7) = elem->node_ptr(17);
813 subelem[2]->set_node(8) = elem->node_ptr(16);
814 subelem[2]->set_node(9) = elem->node_ptr(11);
818 libmesh_assert (split_first_diagonal(elem, 2,3, 0,5));
821 if (split_first_diagonal(elem, 1,5, 2,4))
823 subelem[0]->set_node(0) = elem->node_ptr(0);
824 subelem[0]->set_node(1) = elem->node_ptr(1);
825 subelem[0]->set_node(2) = elem->node_ptr(2);
826 subelem[0]->set_node(3) = elem->node_ptr(3);
828 subelem[0]->set_node(4) = elem->node_ptr(6);
829 subelem[0]->set_node(5) = elem->node_ptr(7);
830 subelem[0]->set_node(6) = elem->node_ptr(8);
831 subelem[0]->set_node(7) = elem->node_ptr(9);
832 subelem[0]->set_node(8) = elem->node_ptr(15);
833 subelem[0]->set_node(9) = elem->node_ptr(17);
835 subelem[1]->set_node(0) = elem->node_ptr(3);
836 subelem[1]->set_node(1) = elem->node_ptr(1);
837 subelem[1]->set_node(2) = elem->node_ptr(2);
838 subelem[1]->set_node(3) = elem->node_ptr(5);
840 subelem[1]->set_node(4) = elem->node_ptr(15);
841 subelem[1]->set_node(5) = elem->node_ptr(7);
842 subelem[1]->set_node(6) = elem->node_ptr(17);
843 subelem[1]->set_node(7) = elem->node_ptr(14);
844 subelem[1]->set_node(8) = elem->node_ptr(16);
845 subelem[1]->set_node(9) = elem->node_ptr(11);
847 subelem[2]->set_node(0) = elem->node_ptr(1);
848 subelem[2]->set_node(1) = elem->node_ptr(3);
849 subelem[2]->set_node(2) = elem->node_ptr(4);
850 subelem[2]->set_node(3) = elem->node_ptr(5);
852 subelem[2]->set_node(4) = elem->node_ptr(15);
853 subelem[2]->set_node(5) = elem->node_ptr(12);
854 subelem[2]->set_node(6) = elem->node_ptr(10);
855 subelem[2]->set_node(7) = elem->node_ptr(16);
856 subelem[2]->set_node(8) = elem->node_ptr(14);
857 subelem[2]->set_node(9) = elem->node_ptr(13);
861 libmesh_assert (split_first_diagonal(elem, 2,4, 1,5));
863 subelem[0]->set_node(0) = elem->node_ptr(0);
864 subelem[0]->set_node(1) = elem->node_ptr(1);
865 subelem[0]->set_node(2) = elem->node_ptr(2);
866 subelem[0]->set_node(3) = elem->node_ptr(3);
868 subelem[0]->set_node(4) = elem->node_ptr(6);
869 subelem[0]->set_node(5) = elem->node_ptr(7);
870 subelem[0]->set_node(6) = elem->node_ptr(8);
871 subelem[0]->set_node(7) = elem->node_ptr(9);
872 subelem[0]->set_node(8) = elem->node_ptr(15);
873 subelem[0]->set_node(9) = elem->node_ptr(17);
875 subelem[1]->set_node(0) = elem->node_ptr(2);
876 subelem[1]->set_node(1) = elem->node_ptr(3);
877 subelem[1]->set_node(2) = elem->node_ptr(4);
878 subelem[1]->set_node(3) = elem->node_ptr(5);
880 subelem[1]->set_node(4) = elem->node_ptr(17);
881 subelem[1]->set_node(5) = elem->node_ptr(12);
882 subelem[1]->set_node(6) = elem->node_ptr(16);
883 subelem[1]->set_node(7) = elem->node_ptr(11);
884 subelem[1]->set_node(8) = elem->node_ptr(14);
885 subelem[1]->set_node(9) = elem->node_ptr(13);
887 subelem[2]->set_node(0) = elem->node_ptr(3);
888 subelem[2]->set_node(1) = elem->node_ptr(1);
889 subelem[2]->set_node(2) = elem->node_ptr(2);
890 subelem[2]->set_node(3) = elem->node_ptr(4);
892 subelem[2]->set_node(4) = elem->node_ptr(15);
893 subelem[2]->set_node(5) = elem->node_ptr(7);
894 subelem[2]->set_node(6) = elem->node_ptr(17);
895 subelem[2]->set_node(7) = elem->node_ptr(12);
896 subelem[2]->set_node(8) = elem->node_ptr(10);
897 subelem[2]->set_node(9) = elem->node_ptr(16);
925 libMesh::err <<
"Error, encountered unimplemented element " 926 << Utility::enum_to_string<ElemType>(etype)
927 <<
" in MeshTools::Modification::all_tri()..." 929 libmesh_not_implemented();
936 for (
unsigned int i=0; i != max_subelems; ++i)
938 subelem[i]->processor_id() = elem->processor_id();
939 subelem[i]->subdomain_id() = elem->subdomain_id();
947 bool mesh_is_serial =
mesh.is_serial();
949 if (mesh_has_boundary_data || mesh_is_serial)
952 std::vector<boundary_id_type> bc_ids;
954 for (
auto sn : elem->side_index_range())
956 mesh.get_boundary_info().boundary_ids(elem, sn, bc_ids);
957 for (
const auto & b_id : bc_ids)
959 if (mesh_is_serial && b_id == BoundaryInfo::invalid_id)
963 std::unique_ptr<Elem> elem_side = elem->build_side_ptr(sn);
964 std::vector<dof_id_type> elem_side_nodes(elem_side->n_nodes());
965 for (
unsigned int esn=0,
966 n_esn = cast_int<unsigned int>(elem_side_nodes.size());
968 elem_side_nodes[esn] = elem_side->node_id(esn);
969 std::sort(elem_side_nodes.begin(), elem_side_nodes.end());
971 for (
unsigned int i=0; i != max_subelems; ++i)
974 for (
auto subside : subelem[i]->side_index_range())
976 std::unique_ptr<Elem> subside_elem = subelem[i]->build_side_ptr(subside);
984 std::vector<dof_id_type> subside_nodes(subside_elem->n_vertices());
985 for (
unsigned int ssn=0,
986 n_ssn = cast_int<unsigned int>(subside_nodes.size());
988 subside_nodes[ssn] = subside_elem->node_id(ssn);
989 std::sort(subside_nodes.begin(), subside_nodes.end());
993 if (std::includes(elem_side_nodes.begin(), elem_side_nodes.end(),
994 subside_nodes.begin(), subside_nodes.end()))
996 if (b_id != BoundaryInfo::invalid_id)
998 new_bndry_ids.push_back(b_id);
999 new_bndry_elements.push_back(subelem[i]);
1000 new_bndry_sides.push_back(subside);
1006 subelem[i]->set_neighbor(subside, const_cast<RemoteElem*>(
remote_elem));
1014 mesh.get_boundary_info().remove(elem);
1022 for (
unsigned int i=0; i != max_subelems; ++i)
1029 subelem[i]->set_id( max_orig_id + 6*elem->id() + i );
1031 #ifdef LIBMESH_ENABLE_UNIQUE_ID 1032 subelem[i]->set_unique_id() = max_unique_id + 2*elem->unique_id() + i;
1036 new_elements.push_back(subelem[i]);
1040 mesh.delete_elem(elem);
1048 std::vector<Elem *>::iterator el = new_elements.begin();
1049 const std::vector<Elem *>::iterator
end = new_elements.end();
1050 for (; el !=
end; ++el)
1054 if (mesh_has_boundary_data)
1067 bool nbe_nonempty = new_bndry_elements.size();
1068 mesh.comm().max(nbe_nonempty);
1069 libmesh_assert(nbe_nonempty ||
1070 mesh.get_boundary_info().n_boundary_conds()>0);
1075 libmesh_assert_equal_to (new_bndry_elements.size(), new_bndry_sides.size());
1076 libmesh_assert_equal_to (new_bndry_sides.size(), new_bndry_ids.size());
1079 for (std::size_t s=0; s<new_bndry_elements.size(); ++s)
1080 mesh.get_boundary_info().add_side(new_bndry_elements[s],
1089 if (!
mesh.is_serial())
1091 mesh.comm().max(added_new_ghost_point);
1093 if (added_new_ghost_point)
1094 MeshCommunication().make_nodes_parallel_consistent (
mesh);
1100 mesh.prepare_for_use(
false);
OStreamProxy err(std::cerr)
const RemoteElem * remote_elem