279 std::vector<Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>> child_poly{};
289 child_poly.emplace_back(0, 1);
301 Eigen::Matrix<int, 1, 2> seg_ref_coord;
302 seg_ref_coord << 0, lt_one;
303 child_poly.emplace_back(seg_ref_coord);
307 Eigen::Matrix<int, 1, 2> part_ref_coord;
308 part_ref_coord << 0, lt_half;
309 child_poly.emplace_back(part_ref_coord);
310 part_ref_coord << lt_half, lt_one;
311 child_poly.emplace_back(part_ref_coord);
315 LF_VERIFY_MSG(
false,
"refinement pattern "
317 <<
"not implemented for edge!");
326 Eigen::Matrix<int, 1, 1> point_ref_coord;
327 point_ref_coord << lt_half;
328 child_poly.emplace_back(point_ref_coord);
333 LF_VERIFY_MSG(
false,
"invalid codim");
345 Eigen::MatrixXi lt_node_coords(2, 3);
346 lt_node_coords << 0, lt_one, 0, 0, 0, lt_one;
347 Eigen::MatrixXi lt_midpoint_coords(2, 3);
348 lt_midpoint_coords << lt_half, lt_half, 0, 0, lt_half, lt_half;
351 const unsigned int mod_0 = (0 +
anchor_) % 3;
352 const unsigned int mod_1 = (1 +
anchor_) % 3;
353 const unsigned int mod_2 = (2 +
anchor_) % 3;
358 Eigen::MatrixXi child_coords(2, 3);
365 child_coords = lt_node_coords;
366 child_poly.push_back(child_coords);
372 "Anchor must be set for bisection refinement of triangle");
374 child_coords.col(0) = lt_node_coords.col(mod_0);
375 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
376 child_coords.col(2) = lt_node_coords.col(mod_2);
377 child_poly.push_back(child_coords);
379 child_coords.col(0) = lt_node_coords.col(mod_1);
380 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
381 child_coords.col(2) = lt_node_coords.col(mod_2);
382 child_poly.push_back(child_coords);
388 "Anchor must be set for trisection refinement of triangle");
392 child_coords.col(0) = lt_node_coords.col(mod_0);
393 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
394 child_coords.col(2) = lt_node_coords.col(mod_2);
395 child_poly.push_back(child_coords);
397 child_coords.col(0) = lt_node_coords.col(mod_1);
398 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
399 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
400 child_poly.push_back(child_coords);
402 child_coords.col(0) = lt_node_coords.col(mod_2);
403 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
404 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
405 child_poly.push_back(child_coords);
411 "Anchor must be set for trisection refinement of triangle");
416 child_coords.col(0) = lt_node_coords.col(mod_0);
417 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
418 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
419 child_poly.push_back(child_coords);
421 child_coords.col(0) = lt_node_coords.col(mod_1);
422 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
423 child_coords.col(2) = lt_node_coords.col(mod_2);
424 child_poly.push_back(child_coords);
426 child_coords.col(0) = lt_node_coords.col(mod_2);
427 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
428 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
429 child_poly.push_back(child_coords);
435 "Anchor must be set for quadsection refinement of triangle");
439 child_coords.col(0) = lt_node_coords.col(mod_0);
440 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
441 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
442 child_poly.push_back(child_coords);
444 child_coords.col(0) = lt_node_coords.col(mod_1);
445 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
446 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
447 child_poly.push_back(child_coords);
449 child_coords.col(0) = lt_node_coords.col(mod_2);
450 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
451 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
452 child_poly.push_back(child_coords);
454 child_coords.col(0) = lt_node_coords.col(mod_2);
455 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
456 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
457 child_poly.push_back(child_coords);
462 child_coords.col(0) = lt_node_coords.col(0);
463 child_coords.col(1) = lt_midpoint_coords.col(0);
464 child_coords.col(2) = lt_midpoint_coords.col(2);
465 child_poly.push_back(child_coords);
467 child_coords.col(0) = lt_node_coords.col(1);
468 child_coords.col(1) = lt_midpoint_coords.col(0);
469 child_coords.col(2) = lt_midpoint_coords.col(1);
470 child_poly.push_back(child_coords);
472 child_coords.col(0) = lt_node_coords.col(2);
473 child_coords.col(1) = lt_midpoint_coords.col(2);
474 child_coords.col(2) = lt_midpoint_coords.col(1);
475 child_poly.push_back(child_coords);
477 child_coords.col(0) = lt_midpoint_coords.col(0);
478 child_coords.col(1) = lt_midpoint_coords.col(1);
479 child_coords.col(2) = lt_midpoint_coords.col(2);
480 child_poly.push_back(child_coords);
489 const Eigen::Vector2i lt_baryc_coords =
490 Eigen::Vector2i({lt_third, lt_third});
492 child_coords.col(0) = lt_node_coords.col(0);
493 child_coords.col(1) = lt_midpoint_coords.col(0);
494 child_coords.col(2) = lt_baryc_coords;
495 child_poly.push_back(child_coords);
497 child_coords.col(0) = lt_node_coords.col(1);
498 child_coords.col(1) = lt_midpoint_coords.col(0);
499 child_coords.col(2) = lt_baryc_coords;
500 child_poly.push_back(child_coords);
502 child_coords.col(0) = lt_node_coords.col(1);
503 child_coords.col(1) = lt_midpoint_coords.col(1);
504 child_coords.col(2) = lt_baryc_coords;
505 child_poly.push_back(child_coords);
507 child_coords.col(0) = lt_node_coords.col(2);
508 child_coords.col(1) = lt_midpoint_coords.col(1);
509 child_coords.col(2) = lt_baryc_coords;
510 child_poly.push_back(child_coords);
512 child_coords.col(0) = lt_node_coords.col(2);
513 child_coords.col(1) = lt_midpoint_coords.col(2);
514 child_coords.col(2) = lt_baryc_coords;
515 child_poly.push_back(child_coords);
517 child_coords.col(0) = lt_node_coords.col(0);
518 child_coords.col(1) = lt_midpoint_coords.col(2);
519 child_coords.col(2) = lt_baryc_coords;
520 child_poly.push_back(child_coords);
524 LF_VERIFY_MSG(
false,
"refinement pattern "
526 <<
"not implemented for triangle!");
536 Eigen::MatrixXi child_coords(2, 2);
549 "Anchor must be set for bisection refinement of triangle");
552 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
553 child_coords.col(1) = lt_node_coords.col(mod_2);
554 child_poly.push_back(child_coords);
560 "Anchor must be set for trisection refinement of triangle");
564 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
565 child_coords.col(1) = lt_node_coords.col(mod_2);
566 child_poly.push_back(child_coords);
568 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
569 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
570 child_poly.push_back(child_coords);
576 "Anchor must be set for trisection refinement of triangle");
581 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
582 child_coords.col(1) = lt_node_coords.col(mod_2);
583 child_poly.push_back(child_coords);
585 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
586 child_coords.col(1) = lt_midpoint_coords.col(mod_2);
587 child_poly.push_back(child_coords);
593 "Anchor must be set for quadsection refinement of triangle");
597 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
598 child_coords.col(1) = lt_node_coords.col(mod_2);
599 child_poly.push_back(child_coords);
601 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
602 child_coords.col(1) = lt_midpoint_coords.col(mod_2);
603 child_poly.push_back(child_coords);
605 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
606 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
607 child_poly.push_back(child_coords);
613 child_coords.col(0) = lt_midpoint_coords.col(0);
614 child_coords.col(1) = lt_midpoint_coords.col(2);
615 child_poly.push_back(child_coords);
617 child_coords.col(0) = lt_midpoint_coords.col(0);
618 child_coords.col(1) = lt_midpoint_coords.col(1);
619 child_poly.push_back(child_coords);
621 child_coords.col(0) = lt_midpoint_coords.col(2);
622 child_coords.col(1) = lt_midpoint_coords.col(1);
623 child_poly.push_back(child_coords);
632 const Eigen::Vector2i lt_baryc_coords =
633 Eigen::Vector2i({lt_third, lt_third});
635 child_coords.col(0) = lt_node_coords.col(0);
636 child_coords.col(1) = lt_baryc_coords;
637 child_poly.push_back(child_coords);
639 child_coords.col(0) = lt_node_coords.col(1);
640 child_coords.col(1) = lt_baryc_coords;
641 child_poly.push_back(child_coords);
643 child_coords.col(0) = lt_node_coords.col(2);
644 child_coords.col(1) = lt_baryc_coords;
645 child_poly.push_back(child_coords);
647 child_coords.col(0) = lt_midpoint_coords.col(0);
648 child_coords.col(1) = lt_baryc_coords;
649 child_poly.push_back(child_coords);
651 child_coords.col(0) = lt_midpoint_coords.col(1);
652 child_coords.col(1) = lt_baryc_coords;
653 child_poly.push_back(child_coords);
655 child_coords.col(0) = lt_midpoint_coords.col(2);
656 child_coords.col(1) = lt_baryc_coords;
657 child_poly.push_back(child_coords);
661 LF_VERIFY_MSG(
false,
"refinement pattern "
663 <<
"not implemented for triangle!");
674 child_poly.emplace_back(Eigen::Vector2i({lt_third, lt_third}));
679 LF_VERIFY_MSG(
false,
"invalid codim");
688 Eigen::MatrixXi lt_node_coords(2, 4);
689 lt_node_coords << 0, lt_one, lt_one, 0, 0, 0, lt_one, lt_one;
690 Eigen::MatrixXi lt_midpoint_coords(2, 4);
691 lt_midpoint_coords << lt_half, lt_one, lt_half, 0, 0, lt_half, lt_one,
695 const unsigned int mod_0 = (0 +
anchor_) % 4;
696 const unsigned int mod_1 = (1 +
anchor_) % 4;
697 const unsigned int mod_2 = (2 +
anchor_) % 4;
698 const unsigned int mod_3 = (3 +
anchor_) % 4;
704 Eigen::MatrixXi tria_child_coords(2, 3);
706 Eigen::MatrixXi quad_child_coords(2, 4);
712 child_poly.push_back(lt_node_coords);
718 "Anchor must be set for trisection refinement of quad");
722 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
723 tria_child_coords.col(1) = lt_node_coords.col(mod_2);
724 tria_child_coords.col(2) = lt_node_coords.col(mod_3);
725 child_poly.push_back(tria_child_coords);
727 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
728 tria_child_coords.col(1) = lt_node_coords.col(mod_0);
729 tria_child_coords.col(2) = lt_node_coords.col(mod_3);
730 child_poly.push_back(tria_child_coords);
732 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
733 tria_child_coords.col(1) = lt_node_coords.col(mod_1);
734 tria_child_coords.col(2) = lt_node_coords.col(mod_2);
735 child_poly.push_back(tria_child_coords);
741 "Anchor must be set for quadsection refinement of triangle");
745 tria_child_coords.col(0) = lt_node_coords.col(mod_0);
746 tria_child_coords.col(1) = lt_node_coords.col(mod_3);
747 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_0);
748 child_poly.push_back(tria_child_coords);
750 tria_child_coords.col(0) = lt_node_coords.col(mod_1);
751 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_1);
752 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_0);
753 child_poly.push_back(tria_child_coords);
755 tria_child_coords.col(0) = lt_node_coords.col(mod_2);
756 tria_child_coords.col(1) = lt_node_coords.col(mod_3);
757 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_1);
758 child_poly.push_back(tria_child_coords);
760 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
761 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_1);
762 tria_child_coords.col(2) = lt_node_coords.col(mod_3);
763 child_poly.push_back(tria_child_coords);
769 "Anchor must be set for splitting of quad");
772 quad_child_coords.col(0) = lt_node_coords.col(mod_0);
773 quad_child_coords.col(1) = lt_midpoint_coords.col(mod_0);
774 quad_child_coords.col(2) = lt_midpoint_coords.col(mod_2);
775 quad_child_coords.col(3) = lt_node_coords.col(mod_3);
776 child_poly.push_back(quad_child_coords);
778 quad_child_coords.col(0) = lt_node_coords.col(mod_1);
779 quad_child_coords.col(1) = lt_node_coords.col(mod_2);
780 quad_child_coords.col(2) = lt_midpoint_coords.col(mod_2);
781 quad_child_coords.col(3) = lt_midpoint_coords.col(mod_0);
782 child_poly.push_back(quad_child_coords);
788 "Anchor must be set for three edge refinement of a quad");
792 quad_child_coords.col(0) = lt_node_coords.col(mod_2);
793 quad_child_coords.col(1) = lt_node_coords.col(mod_3);
794 quad_child_coords.col(2) = lt_midpoint_coords.col(mod_3);
795 quad_child_coords.col(3) = lt_midpoint_coords.col(mod_1);
796 child_poly.push_back(quad_child_coords);
798 tria_child_coords.col(0) = lt_node_coords.col(mod_0);
799 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_0);
800 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_3);
801 child_poly.push_back(tria_child_coords);
803 tria_child_coords.col(0) = lt_node_coords.col(mod_1);
804 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_0);
805 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_1);
806 child_poly.push_back(tria_child_coords);
808 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
809 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_1);
810 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_3);
811 child_poly.push_back(tria_child_coords);
818 const Eigen::Vector2i lt_baryc_coords =
819 Eigen::Vector2i({lt_half, lt_half});
821 quad_child_coords.col(0) = lt_node_coords.col(0);
822 quad_child_coords.col(1) = lt_midpoint_coords.col(0);
823 quad_child_coords.col(2) = lt_baryc_coords;
824 quad_child_coords.col(3) = lt_midpoint_coords.col(3);
825 child_poly.push_back(quad_child_coords);
827 quad_child_coords.col(0) = lt_node_coords.col(1);
828 quad_child_coords.col(1) = lt_midpoint_coords.col(1);
829 quad_child_coords.col(2) = lt_baryc_coords;
830 quad_child_coords.col(3) = lt_midpoint_coords.col(0);
831 child_poly.push_back(quad_child_coords);
833 quad_child_coords.col(0) = lt_node_coords.col(2);
834 quad_child_coords.col(1) = lt_midpoint_coords.col(1);
835 quad_child_coords.col(2) = lt_baryc_coords;
836 quad_child_coords.col(3) = lt_midpoint_coords.col(2);
837 child_poly.push_back(quad_child_coords);
839 quad_child_coords.col(0) = lt_node_coords.col(3);
840 quad_child_coords.col(1) = lt_midpoint_coords.col(2);
841 quad_child_coords.col(2) = lt_baryc_coords;
842 quad_child_coords.col(3) = lt_midpoint_coords.col(3);
843 child_poly.push_back(quad_child_coords);
847 LF_VERIFY_MSG(
false,
"refinement pattern "
849 <<
"not implemented for quadrilateral!");
857 Eigen::MatrixXi child_coords(2, 2);
867 "Anchor must be set for trisection refinement of quad");
871 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
872 child_coords.col(1) = lt_node_coords.col(mod_2);
873 child_poly.push_back(child_coords);
875 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
876 child_coords.col(1) = lt_node_coords.col(mod_3);
877 child_poly.push_back(child_coords);
883 "Anchor must be set for quadsection refinement of triangle");
886 child_coords.col(0) = lt_node_coords.col(mod_3);
887 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
888 child_poly.push_back(child_coords);
890 child_coords.col(0) = lt_midpoint_coords.col(mod_1);
891 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
892 child_poly.push_back(child_coords);
894 child_coords.col(0) = lt_node_coords.col(mod_3);
895 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
896 child_poly.push_back(child_coords);
902 "Anchor must be set for splitting of quad");
905 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
906 child_coords.col(1) = lt_midpoint_coords.col(mod_2);
907 child_poly.push_back(child_coords);
913 "Anchor must be set for three edge refinement of a quad");
916 child_coords.col(0) = lt_midpoint_coords.col(mod_3);
917 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
918 child_poly.push_back(child_coords);
920 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
921 child_coords.col(1) = lt_midpoint_coords.col(mod_3);
922 child_poly.push_back(child_coords);
924 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
925 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
926 child_poly.push_back(child_coords);
934 const Eigen::Vector2i lt_baryc_coords =
935 Eigen::Vector2i({lt_half, lt_half});
937 child_coords.col(0) = lt_midpoint_coords.col(0);
938 child_coords.col(1) = lt_baryc_coords;
939 child_poly.push_back(child_coords);
941 child_coords.col(0) = lt_midpoint_coords.col(1);
942 child_coords.col(1) = lt_baryc_coords;
943 child_poly.push_back(child_coords);
945 child_coords.col(0) = lt_midpoint_coords.col(2);
946 child_coords.col(1) = lt_baryc_coords;
947 child_poly.push_back(child_coords);
949 child_coords.col(0) = lt_midpoint_coords.col(3);
950 child_coords.col(1) = lt_baryc_coords;
951 child_poly.push_back(child_coords);
955 LF_VERIFY_MSG(
false,
"refinement pattern "
957 <<
"not implemented for quadrilateral!");
968 child_poly.emplace_back(Eigen::Vector2i({lt_half, lt_half}));
973 LF_VERIFY_MSG(
false,
"invalid codim");
978 LF_VERIFY_MSG(
false,
"Unsupported RefEl");