56 std::array<SpatialDomains::PointGeom *, 6> v,
57 std::array<SpatialDomains::SegGeomUniquePtr, 9> &segVec,
58 std::array<SpatialDomains::TriGeomUniquePtr, 2> &triVec,
59 std::array<SpatialDomains::QuadGeomUniquePtr, 3> &quadVec)
61 std::array<std::array<int, 2>, 9> edgeVerts = {{{{0, 1}},
70 std::array<std::array<int, 4>, 5> faceEdges = {{{{0, 1, 2, 3}},
77 for (
int i = 0; i < 9; ++i)
79 segVec[i] =
CreateSegGeom(i, v[edgeVerts[i][0]], v[edgeVerts[i][1]]);
83 std::array<SpatialDomains::Geometry2D *, 5> faces;
84 for (
int i = 0; i < 5; ++i)
89 std::array<SpatialDomains::SegGeom *, 4> face;
90 for (
int j = 0; j < 4; ++j)
92 face[j] = segVec[faceEdges[i][j]].get();
96 faces[i] = quadVec[i / 2].get();
101 std::array<SpatialDomains::SegGeom *, 3> face;
102 for (
int j = 0; j < 3; ++j)
104 face[j] = segVec[faceEdges[i][j]].get();
108 faces[i] = triVec[(i - 1) / 2].get();
132 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
133 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
134 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
135 std::array<SpatialDomains::PointGeom *, 6> v = {
136 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
166 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
170 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
171 for (
int i = 0; i < nelmts; ++i)
173 CollExp.push_back(Exp);
184 for (
int i = 0; i < coeffs.size(); ++i)
191 for (
int i = 0; i < nelmts; ++i)
193 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
194 tmp = phys1 + i * Exp->GetTotPoints());
198 double epsilon = 1.0e-8;
199 for (
int i = 0; i < phys1.size(); ++i)
201 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
220 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
221 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
222 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
223 std::array<SpatialDomains::PointGeom *, 6> v = {
224 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
254 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
258 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
259 for (
int i = 0; i < nelmts; ++i)
261 CollExp.push_back(Exp);
272 for (
int i = 0; i < coeffs.size(); ++i)
280 for (
int i = 0; i < nelmts; ++i)
282 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
283 tmp = phys1 + i * Exp->GetTotPoints());
287 double epsilon = 1.0e-8;
288 for (
int i = 0; i < phys1.size(); ++i)
290 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
309 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
310 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
311 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
312 std::array<SpatialDomains::PointGeom *, 6> v = {
313 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
343 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
347 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
348 for (
int i = 0; i < nelmts; ++i)
350 CollExp.push_back(Exp);
361 for (
int i = 0; i < coeffs.size(); ++i)
369 for (
int i = 0; i < nelmts; ++i)
371 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
372 tmp = phys1 + i * Exp->GetTotPoints());
376 double epsilon = 1.0e-8;
377 for (
int i = 0; i < phys1.size(); ++i)
379 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
380 phys2[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys2[i];
381 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
400 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
401 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
402 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
403 std::array<SpatialDomains::PointGeom *, 6> v = {
404 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
434 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
438 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
439 for (
int i = 0; i < nelmts; ++i)
441 CollExp.push_back(Exp);
452 for (
int i = 0; i < coeffs.size(); ++i)
460 for (
int i = 0; i < nelmts; ++i)
462 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
463 tmp = phys1 + i * Exp->GetTotPoints());
467 double epsilon = 1.0e-8;
468 for (
int i = 0; i < phys1.size(); ++i)
470 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
489 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
490 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
491 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
492 std::array<SpatialDomains::PointGeom *, 6> v = {
493 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
497 unsigned int numQuadPoints = 5;
498 unsigned int numModes = 4;
519 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
529 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
531 unsigned int nelmts = 2;
533 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
534 for (
unsigned int i = 0; i < nelmts; ++i)
536 CollExp.push_back(Exp);
550 for (
int i = 0; i < coeffs.size(); ++i)
558 for (
unsigned int i = 0; i < nelmts; ++i)
560 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
561 tmp = physRef + i * Exp->GetTotPoints());
565 double epsilon = 1.0e-8;
566 for (
unsigned int i = 0; i < physRef.size(); ++i)
568 BOOST_CHECK_CLOSE(physRef[i], phys[i], epsilon);
587 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
588 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
589 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
590 std::array<SpatialDomains::PointGeom *, 6> v = {
591 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
595 unsigned int numQuadPoints = 8;
596 unsigned int numModes = 4;
617 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
627 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
629 unsigned int nelmts = 2;
631 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
632 for (
unsigned int i = 0; i < nelmts; ++i)
634 CollExp.push_back(Exp);
648 for (
int i = 0; i < coeffs.size(); ++i)
656 for (
unsigned int i = 0; i < nelmts; ++i)
658 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
659 tmp = physRef + i * Exp->GetTotPoints());
663 double epsilon = 1.0e-8;
664 for (
unsigned int i = 0; i < physRef.size(); ++i)
666 BOOST_CHECK_CLOSE(physRef[i], phys[i], epsilon);
685 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
686 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
687 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
688 std::array<SpatialDomains::PointGeom *, 6> v = {
689 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
719 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
723 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
724 for (
int i = 0; i < nelmts; ++i)
726 CollExp.push_back(Exp);
737 for (
int i = 0; i < coeffs.size(); ++i)
745 for (
int i = 0; i < nelmts; ++i)
747 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
748 tmp = phys1 + i * Exp->GetTotPoints());
752 double epsilon = 1.0e-8;
753 for (
int i = 0; i < phys1.size(); ++i)
755 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
773 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
774 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
775 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
776 std::array<SpatialDomains::PointGeom *, 6> v = {
777 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
807 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
811 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
812 for (
int i = 0; i < nelmts; ++i)
814 CollExp.push_back(Exp);
825 for (
int i = 0; i < coeffs.size(); ++i)
833 for (
int i = 0; i < nelmts; ++i)
835 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
836 tmp = phys1 + i * Exp->GetTotPoints());
840 double epsilon = 1.0e-8;
841 for (
int i = 0; i < phys1.size(); ++i)
843 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
844 phys2[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys2[i];
845 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
864 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
865 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
866 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
867 std::array<SpatialDomains::PointGeom *, 6> v = {
868 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
898 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
902 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
903 for (
int i = 0; i < nelmts; ++i)
905 CollExp.push_back(Exp);
915 const int nq = Exp->GetTotPoints();
922 Exp->GetCoords(xc, yc, zc);
924 for (
int i = 0; i < nq; ++i)
926 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
928 Exp->IProductWRTBase(phys, coeffs1);
930 for (
int i = 1; i < nelmts; ++i)
933 Exp->IProductWRTBase(phys + i * nq,
934 tmp = coeffs1 + i * Exp->GetNcoeffs());
939 double epsilon = 1.0e-8;
940 for (
int i = 0; i < coeffs1.size(); ++i)
943 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
944 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
945 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
964 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
965 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
966 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
967 std::array<SpatialDomains::PointGeom *, 6> v = {
968 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
998 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1002 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1003 for (
int i = 0; i < nelmts; ++i)
1005 CollExp.push_back(Exp);
1015 const int nq = Exp->GetTotPoints();
1022 Exp->GetCoords(xc, yc, zc);
1024 for (
int i = 0; i < nq; ++i)
1026 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1028 Exp->IProductWRTBase(phys, coeffs1);
1030 for (
int i = 1; i < nelmts; ++i)
1033 Exp->IProductWRTBase(phys + i * nq,
1034 tmp = coeffs1 + i * Exp->GetNcoeffs());
1039 double epsilon = 1.0e-8;
1040 for (
int i = 0; i < coeffs1.size(); ++i)
1043 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1044 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1045 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1064 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1065 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1066 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1067 std::array<SpatialDomains::PointGeom *, 6> v = {
1068 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1098 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1102 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1103 for (
int i = 0; i < nelmts; ++i)
1105 CollExp.push_back(Exp);
1115 const int nq = Exp->GetTotPoints();
1122 Exp->GetCoords(xc, yc, zc);
1124 for (
int i = 0; i < nq; ++i)
1126 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1128 Exp->IProductWRTBase(phys, coeffs1);
1130 for (
int i = 1; i < nelmts; ++i)
1133 Exp->IProductWRTBase(phys + i * nq,
1134 tmp = coeffs1 + i * Exp->GetNcoeffs());
1139 double epsilon = 1.0e-8;
1140 for (
int i = 0; i < coeffs1.size(); ++i)
1143 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1144 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1145 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1150 TestPrismIProductWRTBase_MatrixFree_UniformP_Undeformed_MultiElmt)
1165 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1166 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1167 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1168 std::array<SpatialDomains::PointGeom *, 6> v = {
1169 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1173 unsigned int numQuadPoints = 5;
1174 unsigned int numModes = 4;
1195 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1205 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1207 unsigned int nelmts = 2;
1209 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1210 for (
unsigned int i = 0; i < nelmts; ++i)
1212 CollExp.push_back(Exp);
1225 const int nq = Exp->GetTotPoints();
1232 Exp->GetCoords(xc, yc, zc);
1234 for (
int i = 0; i < nq; ++i)
1236 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1238 Exp->IProductWRTBase(phys, coeffsRef);
1240 for (
int i = 1; i < nelmts; ++i)
1243 Exp->IProductWRTBase(phys + i * nq,
1244 tmp = coeffsRef + i * Exp->GetNcoeffs());
1249 double epsilon = 1.0e-8;
1250 for (
int i = 0; i < coeffsRef.size(); ++i)
1253 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1254 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1255 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1260 TestPrismIProductWRTBase_MatrixFree_UniformP_Deformed_MultiElmt)
1275 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1276 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1277 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1278 std::array<SpatialDomains::PointGeom *, 6> v = {
1279 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1283 unsigned int numQuadPoints = 5;
1284 unsigned int numModes = 4;
1305 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1315 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1317 unsigned int nelmts = 2;
1319 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1320 for (
unsigned int i = 0; i < nelmts; ++i)
1322 CollExp.push_back(Exp);
1335 const int nq = Exp->GetTotPoints();
1342 Exp->GetCoords(xc, yc, zc);
1344 for (
int i = 0; i < nq; ++i)
1346 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1348 Exp->IProductWRTBase(phys, coeffsRef);
1350 for (
int i = 1; i < nelmts; ++i)
1353 Exp->IProductWRTBase(phys + i * nq,
1354 tmp = coeffsRef + i * Exp->GetNcoeffs());
1359 double epsilon = 1.0e-8;
1360 for (
int i = 0; i < coeffsRef.size(); ++i)
1363 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1364 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1365 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1370 TestPrismIProductWRTBase_MatrixFree_UniformP_Deformed_OverInt_MultiElmt)
1385 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1386 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1387 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1388 std::array<SpatialDomains::PointGeom *, 6> v = {
1389 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1393 unsigned int numQuadPoints = 8;
1394 unsigned int numModes = 4;
1415 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1425 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1427 unsigned int nelmts = 2;
1429 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1430 for (
unsigned int i = 0; i < nelmts; ++i)
1432 CollExp.push_back(Exp);
1445 const int nq = Exp->GetTotPoints();
1452 Exp->GetCoords(xc, yc, zc);
1454 for (
int i = 0; i < nq; ++i)
1456 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1458 Exp->IProductWRTBase(phys, coeffsRef);
1460 for (
int i = 1; i < nelmts; ++i)
1463 Exp->IProductWRTBase(phys + i * nq,
1464 tmp = coeffsRef + i * Exp->GetNcoeffs());
1469 double epsilon = 1.0e-8;
1470 for (
int i = 0; i < coeffsRef.size(); ++i)
1473 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1474 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1475 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1494 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1495 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1496 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1497 std::array<SpatialDomains::PointGeom *, 6> v = {
1498 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1528 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1532 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1533 for (
int i = 0; i < nelmts; ++i)
1535 CollExp.push_back(Exp);
1545 const int nq = Exp->GetTotPoints();
1552 Exp->GetCoords(xc, yc, zc);
1554 for (
int i = 0; i < nq; ++i)
1556 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1558 Exp->IProductWRTBase(phys, coeffs1);
1560 for (
int i = 1; i < nelmts; ++i)
1563 Exp->IProductWRTBase(phys + i * nq,
1564 tmp = coeffs1 + i * Exp->GetNcoeffs());
1569 double epsilon = 1.0e-8;
1570 for (
int i = 0; i < coeffs1.size(); ++i)
1573 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1574 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1575 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1594 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1595 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1596 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1597 std::array<SpatialDomains::PointGeom *, 6> v = {
1598 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1628 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1632 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1633 for (
int i = 0; i < nelmts; ++i)
1635 CollExp.push_back(Exp);
1645 const int nq = Exp->GetTotPoints();
1652 Exp->GetCoords(xc, yc, zc);
1654 for (
int i = 0; i < nq; ++i)
1656 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1658 Exp->IProductWRTBase(phys, coeffs1);
1660 for (
int i = 1; i < nelmts; ++i)
1663 Exp->IProductWRTBase(phys + i * nq,
1664 tmp = coeffs1 + i * Exp->GetNcoeffs());
1669 double epsilon = 1.0e-8;
1670 for (
int i = 0; i < coeffs1.size(); ++i)
1673 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1674 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1675 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1694 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1695 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1696 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1697 std::array<SpatialDomains::PointGeom *, 6> v = {
1698 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1728 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1732 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1733 for (
int i = 0; i < nelmts; ++i)
1735 CollExp.push_back(Exp);
1745 const int nq = Exp->GetTotPoints();
1752 Exp->GetCoords(xc, yc, zc);
1754 for (
int i = 0; i < nq; ++i)
1756 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1758 Exp->IProductWRTBase(phys, coeffs1);
1760 for (
int i = 1; i < nelmts; ++i)
1763 Exp->IProductWRTBase(phys + i * nq,
1764 tmp = coeffs1 + i * Exp->GetNcoeffs());
1769 double epsilon = 1.0e-8;
1770 for (
int i = 0; i < coeffs1.size(); ++i)
1773 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1774 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1775 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1794 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1795 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1796 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1797 std::array<SpatialDomains::PointGeom *, 6> v = {
1798 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1819 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1828 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1832 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1833 for (
int i = 0; i < nelmts; ++i)
1835 CollExp.push_back(Exp);
1845 const int nq = Exp->GetTotPoints();
1851 Exp->GetCoords(xc, yc, zc);
1853 for (
int i = 0; i < nq; ++i)
1855 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1857 Exp->PhysDeriv(phys, diff1, tmp1 = diff1 + (nelmts)*nq,
1858 tmp2 = diff1 + (2 * nelmts) * nq);
1860 for (
int i = 1; i < nelmts; ++i)
1863 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
1864 tmp1 = diff1 + (nelmts + i) * nq,
1865 tmp2 = diff1 + (2 * nelmts + i) * nq);
1869 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
1871 double epsilon = 1.0e-8;
1872 for (
int i = 0; i < diff1.size(); ++i)
1874 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1893 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1894 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1895 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1896 std::array<SpatialDomains::PointGeom *, 6> v = {
1897 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
1918 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1927 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
1931 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1932 for (
int i = 0; i < nelmts; ++i)
1934 CollExp.push_back(Exp);
1944 const int nq = Exp->GetTotPoints();
1950 Exp->GetCoords(xc, yc, zc);
1952 for (
int i = 0; i < nq; ++i)
1954 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1956 Exp->PhysDeriv(phys, diff1, tmp1 = diff1 + (nelmts)*nq,
1957 tmp2 = diff1 + (2 * nelmts) * nq);
1959 for (
int i = 1; i < nelmts; ++i)
1962 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
1963 tmp1 = diff1 + (nelmts + i) * nq,
1964 tmp2 = diff1 + (2 * nelmts + i) * nq);
1968 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
1970 double epsilon = 1.0e-8;
1971 for (
int i = 0; i < diff1.size(); ++i)
1974 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
1975 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
1976 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1995 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
1996 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
1997 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
1998 std::array<SpatialDomains::PointGeom *, 6> v = {
1999 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2020 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2029 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2033 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2034 for (
int i = 0; i < nelmts; ++i)
2036 CollExp.push_back(Exp);
2046 const int nq = Exp->GetTotPoints();
2052 Exp->GetCoords(xc, yc, zc);
2054 for (
int i = 0; i < nq; ++i)
2056 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2058 Exp->PhysDeriv(phys, diff1, tmp1 = diff1 + (nelmts)*nq,
2059 tmp2 = diff1 + (2 * nelmts) * nq);
2061 for (
int i = 1; i < nelmts; ++i)
2064 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2065 tmp1 = diff1 + (nelmts + i) * nq,
2066 tmp2 = diff1 + (2 * nelmts + i) * nq);
2070 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2072 double epsilon = 1.0e-8;
2073 for (
int i = 0; i < diff1.size(); ++i)
2075 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
2076 diff2[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff2[i];
2077 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2096 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2097 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2098 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2099 std::array<SpatialDomains::PointGeom *, 6> v = {
2100 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2121 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2130 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2134 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2135 for (
int i = 0; i < nelmts; ++i)
2137 CollExp.push_back(Exp);
2147 const int nq = Exp->GetTotPoints();
2153 Exp->GetCoords(xc, yc, zc);
2155 for (
int i = 0; i < nq; ++i)
2157 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2159 Exp->PhysDeriv(phys, diff1, tmp1 = diff1 + (nelmts)*nq,
2160 tmp2 = diff1 + (2 * nelmts) * nq);
2162 for (
int i = 1; i < nelmts; ++i)
2165 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2166 tmp1 = diff1 + (nelmts + i) * nq,
2167 tmp2 = diff1 + (2 * nelmts + i) * nq);
2171 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2173 double epsilon = 1.0e-8;
2174 for (
int i = 0; i < diff1.size(); ++i)
2177 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
2178 diff2[i] = (fabs(diff2[i]) < 1e-14) ? 0.0 : diff2[i];
2179 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2198 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2199 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2200 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2201 std::array<SpatialDomains::PointGeom *, 6> v = {
2202 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2223 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2232 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2236 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2237 for (
int i = 0; i < nelmts; ++i)
2239 CollExp.push_back(Exp);
2249 const int nq = Exp->GetTotPoints();
2255 Exp->GetCoords(xc, yc, zc);
2257 for (
int i = 0; i < nq; ++i)
2259 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2261 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
2262 tmp2 = diff1 + (2 * nelmts) * nq);
2263 for (
int i = 1; i < nelmts; ++i)
2266 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2267 tmp1 = diff1 + (nelmts + i) * nq,
2268 tmp2 = diff1 + (2 * nelmts + i) * nq);
2272 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2274 double epsilon = 1.0e-8;
2275 for (
int i = 0; i < diff1.size(); ++i)
2277 diff1[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff1[i];
2278 diff2[i] = (fabs(diff1[i]) < 1e-14) ? 0.0 : diff2[i];
2279 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2298 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2299 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2300 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2301 std::array<SpatialDomains::PointGeom *, 6> v = {
2302 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2306 unsigned int numQuadPoints = 5;
2307 unsigned int numModes = 2;
2328 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2338 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2342 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2343 for (
int i = 0; i < nelmts; ++i)
2345 CollExp.push_back(Exp);
2358 const int nq = Exp->GetTotPoints();
2364 Exp->GetCoords(xc, yc, zc);
2366 for (
int i = 0; i < nq; ++i)
2368 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2370 Exp->PhysDeriv(phys, diffRef, tmp1 = diffRef + (nelmts)*nq,
2371 tmp2 = diffRef + (2 * nelmts) * nq);
2373 for (
int i = 1; i < nelmts; ++i)
2376 Exp->PhysDeriv(phys, tmp = diffRef + i * nq,
2377 tmp1 = diffRef + (nelmts + i) * nq,
2378 tmp2 = diffRef + (2 * nelmts + i) * nq);
2382 tmp = diff + nelmts * nq, tmp2 = diff + 2 * nelmts * nq);
2384 double epsilon = 1.0e-8;
2385 for (
int i = 0; i < diffRef.size(); ++i)
2387 diffRef[i] = (std::abs(diffRef[i]) < 1e-14) ? 0.0 : diffRef[i];
2388 diff[i] = (std::abs(diff[i]) < 1e-14) ? 0.0 : diff[i];
2389 BOOST_CHECK_CLOSE(diffRef[i], diff[i], epsilon);
2394 TestPrismIProductWRTDerivBase_IterPerExp_UniformP_MultiElmt)
2409 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2410 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2411 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2412 std::array<SpatialDomains::PointGeom *, 6> v = {
2413 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2434 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2443 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2447 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2448 for (
int i = 0; i < nelmts; ++i)
2450 CollExp.push_back(Exp);
2460 const int nq = Exp->GetTotPoints();
2461 const int nm = Exp->GetNcoeffs();
2470 Exp->GetCoords(xc, yc, zc);
2472 for (
int i = 0; i < nq; ++i)
2474 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2475 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2476 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2478 for (
int i = 1; i < nelmts; ++i)
2486 for (
int i = 0; i < nelmts; ++i)
2488 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2489 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2490 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2491 tmp = coeffs1 + i * nm, 1);
2492 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2493 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2494 tmp = coeffs1 + i * nm, 1);
2500 double epsilon = 1.0e-8;
2501 for (
int i = 0; i < coeffs1.size(); ++i)
2503 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2504 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2505 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2524 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2525 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2526 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2527 std::array<SpatialDomains::PointGeom *, 6> v = {
2528 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2549 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2558 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2562 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2563 for (
int i = 0; i < nelmts; ++i)
2565 CollExp.push_back(Exp);
2575 const int nq = Exp->GetTotPoints();
2576 const int nm = Exp->GetNcoeffs();
2585 Exp->GetCoords(xc, yc, zc);
2587 for (
int i = 0; i < nq; ++i)
2589 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2590 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2591 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2593 for (
int i = 1; i < nelmts; ++i)
2601 for (
int i = 0; i < nelmts; ++i)
2603 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2604 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2605 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2606 tmp = coeffs1 + i * nm, 1);
2607 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2608 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2609 tmp = coeffs1 + i * nm, 1);
2615 double epsilon = 1.0e-8;
2616 for (
int i = 0; i < coeffs1.size(); ++i)
2618 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2619 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2620 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2639 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2640 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2641 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2642 std::array<SpatialDomains::PointGeom *, 6> v = {
2643 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2664 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2673 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2677 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2678 for (
int i = 0; i < nelmts; ++i)
2680 CollExp.push_back(Exp);
2690 const int nq = Exp->GetTotPoints();
2691 const int nm = Exp->GetNcoeffs();
2700 Exp->GetCoords(xc, yc, zc);
2702 for (
int i = 0; i < nq; ++i)
2704 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2705 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2706 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2708 for (
int i = 1; i < nelmts; ++i)
2716 for (
int i = 0; i < nelmts; ++i)
2718 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2719 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2720 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2721 tmp = coeffs1 + i * nm, 1);
2722 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2723 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2724 tmp = coeffs1 + i * nm, 1);
2730 double epsilon = 1.0e-8;
2731 for (
int i = 0; i < coeffs1.size(); ++i)
2733 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2734 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2735 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2740 TestPrismIProductWRTDerivBase_IterPerExp_VariableP_MultiElmt)
2755 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2756 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2757 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2758 std::array<SpatialDomains::PointGeom *, 6> v = {
2759 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2780 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2789 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2793 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2794 for (
int i = 0; i < nelmts; ++i)
2796 CollExp.push_back(Exp);
2806 const int nq = Exp->GetTotPoints();
2807 const int nm = Exp->GetNcoeffs();
2816 Exp->GetCoords(xc, yc, zc);
2818 for (
int i = 0; i < nq; ++i)
2820 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2821 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2822 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2824 for (
int i = 1; i < nelmts; ++i)
2832 for (
int i = 0; i < nelmts; ++i)
2834 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2835 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2836 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2837 tmp = coeffs1 + i * nm, 1);
2838 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2839 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2840 tmp = coeffs1 + i * nm, 1);
2846 double epsilon = 1.0e-8;
2847 for (
int i = 0; i < coeffs1.size(); ++i)
2849 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2850 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2851 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2870 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2871 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2872 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2873 std::array<SpatialDomains::PointGeom *, 6> v = {
2874 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
2895 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2904 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
2908 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2909 for (
int i = 0; i < nelmts; ++i)
2911 CollExp.push_back(Exp);
2921 const int nq = Exp->GetTotPoints();
2922 const int nm = Exp->GetNcoeffs();
2931 Exp->GetCoords(xc, yc, zc);
2933 for (
int i = 0; i < nq; ++i)
2935 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2936 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2937 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2939 for (
int i = 1; i < nelmts; ++i)
2947 for (
int i = 0; i < nelmts; ++i)
2949 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2950 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2951 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2952 tmp = coeffs1 + i * nm, 1);
2953 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2954 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2955 tmp = coeffs1 + i * nm, 1);
2961 double epsilon = 1.0e-8;
2962 for (
int i = 0; i < coeffs1.size(); ++i)
2964 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2965 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2966 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2985 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
2986 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
2987 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
2988 std::array<SpatialDomains::PointGeom *, 6> v = {
2989 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3010 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3019 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3023 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3024 for (
int i = 0; i < nelmts; ++i)
3026 CollExp.push_back(Exp);
3036 const int nq = Exp->GetTotPoints();
3037 const int nm = Exp->GetNcoeffs();
3046 Exp->GetCoords(xc, yc, zc);
3048 for (
int i = 0; i < nq; ++i)
3050 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3051 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3052 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3054 for (
int i = 1; i < nelmts; ++i)
3062 for (
int i = 0; i < nelmts; ++i)
3064 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
3065 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
3066 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3067 tmp = coeffs1 + i * nm, 1);
3068 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
3069 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3070 tmp = coeffs1 + i * nm, 1);
3076 double epsilon = 1.0e-8;
3077 for (
int i = 0; i < coeffs1.size(); ++i)
3079 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3080 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3081 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3086 TestPrismIProductWRTDerivBase_MatriFree_UniformP_Undeformed_MultiElmt)
3101 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3102 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3103 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3104 std::array<SpatialDomains::PointGeom *, 6> v = {
3105 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3109 unsigned int numQuadPoints = 7;
3110 unsigned int numModes = 6;
3131 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3141 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3143 unsigned int nelmts = 1;
3145 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3146 for (
unsigned int i = 0; i < nelmts; ++i)
3148 CollExp.push_back(Exp);
3161 const int nq = Exp->GetTotPoints();
3162 const int nm = Exp->GetNcoeffs();
3171 Exp->GetCoords(xc, yc, zc);
3173 for (
int i = 0; i < nq; ++i)
3175 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3176 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3177 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3179 for (
int i = 1; i < nelmts; ++i)
3187 for (
int i = 0; i < nelmts; ++i)
3189 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffsRef + i * nm);
3190 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs + i * nm);
3191 Vmath::Vadd(nm, coeffsRef + i * nm, 1, coeffs + i * nm, 1,
3192 tmp = coeffsRef + i * nm, 1);
3193 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs + i * nm);
3194 Vmath::Vadd(nm, coeffsRef + i * nm, 1, coeffs + i * nm, 1,
3195 tmp = coeffsRef + i * nm, 1);
3201 double epsilon = 1.0e-8;
3202 for (
int i = 0; i < coeffsRef.size(); ++i)
3204 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3205 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3206 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3211 TestPrismIProductWRTDerivBase_MatriFree_UniformP_Deformed_MultiElmt)
3226 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3227 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3228 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3229 std::array<SpatialDomains::PointGeom *, 6> v = {
3230 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3234 unsigned int numQuadPoints = 7;
3235 unsigned int numModes = 6;
3256 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3266 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3268 unsigned int nelmts = 1;
3270 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3271 for (
unsigned int i = 0; i < nelmts; ++i)
3273 CollExp.push_back(Exp);
3286 const int nq = Exp->GetTotPoints();
3287 const int nm = Exp->GetNcoeffs();
3296 Exp->GetCoords(xc, yc, zc);
3298 for (
int i = 0; i < nq; ++i)
3300 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3301 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3302 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3304 for (
int i = 1; i < nelmts; ++i)
3312 for (
int i = 0; i < nelmts; ++i)
3314 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffsRef + i * nm);
3315 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs + i * nm);
3316 Vmath::Vadd(nm, coeffsRef + i * nm, 1, coeffs + i * nm, 1,
3317 tmp = coeffsRef + i * nm, 1);
3318 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs + i * nm);
3319 Vmath::Vadd(nm, coeffsRef + i * nm, 1, coeffs + i * nm, 1,
3320 tmp = coeffsRef + i * nm, 1);
3326 double epsilon = 1.0e-8;
3327 for (
int i = 0; i < coeffsRef.size(); ++i)
3329 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3330 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3331 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3336 TestPrismIProductWRTDerivBase_MatriFree_UniformP_Deformed_OverInt_MultiElmt)
3351 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3352 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3353 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3354 std::array<SpatialDomains::PointGeom *, 6> v = {
3355 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3359 unsigned int numQuadPoints = 12;
3360 unsigned int numModes = 6;
3381 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3391 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3393 unsigned int nelmts = 1;
3395 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3396 for (
unsigned int i = 0; i < nelmts; ++i)
3398 CollExp.push_back(Exp);
3411 const int nq = Exp->GetTotPoints();
3412 const int nm = Exp->GetNcoeffs();
3421 Exp->GetCoords(xc, yc, zc);
3423 for (
int i = 0; i < nq; ++i)
3425 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3426 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3427 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3429 for (
int i = 1; i < nelmts; ++i)
3437 for (
int i = 0; i < nelmts; ++i)
3439 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffsRef + i * nm);
3440 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs + i * nm);
3441 Vmath::Vadd(nm, coeffsRef + i * nm, 1, coeffs + i * nm, 1,
3442 tmp = coeffsRef + i * nm, 1);
3443 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs + i * nm);
3444 Vmath::Vadd(nm, coeffsRef + i * nm, 1, coeffs + i * nm, 1,
3445 tmp = coeffsRef + i * nm, 1);
3451 double epsilon = 1.0e-8;
3452 for (
int i = 0; i < coeffsRef.size(); ++i)
3454 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3455 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3456 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3475 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3476 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3477 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3478 std::array<SpatialDomains::PointGeom *, 6> v = {
3479 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3483 unsigned int numQuadPoints = 7;
3484 unsigned int numModes = 6;
3505 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3515 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3519 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3523 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3524 for (
int i = 0; i < nelmts; ++i)
3526 CollExp.push_back(Exp);
3545 const int nm = Exp->GetNcoeffs();
3550 for (
int i = 0; i < nm; ++i)
3555 for (
int i = 1; i < nelmts; ++i)
3557 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
3563 for (
int i = 0; i < nelmts; ++i)
3566 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
3571 double epsilon = 1.0e-8;
3572 for (
int i = 0; i < coeffsRef.size(); ++i)
3574 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3575 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3576 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3595 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3596 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3597 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3598 std::array<SpatialDomains::PointGeom *, 6> v = {
3599 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3603 unsigned int numQuadPoints = 7;
3604 unsigned int numModes = 6;
3625 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3635 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3639 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3643 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3644 for (
int i = 0; i < nelmts; ++i)
3646 CollExp.push_back(Exp);
3659 const int nm = Exp->GetNcoeffs();
3664 for (
int i = 0; i < nm; ++i)
3669 for (
int i = 1; i < nelmts; ++i)
3671 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
3677 for (
int i = 0; i < nelmts; ++i)
3680 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
3685 double epsilon = 1.0e-8;
3686 for (
int i = 0; i < coeffsRef.size(); ++i)
3688 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3689 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3690 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3709 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3710 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3711 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3712 std::array<SpatialDomains::PointGeom *, 6> v = {
3713 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3717 unsigned int numQuadPoints = 10;
3718 unsigned int numModes = 6;
3739 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3749 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3753 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3757 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3758 for (
int i = 0; i < nelmts; ++i)
3760 CollExp.push_back(Exp);
3773 const int nm = Exp->GetNcoeffs();
3778 for (
int i = 0; i < nm; ++i)
3783 for (
int i = 1; i < nelmts; ++i)
3785 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
3791 for (
int i = 0; i < nelmts; ++i)
3794 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
3799 double epsilon = 1.0e-8;
3800 for (
int i = 0; i < coeffsRef.size(); ++i)
3802 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3803 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3804 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3823 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3824 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3825 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3826 std::array<SpatialDomains::PointGeom *, 6> v = {
3827 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3831 unsigned int numQuadPoints = 7;
3832 unsigned int numModes = 6;
3853 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3863 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3867 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3871 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3872 for (
int i = 0; i < nelmts; ++i)
3874 CollExp.push_back(Exp);
3893 const int nm = Exp->GetNcoeffs();
3898 for (
int i = 0; i < nm; ++i)
3903 for (
int i = 1; i < nelmts; ++i)
3905 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
3911 for (
int i = 0; i < nelmts; ++i)
3914 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
3919 double epsilon = 1.0e-8;
3920 for (
int i = 0; i < coeffsRef.size(); ++i)
3922 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3923 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3924 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3943 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
3944 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
3945 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
3946 std::array<SpatialDomains::PointGeom *, 6> v = {
3947 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
3951 unsigned int numQuadPoints = 7;
3952 unsigned int numModes = 6;
3973 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3983 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
3987 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3989 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3990 CollExp.push_back(Exp);
4001 const int nq = Exp->GetTotPoints();
4006 Exp->GetCoords(xc, yc, zc);
4008 for (
int i = 0; i < nq; ++i)
4010 phys[i] = pow(xc[i], 3) + pow(yc[i], 3) + pow(zc[i], 3);
4024 double epsilon = 2.0e-8;
4025 for (
int i = 0; i < nq1; ++i)
4027 NekDouble exact = pow(xc1[i], 3) + pow(yc1[i], 3) + pow(zc1[i], 3);
4028 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
4029 exact = (fabs(exact) < 1e-14) ? 0.0 : exact;
4030 BOOST_CHECK_CLOSE(phys1[i], exact, epsilon);
4049 std::array<SpatialDomains::SegGeomUniquePtr, 9> segVec;
4050 std::array<SpatialDomains::QuadGeomUniquePtr, 3> quadVec;
4051 std::array<SpatialDomains::TriGeomUniquePtr, 2> triVec;
4052 std::array<SpatialDomains::PointGeom *, 6> v = {
4053 v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get()};
4057 unsigned int numQuadPoints = 7;
4058 unsigned int numModes = 6;
4079 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
4089 basisKeyDir1, basisKeyDir2, basisKeyDir3, prismGeom.get());
4093 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4095 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4096 CollExp.push_back(Exp);
4107 const int nq = Exp->GetTotPoints();
4112 Exp->GetCoords(xc, yc, zc);
4114 for (
int i = 0; i < nq; ++i)
4116 phys[i] = pow(xc[i], 3) + pow(yc[i], 3) + pow(zc[i], 3);
4130 double epsilon = 1.0e-8;
4131 for (
int i = 0; i < nq1; ++i)
4133 NekDouble exact = pow(xc1[i], 3) + pow(yc1[i], 3) + pow(zc1[i], 3);
4134 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
4135 exact = (fabs(exact) < 1e-14) ? 0.0 : exact;
4136 BOOST_CHECK_CLOSE(phys1[i], exact, epsilon);