1130 const int elem = ref.
index;
1131 char ref_type = ref.
GetType();
1132 const real_t scale_x = ref.
s[0];
1133 const real_t scale_y = ref.
s[1];
1134 const real_t scale_z = ref.
s[2];
1136 if (!ref_type) {
return; }
1142 const char remaining = ref_type & ~el.
ref_type;
1148 if (el.
child[i] >= 0)
1173 for (
int i = 0; i < gi.
nf; i++)
1175 const int* fv = gi.
faces[i];
1176 Face* face =
faces.Find(no[fv[0]], no[fv[1]], no[fv[2]], no[fv[3]]);
1210 no[4], mid45, mid67, no[7], attr,
1211 fa[0], fa[1], -1, fa[3], fa[4], fa[5]);
1214 mid45, no[5], no[6], mid67, attr,
1215 fa[0], fa[1], fa[2], fa[3], -1, fa[5]);
1235 no[4], no[5], mid56, mid74, attr,
1236 fa[0], fa[1], fa[2], -1, fa[4], fa[5]);
1239 mid74, mid56, no[6], no[7], attr,
1240 fa[0], -1, fa[2], fa[3], fa[4], fa[5]);
1260 mid04, mid15, mid26, mid37, attr,
1261 fa[0], fa[1], fa[2], fa[3], fa[4], -1);
1264 no[4], no[5], no[6], no[7], attr,
1265 -1, fa[1], fa[2], fa[3], fa[4], fa[5]);
1304 no[4], mid45, midf5, mid74, attr,
1305 fa[0], fa[1], -1, -1, fa[4], fa[5]);
1308 mid45, no[5], mid56, midf5, attr,
1309 fa[0], fa[1], fa[2], -1, -1, fa[5]);
1312 midf5, mid56, no[6], mid67, attr,
1313 fa[0], -1, fa[2], fa[3], -1, fa[5]);
1316 mid74, midf5, mid67, no[7], attr,
1317 fa[0], -1, -1, fa[3], fa[4], fa[5]);
1324 CheckIsoFace(no[3], no[2], no[1], no[0], mid23, mid12, mid01, mid30, midf0);
1325 CheckIsoFace(no[4], no[5], no[6], no[7], mid45, mid56, mid67, mid74, midf5);
1359 mid04, midf1, midf3, mid37, attr,
1360 fa[0], fa[1], -1, fa[3], fa[4], -1);
1363 midf1, mid15, mid26, midf3, attr,
1364 fa[0], fa[1], fa[2], fa[3], -1, -1);
1367 mid45, no[5], no[6], mid67, attr,
1368 -1, fa[1], fa[2], fa[3], -1, fa[5]);
1371 no[4], mid45, mid67, no[7], attr,
1372 -1, fa[1], -1, fa[3], fa[4], fa[5]);
1379 CheckIsoFace(no[0], no[1], no[5], no[4], mid01, mid15, mid45, mid04, midf1);
1380 CheckIsoFace(no[2], no[3], no[7], no[6], mid23, mid37, mid67, mid26, midf3);
1414 mid04, mid15, midf2, midf4, attr,
1415 fa[0], fa[1], fa[2], -1, fa[4], -1);
1418 midf4, midf2, mid26, mid37, attr,
1419 fa[0], -1, fa[2], fa[3], fa[4], -1);
1422 no[4], no[5], mid56, mid74, attr,
1423 -1, fa[1], fa[2], -1, fa[4], fa[5]);
1426 mid74, mid56, no[6], no[7], attr,
1427 -1, -1, fa[2], fa[3], fa[4], fa[5]);
1434 CheckIsoFace(no[1], no[2], no[6], no[5], mid12, mid26, mid56, mid15, midf2);
1435 CheckIsoFace(no[3], no[0], no[4], no[7], mid30, mid04, mid74, mid37, midf4);
1499 mid04, midf1, midel, midf4, attr,
1500 fa[0], fa[1], -1, -1, fa[4], -1);
1503 midf1, mid15, midf2, midel, attr,
1504 fa[0], fa[1], fa[2], -1, -1, -1);
1507 midel, midf2, mid26, midf3, attr,
1508 fa[0], -1, fa[2], fa[3], -1, -1);
1511 midf4, midel, midf3, mid37, attr,
1512 fa[0], -1, -1, fa[3], fa[4], -1);
1515 no[4], mid45, midf5, mid74, attr,
1516 -1, fa[1], -1, -1, fa[4], fa[5]);
1519 mid45, no[5], mid56, midf5, attr,
1520 -1, fa[1], fa[2], -1, -1, fa[5]);
1523 midf5, mid56, no[6], mid67, attr,
1524 -1, -1, fa[2], fa[3], -1, fa[5]);
1527 mid74, midf5, mid67, no[7], attr,
1528 -1, -1, -1, fa[3], fa[4], fa[5]);
1530 CheckIsoFace(no[3], no[2], no[1], no[0], mid23, mid12, mid01, mid30, midf0);
1531 CheckIsoFace(no[0], no[1], no[5], no[4], mid01, mid15, mid45, mid04, midf1);
1532 CheckIsoFace(no[1], no[2], no[6], no[5], mid12, mid26, mid56, mid15, midf2);
1533 CheckIsoFace(no[2], no[3], no[7], no[6], mid23, mid37, mid67, mid26, midf3);
1534 CheckIsoFace(no[3], no[0], no[4], no[7], mid30, mid04, mid74, mid37, midf4);
1535 CheckIsoFace(no[4], no[5], no[6], no[7], mid45, mid56, mid67, mid74, midf5);
1539 MFEM_ABORT(
"invalid refinement type.");
1572 child[0] =
NewWedge(no[0], mid01, mid20,
1573 no[3], mid34, mid53, attr,
1574 fa[0], fa[1], fa[2], -1, fa[4]);
1576 child[1] =
NewWedge(mid01, no[1], mid12,
1577 mid34, no[4], mid45, attr,
1578 fa[0], fa[1], fa[2], fa[3], -1);
1580 child[2] =
NewWedge(mid20, mid12, no[2],
1581 mid53, mid45, no[5], attr,
1582 fa[0], fa[1], -1, fa[3], fa[4]);
1584 child[3] =
NewWedge(mid12, mid20, mid01,
1585 mid45, mid53, mid34, attr,
1586 fa[0], fa[1], -1, -1, -1);
1598 child[0] =
NewWedge(no[0], no[1], no[2],
1599 mid03, mid14, mid25, attr,
1600 fa[0], -1, fa[2], fa[3], fa[4]);
1602 child[1] =
NewWedge(mid03, mid14, mid25,
1603 no[3], no[4], no[5], attr,
1604 -1, fa[1], fa[2], fa[3], fa[4]);
1630 child[0] =
NewWedge(no[0], mid01, mid20,
1631 mid03, midf2, midf4, attr,
1632 fa[0], -1, fa[2], -1, fa[4]);
1634 child[1] =
NewWedge(mid01, no[1], mid12,
1635 midf2, mid14, midf3, attr,
1636 fa[0], -1, fa[2], fa[3], -1);
1638 child[2] =
NewWedge(mid20, mid12, no[2],
1639 midf4, midf3, mid25, attr,
1640 fa[0], -1, -1, fa[3], fa[4]);
1642 child[3] =
NewWedge(mid12, mid20, mid01,
1643 midf3, midf4, midf2, attr,
1644 fa[0], -1, -1, -1, -1);
1646 child[4] =
NewWedge(mid03, midf2, midf4,
1647 no[3], mid34, mid53, attr,
1648 -1, fa[1], fa[2], -1, fa[4]);
1650 child[5] =
NewWedge(midf2, mid14, midf3,
1651 mid34, no[4], mid45, attr,
1652 -1, fa[1], fa[2], fa[3], -1);
1654 child[6] =
NewWedge(midf4, midf3, mid25,
1655 mid53, mid45, no[5], attr,
1656 -1, fa[1], -1, fa[3], fa[4]);
1658 child[7] =
NewWedge(midf3, midf4, midf2,
1659 mid45, mid53, mid34, attr,
1660 -1, fa[1], -1, -1, -1);
1662 CheckIsoFace(no[0], no[1], no[4], no[3], mid01, mid14, mid34, mid03, midf2);
1663 CheckIsoFace(no[1], no[2], no[5], no[4], mid12, mid25, mid45, mid14, midf3);
1664 CheckIsoFace(no[2], no[0], no[3], no[5], mid20, mid03, mid53, mid25, midf4);
1695 -1, fa[1], fa[2], fa[3]);
1698 fa[0], -1, fa[2], fa[3]);
1701 fa[0], fa[1], -1, fa[3]);
1704 fa[0], fa[1], fa[2], -1);
1784 child[0] =
NewPyramid(no[0], mid01, midf0, mid03, mid04,
1785 attr, fa[0], fa[1], -1, -1, fa[4]);
1787 child[1] =
NewPyramid(mid01, no[1], mid12, midf0, mid14,
1788 attr, fa[0], fa[1], fa[2], -1, -1);
1790 child[2] =
NewPyramid(midf0, mid12, no[2], mid23, mid24,
1791 attr, fa[0], -1, fa[2], fa[3], -1);
1793 child[3] =
NewPyramid(mid03, midf0, mid23, no[3], mid34,
1794 attr, fa[0], -1, -1, fa[3], fa[4]);
1796 child[4] =
NewPyramid(mid24, mid14, mid04, mid34, midf0,
1797 attr, -1, -1, -1, -1, -1);
1799 child[5] =
NewPyramid(mid04, mid14, mid24, mid34, no[4],
1800 attr, -1, fa[1], fa[2], fa[3], fa[4]);
1803 attr, -1, -1, -1, fa[1]);
1806 attr, -1, -1, fa[2], -1);
1809 attr, -1, -1, fa[3], -1);
1812 attr, -1, fa[4], -1, -1);
1814 CheckIsoFace(no[3], no[2], no[1], no[0], mid23, mid12, mid01, mid03, midf0);
1822 const int mid01 =
nodes.GetId(no[0], no[1]);
1823 const int mid23 =
nodes.GetId(no[2], no[3]);
1829 attr, fa[0], -1, fa[2], fa[3]);
1832 attr, fa[0], fa[1], fa[2], -1);
1836 const int mid12 =
nodes.GetId(no[1], no[2]);
1837 const int mid30 =
nodes.GetId(no[3], no[0]);
1843 attr, fa[0], fa[1], -1, fa[3]);
1846 attr, -1, fa[1], fa[2], fa[3]);
1850 const int mid01 =
nodes.GetId(no[0], no[1]);
1851 const int mid12 =
nodes.GetId(no[1], no[2]);
1852 const int mid23 =
nodes.GetId(no[2], no[3]);
1853 const int mid30 =
nodes.GetId(no[3], no[0]);
1855 const int midel =
nodes.GetId(mid01, mid23);
1866 attr, fa[0], -1, -1, fa[3]);
1869 attr, fa[0], fa[1], -1, -1);
1872 attr, -1, fa[1], fa[2], -1);
1875 attr, -1, -1, fa[2], fa[3]);
1879 MFEM_ABORT(
"Invalid refinement type.");
1889 int mid01 =
nodes.GetId(no[0], no[1]);
1890 int mid12 =
nodes.GetId(no[1], no[2]);
1891 int mid20 =
nodes.GetId(no[2], no[0]);
1893 child[0] =
NewTriangle(no[0], mid01, mid20, attr, fa[0], -1, fa[2]);
1894 child[1] =
NewTriangle(mid01, no[1], mid12, attr, fa[0], fa[1], -1);
1895 child[2] =
NewTriangle(mid20, mid12, no[2], attr, -1, fa[1], fa[2]);
1896 child[3] =
NewTriangle(mid12, mid20, mid01, attr, -1, -1, -1);
1902 int mid =
nodes.GetId(no[0], no[1]);
1903 child[0] =
NewSegment(no[0], mid, attr, fa[0], -1);
1904 child[1] =
NewSegment(mid, no[1], attr, -1, fa[1]);
1908 MFEM_ABORT(
"Unsupported element geometry.");
1912 for (
int i = 0; i < MaxElemChildren && child[i] >= 0; i++)
1925 for (
int i = 0; i < MaxElemChildren && child[i] >= 0; i++)
1934 for (
int i = 0; i < MaxElemChildren && child[i] >= 0; i++)
1943 std::memcpy(el.
child, child,
sizeof(el.
child));
4632 int ref_type = *ref_path++;
4633 int child = *ref_path++;
4641 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
4642 Point mid67(pm(6), pm(7)), mid45(pm(4), pm(5));
4647 pm(4), mid45, mid67, pm(7));
4649 else if (child == 1)
4652 mid45, pm(5), pm(6), mid67);
4655 else if (ref_type == 2)
4657 Point mid12(pm(1), pm(2)), mid30(pm(3), pm(0));
4658 Point mid56(pm(5), pm(6)), mid74(pm(7), pm(4));
4663 pm(4), pm(5), mid56, mid74);
4665 else if (child == 1)
4668 mid74, mid56, pm(6), pm(7));
4671 else if (ref_type == 4)
4673 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4674 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4679 mid04, mid15, mid26, mid37);
4681 else if (child == 1)
4684 pm(4), pm(5), pm(6), pm(7));
4687 else if (ref_type == 3)
4689 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
4690 Point mid23(pm(2), pm(3)), mid30(pm(3), pm(0));
4691 Point mid45(pm(4), pm(5)), mid56(pm(5), pm(6));
4692 Point mid67(pm(6), pm(7)), mid74(pm(7), pm(4));
4694 Point midf0(mid23, mid12, mid01, mid30);
4695 Point midf5(mid45, mid56, mid67, mid74);
4700 pm(4), mid45, midf5, mid74);
4702 else if (child == 1)
4705 mid45, pm(5), mid56, midf5);
4707 else if (child == 2)
4710 midf5, mid56, pm(6), mid67);
4712 else if (child == 3)
4715 mid74, midf5, mid67, pm(7));
4718 else if (ref_type == 5)
4720 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
4721 Point mid45(pm(4), pm(5)), mid67(pm(6), pm(7));
4722 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4723 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4725 Point midf1(mid01, mid15, mid45, mid04);
4726 Point midf3(mid23, mid37, mid67, mid26);
4731 mid04, midf1, midf3, mid37);
4733 else if (child == 1)
4736 midf1, mid15, mid26, midf3);
4738 else if (child == 2)
4741 mid45, pm(5), pm(6), mid67);
4743 else if (child == 3)
4746 pm(4), mid45, mid67, pm(7));
4749 else if (ref_type == 6)
4751 Point mid12(pm(1), pm(2)), mid30(pm(3), pm(0));
4752 Point mid56(pm(5), pm(6)), mid74(pm(7), pm(4));
4753 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4754 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4756 Point midf2(mid12, mid26, mid56, mid15);
4757 Point midf4(mid30, mid04, mid74, mid37);
4762 mid04, mid15, midf2, midf4);
4764 else if (child == 1)
4767 midf4, midf2, mid26, mid37);
4769 else if (child == 2)
4772 pm(4), pm(5), mid56, mid74);
4774 else if (child == 3)
4777 mid74, mid56, pm(6), pm(7));
4780 else if (ref_type == 7)
4782 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
4783 Point mid23(pm(2), pm(3)), mid30(pm(3), pm(0));
4784 Point mid45(pm(4), pm(5)), mid56(pm(5), pm(6));
4785 Point mid67(pm(6), pm(7)), mid74(pm(7), pm(4));
4786 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4787 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4789 Point midf0(mid23, mid12, mid01, mid30);
4790 Point midf1(mid01, mid15, mid45, mid04);
4791 Point midf2(mid12, mid26, mid56, mid15);
4792 Point midf3(mid23, mid37, mid67, mid26);
4793 Point midf4(mid30, mid04, mid74, mid37);
4794 Point midf5(mid45, mid56, mid67, mid74);
4796 Point midel(midf1, midf3);
4801 mid04, midf1, midel, midf4);
4803 else if (child == 1)
4806 midf1, mid15, midf2, midel);
4808 else if (child == 2)
4811 midel, midf2, mid26, midf3);
4813 else if (child == 3)
4816 midf4, midel, midf3, mid37);
4818 else if (child == 4)
4821 pm(4), mid45, midf5, mid74);
4823 else if (child == 5)
4826 mid45, pm(5), mid56, midf5);
4828 else if (child == 6)
4831 midf5, mid56, pm(6), mid67);
4833 else if (child == 7)
4836 mid74, midf5, mid67, pm(7));
4844 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
4845 Point mid20(pm(2), pm(0)), mid34(pm(3), pm(4));
4846 Point mid45(pm(4), pm(5)), mid53(pm(5), pm(3));
4850 pm =
PointMatrix(pm(0), mid01, mid20, pm(3), mid34, mid53);
4852 else if (child == 1)
4854 pm =
PointMatrix(mid01, pm(1), mid12, mid34, pm(4), mid45);
4856 else if (child == 2)
4858 pm =
PointMatrix(mid20, mid12, pm(2), mid53, mid45, pm(5));
4860 else if (child == 3)
4862 pm =
PointMatrix(mid12, mid20, mid01, mid45, mid53, mid34);
4865 else if (ref_type == 4)
4867 Point mid03(pm(0), pm(3)), mid14(pm(1), pm(4)), mid25(pm(2), pm(5));
4871 pm =
PointMatrix(pm(0), pm(1), pm(2), mid03, mid14, mid25);
4873 else if (child == 1)
4875 pm =
PointMatrix(mid03, mid14, mid25, pm(3), pm(4), pm(5));
4880 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2)), mid20(pm(2), pm(0));
4881 Point mid34(pm(3), pm(4)), mid45(pm(4), pm(5)), mid53(pm(5), pm(3));
4882 Point mid03(pm(0), pm(3)), mid14(pm(1), pm(4)), mid25(pm(2), pm(5));
4884 Point midf2(mid01, mid14, mid34, mid03);
4885 Point midf3(mid12, mid25, mid45, mid14);
4886 Point midf4(mid20, mid03, mid53, mid25);
4890 pm =
PointMatrix(pm(0), mid01, mid20, mid03, midf2, midf4);
4892 else if (child == 1)
4894 pm =
PointMatrix(mid01, pm(1), mid12, midf2, mid14, midf3);
4896 else if (child == 2)
4898 pm =
PointMatrix(mid20, mid12, pm(2), midf4, midf3, mid25);
4900 else if (child == 3)
4902 pm =
PointMatrix(mid12, mid20, mid01, midf3, midf4, midf2);
4904 else if (child == 4)
4906 pm =
PointMatrix(mid03, midf2, midf4, pm(3), mid34, mid53);
4908 else if (child == 5)
4910 pm =
PointMatrix(midf2, mid14, midf3, mid34, pm(4), mid45);
4912 else if (child == 6)
4914 pm =
PointMatrix(midf4, midf3, mid25, mid53, mid45, pm(5));
4916 else if (child == 7)
4918 pm =
PointMatrix(midf3, midf4, midf2, mid45, mid53, mid34);
4924 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
4925 Point mid03(pm(0), pm(3)), mid12(pm(1), pm(2));
4926 Point mid04(pm(0), pm(4)), mid14(pm(1), pm(4));
4927 Point mid24(pm(2), pm(4)), mid34(pm(3), pm(4));
4928 Point midf0(mid23, mid12, mid01, mid03);
4932 pm =
PointMatrix(pm(0), mid01, midf0, mid03, mid04);
4934 else if (child == 1)
4936 pm =
PointMatrix(mid01, pm(1), mid12, midf0, mid14);
4938 else if (child == 2)
4940 pm =
PointMatrix(midf0, mid12, pm(2), mid23, mid24);
4942 else if (child == 3)
4944 pm =
PointMatrix(mid03, midf0, mid23, pm(3), mid34);
4946 else if (child == 4)
4948 pm =
PointMatrix(mid24, mid14, mid04, mid34, midf0);
4950 else if (child == 5)
4952 pm =
PointMatrix(mid04, mid14, mid24, mid34, pm(4));
4954 else if (child == 6)
4958 else if (child == 7)
4962 else if (child == 8)
4966 else if (child == 9)
4973 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2)), mid02(pm(2), pm(0));
4974 Point mid03(pm(0), pm(3)), mid13(pm(1), pm(3)), mid23(pm(2), pm(3));
4980 else if (child == 1)
4984 else if (child == 2)
4988 else if (child == 3)
4992 else if (child == 4)
4996 else if (child == 5)
5000 else if (child == 6)
5004 else if (child == 7)
5013 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
5019 else if (child == 1)
5024 else if (ref_type == 2)
5026 Point mid12(pm(1), pm(2)), mid30(pm(3), pm(0));
5032 else if (child == 1)
5037 else if (ref_type == 3)
5039 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
5040 Point mid23(pm(2), pm(3)), mid30(pm(3), pm(0));
5041 Point midel(mid01, mid23);
5047 else if (child == 1)
5051 else if (child == 2)
5055 else if (child == 3)
5063 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2)), mid20(pm(2), pm(0));
5069 else if (child == 1)
5073 else if (child == 2)
5077 else if (child == 3)
5084 Point mid01(pm(0), pm(1));
5090 else if (child == 1)
5098 for (
int i = 0; i < pm.
np; i++)
5100 for (
int j = 0; j < pm(i).dim; j++)
5102 matrix(j, i) = pm(i).coord[j];