7#include "hybrid2d_refinement_pattern.h"
29 o <<
"rp_trisect_left";
41 o <<
"rp_barycentric";
57 case RefPat::rp_nil: {
60 case RefPat::rp_copy: {
64 LF_VERIFY_MSG(
false,
"Illegal refinement pattern for point");
73 case RefPat::rp_nil: {
76 case RefPat::rp_copy: {
79 case RefPat::rp_split: {
83 LF_VERIFY_MSG(
false,
"refinement pattern "
85 <<
"not implemented for edge!");
94 case RefPat::rp_copy: {
97 case RefPat::rp_split: {
101 LF_VERIFY_MSG(
false,
"refinement pattern "
103 <<
"not implemented for edge!");
110 LF_VERIFY_MSG(
false,
"invalid codim");
118 case RefPat::rp_nil: {
121 case RefPat::rp_copy: {
124 case RefPat::rp_bisect: {
127 case RefPat::rp_trisect:
128 case RefPat::rp_trisect_left: {
131 case RefPat::rp_quadsect:
132 case RefPat::rp_regular: {
135 case RefPat::rp_barycentric: {
139 LF_VERIFY_MSG(
false,
"refinement pattern "
141 <<
"not implemented for triangle!");
147 LF_VERIFY_MSG(
false,
"invalid codim");
152 case RefPat::rp_copy: {
155 case RefPat::rp_bisect: {
158 case RefPat::rp_trisect:
159 case RefPat::rp_trisect_left: {
162 case RefPat::rp_quadsect:
163 case RefPat::rp_regular: {
166 case RefPat::rp_barycentric: {
170 LF_VERIFY_MSG(
false,
"refinement pattern "
172 <<
"not implemented for triangle!");
179 if (
ref_pat_ == RefPat::rp_barycentric) {
191 case RefPat::rp_nil: {
194 case RefPat::rp_copy: {
197 case RefPat::rp_trisect: {
200 case RefPat::rp_quadsect: {
203 case RefPat::rp_bisect:
204 case RefPat::rp_split: {
207 case RefPat::rp_threeedge:
208 case RefPat::rp_barycentric:
209 case RefPat::rp_regular: {
213 LF_VERIFY_MSG(
false,
"refinement pattern "
215 <<
"not implemented for quadrilateral!");
224 case RefPat::rp_copy: {
227 case RefPat::rp_trisect: {
230 case RefPat::rp_quadsect: {
233 case RefPat::rp_bisect:
234 case RefPat::rp_split: {
237 case RefPat::rp_threeedge: {
240 case RefPat::rp_barycentric:
241 case RefPat::rp_regular: {
245 LF_VERIFY_MSG(
false,
"refinement pattern "
247 <<
"not implemented for quadrilateral!");
254 if ((
ref_pat_ == RefPat::rp_barycentric) ||
262 LF_VERIFY_MSG(
false,
"invalid codim");
270std::vector<Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>>
276 std::vector<Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>> child_poly{};
286 child_poly.emplace_back(0, 1);
294 case RefPat::rp_nil: {
297 case RefPat::rp_copy: {
298 Eigen::Matrix<int, 1, 2> seg_ref_coord;
299 seg_ref_coord << 0, lt_one;
300 child_poly.emplace_back(seg_ref_coord);
303 case RefPat::rp_split: {
304 Eigen::Matrix<int, 1, 2> part_ref_coord;
305 part_ref_coord << 0, lt_half;
306 child_poly.emplace_back(part_ref_coord);
307 part_ref_coord << lt_half, lt_one;
308 child_poly.emplace_back(part_ref_coord);
312 LF_VERIFY_MSG(
false,
"refinement pattern "
314 <<
"not implemented for edge!");
323 Eigen::Matrix<int, 1, 1> point_ref_coord;
324 point_ref_coord << lt_half;
325 child_poly.emplace_back(point_ref_coord);
330 LF_VERIFY_MSG(
false,
"invalid codim");
342 Eigen::MatrixXi lt_node_coords(2, 3);
343 lt_node_coords << 0, lt_one, 0, 0, 0, lt_one;
344 Eigen::MatrixXi lt_midpoint_coords(2, 3);
345 lt_midpoint_coords << lt_half, lt_half, 0, 0, lt_half, lt_half;
348 const unsigned int mod_0 = (0 +
anchor_) % 3;
349 const unsigned int mod_1 = (1 +
anchor_) % 3;
350 const unsigned int mod_2 = (2 +
anchor_) % 3;
355 Eigen::MatrixXi child_coords(2, 3);
358 case RefPat::rp_nil: {
361 case RefPat::rp_copy: {
362 child_coords = lt_node_coords;
363 child_poly.push_back(child_coords);
366 case RefPat::rp_bisect: {
369 "Anchor must be set for bisection refinement of triangle");
371 child_coords.col(0) = lt_node_coords.col(mod_0);
372 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
373 child_coords.col(2) = lt_node_coords.col(mod_2);
374 child_poly.push_back(child_coords);
376 child_coords.col(0) = lt_node_coords.col(mod_1);
377 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
378 child_coords.col(2) = lt_node_coords.col(mod_2);
379 child_poly.push_back(child_coords);
382 case RefPat::rp_trisect: {
385 "Anchor must be set for trisection refinement of triangle");
389 child_coords.col(0) = lt_node_coords.col(mod_0);
390 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
391 child_coords.col(2) = lt_node_coords.col(mod_2);
392 child_poly.push_back(child_coords);
394 child_coords.col(0) = lt_node_coords.col(mod_1);
395 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
396 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
397 child_poly.push_back(child_coords);
399 child_coords.col(0) = lt_node_coords.col(mod_2);
400 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
401 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
402 child_poly.push_back(child_coords);
405 case RefPat::rp_trisect_left: {
408 "Anchor must be set for trisection refinement of triangle");
413 child_coords.col(0) = lt_node_coords.col(mod_0);
414 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
415 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
416 child_poly.push_back(child_coords);
418 child_coords.col(0) = lt_node_coords.col(mod_1);
419 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
420 child_coords.col(2) = lt_node_coords.col(mod_2);
421 child_poly.push_back(child_coords);
423 child_coords.col(0) = lt_node_coords.col(mod_2);
424 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
425 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
426 child_poly.push_back(child_coords);
429 case RefPat::rp_quadsect: {
432 "Anchor must be set for quadsection refinement of triangle");
436 child_coords.col(0) = lt_node_coords.col(mod_0);
437 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
438 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
439 child_poly.push_back(child_coords);
441 child_coords.col(0) = lt_node_coords.col(mod_1);
442 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
443 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
444 child_poly.push_back(child_coords);
446 child_coords.col(0) = lt_node_coords.col(mod_2);
447 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
448 child_coords.col(2) = lt_midpoint_coords.col(mod_1);
449 child_poly.push_back(child_coords);
451 child_coords.col(0) = lt_node_coords.col(mod_2);
452 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
453 child_coords.col(2) = lt_midpoint_coords.col(mod_2);
454 child_poly.push_back(child_coords);
457 case RefPat::rp_regular: {
459 child_coords.col(0) = lt_node_coords.col(0);
460 child_coords.col(1) = lt_midpoint_coords.col(0);
461 child_coords.col(2) = lt_midpoint_coords.col(2);
462 child_poly.push_back(child_coords);
464 child_coords.col(0) = lt_node_coords.col(1);
465 child_coords.col(1) = lt_midpoint_coords.col(0);
466 child_coords.col(2) = lt_midpoint_coords.col(1);
467 child_poly.push_back(child_coords);
469 child_coords.col(0) = lt_node_coords.col(2);
470 child_coords.col(1) = lt_midpoint_coords.col(2);
471 child_coords.col(2) = lt_midpoint_coords.col(1);
472 child_poly.push_back(child_coords);
474 child_coords.col(0) = lt_midpoint_coords.col(0);
475 child_coords.col(1) = lt_midpoint_coords.col(1);
476 child_coords.col(2) = lt_midpoint_coords.col(2);
477 child_poly.push_back(child_coords);
480 case RefPat::rp_barycentric: {
486 Eigen::Vector2i lt_baryc_coords =
487 Eigen::Vector2i({lt_third, lt_third});
489 child_coords.col(0) = lt_node_coords.col(0);
490 child_coords.col(1) = lt_midpoint_coords.col(0);
491 child_coords.col(2) = lt_baryc_coords;
492 child_poly.push_back(child_coords);
494 child_coords.col(0) = lt_node_coords.col(1);
495 child_coords.col(1) = lt_midpoint_coords.col(0);
496 child_coords.col(2) = lt_baryc_coords;
497 child_poly.push_back(child_coords);
499 child_coords.col(0) = lt_node_coords.col(1);
500 child_coords.col(1) = lt_midpoint_coords.col(1);
501 child_coords.col(2) = lt_baryc_coords;
502 child_poly.push_back(child_coords);
504 child_coords.col(0) = lt_node_coords.col(2);
505 child_coords.col(1) = lt_midpoint_coords.col(1);
506 child_coords.col(2) = lt_baryc_coords;
507 child_poly.push_back(child_coords);
509 child_coords.col(0) = lt_node_coords.col(2);
510 child_coords.col(1) = lt_midpoint_coords.col(2);
511 child_coords.col(2) = lt_baryc_coords;
512 child_poly.push_back(child_coords);
514 child_coords.col(0) = lt_node_coords.col(0);
515 child_coords.col(1) = lt_midpoint_coords.col(2);
516 child_coords.col(2) = lt_baryc_coords;
517 child_poly.push_back(child_coords);
521 LF_VERIFY_MSG(
false,
"refinement pattern "
523 <<
"not implemented for triangle!");
533 Eigen::MatrixXi child_coords(2, 2);
539 case RefPat::rp_copy: {
543 case RefPat::rp_bisect: {
546 "Anchor must be set for bisection refinement of triangle");
549 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
550 child_coords.col(1) = lt_node_coords.col(mod_2);
551 child_poly.push_back(child_coords);
554 case RefPat::rp_trisect: {
557 "Anchor must be set for trisection refinement of triangle");
561 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
562 child_coords.col(1) = lt_node_coords.col(mod_2);
563 child_poly.push_back(child_coords);
565 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
566 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
567 child_poly.push_back(child_coords);
570 case RefPat::rp_trisect_left: {
573 "Anchor must be set for trisection refinement of triangle");
578 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
579 child_coords.col(1) = lt_node_coords.col(mod_2);
580 child_poly.push_back(child_coords);
582 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
583 child_coords.col(1) = lt_midpoint_coords.col(mod_2);
584 child_poly.push_back(child_coords);
587 case RefPat::rp_quadsect: {
590 "Anchor must be set for quadsection refinement of triangle");
594 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
595 child_coords.col(1) = lt_node_coords.col(mod_2);
596 child_poly.push_back(child_coords);
598 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
599 child_coords.col(1) = lt_midpoint_coords.col(mod_2);
600 child_poly.push_back(child_coords);
602 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
603 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
604 child_poly.push_back(child_coords);
607 case RefPat::rp_regular: {
610 child_coords.col(0) = lt_midpoint_coords.col(0);
611 child_coords.col(1) = lt_midpoint_coords.col(2);
612 child_poly.push_back(child_coords);
614 child_coords.col(0) = lt_midpoint_coords.col(0);
615 child_coords.col(1) = lt_midpoint_coords.col(1);
616 child_poly.push_back(child_coords);
618 child_coords.col(0) = lt_midpoint_coords.col(2);
619 child_coords.col(1) = lt_midpoint_coords.col(1);
620 child_poly.push_back(child_coords);
623 case RefPat::rp_barycentric: {
629 Eigen::Vector2i lt_baryc_coords =
630 Eigen::Vector2i({lt_third, lt_third});
632 child_coords.col(0) = lt_node_coords.col(0);
633 child_coords.col(1) = lt_baryc_coords;
634 child_poly.push_back(child_coords);
636 child_coords.col(0) = lt_node_coords.col(1);
637 child_coords.col(1) = lt_baryc_coords;
638 child_poly.push_back(child_coords);
640 child_coords.col(0) = lt_node_coords.col(2);
641 child_coords.col(1) = lt_baryc_coords;
642 child_poly.push_back(child_coords);
644 child_coords.col(0) = lt_midpoint_coords.col(0);
645 child_coords.col(1) = lt_baryc_coords;
646 child_poly.push_back(child_coords);
648 child_coords.col(0) = lt_midpoint_coords.col(1);
649 child_coords.col(1) = lt_baryc_coords;
650 child_poly.push_back(child_coords);
652 child_coords.col(0) = lt_midpoint_coords.col(2);
653 child_coords.col(1) = lt_baryc_coords;
654 child_poly.push_back(child_coords);
658 LF_VERIFY_MSG(
false,
"refinement pattern "
660 <<
"not implemented for triangle!");
668 if (
ref_pat_ == RefPat::rp_barycentric) {
671 child_poly.emplace_back(Eigen::Vector2i({lt_third, lt_third}));
676 LF_VERIFY_MSG(
false,
"invalid codim");
685 Eigen::MatrixXi lt_node_coords(2, 4);
686 lt_node_coords << 0, lt_one, lt_one, 0, 0, 0, lt_one, lt_one;
687 Eigen::MatrixXi lt_midpoint_coords(2, 4);
688 lt_midpoint_coords << lt_half, lt_one, lt_half, 0, 0, lt_half, lt_one,
692 const unsigned int mod_0 = (0 +
anchor_) % 4;
693 const unsigned int mod_1 = (1 +
anchor_) % 4;
694 const unsigned int mod_2 = (2 +
anchor_) % 4;
695 const unsigned int mod_3 = (3 +
anchor_) % 4;
701 Eigen::MatrixXi tria_child_coords(2, 3);
703 Eigen::MatrixXi quad_child_coords(2, 4);
705 case RefPat::rp_nil: {
708 case RefPat::rp_copy: {
709 child_poly.push_back(lt_node_coords);
712 case RefPat::rp_trisect: {
715 "Anchor must be set for trisection refinement of quad");
719 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
720 tria_child_coords.col(1) = lt_node_coords.col(mod_2);
721 tria_child_coords.col(2) = lt_node_coords.col(mod_3);
722 child_poly.push_back(tria_child_coords);
724 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
725 tria_child_coords.col(1) = lt_node_coords.col(mod_0);
726 tria_child_coords.col(2) = lt_node_coords.col(mod_3);
727 child_poly.push_back(tria_child_coords);
729 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
730 tria_child_coords.col(1) = lt_node_coords.col(mod_1);
731 tria_child_coords.col(2) = lt_node_coords.col(mod_2);
732 child_poly.push_back(tria_child_coords);
735 case RefPat::rp_quadsect: {
738 "Anchor must be set for quadsection refinement of triangle");
742 tria_child_coords.col(0) = lt_node_coords.col(mod_0);
743 tria_child_coords.col(1) = lt_node_coords.col(mod_3);
744 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_0);
745 child_poly.push_back(tria_child_coords);
747 tria_child_coords.col(0) = lt_node_coords.col(mod_1);
748 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_1);
749 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_0);
750 child_poly.push_back(tria_child_coords);
752 tria_child_coords.col(0) = lt_node_coords.col(mod_2);
753 tria_child_coords.col(1) = lt_node_coords.col(mod_3);
754 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_1);
755 child_poly.push_back(tria_child_coords);
757 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
758 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_1);
759 tria_child_coords.col(2) = lt_node_coords.col(mod_3);
760 child_poly.push_back(tria_child_coords);
763 case RefPat::rp_bisect:
764 case RefPat::rp_split: {
766 "Anchor must be set for splitting of quad");
769 quad_child_coords.col(0) = lt_node_coords.col(mod_0);
770 quad_child_coords.col(1) = lt_midpoint_coords.col(mod_0);
771 quad_child_coords.col(2) = lt_midpoint_coords.col(mod_2);
772 quad_child_coords.col(3) = lt_node_coords.col(mod_3);
773 child_poly.push_back(quad_child_coords);
775 quad_child_coords.col(0) = lt_node_coords.col(mod_1);
776 quad_child_coords.col(1) = lt_node_coords.col(mod_2);
777 quad_child_coords.col(2) = lt_midpoint_coords.col(mod_2);
778 quad_child_coords.col(3) = lt_midpoint_coords.col(mod_0);
779 child_poly.push_back(quad_child_coords);
782 case RefPat::rp_threeedge: {
785 "Anchor must be set for three edge refinement of a quad");
789 quad_child_coords.col(0) = lt_node_coords.col(mod_2);
790 quad_child_coords.col(1) = lt_node_coords.col(mod_3);
791 quad_child_coords.col(2) = lt_midpoint_coords.col(mod_3);
792 quad_child_coords.col(3) = lt_midpoint_coords.col(mod_1);
793 child_poly.push_back(quad_child_coords);
795 tria_child_coords.col(0) = lt_node_coords.col(mod_0);
796 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_0);
797 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_3);
798 child_poly.push_back(tria_child_coords);
800 tria_child_coords.col(0) = lt_node_coords.col(mod_1);
801 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_0);
802 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_1);
803 child_poly.push_back(tria_child_coords);
805 tria_child_coords.col(0) = lt_midpoint_coords.col(mod_0);
806 tria_child_coords.col(1) = lt_midpoint_coords.col(mod_1);
807 tria_child_coords.col(2) = lt_midpoint_coords.col(mod_3);
808 child_poly.push_back(tria_child_coords);
811 case RefPat::rp_barycentric:
812 case RefPat::rp_regular: {
815 Eigen::Vector2i lt_baryc_coords =
816 Eigen::Vector2i({lt_half, lt_half});
818 quad_child_coords.col(0) = lt_node_coords.col(0);
819 quad_child_coords.col(1) = lt_midpoint_coords.col(0);
820 quad_child_coords.col(2) = lt_baryc_coords;
821 quad_child_coords.col(3) = lt_midpoint_coords.col(3);
822 child_poly.push_back(quad_child_coords);
824 quad_child_coords.col(0) = lt_node_coords.col(1);
825 quad_child_coords.col(1) = lt_midpoint_coords.col(1);
826 quad_child_coords.col(2) = lt_baryc_coords;
827 quad_child_coords.col(3) = lt_midpoint_coords.col(0);
828 child_poly.push_back(quad_child_coords);
830 quad_child_coords.col(0) = lt_node_coords.col(2);
831 quad_child_coords.col(1) = lt_midpoint_coords.col(1);
832 quad_child_coords.col(2) = lt_baryc_coords;
833 quad_child_coords.col(3) = lt_midpoint_coords.col(2);
834 child_poly.push_back(quad_child_coords);
836 quad_child_coords.col(0) = lt_node_coords.col(3);
837 quad_child_coords.col(1) = lt_midpoint_coords.col(2);
838 quad_child_coords.col(2) = lt_baryc_coords;
839 quad_child_coords.col(3) = lt_midpoint_coords.col(3);
840 child_poly.push_back(quad_child_coords);
844 LF_VERIFY_MSG(
false,
"refinement pattern "
846 <<
"not implemented for quadrilateral!");
854 Eigen::MatrixXi child_coords(2, 2);
857 case RefPat::rp_copy: {
861 case RefPat::rp_trisect: {
864 "Anchor must be set for trisection refinement of quad");
868 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
869 child_coords.col(1) = lt_node_coords.col(mod_2);
870 child_poly.push_back(child_coords);
872 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
873 child_coords.col(1) = lt_node_coords.col(mod_3);
874 child_poly.push_back(child_coords);
877 case RefPat::rp_quadsect: {
880 "Anchor must be set for quadsection refinement of triangle");
883 child_coords.col(0) = lt_node_coords.col(mod_3);
884 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
885 child_poly.push_back(child_coords);
887 child_coords.col(0) = lt_midpoint_coords.col(mod_1);
888 child_coords.col(1) = lt_midpoint_coords.col(mod_0);
889 child_poly.push_back(child_coords);
891 child_coords.col(0) = lt_node_coords.col(mod_3);
892 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
893 child_poly.push_back(child_coords);
896 case RefPat::rp_bisect:
897 case RefPat::rp_split: {
899 "Anchor must be set for splitting of quad");
902 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
903 child_coords.col(1) = lt_midpoint_coords.col(mod_2);
904 child_poly.push_back(child_coords);
907 case RefPat::rp_threeedge: {
910 "Anchor must be set for three edge refinement of a quad");
913 child_coords.col(0) = lt_midpoint_coords.col(mod_3);
914 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
915 child_poly.push_back(child_coords);
917 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
918 child_coords.col(1) = lt_midpoint_coords.col(mod_3);
919 child_poly.push_back(child_coords);
921 child_coords.col(0) = lt_midpoint_coords.col(mod_0);
922 child_coords.col(1) = lt_midpoint_coords.col(mod_1);
923 child_poly.push_back(child_coords);
926 case RefPat::rp_barycentric:
927 case RefPat::rp_regular: {
931 Eigen::Vector2i lt_baryc_coords =
932 Eigen::Vector2i({lt_half, lt_half});
934 child_coords.col(0) = lt_midpoint_coords.col(0);
935 child_coords.col(1) = lt_baryc_coords;
936 child_poly.push_back(child_coords);
938 child_coords.col(0) = lt_midpoint_coords.col(1);
939 child_coords.col(1) = lt_baryc_coords;
940 child_poly.push_back(child_coords);
942 child_coords.col(0) = lt_midpoint_coords.col(2);
943 child_coords.col(1) = lt_baryc_coords;
944 child_poly.push_back(child_coords);
946 child_coords.col(0) = lt_midpoint_coords.col(3);
947 child_coords.col(1) = lt_baryc_coords;
948 child_poly.push_back(child_coords);
952 LF_VERIFY_MSG(
false,
"refinement pattern "
954 <<
"not implemented for quadrilateral!");
963 if ((
ref_pat_ == RefPat::rp_regular) ||
964 (
ref_pat_ == RefPat::rp_barycentric)) {
965 child_poly.emplace_back(Eigen::Vector2i({lt_half, lt_half}));
970 LF_VERIFY_MSG(
false,
"invalid codim");
static constexpr RefEl kSegment()
Returns the (1-dimensional) reference segment.
constexpr dim_t Dimension() const
Return the dimension of this reference element.
static constexpr RefEl kPoint()
Returns the (0-dimensional) reference point.
static constexpr RefEl kTria()
Returns the reference triangle.
static constexpr RefEl kQuad()
Returns the reference quadrilateral.
std::string ToString() const
Return a string representation of this Reference element.
lf::base::size_type lattice_const_
lf::base::size_type NumChildren(lf::base::dim_t codim) const override
provide number of child entities of a given co-dimension to be created by refinement
lf::base::sub_idx_t anchor_
std::vector< Eigen::Matrix< int, Eigen::Dynamic, Eigen::Dynamic > > ChildPolygons(lf::base::dim_t codim) const override
provide lattice reference coordinates of vertices of child polygons
unsigned int dim_t
type for dimensions and co-dimensions and numbers derived from them
unsigned int size_type
general type for variables related to size of arrays
tools for regular or local refinement of 2D hybrid meshes
std::ostream & operator<<(std::ostream &o, const RefPat &refpat)
RefPat
(possibly incomplete) list of refinement patterns for triangles/quadrilaterals