1128 const int elem = ref.
index;
1129 char ref_type = ref.
GetType();
1130 const real_t scale_x = ref.
s[0];
1131 const real_t scale_y = ref.
s[1];
1132 const real_t scale_z = ref.
s[2];
1134 if (!ref_type) {
return; }
1140 const char remaining = ref_type & ~el.
ref_type;
1146 if (el.
child[i] >= 0)
1171 for (
int i = 0; i < gi.
nf; i++)
1173 const int* fv = gi.
faces[i];
1174 Face* face =
faces.Find(no[fv[0]], no[fv[1]], no[fv[2]], no[fv[3]]);
1208 no[4], mid45, mid67, no[7], attr,
1209 fa[0], fa[1], -1, fa[3], fa[4], fa[5]);
1212 mid45, no[5], no[6], mid67, attr,
1213 fa[0], fa[1], fa[2], fa[3], -1, fa[5]);
1233 no[4], no[5], mid56, mid74, attr,
1234 fa[0], fa[1], fa[2], -1, fa[4], fa[5]);
1237 mid74, mid56, no[6], no[7], attr,
1238 fa[0], -1, fa[2], fa[3], fa[4], fa[5]);
1258 mid04, mid15, mid26, mid37, attr,
1259 fa[0], fa[1], fa[2], fa[3], fa[4], -1);
1262 no[4], no[5], no[6], no[7], attr,
1263 -1, fa[1], fa[2], fa[3], fa[4], fa[5]);
1302 no[4], mid45, midf5, mid74, attr,
1303 fa[0], fa[1], -1, -1, fa[4], fa[5]);
1306 mid45, no[5], mid56, midf5, attr,
1307 fa[0], fa[1], fa[2], -1, -1, fa[5]);
1310 midf5, mid56, no[6], mid67, attr,
1311 fa[0], -1, fa[2], fa[3], -1, fa[5]);
1314 mid74, midf5, mid67, no[7], attr,
1315 fa[0], -1, -1, fa[3], fa[4], fa[5]);
1322 CheckIsoFace(no[3], no[2], no[1], no[0], mid23, mid12, mid01, mid30, midf0);
1323 CheckIsoFace(no[4], no[5], no[6], no[7], mid45, mid56, mid67, mid74, midf5);
1357 mid04, midf1, midf3, mid37, attr,
1358 fa[0], fa[1], -1, fa[3], fa[4], -1);
1361 midf1, mid15, mid26, midf3, attr,
1362 fa[0], fa[1], fa[2], fa[3], -1, -1);
1365 mid45, no[5], no[6], mid67, attr,
1366 -1, fa[1], fa[2], fa[3], -1, fa[5]);
1369 no[4], mid45, mid67, no[7], attr,
1370 -1, fa[1], -1, fa[3], fa[4], fa[5]);
1377 CheckIsoFace(no[0], no[1], no[5], no[4], mid01, mid15, mid45, mid04, midf1);
1378 CheckIsoFace(no[2], no[3], no[7], no[6], mid23, mid37, mid67, mid26, midf3);
1412 mid04, mid15, midf2, midf4, attr,
1413 fa[0], fa[1], fa[2], -1, fa[4], -1);
1416 midf4, midf2, mid26, mid37, attr,
1417 fa[0], -1, fa[2], fa[3], fa[4], -1);
1420 no[4], no[5], mid56, mid74, attr,
1421 -1, fa[1], fa[2], -1, fa[4], fa[5]);
1424 mid74, mid56, no[6], no[7], attr,
1425 -1, -1, fa[2], fa[3], fa[4], fa[5]);
1432 CheckIsoFace(no[1], no[2], no[6], no[5], mid12, mid26, mid56, mid15, midf2);
1433 CheckIsoFace(no[3], no[0], no[4], no[7], mid30, mid04, mid74, mid37, midf4);
1497 mid04, midf1, midel, midf4, attr,
1498 fa[0], fa[1], -1, -1, fa[4], -1);
1501 midf1, mid15, midf2, midel, attr,
1502 fa[0], fa[1], fa[2], -1, -1, -1);
1505 midel, midf2, mid26, midf3, attr,
1506 fa[0], -1, fa[2], fa[3], -1, -1);
1509 midf4, midel, midf3, mid37, attr,
1510 fa[0], -1, -1, fa[3], fa[4], -1);
1513 no[4], mid45, midf5, mid74, attr,
1514 -1, fa[1], -1, -1, fa[4], fa[5]);
1517 mid45, no[5], mid56, midf5, attr,
1518 -1, fa[1], fa[2], -1, -1, fa[5]);
1521 midf5, mid56, no[6], mid67, attr,
1522 -1, -1, fa[2], fa[3], -1, fa[5]);
1525 mid74, midf5, mid67, no[7], attr,
1526 -1, -1, -1, fa[3], fa[4], fa[5]);
1528 CheckIsoFace(no[3], no[2], no[1], no[0], mid23, mid12, mid01, mid30, midf0);
1529 CheckIsoFace(no[0], no[1], no[5], no[4], mid01, mid15, mid45, mid04, midf1);
1530 CheckIsoFace(no[1], no[2], no[6], no[5], mid12, mid26, mid56, mid15, midf2);
1531 CheckIsoFace(no[2], no[3], no[7], no[6], mid23, mid37, mid67, mid26, midf3);
1532 CheckIsoFace(no[3], no[0], no[4], no[7], mid30, mid04, mid74, mid37, midf4);
1533 CheckIsoFace(no[4], no[5], no[6], no[7], mid45, mid56, mid67, mid74, midf5);
1537 MFEM_ABORT(
"invalid refinement type.");
1570 child[0] =
NewWedge(no[0], mid01, mid20,
1571 no[3], mid34, mid53, attr,
1572 fa[0], fa[1], fa[2], -1, fa[4]);
1574 child[1] =
NewWedge(mid01, no[1], mid12,
1575 mid34, no[4], mid45, attr,
1576 fa[0], fa[1], fa[2], fa[3], -1);
1578 child[2] =
NewWedge(mid20, mid12, no[2],
1579 mid53, mid45, no[5], attr,
1580 fa[0], fa[1], -1, fa[3], fa[4]);
1582 child[3] =
NewWedge(mid12, mid20, mid01,
1583 mid45, mid53, mid34, attr,
1584 fa[0], fa[1], -1, -1, -1);
1596 child[0] =
NewWedge(no[0], no[1], no[2],
1597 mid03, mid14, mid25, attr,
1598 fa[0], -1, fa[2], fa[3], fa[4]);
1600 child[1] =
NewWedge(mid03, mid14, mid25,
1601 no[3], no[4], no[5], attr,
1602 -1, fa[1], fa[2], fa[3], fa[4]);
1628 child[0] =
NewWedge(no[0], mid01, mid20,
1629 mid03, midf2, midf4, attr,
1630 fa[0], -1, fa[2], -1, fa[4]);
1632 child[1] =
NewWedge(mid01, no[1], mid12,
1633 midf2, mid14, midf3, attr,
1634 fa[0], -1, fa[2], fa[3], -1);
1636 child[2] =
NewWedge(mid20, mid12, no[2],
1637 midf4, midf3, mid25, attr,
1638 fa[0], -1, -1, fa[3], fa[4]);
1640 child[3] =
NewWedge(mid12, mid20, mid01,
1641 midf3, midf4, midf2, attr,
1642 fa[0], -1, -1, -1, -1);
1644 child[4] =
NewWedge(mid03, midf2, midf4,
1645 no[3], mid34, mid53, attr,
1646 -1, fa[1], fa[2], -1, fa[4]);
1648 child[5] =
NewWedge(midf2, mid14, midf3,
1649 mid34, no[4], mid45, attr,
1650 -1, fa[1], fa[2], fa[3], -1);
1652 child[6] =
NewWedge(midf4, midf3, mid25,
1653 mid53, mid45, no[5], attr,
1654 -1, fa[1], -1, fa[3], fa[4]);
1656 child[7] =
NewWedge(midf3, midf4, midf2,
1657 mid45, mid53, mid34, attr,
1658 -1, fa[1], -1, -1, -1);
1660 CheckIsoFace(no[0], no[1], no[4], no[3], mid01, mid14, mid34, mid03, midf2);
1661 CheckIsoFace(no[1], no[2], no[5], no[4], mid12, mid25, mid45, mid14, midf3);
1662 CheckIsoFace(no[2], no[0], no[3], no[5], mid20, mid03, mid53, mid25, midf4);
1693 -1, fa[1], fa[2], fa[3]);
1696 fa[0], -1, fa[2], fa[3]);
1699 fa[0], fa[1], -1, fa[3]);
1702 fa[0], fa[1], fa[2], -1);
1782 child[0] =
NewPyramid(no[0], mid01, midf0, mid03, mid04,
1783 attr, fa[0], fa[1], -1, -1, fa[4]);
1785 child[1] =
NewPyramid(mid01, no[1], mid12, midf0, mid14,
1786 attr, fa[0], fa[1], fa[2], -1, -1);
1788 child[2] =
NewPyramid(midf0, mid12, no[2], mid23, mid24,
1789 attr, fa[0], -1, fa[2], fa[3], -1);
1791 child[3] =
NewPyramid(mid03, midf0, mid23, no[3], mid34,
1792 attr, fa[0], -1, -1, fa[3], fa[4]);
1794 child[4] =
NewPyramid(mid24, mid14, mid04, mid34, midf0,
1795 attr, -1, -1, -1, -1, -1);
1797 child[5] =
NewPyramid(mid04, mid14, mid24, mid34, no[4],
1798 attr, -1, fa[1], fa[2], fa[3], fa[4]);
1801 attr, -1, -1, -1, fa[1]);
1804 attr, -1, -1, fa[2], -1);
1807 attr, -1, -1, fa[3], -1);
1810 attr, -1, fa[4], -1, -1);
1812 CheckIsoFace(no[3], no[2], no[1], no[0], mid23, mid12, mid01, mid03, midf0);
1820 const int mid01 =
nodes.GetId(no[0], no[1]);
1821 const int mid23 =
nodes.GetId(no[2], no[3]);
1827 attr, fa[0], -1, fa[2], fa[3]);
1830 attr, fa[0], fa[1], fa[2], -1);
1834 const int mid12 =
nodes.GetId(no[1], no[2]);
1835 const int mid30 =
nodes.GetId(no[3], no[0]);
1841 attr, fa[0], fa[1], -1, fa[3]);
1844 attr, -1, fa[1], fa[2], fa[3]);
1848 const int mid01 =
nodes.GetId(no[0], no[1]);
1849 const int mid12 =
nodes.GetId(no[1], no[2]);
1850 const int mid23 =
nodes.GetId(no[2], no[3]);
1851 const int mid30 =
nodes.GetId(no[3], no[0]);
1853 const int midel =
nodes.GetId(mid01, mid23);
1864 attr, fa[0], -1, -1, fa[3]);
1867 attr, fa[0], fa[1], -1, -1);
1870 attr, -1, fa[1], fa[2], -1);
1873 attr, -1, -1, fa[2], fa[3]);
1877 MFEM_ABORT(
"Invalid refinement type.");
1887 int mid01 =
nodes.GetId(no[0], no[1]);
1888 int mid12 =
nodes.GetId(no[1], no[2]);
1889 int mid20 =
nodes.GetId(no[2], no[0]);
1891 child[0] =
NewTriangle(no[0], mid01, mid20, attr, fa[0], -1, fa[2]);
1892 child[1] =
NewTriangle(mid01, no[1], mid12, attr, fa[0], fa[1], -1);
1893 child[2] =
NewTriangle(mid20, mid12, no[2], attr, -1, fa[1], fa[2]);
1894 child[3] =
NewTriangle(mid12, mid20, mid01, attr, -1, -1, -1);
1900 int mid =
nodes.GetId(no[0], no[1]);
1901 child[0] =
NewSegment(no[0], mid, attr, fa[0], -1);
1902 child[1] =
NewSegment(mid, no[1], attr, -1, fa[1]);
1906 MFEM_ABORT(
"Unsupported element geometry.");
1910 for (
int i = 0; i < MaxElemChildren && child[i] >= 0; i++)
1923 for (
int i = 0; i < MaxElemChildren && child[i] >= 0; i++)
1932 for (
int i = 0; i < MaxElemChildren && child[i] >= 0; i++)
1941 std::memcpy(el.
child, child,
sizeof(el.
child));
4630 int ref_type = *ref_path++;
4631 int child = *ref_path++;
4639 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
4640 Point mid67(pm(6), pm(7)), mid45(pm(4), pm(5));
4645 pm(4), mid45, mid67, pm(7));
4647 else if (child == 1)
4650 mid45, pm(5), pm(6), mid67);
4653 else if (ref_type == 2)
4655 Point mid12(pm(1), pm(2)), mid30(pm(3), pm(0));
4656 Point mid56(pm(5), pm(6)), mid74(pm(7), pm(4));
4661 pm(4), pm(5), mid56, mid74);
4663 else if (child == 1)
4666 mid74, mid56, pm(6), pm(7));
4669 else if (ref_type == 4)
4671 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4672 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4677 mid04, mid15, mid26, mid37);
4679 else if (child == 1)
4682 pm(4), pm(5), pm(6), pm(7));
4685 else if (ref_type == 3)
4687 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
4688 Point mid23(pm(2), pm(3)), mid30(pm(3), pm(0));
4689 Point mid45(pm(4), pm(5)), mid56(pm(5), pm(6));
4690 Point mid67(pm(6), pm(7)), mid74(pm(7), pm(4));
4692 Point midf0(mid23, mid12, mid01, mid30);
4693 Point midf5(mid45, mid56, mid67, mid74);
4698 pm(4), mid45, midf5, mid74);
4700 else if (child == 1)
4703 mid45, pm(5), mid56, midf5);
4705 else if (child == 2)
4708 midf5, mid56, pm(6), mid67);
4710 else if (child == 3)
4713 mid74, midf5, mid67, pm(7));
4716 else if (ref_type == 5)
4718 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
4719 Point mid45(pm(4), pm(5)), mid67(pm(6), pm(7));
4720 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4721 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4723 Point midf1(mid01, mid15, mid45, mid04);
4724 Point midf3(mid23, mid37, mid67, mid26);
4729 mid04, midf1, midf3, mid37);
4731 else if (child == 1)
4734 midf1, mid15, mid26, midf3);
4736 else if (child == 2)
4739 mid45, pm(5), pm(6), mid67);
4741 else if (child == 3)
4744 pm(4), mid45, mid67, pm(7));
4747 else if (ref_type == 6)
4749 Point mid12(pm(1), pm(2)), mid30(pm(3), pm(0));
4750 Point mid56(pm(5), pm(6)), mid74(pm(7), pm(4));
4751 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4752 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4754 Point midf2(mid12, mid26, mid56, mid15);
4755 Point midf4(mid30, mid04, mid74, mid37);
4760 mid04, mid15, midf2, midf4);
4762 else if (child == 1)
4765 midf4, midf2, mid26, mid37);
4767 else if (child == 2)
4770 pm(4), pm(5), mid56, mid74);
4772 else if (child == 3)
4775 mid74, mid56, pm(6), pm(7));
4778 else if (ref_type == 7)
4780 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
4781 Point mid23(pm(2), pm(3)), mid30(pm(3), pm(0));
4782 Point mid45(pm(4), pm(5)), mid56(pm(5), pm(6));
4783 Point mid67(pm(6), pm(7)), mid74(pm(7), pm(4));
4784 Point mid04(pm(0), pm(4)), mid15(pm(1), pm(5));
4785 Point mid26(pm(2), pm(6)), mid37(pm(3), pm(7));
4787 Point midf0(mid23, mid12, mid01, mid30);
4788 Point midf1(mid01, mid15, mid45, mid04);
4789 Point midf2(mid12, mid26, mid56, mid15);
4790 Point midf3(mid23, mid37, mid67, mid26);
4791 Point midf4(mid30, mid04, mid74, mid37);
4792 Point midf5(mid45, mid56, mid67, mid74);
4794 Point midel(midf1, midf3);
4799 mid04, midf1, midel, midf4);
4801 else if (child == 1)
4804 midf1, mid15, midf2, midel);
4806 else if (child == 2)
4809 midel, midf2, mid26, midf3);
4811 else if (child == 3)
4814 midf4, midel, midf3, mid37);
4816 else if (child == 4)
4819 pm(4), mid45, midf5, mid74);
4821 else if (child == 5)
4824 mid45, pm(5), mid56, midf5);
4826 else if (child == 6)
4829 midf5, mid56, pm(6), mid67);
4831 else if (child == 7)
4834 mid74, midf5, mid67, pm(7));
4842 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
4843 Point mid20(pm(2), pm(0)), mid34(pm(3), pm(4));
4844 Point mid45(pm(4), pm(5)), mid53(pm(5), pm(3));
4848 pm =
PointMatrix(pm(0), mid01, mid20, pm(3), mid34, mid53);
4850 else if (child == 1)
4852 pm =
PointMatrix(mid01, pm(1), mid12, mid34, pm(4), mid45);
4854 else if (child == 2)
4856 pm =
PointMatrix(mid20, mid12, pm(2), mid53, mid45, pm(5));
4858 else if (child == 3)
4860 pm =
PointMatrix(mid12, mid20, mid01, mid45, mid53, mid34);
4863 else if (ref_type == 4)
4865 Point mid03(pm(0), pm(3)), mid14(pm(1), pm(4)), mid25(pm(2), pm(5));
4869 pm =
PointMatrix(pm(0), pm(1), pm(2), mid03, mid14, mid25);
4871 else if (child == 1)
4873 pm =
PointMatrix(mid03, mid14, mid25, pm(3), pm(4), pm(5));
4878 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2)), mid20(pm(2), pm(0));
4879 Point mid34(pm(3), pm(4)), mid45(pm(4), pm(5)), mid53(pm(5), pm(3));
4880 Point mid03(pm(0), pm(3)), mid14(pm(1), pm(4)), mid25(pm(2), pm(5));
4882 Point midf2(mid01, mid14, mid34, mid03);
4883 Point midf3(mid12, mid25, mid45, mid14);
4884 Point midf4(mid20, mid03, mid53, mid25);
4888 pm =
PointMatrix(pm(0), mid01, mid20, mid03, midf2, midf4);
4890 else if (child == 1)
4892 pm =
PointMatrix(mid01, pm(1), mid12, midf2, mid14, midf3);
4894 else if (child == 2)
4896 pm =
PointMatrix(mid20, mid12, pm(2), midf4, midf3, mid25);
4898 else if (child == 3)
4900 pm =
PointMatrix(mid12, mid20, mid01, midf3, midf4, midf2);
4902 else if (child == 4)
4904 pm =
PointMatrix(mid03, midf2, midf4, pm(3), mid34, mid53);
4906 else if (child == 5)
4908 pm =
PointMatrix(midf2, mid14, midf3, mid34, pm(4), mid45);
4910 else if (child == 6)
4912 pm =
PointMatrix(midf4, midf3, mid25, mid53, mid45, pm(5));
4914 else if (child == 7)
4916 pm =
PointMatrix(midf3, midf4, midf2, mid45, mid53, mid34);
4922 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
4923 Point mid03(pm(0), pm(3)), mid12(pm(1), pm(2));
4924 Point mid04(pm(0), pm(4)), mid14(pm(1), pm(4));
4925 Point mid24(pm(2), pm(4)), mid34(pm(3), pm(4));
4926 Point midf0(mid23, mid12, mid01, mid03);
4930 pm =
PointMatrix(pm(0), mid01, midf0, mid03, mid04);
4932 else if (child == 1)
4934 pm =
PointMatrix(mid01, pm(1), mid12, midf0, mid14);
4936 else if (child == 2)
4938 pm =
PointMatrix(midf0, mid12, pm(2), mid23, mid24);
4940 else if (child == 3)
4942 pm =
PointMatrix(mid03, midf0, mid23, pm(3), mid34);
4944 else if (child == 4)
4946 pm =
PointMatrix(mid24, mid14, mid04, mid34, midf0);
4948 else if (child == 5)
4950 pm =
PointMatrix(mid04, mid14, mid24, mid34, pm(4));
4952 else if (child == 6)
4956 else if (child == 7)
4960 else if (child == 8)
4964 else if (child == 9)
4971 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2)), mid02(pm(2), pm(0));
4972 Point mid03(pm(0), pm(3)), mid13(pm(1), pm(3)), mid23(pm(2), pm(3));
4978 else if (child == 1)
4982 else if (child == 2)
4986 else if (child == 3)
4990 else if (child == 4)
4994 else if (child == 5)
4998 else if (child == 6)
5002 else if (child == 7)
5011 Point mid01(pm(0), pm(1)), mid23(pm(2), pm(3));
5017 else if (child == 1)
5022 else if (ref_type == 2)
5024 Point mid12(pm(1), pm(2)), mid30(pm(3), pm(0));
5030 else if (child == 1)
5035 else if (ref_type == 3)
5037 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2));
5038 Point mid23(pm(2), pm(3)), mid30(pm(3), pm(0));
5039 Point midel(mid01, mid23);
5045 else if (child == 1)
5049 else if (child == 2)
5053 else if (child == 3)
5061 Point mid01(pm(0), pm(1)), mid12(pm(1), pm(2)), mid20(pm(2), pm(0));
5067 else if (child == 1)
5071 else if (child == 2)
5075 else if (child == 3)
5082 Point mid01(pm(0), pm(1));
5088 else if (child == 1)
5096 for (
int i = 0; i < pm.
np; i++)
5098 for (
int j = 0; j < pm(i).dim; j++)
5100 matrix(j, i) = pm(i).coord[j];