564 int nsplit, std::map<int, int> &FceEdgOffset,
565 std::map<
int, std::map<int, int>> &CoeffMap,
int voffset,
bool UseGLL,
596 int edgeoffset = nsplit * (3 * nsplit - 2);
607 Xmap->BwdTrans(geom->GetCoeffs(0), tmp);
608 Xmap->PhysInterpToGLL(tmp, Xpts, nsplit + 1);
609 Xmap->BwdTrans(geom->GetCoeffs(1), tmp);
610 Xmap->PhysInterpToGLL(tmp, Ypts, nsplit + 1);
614 Xmap->BwdTrans(geom->GetCoeffs(2), tmp);
615 Xmap->PhysInterpToGLL(tmp, Zpts, nsplit + 1);
621 Xmap->BwdTrans(geom->GetCoeffs(0), tmp);
622 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Xpts, nsplit + 1);
623 Xmap->BwdTrans(geom->GetCoeffs(1), tmp);
624 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Ypts, nsplit + 1);
627 Xmap->BwdTrans(geom->GetCoeffs(2), tmp);
628 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Zpts, nsplit + 1);
632 int triid = geom->GetGlobalID();
634 int edgeid0 = geom->GetEdge(0)->GetGlobalID();
635 int edgeid1 = geom->GetEdge(1)->GetGlobalID();
636 int edgeid2 = geom->GetEdge(2)->GetGlobalID();
644 for (
int i = 1; i < nsplit; ++i)
647 fwd0 ? maxvertid + edgeid0 * (nsplit - 1) + i - 1
648 : maxvertid + edgeid0 * (nsplit - 1) + nsplit - i - 1;
649 vids[i][nsplit - i] =
650 fwd1 ? maxvertid + edgeid1 * (nsplit - 1) + i - 1
651 : maxvertid + edgeid1 * (nsplit - 1) + nsplit - i - 1;
653 fwd2 ? maxvertid + edgeid2 * (nsplit - 1) + i - 1
654 : maxvertid + edgeid2 * (nsplit - 1) + nsplit - i - 1;
659 fwd0 ?
m_graph->GetSegGeom(edgeid0)->GetVertex(0)->GetGlobalID()
660 :
m_graph->GetSegGeom(edgeid0)->GetVertex(1)->GetGlobalID();
662 fwd0 ?
m_graph->GetSegGeom(edgeid0)->GetVertex(1)->GetGlobalID()
663 :
m_graph->GetSegGeom(edgeid0)->GetVertex(0)->GetGlobalID();
665 fwd2 ?
m_graph->GetSegGeom(edgeid2)->GetVertex(1)->GetGlobalID()
666 :
m_graph->GetSegGeom(edgeid2)->GetVertex(0)->GetGlobalID();
669 for (
int i = 0; i < nsplit; ++i)
672 fwd0 ? edgeid0 * nsplit + i : edgeid0 * nsplit + nsplit - i - 1;
674 fwd2 ? edgeid2 * nsplit + i : edgeid2 * nsplit + nsplit - i - 1;
675 eids_d[i][nsplit - i] =
676 fwd1 ? edgeid1 * nsplit + i : edgeid1 * nsplit + nsplit - i - 1;
680 int cnt = nsplit + 1;
682 for (
int j = 1; j < nsplit; ++j)
684 for (
int i = 1; i < nsplit - j; ++i)
686 vid = triid * (nsplit - 1) * (nsplit - 1) +
687 (j - 1) * (nsplit - 1) + (i - 1);
690 vid += maxvertid + maxedgeid * (nsplit - 1) / nsplit;
698 m_linMesh->AddGeom(vid, std::move(vert));
700 cnt += nsplit + 1 - j;
703 AddSplitTri(nsplit, vids, eids_h, eids_v, eids_d, maxedgeid, edgeoffset,
704 triid, FceEdgOffset, CoeffMap);
720 Xmap->BwdTrans(quadgeom->GetCoeffs(0), tmp);
721 Xmap->PhysInterpToGLL(tmp, Xpts, nsplit + 1);
722 Xmap->BwdTrans(quadgeom->GetCoeffs(1), tmp);
723 Xmap->PhysInterpToGLL(tmp, Ypts, nsplit + 1);
727 Xmap->BwdTrans(quadgeom->GetCoeffs(2), tmp);
728 Xmap->PhysInterpToGLL(tmp, Zpts, nsplit + 1);
734 Xmap->BwdTrans(quadgeom->GetCoeffs(0), tmp);
735 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Xpts, nsplit + 1);
736 Xmap->BwdTrans(quadgeom->GetCoeffs(1), tmp);
737 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Ypts, nsplit + 1);
741 Xmap->BwdTrans(quadgeom->GetCoeffs(2), tmp);
742 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Zpts, nsplit + 1);
746 int quadid = quadgeom->GetGlobalID();
748 int edgeid0 = quadgeom->GetEdge(0)->GetGlobalID();
749 int edgeid1 = quadgeom->GetEdge(1)->GetGlobalID();
750 int edgeid2 = quadgeom->GetEdge(2)->GetGlobalID();
751 int edgeid3 = quadgeom->GetEdge(3)->GetGlobalID();
760 for (
int i = 1; i < nsplit; ++i)
763 fwd0 ? maxvertid + edgeid0 * (nsplit - 1) + i - 1
764 : maxvertid + edgeid0 * (nsplit - 1) + nsplit - i - 1;
766 fwd1 ? maxvertid + edgeid1 * (nsplit - 1) + i - 1
767 : maxvertid + edgeid1 * (nsplit - 1) + nsplit - i - 1;
772 fwd2 ? maxvertid + edgeid2 * (nsplit - 1) + i - 1
773 : maxvertid + edgeid2 * (nsplit - 1) + nsplit - i - 1;
775 fwd3 ? maxvertid + edgeid3 * (nsplit - 1) + i - 1
776 : maxvertid + edgeid3 * (nsplit - 1) + nsplit - i - 1;
781 fwd0 ?
m_graph->GetSegGeom(edgeid0)->GetVertex(0)->GetGlobalID()
782 :
m_graph->GetSegGeom(edgeid0)->GetVertex(1)->GetGlobalID();
784 fwd0 ?
m_graph->GetSegGeom(edgeid0)->GetVertex(1)->GetGlobalID()
785 :
m_graph->GetSegGeom(edgeid0)->GetVertex(0)->GetGlobalID();
787 fwd2 ?
m_graph->GetSegGeom(edgeid2)->GetVertex(0)->GetGlobalID()
788 :
m_graph->GetSegGeom(edgeid2)->GetVertex(1)->GetGlobalID();
789 vids[nsplit][nsplit] =
790 fwd2 ?
m_graph->GetSegGeom(edgeid2)->GetVertex(1)->GetGlobalID()
791 :
m_graph->GetSegGeom(edgeid2)->GetVertex(0)->GetGlobalID();
794 for (
int i = 0; i < nsplit; ++i)
797 fwd0 ? edgeid0 * nsplit + i : edgeid0 * nsplit + nsplit - i - 1;
799 fwd2 ? edgeid2 * nsplit + i : edgeid2 * nsplit + nsplit - i - 1;
801 fwd1 ? edgeid1 * nsplit + i : edgeid1 * nsplit + nsplit - i - 1;
803 fwd3 ? edgeid3 * nsplit + i : edgeid3 * nsplit + nsplit - i - 1;
808 for (
int j = 1; j < nsplit; ++j)
810 for (
int i = 1; i < nsplit; ++i)
812 vid = quadid * (nsplit - 1) * (nsplit - 1) +
813 (j - 1) * (nsplit - 1) + (i - 1);
817 vid += maxvertid + maxedgeid * (nsplit - 1) / nsplit;
824 Ypts[j * (nsplit + 1) + i], Zpts[j * (nsplit + 1) + i]);
825 m_linMesh->AddGeom(vid, std::move(vert));
832 for (
int j = 1; j < nsplit; ++j)
834 for (
int i = 0; i < nsplit; ++i)
836 int edgid = maxedgeid + quadid * edgeoffset + cnt++;
838 eids_h[j][i] = edgid;
840 std::array<PointGeom *, 2> vert;
841 vert[0] =
m_linMesh->GetPointGeom(vids[j][i]);
842 vert[1] =
m_linMesh->GetPointGeom(vids[j][i + 1]);
848 m_linMesh->AddGeom(edgid, std::move(edge));
854 for (
int j = 0; j < nsplit; ++j)
856 for (
int i = 1; i < nsplit; ++i)
858 int edgid = maxedgeid + quadid * edgeoffset + cnt++;
860 eids_v[j][i] = edgid;
862 std::array<PointGeom *, 2> vert;
863 vert[0] =
m_linMesh->GetPointGeom(vids[j][i]);
864 vert[1] =
m_linMesh->GetPointGeom(vids[j + 1][i]);
869 m_linMesh->AddGeom(edgid, std::move(edge));
876 for (
int j = 0; j < nsplit; ++j)
878 for (
int i = 0; i < nsplit; ++i)
880 int edgid = maxedgeid + quadid * edgeoffset + cnt++;
882 eids_d[j][i] = edgid;
884 std::array<PointGeom *, 2> vert;
885 vert[0] =
m_linMesh->GetPointGeom(vids[j][i + 1]);
886 vert[1] =
m_linMesh->GetPointGeom(vids[j + 1][i]);
890 m_linMesh->AddGeom(edgid, std::move(edge_d));
895 for (
int j = 0; j < nsplit; ++j)
897 for (
int i = 0; i < nsplit; ++i)
900 2 * (quadid * nsplit * nsplit + j * nsplit + i);
902 std::array<SegGeom *, 3> edges;
903 edges[0] =
m_linMesh->GetSegGeom(eids_h[j][i]);
904 edges[1] =
m_linMesh->GetSegGeom(eids_d[j][i]);
905 edges[2] =
m_linMesh->GetSegGeom(eids_v[j][i]);
909 m_linMesh->AddGeom(newtriid, std::move(tri));
912 2 * (quadid * nsplit * nsplit + j * nsplit + i) + 1;
914 edges[0] =
m_linMesh->GetSegGeom(eids_h[j + 1][i]);
915 edges[1] =
m_linMesh->GetSegGeom(eids_d[j][i]);
916 edges[2] =
m_linMesh->GetSegGeom(eids_v[j][i + 1]);
922 m_linMesh->AddGeom(newtriid, std::move(tri1));
929 for (
int j = 0; j < nsplit; ++j)
931 for (
int i = 0; i < nsplit; ++i)
934 2 * quadid * nsplit * nsplit + j * nsplit + i;
936 std::array<SegGeom *, 4> edges;
937 edges[0] =
m_linMesh->GetSegGeom(eids_h[j][i]);
938 edges[2] =
m_linMesh->GetSegGeom(eids_h[j + 1][i]);
939 edges[1] =
m_linMesh->GetSegGeom(eids_v[j][i + 1]);
940 edges[3] =
m_linMesh->GetSegGeom(eids_v[j][i]);
945 m_linMesh->AddGeom(newquadid, std::move(quad));
1065 int nsplit, std::map<int, int> &FceEdgOffset,
1066 std::map<
int, std::map<int, int>> &CoeffMap,
bool UseGLL)
1069 Array3D<int> E_vid(nsplit + 1, nsplit + 1, nsplit + 1);
1071 Array3D<int> E_eidx(nsplit + 1, nsplit + 1, nsplit + 1);
1073 Array3D<int> E_eidy(nsplit + 1, nsplit + 1, nsplit + 1);
1075 Array3D<int> E_eidz(nsplit + 1, nsplit + 1, nsplit + 1);
1078 Array3D<int> E_eidxy(nsplit + 1, nsplit + 1, nsplit + 1);
1080 Array3D<int> E_eidyz(nsplit + 1, nsplit + 1, nsplit + 1);
1082 Array3D<int> E_eidxz(nsplit + 1, nsplit + 1, nsplit + 1);
1085 Array3D<int> E_fidxy1(nsplit + 1, nsplit + 1, nsplit + 1);
1087 Array3D<int> E_fidxy2(nsplit + 1, nsplit + 1, nsplit + 1);
1090 Array3D<int> E_fidxz1(nsplit + 1, nsplit + 1, nsplit + 1);
1092 Array3D<int> E_fidxz2(nsplit + 1, nsplit + 1, nsplit + 1);
1095 Array3D<int> E_fidyz1(nsplit + 1, nsplit + 1, nsplit + 1);
1097 Array3D<int> E_fidyz2(nsplit + 1, nsplit + 1, nsplit + 1);
1100 Array3D<int> E_fidyzd1(nsplit + 1, nsplit + 1, nsplit + 1);
1102 Array3D<int> E_fidyzd2(nsplit + 1, nsplit + 1, nsplit + 1);
1104 int maxvertid, maxedgeid;
1122 maxfaceid = std::max(
1127 maxfaceid = std::max(
1136 int edgeoffset = 3 * nsplit * (nsplit - 1) * (nsplit - 1);
1137 int faceoffset = 3 * nsplit * nsplit * (nsplit - 1);
1148 int elmtid = geom->GetGlobalID();
1151 int fid = geom->GetFace(0)->GetGlobalID();
1152 int fce_offset = 2 * fid * nsplit * nsplit;
1157 for (
int j = 0; j < nsplit; ++j)
1159 for (
int i = 0; i < nsplit - j; ++i)
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;
1168 int oset = FceEdgOffset[Fce_id];
1174 E_vid(0, j, i) = face->
GetVid(oset);
1175 E_vid(0, j, i + 1) = face->
GetVid((oset + 1) % 3);
1177 E_eidy(0, j, i) = face->
GetEid((oset + 2) % 3);
1178 E_eidxy(0, j, i) = face->
GetEid((oset + 1) % 3);
1182 E_vid(0, j, i) = face->
GetVid((oset + 1) % 3);
1183 E_vid(0, j, i + 1) = face->
GetVid(oset);
1185 E_eidy(0, j, i) = face->
GetEid((oset + 1) % 3);
1186 E_eidxy(0, j, i) = face->
GetEid((oset + 2) % 3);
1188 E_vid(0, j + 1, i) = face->
GetVid((oset + 2) % 3);
1189 E_eidx(0, j, i) = face->
GetEid(oset);
1193 for (
int i = 0; i < nsplit - j - 1; ++i)
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;
1199 cnt += nsplit - j - 1;
1203 fid = geom->GetFace(1)->GetGlobalID();
1204 fce_offset = 2 * fid * nsplit * nsplit;
1207 for (
int j = 0; j < nsplit; ++j)
1209 for (
int i = 0; i < nsplit - j; ++i)
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;
1218 int oset = FceEdgOffset[Fce_id];
1224 E_vid(j, 0, i) = face->
GetVid(oset);
1225 E_vid(j, 0, i + 1) = face->
GetVid((oset + 1) % 3);
1227 E_eidz(j, 0, i) = face->
GetEid((oset + 2) % 3);
1228 E_eidxz(j, 0, i) = face->
GetEid((oset + 1) % 3);
1232 E_vid(j, 0, i) = face->
GetVid((oset + 1) % 3);
1233 E_vid(j, 0, i + 1) = face->
GetVid(oset);
1235 E_eidz(j, 0, i) = face->
GetEid((oset + 1) % 3);
1236 E_eidxz(j, 0, i) = face->
GetEid((oset + 2) % 3);
1238 E_vid(j + 1, 0, i) = face->
GetVid((oset + 2) % 3);
1239 E_eidx(j, 0, i) = face->
GetEid(oset);
1243 for (
int i = 0; i < nsplit - j - 1; ++i)
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;
1249 cnt += nsplit - j - 1;
1253 fid = geom->GetFace(2)->GetGlobalID();
1254 fce_offset = 2 * fid * nsplit * nsplit;
1258 for (
int j = 0; j < nsplit; ++j)
1260 for (
int i = 0; i < nsplit - j; ++i)
1262 int Fce_id = FceFwd ? fce_offset + cnt + i
1263 : fce_offset + cnt + nsplit - j - 1 - i;
1265 E_fidyzd1(j, i, nsplit - j - i - 1) = Fce_id;
1270 int oset = FceEdgOffset[Fce_id];
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);
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);
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);
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);
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);
1306 for (
int i = 0; i < nsplit - j - 1; ++i)
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;
1312 cnt += nsplit - j - 1;
1316 fid = geom->GetFace(3)->GetGlobalID();
1317 fce_offset = 2 * fid * nsplit * nsplit;
1320 for (
int j = 0; j < nsplit; ++j)
1322 for (
int i = 0; i < nsplit - j; ++i)
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;
1331 int oset = FceEdgOffset[Fce_id];
1337 E_vid(j, i, 0) = face->
GetVid(oset);
1338 E_vid(j, i + 1, 0) = face->
GetVid((oset + 1) % 3);
1340 E_eidz(j, i, 0) = face->
GetEid((oset + 2) % 3);
1341 E_eidyz(j, i, 0) = face->
GetEid((oset + 1) % 3);
1345 E_vid(j, i, 0) = face->
GetVid((oset + 1) % 3);
1346 E_vid(j, i + 1, 0) = face->
GetVid(oset);
1348 E_eidz(j, i, 0) = face->
GetEid((oset + 1) % 3);
1349 E_eidyz(j, i, 0) = face->
GetEid((oset + 2) % 3);
1351 E_vid(j + 1, i, 0) = face->
GetVid((oset + 2) % 3);
1352 E_eidy(j, i, 0) = face->
GetEid(oset);
1356 for (
int i = 0; i < nsplit - j - 1; ++i)
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;
1362 cnt += nsplit - j - 1;
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);
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);
1389 cnt = (nsplit + 2) * (nsplit + 1) / 2;
1390 for (
int k = 1; k < nsplit; ++k)
1392 cnt += nsplit + 1 - k;
1393 for (
int j = 1; j < nsplit - k; ++j)
1396 for (
int i = 1; i < nsplit - k - j; ++i, cnt++)
1400 elmtid * (nsplit - 1) * (nsplit - 1) * (nsplit - 1) +
1403 E_vid(k, j, i) = vid;
1410 m_linMesh->AddGeom(vid, std::move(vert));
1419 for (
int k = 0; k < nsplit; ++k)
1421 for (
int j = 0; j < nsplit - k; ++j)
1423 for (
int i = 0; i < nsplit - k - j; ++i)
1425 if (i < nsplit - k - j - 2)
1429 int edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1430 std::array<PointGeom *, 2> vert;
1432 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 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;
1442 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1444 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i));
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;
1454 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1456 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 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;
1466 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1468 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 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;
1478 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1480 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 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;
1490 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1492 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 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;
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));
1515 m_linMesh->AddGeom(newtriid, std::move(tri0));
1516 E_fidyzd2(k, j, i) = newtriid;
1519 newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
1520 edges[0] =
m_linMesh->GetSegGeom(E_eidyz(k, j, i + 1));
1522 m_linMesh->GetSegGeom(E_eidz(k, j + 1, i + 1));
1524 m_linMesh->GetSegGeom(E_eidy(k + 1, j, i + 1));
1530 m_linMesh->AddGeom(newtriid, std::move(tri1));
1531 E_fidyz2(k, j, i + 1) = newtriid;
1534 newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
1535 edges[0] =
m_linMesh->GetSegGeom(E_eidxz(k, j + 1, i));
1537 m_linMesh->GetSegGeom(E_eidz(k, j + 1, i + 1));
1539 m_linMesh->GetSegGeom(E_eidx(k + 1, j + 1, i));
1545 m_linMesh->AddGeom(newtriid, std::move(tri2));
1546 E_fidxz2(k, j + 1, i) = newtriid;
1549 newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
1550 edges[0] =
m_linMesh->GetSegGeom(E_eidxy(k + 1, j, i));
1552 m_linMesh->GetSegGeom(E_eidy(k + 1, j, i + 1));
1554 m_linMesh->GetSegGeom(E_eidx(k + 1, j + 1, i));
1561 m_linMesh->AddGeom(newtriid, std::move(tri3));
1562 E_fidxy2(k + 1, j, i) = newtriid;
1566 elmtid * nsplit * nsplit * nsplit + cnt++;
1567 std::array<TriGeom *, 4> faces;
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));
1581 m_linMesh->AddGeom(newtetid, std::move(tet));
1586 if (i < nsplit - k - j - 1)
1590 int edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
1592 std::array<PointGeom *, 2> vert;
1593 vert[0] =
m_linMesh->GetPointGeom(E_vid(k, j + 1, i));
1595 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 1));
1601 m_linMesh->AddGeom(edgid, std::move(edge));
1607 elmtid * faceoffset + maxfaceid + fcnt++;
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));
1618 m_linMesh->AddGeom(newtriid0, std::move(tri0));
1619 E_fidyzd1(k, j, i) = newtriid0;
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));
1633 m_linMesh->AddGeom(newtriid1, std::move(tri1));
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));
1646 m_linMesh->AddGeom(newtriid2, std::move(tri2));
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));
1659 m_linMesh->AddGeom(newtriid3, std::move(tri3));
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));
1672 m_linMesh->AddGeom(newtriid4, std::move(tri4));
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));
1685 m_linMesh->AddGeom(newtriid5, std::move(tri5));
1686 E_fidxz1(k, j + 1, i) = newtriid5;
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));
1699 m_linMesh->AddGeom(newtriid6, std::move(tri6));
1700 E_fidyz1(k, j, i + 1) = newtriid6;
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));
1713 m_linMesh->AddGeom(newtriid7, std::move(tri7));
1714 E_fidxy1(k + 1, j, i) = newtriid7;
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));
1730 m_linMesh->AddGeom(newtetid, std::move(tet0));
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);
1745 m_linMesh->AddGeom(newtetid, std::move(tet1));
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);
1760 m_linMesh->AddGeom(newtetid, std::move(tet2));
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));
1775 m_linMesh->AddGeom(newtetid, std::move(tet3));
1781 int newtetid = elmtid * nsplit * nsplit * nsplit + cnt++;
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));
1793 m_linMesh->AddGeom(newtetid, std::move(tet));
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");
1806 for (
int k = 0; k < nsplit + 1; ++k)
1808 for (
int j = 0; j < nsplit + 1 - k; ++j)
1810 for (
int i = 0; i < nsplit + 1 - j - k; ++i)
1812 CoeffMap[elmtid][E_vid(k, j, i)] = cnt++;
1820 int nsplit, std::map<int, int> &FceEdgOffset,
1821 std::map<
int, std::map<int, int>> &CoeffMap,
bool UseGLL)
1824 Array3D<int> E_vid(nsplit + 1, nsplit + 1, nsplit + 1);
1827 Array3D<int> E_eidx(nsplit + 1, nsplit + 1, nsplit + 1);
1829 Array3D<int> E_eidy(nsplit + 1, nsplit + 1, nsplit + 1);
1831 Array3D<int> E_eidz(nsplit + 1, nsplit + 1, nsplit + 1);
1834 Array3D<int> E_eidxz(nsplit + 1, nsplit + 1, nsplit + 1);
1837 Array3D<int> E_fidxy(nsplit + 1, nsplit + 1, nsplit + 1);
1839 Array3D<int> E_fidxz1(nsplit + 1, nsplit + 1, nsplit + 1);
1841 Array3D<int> E_fidxz2(nsplit + 1, nsplit + 1, nsplit + 1);
1843 Array3D<int> E_fidyz(nsplit + 1, nsplit + 1, nsplit + 1);
1846 Array3D<int> E_fidyzd(nsplit + 1, nsplit + 1, nsplit + 1);
1848 int maxvertid, maxedgeid;
1865 maxfaceid = std::max(
1870 maxfaceid = std::max(
1877 std::map<StdRegions::Orientation, std::array<int, 4>> vertMap{
1888 std::map<StdRegions::Orientation, std::array<int, 4>> edgMap{
1902 int edgeoffset = 3 * nsplit * (nsplit - 1) * (nsplit - 1);
1903 int faceoffset = 3 * nsplit * nsplit * (nsplit - 1);
1914 int elmtid = geom->GetGlobalID();
1919 int fid = geom->GetFace(0)->GetGlobalID();
1920 int fce_offset = 2 * fid * nsplit * nsplit;
1925 Xmap->ReOrientTracePhysMap(orient, idmap, nsplit, nsplit,
false);
1928 for (
int j = 0; j < nsplit; ++j)
1930 for (
int i = 0; i < nsplit; ++i)
1932 int Fce_id = fce_offset + idmap[i + j * nsplit];
1934 E_fidxy(0, j, i) = Fce_id;
1939 E_vid(0, j, i) = face->
GetVid(vertMap[orient][0]);
1940 E_vid(0, j, i + 1) = face->
GetVid(vertMap[orient][1]);
1941 E_vid(0, j + 1, i) = face->
GetVid(vertMap[orient][3]);
1942 E_vid(0, j + 1, i + 1) = face->
GetVid(vertMap[orient][2]);
1944 E_eidx(0, j, i) = face->
GetEid(edgMap[orient][0]);
1945 E_eidx(0, j + 1, i) = face->
GetEid(edgMap[orient][2]);
1946 E_eidy(0, j, i) = face->
GetEid(edgMap[orient][3]);
1947 E_eidy(0, j, i + 1) = face->
GetEid(edgMap[orient][1]);
1952 fid = geom->GetFace(1)->GetGlobalID();
1953 fce_offset = 2 * fid * nsplit * nsplit;
1957 for (
int j = 0; j < nsplit; ++j)
1959 for (
int i = 0; i < nsplit - j; ++i)
1961 int Fce_id = FceFwd ? fce_offset + cnt + i
1962 : fce_offset + cnt + nsplit - j - 1 - i;
1964 E_fidxz1(j, 0, i) = Fce_id;
1970 int oset = FceEdgOffset[Fce_id];
1976 E_vid(j, 0, i) = face->
GetVid(oset);
1977 E_vid(j, 0, i + 1) = face->
GetVid((oset + 1) % 3);
1979 E_eidz(j, 0, i) = face->
GetEid((oset + 2) % 3);
1980 E_eidxz(j, 0, i) = face->
GetEid((oset + 1) % 3);
1984 E_vid(j, 0, i) = face->
GetVid((oset + 1) % 3);
1985 E_vid(j, 0, i + 1) = face->
GetVid(oset);
1987 E_eidz(j, 0, i) = face->
GetEid((oset + 1) % 3);
1988 E_eidxz(j, 0, i) = face->
GetEid((oset + 2) % 3);
1990 E_vid(j + 1, 0, i) = face->
GetVid((oset + 2) % 3);
1991 E_eidx(j, 0, i) = face->
GetEid(oset);
1995 for (
int i = 0; i < nsplit - j - 1; ++i)
1997 int Fce_id = FceFwd ? fce_offset + cnt + i
1998 : fce_offset + cnt + nsplit - j - 2 - i;
1999 E_fidxz2(j, 0, i) = Fce_id;
2001 cnt += nsplit - j - 1;
2005 fid = geom->GetFace(2)->GetGlobalID();
2006 fce_offset = 2 * fid * nsplit * nsplit;
2007 orient = geom->GetForient(2);
2010 Xmap->ReOrientTracePhysMap(orient, idmap, nsplit, nsplit,
false);
2013 for (
int j = 0; j < nsplit; ++j)
2015 for (
int i = 0; i < nsplit; ++i)
2017 int Fce_id = fce_offset + idmap[i + j * nsplit];
2019 E_fidyzd(j, i, nsplit - 1 - j) = Fce_id;
2024 E_vid(j, i, nsplit - j) = face->
GetVid(vertMap[orient][0]);
2025 E_vid(j, i + 1, nsplit - j) = face->
GetVid(vertMap[orient][1]);
2026 E_vid(j + 1, i, nsplit - 1 - j) =
2027 face->
GetVid(vertMap[orient][3]);
2028 E_vid(j + 1, i + 1, nsplit - 1 - j) =
2029 face->
GetVid(vertMap[orient][2]);
2031 E_eidy(j, i, nsplit - j) = face->
GetEid(edgMap[orient][0]);
2032 E_eidy(j + 1, i, nsplit - 1 - j) =
2033 face->
GetEid(edgMap[orient][2]);
2034 E_eidxz(j, i, nsplit - 1 - j) = face->
GetEid(edgMap[orient][3]);
2035 E_eidxz(j, i + 1, nsplit - 1 - j) =
2036 face->
GetEid(edgMap[orient][1]);
2040 fid = geom->GetFace(3)->GetGlobalID();
2041 fce_offset = 2 * fid * nsplit * nsplit;
2044 for (
int j = 0; j < nsplit; ++j)
2046 for (
int i = 0; i < nsplit - j; ++i)
2048 int Fce_id = FceFwd ? fce_offset + cnt + i
2049 : fce_offset + cnt + nsplit - j - 1 - i;
2051 E_fidxz1(j, nsplit, i) = Fce_id;
2057 int oset = FceEdgOffset[Fce_id];
2063 E_vid(j, nsplit, i) = face->
GetVid(oset);
2064 E_vid(j, nsplit, i + 1) = face->
GetVid((oset + 1) % 3);
2066 E_eidz(j, nsplit, i) = face->
GetEid((oset + 2) % 3);
2067 E_eidxz(j, nsplit, i) = face->
GetEid((oset + 1) % 3);
2071 E_vid(j, nsplit, i) = face->
GetVid((oset + 1) % 3);
2072 E_vid(j, nsplit, i + 1) = face->
GetVid(oset);
2074 E_eidz(j, nsplit, i) = face->
GetEid((oset + 1) % 3);
2075 E_eidxz(j, nsplit, i) = face->
GetEid((oset + 2) % 3);
2077 E_vid(j + 1, nsplit, i) = face->
GetVid((oset + 2) % 3);
2078 E_eidx(j, nsplit, i) = face->
GetEid(oset);
2082 for (
int i = 0; i < nsplit - j - 1; ++i)
2084 int Fce_id = FceFwd ? fce_offset + cnt + i
2085 : fce_offset + cnt + nsplit - j - 2 - i;
2086 E_fidxz2(j, nsplit, i) = Fce_id;
2088 cnt += nsplit - j - 1;
2092 fid = geom->GetFace(4)->GetGlobalID();
2093 fce_offset = 2 * fid * nsplit * nsplit;
2095 orient = geom->GetForient(4);
2097 Xmap->ReOrientTracePhysMap(orient, idmap, nsplit, nsplit,
false);
2100 for (
int j = 0; j < nsplit; ++j)
2102 for (
int i = 0; i < nsplit; ++i)
2104 int Fce_id = fce_offset + idmap[i + j * nsplit];
2106 E_fidyz(j, i, 0) = Fce_id;
2111 E_vid(j, i, 0) = face->
GetVid(vertMap[orient][0]);
2112 E_vid(j, i + 1, 0) = face->
GetVid(vertMap[orient][1]);
2113 E_vid(j + 1, i, 0) = face->
GetVid(vertMap[orient][3]);
2114 E_vid(j + 1, i + 1, 0) = face->
GetVid(vertMap[orient][2]);
2116 E_eidy(j, i, 0) = face->
GetEid(edgMap[orient][0]);
2117 E_eidy(j + 1, i, 0) = face->
GetEid(edgMap[orient][2]);
2118 E_eidz(j, i, 0) = face->
GetEid(edgMap[orient][3]);
2119 E_eidz(j, i + 1, 0) = face->
GetEid(edgMap[orient][1]);
2128 Xmap->BwdTrans(geom->GetCoeffs(0), tmp);
2129 Xmap->PhysInterpToGLL(tmp, Xpts, nsplit + 1);
2130 Xmap->BwdTrans(geom->GetCoeffs(1), tmp);
2131 Xmap->PhysInterpToGLL(tmp, Ypts, nsplit + 1);
2132 Xmap->BwdTrans(geom->GetCoeffs(2), tmp);
2133 Xmap->PhysInterpToGLL(tmp, Zpts, nsplit + 1);
2137 Xmap->BwdTrans(geom->GetCoeffs(0), tmp);
2138 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Xpts, nsplit + 1);
2139 Xmap->BwdTrans(geom->GetCoeffs(1), tmp);
2140 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Ypts, nsplit + 1);
2141 Xmap->BwdTrans(geom->GetCoeffs(2), tmp);
2142 Xmap->PhysInterpToSimplexEquiSpaced(tmp, Zpts, nsplit + 1);
2145 cnt = (nsplit + 1) * (nsplit + 1);
2146 for (
int k = 1; k < nsplit; ++k)
2148 cnt += nsplit + 1 - k;
2149 for (
int j = 1; j < nsplit; ++j)
2152 for (
int i = 1; i < nsplit - k; ++i, cnt++)
2156 elmtid * (nsplit - 1) * (nsplit - 1) * (nsplit - 1) +
2159 E_vid(k, j, i) = vid;
2166 m_linMesh->AddGeom(vid, std::move(vert));
2170 cnt += nsplit + 1 - k;
2175 for (
int k = 0; k < nsplit; ++k)
2177 for (
int j = 0; j < nsplit; ++j)
2179 for (
int i = 0; i < nsplit - k; ++i)
2182 if ((i < nsplit - 1 - k) && (j < nsplit - 1))
2187 int edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
2188 std::array<PointGeom *, 2> vert;
2191 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 1));
2193 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i));
2198 m_linMesh->AddGeom(edgid, std::move(edge0));
2199 E_eidxz(k, j + 1, i) = edgid;
2202 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
2204 m_linMesh->GetPointGeom(E_vid(k, j + 1, i + 1));
2206 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i + 1));
2211 m_linMesh->AddGeom(edgid, std::move(edge1));
2212 E_eidz(k, j + 1, i + 1) = edgid;
2215 edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
2217 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i + 1));
2219 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i));
2224 m_linMesh->AddGeom(edgid, std::move(edge2));
2225 E_eidx(k + 1, j + 1, i) = edgid;
2229 int newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
2230 std::array<SegGeom *, 3>
2232 std::array<SegGeom *, 3> edgessort;
2235 m_linMesh->GetSegGeom(E_eidx(k + 1, 0, i));
2236 edgessort[1] =
m_linMesh->GetSegGeom(E_eidxz(k, 0, i));
2238 m_linMesh->GetSegGeom(E_eidz(k, 0, i + 1));
2240 m_linMesh->GetSegGeom(E_eidx(k + 1, j + 1, i));
2241 edges[1] =
m_linMesh->GetSegGeom(E_eidxz(k, j + 1, i));
2243 m_linMesh->GetSegGeom(E_eidz(k, j + 1, i + 1));
2250 m_linMesh->AddGeom(newtriid, std::move(tri1));
2252 E_fidxz2(k, j + 1, i) = newtriid;
2255 if (i < (nsplit - 2 - k))
2258 int edgid = elmtid * edgeoffset + maxedgeid + ecnt++;
2259 std::array<PointGeom *, 2> vert;
2262 m_linMesh->GetPointGeom(E_vid(k + 1, j, i + 1));
2264 m_linMesh->GetPointGeom(E_vid(k + 1, j + 1, i + 1));
2269 m_linMesh->AddGeom(edgid, std::move(edge0));
2270 E_eidy(k + 1, j, i + 1) = edgid;
2273 if (i < (nsplit - 1 - k))
2275 std::array<SegGeom *, 4> edges;
2278 elmtid * faceoffset + maxfaceid + fcnt++;
2279 edges[0] =
m_linMesh->GetSegGeom(E_eidy(k, j, i + 1));
2280 edges[1] =
m_linMesh->GetSegGeom(E_eidxz(k, j + 1, i));
2281 edges[2] =
m_linMesh->GetSegGeom(E_eidy(k + 1, j, i));
2282 edges[3] =
m_linMesh->GetSegGeom(E_eidxz(k, j, i));
2287 m_linMesh->AddGeom(newquadid, std::move(quad0));
2288 E_fidyzd(k, j, i) = newquadid;
2291 newquadid = elmtid * faceoffset + maxfaceid + fcnt++;
2292 edges[0] =
m_linMesh->GetSegGeom(E_eidy(k, j, i + 1));
2294 m_linMesh->GetSegGeom(E_eidz(k, j + 1, i + 1));
2296 m_linMesh->GetSegGeom(E_eidy(k + 1, j, i + 1));
2297 edges[3] =
m_linMesh->GetSegGeom(E_eidz(k, j, i + 1));
2302 m_linMesh->AddGeom(newquadid, std::move(quad1));
2303 E_fidyz(k, j, i + 1) = newquadid;
2306 newquadid = elmtid * faceoffset + maxfaceid + fcnt++;
2308 m_linMesh->GetSegGeom(E_eidy(k + 1, j, i + 1));
2310 m_linMesh->GetSegGeom(E_eidx(k + 1, j + 1, i));
2311 edges[2] =
m_linMesh->GetSegGeom(E_eidy(k + 1, j, i));
2312 edges[3] =
m_linMesh->GetSegGeom(E_eidx(k + 1, j, i));
2317 m_linMesh->AddGeom(newquadid, std::move(quad2));
2318 E_fidxy(k + 1, j, i) = newquadid;
2322 elmtid * nsplit * nsplit * nsplit + cnt++;
2324 std::array<Geometry2D *, 5> faces;
2325 faces[0] =
m_linMesh->GetQuadGeom(E_fidxy(k + 1, j, i));
2326 faces[1] =
m_linMesh->GetTriGeom(E_fidxz2(k, j, i));
2327 faces[2] =
m_linMesh->GetQuadGeom(E_fidyzd(k, j, i));
2328 faces[3] =
m_linMesh->GetTriGeom(E_fidxz2(k, j + 1, i));
2329 faces[4] =
m_linMesh->GetQuadGeom(E_fidyz(k, j, i + 1));
2335 m_linMesh->AddGeom(newprismid, std::move(prism));
2337 m_linMesh->GetPrismGeom(newprismid), 5);
2342 int newtriid = elmtid * faceoffset + maxfaceid + fcnt++;
2343 std::array<SegGeom *, 3> edges;
2344 std::array<SegGeom *, 3> edgessort;
2346 edgessort[0] =
m_linMesh->GetSegGeom(E_eidx(k, 0, i));
2347 edgessort[1] =
m_linMesh->GetSegGeom(E_eidxz(k, 0, i));
2348 edgessort[2] =
m_linMesh->GetSegGeom(E_eidz(k, 0, i));
2349 edges[0] =
m_linMesh->GetSegGeom(E_eidx(k, j + 1, i));
2350 edges[1] =
m_linMesh->GetSegGeom(E_eidxz(k, j + 1, i));
2351 edges[2] =
m_linMesh->GetSegGeom(E_eidz(k, j + 1, i));
2358 m_linMesh->AddGeom(newtriid, std::move(tri0));
2359 E_fidxz1(k, j + 1, i) = newtriid;
2363 int newprismid = elmtid * nsplit * nsplit * nsplit + cnt++;
2365 std::array<Geometry2D *, 5> faces;
2366 faces[0] =
m_linMesh->GetQuadGeom(E_fidxy(k, j, i));
2367 faces[1] =
m_linMesh->GetTriGeom(E_fidxz1(k, j, i));
2368 faces[2] =
m_linMesh->GetQuadGeom(E_fidyzd(k, j, i));
2369 faces[3] =
m_linMesh->GetTriGeom(E_fidxz1(k, j + 1, i));
2370 faces[4] =
m_linMesh->GetQuadGeom(E_fidyz(k, j, i));
2376 m_linMesh->AddGeom(newprismid, std::move(prism));
2379 m_linMesh->GetPrismGeom(newprismid), 5);
2385 "This should not happen, edgeoffset might need to be increased");
2388 "This should not happen, faceoffset might need to be increased");
2392 for (
int k = 0; k < nsplit + 1; ++k)
2394 for (
int j = 0; j < nsplit + 1; ++j)
2396 for (
int i = 0; i < nsplit + 1 - k; ++i)
2398 CoeffMap[elmtid][E_vid(k, j, i)] = cnt++;
2406 int nsplit, std::map<
int, std::pair<
int, std::vector<int>>> &LinCoeffMap,
2407 std::map<
int, std::map<int, int>> &CoeffMap2D,
2408 std::map<
int, std::map<int, int>> &CoeffMap3D,
bool useSimplex)
2410 auto &linMeshComp =
m_linMesh->GetComposites();
2412 for (
auto &c :
m_graph->GetComposites())
2416 linMeshComp[c.first] = curVector;
2418 for (
auto &g : c.second->m_geomVec)
2420 switch (g->GetShapeType())
2424 int id = g->GetGlobalID();
2425 for (
int i = 0; i < nsplit; ++i)
2427 int newid =
id * nsplit + i;
2431 "Failed to find LinMesh edge id");
2432 linMeshComp[c.first]->m_geomVec.push_back(it->second);
2438 int id = g->GetGlobalID();
2439 for (
int i = 0; i < nsplit * nsplit; ++i)
2441 int newid = 2 *
id * nsplit * nsplit + i;
2445 "Failed to find LinMesh tri id");
2446 linMeshComp[c.first]->m_geomVec.push_back(it->second);
2452 int id = g->GetGlobalID();
2456 for (
int i = 0; i < nsplit * nsplit; ++i)
2458 int newid = 2 * (
id * nsplit * nsplit + i);
2464 "Failed to find LinMesh tri id (from quad)");
2465 linMeshComp[c.first]->m_geomVec.push_back(
2472 "Failed to find LinMesh tri id (from quad)");
2473 linMeshComp[c.first]->m_geomVec.push_back(
2479 for (
int i = 0; i < nsplit * nsplit; ++i)
2481 int newid = 2 *
id * nsplit * nsplit + i;
2487 "Failed to find LinMesh quad id");
2488 linMeshComp[c.first]->m_geomVec.push_back(
2496 int id = g->GetGlobalID();
2497 for (
int i = 0; i < nsplit * nsplit * nsplit; ++i)
2499 int newid =
id * nsplit * nsplit * nsplit + i;
2503 "Failed to find LinMesh tet id");
2504 linMeshComp[c.first]->m_geomVec.push_back(it->second);
2510 int id = g->GetGlobalID();
2511 for (
int i = 0; i < nsplit * nsplit * nsplit; ++i)
2513 int newid =
id * nsplit * nsplit * nsplit + i;
2518 "Failed to find LinMesh prism id");
2519 linMeshComp[c.first]->m_geomVec.push_back(it->second);
2531 for (
auto &d :
m_graph->GetDomain())
2534 std::string compstr;
2535 for (
auto sd = d.second.begin(); sd != d.second.end();)
2537 compstr += std::to_string(sd->first);
2538 compstr += (++sd != d.second.end()) ?
"," :
" ";
2543 std::map<int, CompositeSharedPtr> unrollDomain;
2544 m_linMesh->GetCompositeList(compstr, unrollDomain);
2545 m_linMesh->GetDomain()[d.first] = unrollDomain;
2553 for (
auto &expIt : *
m_graph->GetExpansionInfoMap().begin()->second)
2555 Geometry *geom = expIt.second->m_geomPtr;
2557 switch (expIt.second->m_geomPtr->GetShapeType())
2562 ASSERTL1(CoeffMap2D[elmtid].size() ==
2563 (nsplit + 1) * (nsplit + 2) / 2,
2564 "CoeffMap2D is not the correct length");
2566 for (
int i = 0; i < nsplit * nsplit; ++i)
2569 m_linMesh->GetTriGeom(2 * elmtid * nsplit * nsplit + i);
2571 std::vector<int> offset(3);
2573 offset[0] = CoeffMap2D[elmtid][tri->
GetVid(0)];
2574 offset[1] = CoeffMap2D[elmtid][tri->
GetVid(2)];
2575 offset[2] = CoeffMap2D[elmtid][tri->
GetVid(1)];
2577 LinCoeffMap[2 * elmtid * nsplit * nsplit + i] =
2578 std::make_pair(elmtid, offset);
2586 for (
int i = 0, e = 0; i < nsplit; ++i)
2588 for (
int j = 0; j < nsplit; ++j, ++e)
2590 std::vector<int> offset(3);
2591 offset[0] = i * (nsplit + 1) + j;
2592 offset[1] = (i + 1) * (nsplit + 1) + j;
2593 offset[2] = i * (nsplit + 1) + j + 1;
2595 LinCoeffMap[2 * (elmtid * nsplit * nsplit + e)] =
2596 std::make_pair(elmtid, offset);
2598 std::vector<int> offset1(3);
2599 offset1[0] = (i + 1) * (nsplit + 1) + j + 1;
2600 offset1[1] = i * (nsplit + 1) + j + 1;
2601 offset1[2] = (i + 1) * (nsplit + 1) + j;
2603 LinCoeffMap[2 * (elmtid * nsplit * nsplit + e) +
2604 1] = std::make_pair(elmtid, offset1);
2611 for (
int i = 0, e = 0; i < nsplit; ++i)
2613 for (
int j = 0; j < nsplit; ++j, ++e)
2615 std::vector<int> offset(4);
2616 offset[0] = i * (nsplit + 1) + j;
2617 offset[1] = i * (nsplit + 1) + j + 1;
2618 offset[2] = (i + 1) * (nsplit + 1) + j;
2619 offset[3] = (i + 1) * (nsplit + 1) + j + 1;
2621 LinCoeffMap[2 * elmtid * nsplit * nsplit + e] =
2622 std::make_pair(elmtid, offset);
2630 ASSERTL1(CoeffMap3D[elmtid].size() ==
2631 (nsplit + 1) * (nsplit + 2) * (nsplit + 3) / 6,
2632 "CoeffMap3D (Tet) is not the correct length");
2634 for (
int i = 0; i < nsplit * nsplit * nsplit; ++i)
2637 elmtid * nsplit * nsplit * nsplit + i);
2639 std::vector<int> offset(4);
2641 offset[0] = CoeffMap3D[elmtid][tet->
GetVid(0)];
2642 offset[1] = CoeffMap3D[elmtid][tet->
GetVid(3)];
2643 offset[2] = CoeffMap3D[elmtid][tet->
GetVid(2)];
2644 offset[3] = CoeffMap3D[elmtid][tet->
GetVid(1)];
2646 LinCoeffMap[elmtid * nsplit * nsplit * nsplit + i] =
2647 std::make_pair(elmtid, offset);
2654 ASSERTL1(CoeffMap3D[elmtid].size() ==
2655 (nsplit + 1) * (nsplit + 1) * (nsplit + 2) / 2,
2656 "CoeffMap3D (Prism) is not the correct length");
2658 for (
int i = 0; i < nsplit * nsplit * nsplit; ++i)
2661 elmtid * nsplit * nsplit * nsplit + i);
2663 std::vector<int> offset(6);
2665 offset[0] = CoeffMap3D[elmtid][prism->
GetVid(0)];
2666 offset[1] = CoeffMap3D[elmtid][prism->
GetVid(4)];
2667 offset[2] = CoeffMap3D[elmtid][prism->
GetVid(3)];
2668 offset[3] = CoeffMap3D[elmtid][prism->
GetVid(5)];
2669 offset[4] = CoeffMap3D[elmtid][prism->
GetVid(1)];
2670 offset[5] = CoeffMap3D[elmtid][prism->
GetVid(2)];
2672 LinCoeffMap[elmtid * nsplit * nsplit * nsplit + i] =
2673 std::make_pair(elmtid, offset);