1067{
1068
1069 Array3D<int> E_vid(nsplit + 1, nsplit + 1, nsplit + 1);
1070
1071 Array3D<int> E_eidx(nsplit + 1, nsplit + 1, nsplit + 1);
1072
1073 Array3D<int> E_eidy(nsplit + 1, nsplit + 1, nsplit + 1);
1074
1075 Array3D<int> E_eidz(nsplit + 1, nsplit + 1, nsplit + 1);
1076
1077
1078 Array3D<int> E_eidxy(nsplit + 1, nsplit + 1, nsplit + 1);
1079
1080 Array3D<int> E_eidyz(nsplit + 1, nsplit + 1, nsplit + 1);
1081
1082 Array3D<int> E_eidxz(nsplit + 1, nsplit + 1, nsplit + 1);
1083
1084
1085 Array3D<int> E_fidxy1(nsplit + 1, nsplit + 1, nsplit + 1);
1086
1087 Array3D<int> E_fidxy2(nsplit + 1, nsplit + 1, nsplit + 1);
1088
1089
1090 Array3D<int> E_fidxz1(nsplit + 1, nsplit + 1, nsplit + 1);
1091
1092 Array3D<int> E_fidxz2(nsplit + 1, nsplit + 1, nsplit + 1);
1093
1094
1095 Array3D<int> E_fidyz1(nsplit + 1, nsplit + 1, nsplit + 1);
1096
1097 Array3D<int> E_fidyz2(nsplit + 1, nsplit + 1, nsplit + 1);
1098
1099
1100 Array3D<int> E_fidyzd1(nsplit + 1, nsplit + 1, nsplit + 1);
1101
1102 Array3D<int> E_fidyzd2(nsplit + 1, nsplit + 1, nsplit + 1);
1103
1104 int maxvertid, maxedgeid;
1106
1107 Array<OneD, NekDouble> Xpts, Ypts, Zpts;
1108 Xpts = Array<OneD, NekDouble>((nsplit + 1) * (nsplit + 1) * (nsplit + 1));
1109 Ypts = Array<OneD, NekDouble>((nsplit + 1) * (nsplit + 1) * (nsplit + 1));
1110 Zpts = Array<OneD, NekDouble>((nsplit + 1) * (nsplit + 1) * (nsplit + 1));
1111
1112
1113 maxvertid =
m_linMesh->GetGeomMap<PointGeom>().rbegin()->first + 1;
1115 maxedgeid =
m_linMesh->GetGeomMap<SegGeom>().rbegin()->first + 1;
1117
1118 int maxfaceid = 0;
1119
1120 if (
m_linMesh->GetGeomMap<TriGeom>().size())
1121 {
1122 maxfaceid = std::max(
1123 maxfaceid,
m_linMesh->GetGeomMap<TriGeom>().rbegin()->first + 1);
1124 }
1125 if (
m_linMesh->GetGeomMap<QuadGeom>().size())
1126 {
1127 maxfaceid = std::max(
1128 maxfaceid,
m_linMesh->GetGeomMap<QuadGeom>().rbegin()->first + 1);
1129 }
1130
1132
1133
1134
1135
1136 int edgeoffset = 3 * nsplit * (nsplit - 1) * (nsplit - 1);
1137 int faceoffset = 3 * nsplit * nsplit * (nsplit - 1);
1138
1139
1140
1141
1142
1143 for (
auto [
id, geom] :
m_graph->GetGeomMap<TetGeom>())
1144 {
1145 int vcnt = 0;
1146 int ecnt = 0;
1147 int fcnt = 0;
1148 int elmtid = geom->GetGlobalID();
1149
1150
1151 int fid = geom->GetFace(0)->GetGlobalID();
1152 int fce_offset = 2 * fid * nsplit * nsplit;
1153 bool FceFwd =
1155
1156 int cnt = 0;
1157 for (int j = 0; j < nsplit; ++j)
1158 {
1159 for (int i = 0; i < nsplit - j; ++i)
1160 {
1161 int Fce_id = FceFwd ? fce_offset + cnt + i
1162 : fce_offset + cnt + nsplit - j - 1 - i;
1163 E_fidxy1(0, j, i) = Fce_id;
1164
1165
1166
1167
1168 int oset = FceEdgOffset[Fce_id];
1169
1170 TriGeom *face =
m_linMesh->GetTriGeom(Fce_id);
1171
1172 if (FceFwd)
1173 {
1174 E_vid(0, j, i) = face->GetVid(oset);
1175 E_vid(0, j, i + 1) = face->GetVid((oset + 1) % 3);
1176
1177 E_eidy(0, j, i) = face->GetEid((oset + 2) % 3);
1178 E_eidxy(0, j, i) = face->GetEid((oset + 1) % 3);
1179 }
1180 else
1181 {
1182 E_vid(0, j, i) = face->GetVid((oset + 1) % 3);
1183 E_vid(0, j, i + 1) = face->GetVid(oset);
1184
1185 E_eidy(0, j, i) = face->GetEid((oset + 1) % 3);
1186 E_eidxy(0, j, i) = face->GetEid((oset + 2) % 3);
1187 }
1188 E_vid(0, j + 1, i) = face->GetVid((oset + 2) % 3);
1189 E_eidx(0, j, i) = face->GetEid(oset);
1190 }
1191 cnt += nsplit - j;
1192
1193 for (int i = 0; i < nsplit - j - 1; ++i)
1194 {
1195 int Fce_id = FceFwd ? fce_offset + cnt + i
1196 : fce_offset + cnt + nsplit - j - 2 - i;
1197 E_fidxy2(0, j, i) = Fce_id;
1198 }
1199 cnt += nsplit - j - 1;
1200 }
1201
1202
1203 fid = geom->GetFace(1)->GetGlobalID();
1204 fce_offset = 2 * fid * nsplit * nsplit;
1206 cnt = 0;
1207 for (int j = 0; j < nsplit; ++j)
1208 {
1209 for (int i = 0; i < nsplit - j; ++i)
1210 {
1211 int Fce_id = FceFwd ? fce_offset + cnt + i
1212 : fce_offset + cnt + nsplit - j - 1 - i;
1213 E_fidxz1(j, 0, i) = Fce_id;
1214
1215
1216
1217
1218 int oset = FceEdgOffset[Fce_id];
1219
1220 TriGeom *face =
m_linMesh->GetTriGeom(Fce_id);
1221
1222 if (FceFwd)
1223 {
1224 E_vid(j, 0, i) = face->GetVid(oset);
1225 E_vid(j, 0, i + 1) = face->GetVid((oset + 1) % 3);
1226
1227 E_eidz(j, 0, i) = face->GetEid((oset + 2) % 3);
1228 E_eidxz(j, 0, i) = face->GetEid((oset + 1) % 3);
1229 }
1230 else
1231 {
1232 E_vid(j, 0, i) = face->GetVid((oset + 1) % 3);
1233 E_vid(j, 0, i + 1) = face->GetVid(oset);
1234
1235 E_eidz(j, 0, i) = face->GetEid((oset + 1) % 3);
1236 E_eidxz(j, 0, i) = face->GetEid((oset + 2) % 3);
1237 }
1238 E_vid(j + 1, 0, i) = face->GetVid((oset + 2) % 3);
1239 E_eidx(j, 0, i) = face->GetEid(oset);
1240 }
1241 cnt += nsplit - j;
1242
1243 for (int i = 0; i < nsplit - j - 1; ++i)
1244 {
1245 int Fce_id = FceFwd ? fce_offset + cnt + i
1246 : fce_offset + cnt + nsplit - j - 2 - i;
1247 E_fidxz2(j, 0, i) = Fce_id;
1248 }
1249 cnt += nsplit - j - 1;
1250 }
1251
1252
1253 fid = geom->GetFace(2)->GetGlobalID();
1254 fce_offset = 2 * fid * nsplit * nsplit;
1256
1257 cnt = 0;
1258 for (int j = 0; j < nsplit; ++j)
1259 {
1260 for (int i = 0; i < nsplit - j; ++i)
1261 {
1262 int Fce_id = FceFwd ? fce_offset + cnt + i
1263 : fce_offset + cnt + nsplit - j - 1 - i;
1264
1265 E_fidyzd1(j, i, nsplit - j - i - 1) = Fce_id;
1266
1267
1268
1269
1270 int oset = FceEdgOffset[Fce_id];
1271
1272 TriGeom *face =
m_linMesh->GetTriGeom(Fce_id);
1273
1274 if (FceFwd)
1275 {
1276 E_vid(j, i, nsplit - j - i) = face->GetVid(oset);
1277 E_vid(j, i + 1, nsplit - j - i - 1) =
1278 face->GetVid((oset + 1) % 3);
1279
1280 E_eidxz(j, i, nsplit - j - i - 1) =
1281 face->GetEid((oset + 2) % 3);
1282 E_eidyz(j, i, nsplit - j - i - 1) =
1283 face->GetEid((oset + 1) % 3);
1284 }
1285 else
1286 {
1287 E_vid(j, i, nsplit - j - i) = face->GetVid((oset + 1) % 3);
1288 E_vid(j, i + 1, nsplit - j - i - 1) = face->GetVid(oset);
1289
1290 E_eidxz(j, i, nsplit - j - i - 1) =
1291 face->GetEid((oset + 1) % 3);
1292 E_eidyz(j, i, nsplit - j - i - 1) =
1293 face->GetEid((oset + 2) % 3);
1294 }
1295
1296 E_vid(j + 1, i, nsplit - j - i - 1) =
1297 face->GetVid((oset + 2) % 3);
1298 E_eidxy(j, i, nsplit - j - i - 1) = face->GetEid(oset);
1299
1300
1301
1302
1303 }
1304 cnt += nsplit - j;
1305
1306 for (int i = 0; i < nsplit - j - 1; ++i)
1307 {
1308 int Fce_id = FceFwd ? fce_offset + cnt + i
1309 : fce_offset + cnt + nsplit - j - 2 - i;
1310 E_fidyzd2(j, i, nsplit - j - i - 2) = Fce_id;
1311 }
1312 cnt += nsplit - j - 1;
1313 }
1314
1315
1316 fid = geom->GetFace(3)->GetGlobalID();
1317 fce_offset = 2 * fid * nsplit * nsplit;
1319 cnt = 0;
1320 for (int j = 0; j < nsplit; ++j)
1321 {
1322 for (int i = 0; i < nsplit - j; ++i)
1323 {
1324 int Fce_id = FceFwd ? fce_offset + cnt + i
1325 : fce_offset + cnt + nsplit - j - 1 - i;
1326 E_fidyz1(j, i, 0) = Fce_id;
1327
1328
1329
1330
1331 int oset = FceEdgOffset[Fce_id];
1332
1333 TriGeom *face =
m_linMesh->GetTriGeom(Fce_id);
1334
1335 if (FceFwd)
1336 {
1337 E_vid(j, i, 0) = face->GetVid(oset);
1338 E_vid(j, i + 1, 0) = face->GetVid((oset + 1) % 3);
1339
1340 E_eidz(j, i, 0) = face->GetEid((oset + 2) % 3);
1341 E_eidyz(j, i, 0) = face->GetEid((oset + 1) % 3);
1342 }
1343 else
1344 {
1345 E_vid(j, i, 0) = face->GetVid((oset + 1) % 3);
1346 E_vid(j, i + 1, 0) = face->GetVid(oset);
1347
1348 E_eidz(j, i, 0) = face->GetEid((oset + 1) % 3);
1349 E_eidyz(j, i, 0) = face->GetEid((oset + 2) % 3);
1350 }
1351 E_vid(j + 1, i, 0) = face->GetVid((oset + 2) % 3);
1352 E_eidy(j, i, 0) = face->GetEid(oset);
1353 }
1354 cnt += nsplit - j;
1355
1356 for (int i = 0; i < nsplit - j - 1; ++i)
1357 {
1358 int Fce_id = FceFwd ? fce_offset + cnt + i
1359 : fce_offset + cnt + nsplit - j - 2 - i;
1360 E_fidyz2(j, i, 0) = Fce_id;
1361 }
1362 cnt += nsplit - j - 1;
1363 }
1364
1366
1367 Array<OneD, NekDouble> tmp(Xmap->GetTotPoints());
1368
1369
1370 if (UseGLL)
1371 {
1372 Xmap->BwdTrans(geom->GetCoeffs(0), tmp);
1373 Xmap->PhysInterpToGLL(tmp, Xpts, nsplit + 1);
1374 Xmap->BwdTrans(geom->GetCoeffs(1), tmp);
1375 Xmap->PhysInterpToGLL(tmp, Ypts, nsplit + 1);
1376 Xmap->BwdTrans(geom->GetCoeffs(2), tmp);
1377 Xmap->PhysInterpToGLL(tmp, Zpts, nsplit + 1);
1378 }
1379 else
1380 {
1381 Xmap->BwdTrans(geom->GetCoeffs(0), tmp);
1382 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Xpts, nsplit + 1);
1383 Xmap->BwdTrans(geom->GetCoeffs(1), tmp);
1384 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Ypts, nsplit + 1);
1385 Xmap->BwdTrans(geom->GetCoeffs(2), tmp);
1386 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Zpts, nsplit + 1);
1387 }
1388
1389 cnt = (nsplit + 2) * (nsplit + 1) / 2;
1390 for (int k = 1; k < nsplit; ++k)
1391 {
1392 cnt += nsplit + 1 - k;
1393 for (int j = 1; j < nsplit - k; ++j)
1394 {
1395 cnt++;
1396 for (int i = 1; i < nsplit - k - j; ++i, cnt++)
1397 {
1398 int vid =
1399 maxvertid +
1400 elmtid * (nsplit - 1) * (nsplit - 1) * (nsplit - 1) +
1401 vcnt++;
1402
1403 E_vid(k, j, i) = vid;
1404
1408 Zpts[cnt]);
1409
1410 m_linMesh->AddGeom(vid, std::move(vert));
1411 }
1412 cnt++;
1413 }
1414 cnt++;
1415 }
1416
1417
1418 cnt = 0;
1419 for (int k = 0; k < nsplit; ++k)
1420 {
1421 for (int j = 0; j < nsplit - k; ++j)
1422 {
1423 for (int i = 0; i < nsplit - k - j; ++i)
1424 {
1425 if (i < nsplit - k - j - 2)
1426 {
1427
1428
1429 int edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1430 std::array<PointGeom *, 2> vert;
1431 vert[0] =
1432 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 1));
1433 vert[1] =
1434 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i + 1));
1438 m_linMesh->AddGeom(edgid, std::move(edge0));
1439 E_eidz(k, j + 1, i + 1) = edgid;
1440
1441
1442 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1443 vert[0] =
1444 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i));
1445 vert[1] =
1446 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i + 1));
1450 m_linMesh->AddGeom(edgid, std::move(edge1));
1451 E_eidx(k + 1, j + 1, i) = edgid;
1452
1453
1454 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1455 vert[0] =
1456 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 1));
1457 vert[1] =
1458 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i + 1));
1462 m_linMesh->AddGeom(edgid, std::move(edge2));
1463 E_eidy(k + 1, j, i + 1) = edgid;
1464
1465
1466 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1467 vert[0] =
1468 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 1));
1469 vert[1] =
1470 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 1));
1474 m_linMesh->AddGeom(edgid, std::move(edge3));
1475 E_eidyz(k, j, i + 1) = edgid;
1476
1477
1478 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1479 vert[0] =
1480 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 1));
1481 vert[1] =
1482 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i));
1486 m_linMesh->AddGeom(edgid, std::move(edge4));
1487 E_eidxz(k, j + 1, i) = edgid;
1488
1489
1490 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1491 vert[0] =
1492 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 1));
1493 vert[1] =
1494 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i));
1498 m_linMesh->AddGeom(edgid, std::move(edge5));
1499 E_eidxy(k + 1, j, i) = edgid;
1500
1501
1502
1503
1504 int newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
1505 std::array<SegGeom *, 3> edges;
1506 edges[0] =
m_linMesh->GetSegGeom(E_eidyz(k, j, i + 1));
1507 edges[1] =
m_linMesh->GetSegGeom(E_eidxz(k, j + 1, i));
1508 edges[2] =
m_linMesh->GetSegGeom(E_eidxy(k + 1, j, i));
1509
1514
1515 m_linMesh->AddGeom(newtriid, std::move(tri0));
1516 E_fidyzd2(k, j, i) = newtriid;
1517
1518
1519 newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
1520 edges[0] =
m_linMesh->GetSegGeom(E_eidyz(k, j, i + 1));
1521 edges[1] =
1522 m_linMesh->GetSegGeom(E_eidz(k, j + 1, i + 1));
1523 edges[2] =
1524 m_linMesh->GetSegGeom(E_eidy(k + 1, j, i + 1));
1525
1530 m_linMesh->AddGeom(newtriid, std::move(tri1));
1531 E_fidyz2(k, j, i + 1) = newtriid;
1532
1533
1534 newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
1535 edges[0] =
m_linMesh->GetSegGeom(E_eidxz(k, j + 1, i));
1536 edges[1] =
1537 m_linMesh->GetSegGeom(E_eidz(k, j + 1, i + 1));
1538 edges[2] =
1539 m_linMesh->GetSegGeom(E_eidx(k + 1, j + 1, i));
1540
1545 m_linMesh->AddGeom(newtriid, std::move(tri2));
1546 E_fidxz2(k, j + 1, i) = newtriid;
1547
1548
1549 newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
1550 edges[0] =
m_linMesh->GetSegGeom(E_eidxy(k + 1, j, i));
1551 edges[1] =
1552 m_linMesh->GetSegGeom(E_eidy(k + 1, j, i + 1));
1553 edges[2] =
1554 m_linMesh->GetSegGeom(E_eidx(k + 1, j + 1, i));
1555
1557
1561 m_linMesh->AddGeom(newtriid, std::move(tri3));
1562 E_fidxy2(k + 1, j, i) = newtriid;
1563
1564
1565 int newtetid =
1566 elmtid * nsplit * nsplit * nsplit + cnt++;
1567 std::array<TriGeom *, 4> faces;
1568 faces[0] =
1569 m_linMesh->GetTriGeom(E_fidyzd2(k, j, i));
1571 E_fidyz2(k, j, i + 1));
1573 E_fidxz2(k, j + 1, i));
1575 E_fidxy2(k + 1, j, i));
1577
1581 m_linMesh->AddGeom(newtetid, std::move(tet));
1584 }
1585
1586 if (i < nsplit - k - j - 1)
1587 {
1588
1589
1590 int edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1591
1592 std::array<PointGeom *, 2> vert;
1593 vert[0] =
m_linMesh->GetPointGeom(E_vid(k, j + 1, i));
1594 vert[1] =
1595 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 1));
1596
1600 vert);
1601 m_linMesh->AddGeom(edgid, std::move(edge));
1602
1603
1604
1605
1606 int newtriid0 =
1607 elmtid * faceoffset + maxfaceid + fcnt++;
1608
1609 std::array<SegGeom *, 3> edges;
1610 edges[0] =
m_linMesh->GetSegGeom(E_eidxy(k, j, i));
1611 edges[1] =
m_linMesh->GetSegGeom(E_eidyz(k, j, i));
1612 edges[2] =
m_linMesh->GetSegGeom(E_eidxz(k, j, i));
1613
1618 m_linMesh->AddGeom(newtriid0, std::move(tri0));
1619 E_fidyzd1(k, j, i) = newtriid0;
1620
1621
1622
1623 int newtriid1 =
1624 elmtid * faceoffset + maxfaceid + fcnt++;
1625 edges[0] =
m_linMesh->GetSegGeom(E_eidyz(k, j, i));
1626 edges[1] =
m_linMesh->GetSegGeom(edgid);
1627 edges[2] =
m_linMesh->GetSegGeom(E_eidx(k + 1, j, i));
1628
1633 m_linMesh->AddGeom(newtriid1, std::move(tri1));
1634
1635
1636 int newtriid2 =
1637 elmtid * faceoffset + maxfaceid + fcnt++;
1638 edges[0] =
m_linMesh->GetSegGeom(E_eidx(k, j + 1, i));
1639 edges[1] =
m_linMesh->GetSegGeom(edgid);
1640 edges[2] =
m_linMesh->GetSegGeom(E_eidyz(k, j, i + 1));
1641
1646 m_linMesh->AddGeom(newtriid2, std::move(tri2));
1647
1648
1649 int newtriid3 =
1650 elmtid * faceoffset + maxfaceid + fcnt++;
1651 edges[0] =
m_linMesh->GetSegGeom(E_eidxy(k, j, i));
1652 edges[1] =
m_linMesh->GetSegGeom(edgid);
1653 edges[2] =
m_linMesh->GetSegGeom(E_eidz(k, j, i + 1));
1654
1659 m_linMesh->AddGeom(newtriid3, std::move(tri3));
1660
1661
1662 int newtriid4 =
1663 elmtid * faceoffset + maxfaceid + fcnt++;
1664 edges[0] =
m_linMesh->GetSegGeom(edgid);
1665 edges[1] =
m_linMesh->GetSegGeom(E_eidxy(k + 1, j, i));
1666 edges[2] =
m_linMesh->GetSegGeom(E_eidz(k, j + 1, i));
1667
1672 m_linMesh->AddGeom(newtriid4, std::move(tri4));
1673
1674
1675 int newtriid5 =
1676 elmtid * faceoffset + maxfaceid + fcnt++;
1677 edges[0] =
m_linMesh->GetSegGeom(E_eidx(k, j + 1, i));
1678 edges[1] =
m_linMesh->GetSegGeom(E_eidxz(k, j + 1, i));
1679 edges[2] =
m_linMesh->GetSegGeom(E_eidz(k, j + 1, i));
1680
1685 m_linMesh->AddGeom(newtriid5, std::move(tri5));
1686 E_fidxz1(k, j + 1, i) = newtriid5;
1687
1688
1689 int newtriid6 =
1690 elmtid * faceoffset + maxfaceid + fcnt++;
1691 edges[0] =
m_linMesh->GetSegGeom(E_eidy(k, j, i + 1));
1692 edges[1] =
m_linMesh->GetSegGeom(E_eidyz(k, j, i + 1));
1693 edges[2] =
m_linMesh->GetSegGeom(E_eidz(k, j, i + 1));
1694
1699 m_linMesh->AddGeom(newtriid6, std::move(tri6));
1700 E_fidyz1(k, j, i + 1) = newtriid6;
1701
1702
1703 int newtriid7 =
1704 elmtid * faceoffset + maxfaceid + fcnt++;
1705 edges[0] =
m_linMesh->GetSegGeom(E_eidx(k + 1, j, i));
1706 edges[1] =
m_linMesh->GetSegGeom(E_eidy(k + 1, j, i));
1707 edges[2] =
m_linMesh->GetSegGeom(E_eidxy(k + 1, j, i));
1708
1713 m_linMesh->AddGeom(newtriid7, std::move(tri7));
1714 E_fidxy1(k + 1, j, i) = newtriid7;
1715
1716
1717
1718 int newtetid =
1719 elmtid * nsplit * nsplit * nsplit + cnt++;
1720 std::array<TriGeom *, 4> faces;
1721 faces[0] =
m_linMesh->GetTriGeom(E_fidyzd1(k, j, i));
1722 faces[1] =
m_linMesh->GetTriGeom(newtriid3);
1723 faces[2] =
m_linMesh->GetTriGeom(newtriid1);
1724 faces[3] =
m_linMesh->GetTriGeom(E_fidxz2(k, j, i));
1725
1730 m_linMesh->AddGeom(newtetid, std::move(tet0));
1733
1734
1735 newtetid = elmtid * nsplit * nsplit * nsplit + cnt++;
1736 faces[0] =
m_linMesh->GetTriGeom(newtriid1);
1737 faces[1] =
m_linMesh->GetTriGeom(E_fidyz2(k, j, i));
1738 faces[2] =
m_linMesh->GetTriGeom(E_fidxy1(k + 1, j, i));
1739 faces[3] =
m_linMesh->GetTriGeom(newtriid4);
1741
1745 m_linMesh->AddGeom(newtetid, std::move(tet1));
1748
1749
1750 newtetid = elmtid * nsplit * nsplit * nsplit + cnt++;
1751 faces[0] =
m_linMesh->GetTriGeom(E_fidxy2(k, j, i));
1752 faces[1] =
m_linMesh->GetTriGeom(newtriid3);
1753 faces[2] =
m_linMesh->GetTriGeom(E_fidyz1(k, j, i + 1));
1754 faces[3] =
m_linMesh->GetTriGeom(newtriid2);
1756
1760 m_linMesh->AddGeom(newtetid, std::move(tet2));
1763
1764
1765 newtetid = elmtid * nsplit * nsplit * nsplit + cnt++;
1766 faces[0] =
m_linMesh->GetTriGeom(newtriid2);
1767 faces[1] =
m_linMesh->GetTriGeom(E_fidxz1(k, j + 1, i));
1768 faces[2] =
m_linMesh->GetTriGeom(newtriid4);
1769 faces[3] =
m_linMesh->GetTriGeom(E_fidyzd2(k, j, i));
1771
1775 m_linMesh->AddGeom(newtetid, std::move(tet3));
1778 }
1779
1780
1781 int newtetid = elmtid * nsplit * nsplit * nsplit + cnt++;
1782
1783 std::array<TriGeom *, 4> faces;
1784 faces[0] =
m_linMesh->GetTriGeom(E_fidxy1(k, j, i));
1785 faces[1] =
m_linMesh->GetTriGeom(E_fidxz1(k, j, i));
1786 faces[2] =
m_linMesh->GetTriGeom(E_fidyzd1(k, j, i));
1787 faces[3] =
m_linMesh->GetTriGeom(E_fidyz1(k, j, i));
1789
1791 SpatialDomains::TetGeom>::AllocateUniquePtr(newtetid,
1792 faces);
1793 m_linMesh->AddGeom(newtetid, std::move(tet));
1796 }
1797 }
1798 }
1799 ASSERTL1(ecnt <= edgeoffset,
"This should not happen, "
1800 "edgeoffset might need to be increased");
1801 ASSERTL1(fcnt <= faceoffset,
"This should not happen, "
1802 "faceoffset might need to be increased");
1803
1804
1805 cnt = 0;
1806 for (int k = 0; k < nsplit + 1; ++k)
1807 {
1808 for (int j = 0; j < nsplit + 1 - k; ++j)
1809 {
1810 for (int i = 0; i < nsplit + 1 - j - k; ++i)
1811 {
1812 CoeffMap[elmtid][E_vid(k, j, i)] = cnt++;
1813 }
1814 }
1815 }
1816 }
1817}
void TetShuffleFaces(std::array< TriGeom *, 4 > &faces)
unique_ptr_objpool< TetGeom > TetGeomUniquePtr