39#include <boost/test/tools/floating_point_comparison.hpp>
40#include <boost/test/unit_test.hpp>
44namespace HexCollectionTests
106 face3, face4, face5};
132 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
138 unsigned int numQuadPoints = 6;
146 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
148 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
149 CollExp.push_back(Exp);
162 Exp->BwdTrans(coeffs, phys1);
165 double epsilon = 1.0e-8;
166 for (
int i = 0; i < phys1.size(); ++i)
168 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
192 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
213 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
217 basisKeyDir1, basisKeyDir2, basisKeyDir3);
219 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
220 CollExp.push_back(Exp);
233 Exp->BwdTrans(coeffs, phys1);
236 double epsilon = 1.0e-8;
237 for (
int i = 0; i < phys1.size(); ++i)
239 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
263 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
269 unsigned int numQuadPoints = 6;
277 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
281 basisKeyDir1, basisKeyDir1, basisKeyDir1);
283 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
284 CollExp.push_back(Exp);
297 Exp->BwdTrans(coeffs, phys1);
300 double epsilon = 1.0e-8;
301 for (
int i = 0; i < phys1.size(); ++i)
303 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
327 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
333 unsigned int numQuadPoints = 6;
345 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
349 basisKeyDir1, basisKeyDir2, basisKeyDir3);
351 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
352 CollExp.push_back(Exp);
365 Exp->BwdTrans(coeffs, phys1);
369 double epsilon = 1.0e-8;
370 for (
int i = 0; i < phys1.size(); ++i)
372 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
396 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
402 unsigned int numQuadPoints = 6;
414 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
418 basisKeyDir1, basisKeyDir2, basisKeyDir3);
422 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
423 for (
int i = 0; i < nelmts; ++i)
424 CollExp.push_back(Exp);
437 for (
int i = 0; i < nelmts; ++i)
439 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
440 tmp = phys1 + i * Exp->GetTotPoints());
445 double epsilon = 1.0e-8;
446 for (
int i = 0; i < phys1.size(); ++i)
448 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
472 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
478 unsigned int numQuadPoints = 6;
490 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
494 basisKeyDir1, basisKeyDir2, basisKeyDir3);
496 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
497 CollExp.push_back(Exp);
510 Exp->BwdTrans(coeffs, phys1);
514 double epsilon = 1.0e-8;
515 for (
int i = 0; i < phys1.size(); ++i)
517 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
541 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
547 unsigned int numQuadPoints = 6;
555 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
559 basisKeyDir1, basisKeyDir1, basisKeyDir1);
563 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
564 for (
int i = 0; i < nelmts; ++i)
565 CollExp.push_back(Exp);
578 for (
int i = 0; i < nelmts; ++i)
580 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
581 tmp = phys1 + i * Exp->GetTotPoints());
585 double epsilon = 1.0e-8;
586 for (
int i = 0; i < phys1.size(); ++i)
588 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
612 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
618 unsigned int numQuadPoints = 6;
626 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
630 basisKeyDir1, basisKeyDir1, basisKeyDir1);
634 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
635 for (
int i = 0; i < nelmts; ++i)
636 CollExp.push_back(Exp);
649 for (
int i = 0; i < nelmts; ++i)
651 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
652 tmp = phys1 + i * Exp->GetTotPoints());
656 double epsilon = 1.0e-8;
657 for (
int i = 0; i < phys1.size(); ++i)
659 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
683 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
704 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
708 basisKeyDir1, basisKeyDir2, basisKeyDir3);
712 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
713 for (
int i = 0; i < nelmts; ++i)
715 CollExp.push_back(Exp);
729 for (
int i = 0; i < nelmts; ++i)
731 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
732 tmp = phys1 + i * Exp->GetTotPoints());
736 double epsilon = 1.0e-8;
737 for (
int i = 0; i < phys1.size(); ++i)
739 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
763 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
784 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
788 basisKeyDir1, basisKeyDir2, basisKeyDir3);
792 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
793 for (
int i = 0; i < nelmts; ++i)
795 CollExp.push_back(Exp);
809 for (
int i = 0; i < nelmts; ++i)
811 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
812 tmp = phys1 + i * Exp->GetTotPoints());
816 double epsilon = 1.0e-8;
817 for (
int i = 0; i < phys1.size(); ++i)
819 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
843 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
849 unsigned int numQuadPoints = 6;
850 unsigned int numModes = 4;
858 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
862 basisKeyDir1, basisKeyDir1, basisKeyDir1);
864 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
865 CollExp.push_back(Exp);
878 Exp->BwdTrans(coeffs, physRef);
881 double epsilon = 1.0e-8;
882 for (
int i = 0; i < physRef.size(); ++i)
884 BOOST_CHECK_CLOSE(physRef[i], phys[i], epsilon);
908 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
914 unsigned int numQuadPoints = 6;
922 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
926 basisKeyDir1, basisKeyDir1, basisKeyDir1);
928 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
929 CollExp.push_back(Exp);
938 const int nq = Exp->GetTotPoints();
945 Exp->GetCoords(xc, yc, zc);
947 for (
int i = 0; i < nq; ++i)
949 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
952 Exp->IProductWRTBase(phys, coeffs1);
955 double epsilon = 1.0e-8;
956 for (
int i = 0; i < coeffs1.size(); ++i)
958 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
982 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
988 unsigned int numQuadPoints = 5;
989 unsigned int numModes = 4;
997 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
1001 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1003 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1004 CollExp.push_back(Exp);
1013 const int nq = Exp->GetTotPoints();
1020 Exp->GetCoords(xc, yc, zc);
1022 for (
int i = 0; i < nq; ++i)
1024 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1027 Exp->IProductWRTBase(phys, coeffsRef);
1030 double epsilon = 1.0e-8;
1031 for (
int i = 0; i < coeffsRef.size(); ++i)
1033 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1034 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1035 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1059 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1065 unsigned int numQuadPoints = 5;
1066 unsigned int numModes = 4;
1068 quadPointsTypeDir1);
1074 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
1078 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1080 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1081 CollExp.push_back(Exp);
1090 const int nq = Exp->GetTotPoints();
1097 Exp->GetCoords(xc, yc, zc);
1099 for (
int i = 0; i < nq; ++i)
1101 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1104 Exp->IProductWRTBase(phys, coeffsRef);
1107 double epsilon = 1.0e-8;
1108 for (
int i = 0; i < coeffsRef.size(); ++i)
1110 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1111 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1112 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1117 TestHexIProductWRTBase_MatrixFree_UniformP_Deformed_OverInt)
1137 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1143 unsigned int numQuadPoints = 8;
1144 unsigned int numModes = 4;
1146 quadPointsTypeDir1);
1152 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
1156 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1158 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1159 CollExp.push_back(Exp);
1168 const int nq = Exp->GetTotPoints();
1175 Exp->GetCoords(xc, yc, zc);
1177 for (
int i = 0; i < nq; ++i)
1179 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1182 Exp->IProductWRTBase(phys, coeffsRef);
1185 double epsilon = 1.0e-8;
1186 for (
int i = 0; i < coeffsRef.size(); ++i)
1188 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1189 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1190 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1214 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1221 quadPointsTypeDir1);
1223 quadPointsTypeDir1);
1225 quadPointsTypeDir1);
1235 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1239 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1241 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1242 CollExp.push_back(Exp);
1251 const int nq = Exp->GetTotPoints();
1258 Exp->GetCoords(xc, yc, zc);
1260 for (
int i = 0; i < nq; ++i)
1262 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1265 Exp->IProductWRTBase(phys, coeffs1);
1269 double epsilon = 1.0e-8;
1270 for (
int i = 0; i < coeffs1.size(); ++i)
1272 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1296 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1303 quadPointsTypeDir1);
1305 quadPointsTypeDir1);
1307 quadPointsTypeDir1);
1317 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1321 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1323 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1324 CollExp.push_back(Exp);
1333 const int nq = Exp->GetTotPoints();
1340 Exp->GetCoords(xc, yc, zc);
1342 for (
int i = 0; i < nq; ++i)
1344 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1347 Exp->IProductWRTBase(phys, coeffs1);
1351 double epsilon = 1.0e-8;
1352 for (
int i = 0; i < coeffs1.size(); ++i)
1354 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1378 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1385 quadPointsTypeDir1);
1387 quadPointsTypeDir1);
1389 quadPointsTypeDir1);
1399 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1403 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1405 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1406 CollExp.push_back(Exp);
1415 const int nq = Exp->GetTotPoints();
1422 Exp->GetCoords(xc, yc, zc);
1424 for (
int i = 0; i < nq; ++i)
1426 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1429 Exp->IProductWRTBase(phys, coeffs1);
1432 double epsilon = 1.0e-8;
1433 for (
int i = 0; i < coeffs1.size(); ++i)
1435 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1459 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1466 quadPointsTypeDir1);
1468 quadPointsTypeDir1);
1470 quadPointsTypeDir1);
1480 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1484 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1486 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1487 CollExp.push_back(Exp);
1496 const int nq = Exp->GetTotPoints();
1503 Exp->GetCoords(xc, yc, zc);
1505 for (
int i = 0; i < nq; ++i)
1507 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1510 Exp->IProductWRTBase(phys, coeffs1);
1513 double epsilon = 1.0e-8;
1514 for (
int i = 0; i < coeffs1.size(); ++i)
1516 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1540 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1547 quadPointsTypeDir1);
1549 quadPointsTypeDir1);
1551 quadPointsTypeDir1);
1561 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1565 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1567 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1568 CollExp.push_back(Exp);
1577 const int nq = Exp->GetTotPoints();
1584 Exp->GetCoords(xc, yc, zc);
1586 for (
int i = 0; i < nq; ++i)
1588 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1591 Exp->IProductWRTBase(phys, coeffs1);
1594 double epsilon = 1.0e-8;
1595 for (
int i = 0; i < coeffs1.size(); ++i)
1597 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1621 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1628 quadPointsTypeDir1);
1630 quadPointsTypeDir1);
1632 quadPointsTypeDir1);
1642 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1646 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1650 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1651 for (
int i = 0; i < nelmts; ++i)
1653 CollExp.push_back(Exp);
1663 const int nq = Exp->GetTotPoints();
1670 Exp->GetCoords(xc, yc, zc);
1672 for (
int i = 0; i < nq; ++i)
1674 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1676 Exp->IProductWRTBase(phys, coeffs1);
1678 for (
int i = 1; i < nelmts; ++i)
1681 Exp->IProductWRTBase(phys + i * nq,
1682 tmp = coeffs1 + i * Exp->GetNcoeffs());
1687 double epsilon = 1.0e-8;
1688 for (
int i = 0; i < coeffs1.size(); ++i)
1690 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1714 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1721 quadPointsTypeDir1);
1723 quadPointsTypeDir1);
1725 quadPointsTypeDir1);
1735 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1739 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1743 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1744 for (
int i = 0; i < nelmts; ++i)
1746 CollExp.push_back(Exp);
1756 const int nq = Exp->GetTotPoints();
1763 Exp->GetCoords(xc, yc, zc);
1765 for (
int i = 0; i < nq; ++i)
1767 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1769 Exp->IProductWRTBase(phys, coeffs1);
1771 for (
int i = 1; i < nelmts; ++i)
1774 Exp->IProductWRTBase(phys + i * nq,
1775 tmp = coeffs1 + i * Exp->GetNcoeffs());
1780 double epsilon = 1.0e-8;
1781 for (
int i = 0; i < coeffs1.size(); ++i)
1783 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1807 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1813 unsigned int numQuadPoints = 6;
1815 quadPointsTypeDir1);
1821 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
1825 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1827 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1828 CollExp.push_back(Exp);
1837 const int nq = Exp->GetTotPoints();
1844 Exp->GetCoords(xc, yc, zc);
1846 for (
int i = 0; i < nq; ++i)
1848 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1851 Exp->IProductWRTBase(phys, coeffs1);
1854 double epsilon = 1.0e-6;
1855 for (
int i = 0; i < coeffs1.size(); ++i)
1858 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-16) ? 0.0 : coeffs1[i];
1859 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-16) ? 0.0 : coeffs2[i];
1860 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1884 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1891 quadPointsTypeDir1);
1893 quadPointsTypeDir1);
1895 quadPointsTypeDir1);
1905 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
1909 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1911 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1912 CollExp.push_back(Exp);
1921 const int nq = Exp->GetTotPoints();
1928 Exp->GetCoords(xc, yc, zc);
1930 for (
int i = 0; i < nq; ++i)
1932 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1935 Exp->IProductWRTBase(phys, coeffs1);
1938 double epsilon = 1.0e-6;
1939 for (
int i = 0; i < coeffs1.size(); ++i)
1942 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-16) ? 0.0 : coeffs1[i];
1943 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-16) ? 0.0 : coeffs2[i];
1944 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1968 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
1975 quadPointsTypeDir1);
1981 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
1985 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1989 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1990 for (
int i = 0; i < nelmts; ++i)
1992 CollExp.push_back(Exp);
2002 const int nq = Exp->GetTotPoints();
2009 Exp->GetCoords(xc, yc, zc);
2011 for (
int i = 0; i < nq; ++i)
2013 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2015 Exp->IProductWRTBase(phys, coeffs1);
2017 for (
int i = 1; i < nelmts; ++i)
2020 Exp->IProductWRTBase(phys + i * nq,
2021 tmp = coeffs1 + i * Exp->GetNcoeffs());
2025 double epsilon = 1.0e-6;
2026 for (
int i = 0; i < coeffs1.size(); ++i)
2029 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-16) ? 0.0 : coeffs1[i];
2030 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-16) ? 0.0 : coeffs2[i];
2031 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2055 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2062 quadPointsTypeDir1);
2064 quadPointsTypeDir1);
2066 quadPointsTypeDir1);
2076 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
2080 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2084 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2085 for (
int i = 0; i < nelmts; ++i)
2086 CollExp.push_back(Exp);
2095 const int nq = Exp->GetTotPoints();
2102 Exp->GetCoords(xc, yc, zc);
2104 for (
int i = 0; i < nq; ++i)
2106 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2108 Exp->IProductWRTBase(phys, coeffs1);
2110 for (
int i = 1; i < nelmts; ++i)
2113 Exp->IProductWRTBase(phys + i * nq,
2114 tmp = coeffs1 + i * Exp->GetNcoeffs());
2118 double epsilon = 1.0e-4;
2119 for (
int i = 0; i < coeffs1.size(); ++i)
2122 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2123 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2124 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2129 TestHexIProductWRTBase_SumFac_VariableP_MultiElmt_CollDir02)
2149 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2156 quadPointsTypeDir1);
2158 quadPointsTypeDir1);
2160 quadPointsTypeDir1);
2170 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
2174 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2178 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2179 for (
int i = 0; i < nelmts; ++i)
2180 CollExp.push_back(Exp);
2189 const int nq = Exp->GetTotPoints();
2196 Exp->GetCoords(xc, yc, zc);
2198 for (
int i = 0; i < nq; ++i)
2200 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2202 Exp->IProductWRTBase(phys, coeffs1);
2204 for (
int i = 1; i < nelmts; ++i)
2207 Exp->IProductWRTBase(phys + i * nq,
2208 tmp = coeffs1 + i * Exp->GetNcoeffs());
2212 double epsilon = 1.0e-4;
2213 for (
int i = 0; i < coeffs1.size(); ++i)
2216 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2217 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2218 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2223 TestHexIProductWRTBase_SumFac_VariableP_MultiElmt_CollDir12)
2243 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2250 quadPointsTypeDir1);
2252 quadPointsTypeDir1);
2254 quadPointsTypeDir1);
2264 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
2268 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2272 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2273 for (
int i = 0; i < nelmts; ++i)
2274 CollExp.push_back(Exp);
2283 const int nq = Exp->GetTotPoints();
2290 Exp->GetCoords(xc, yc, zc);
2292 for (
int i = 0; i < nq; ++i)
2294 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2296 Exp->IProductWRTBase(phys, coeffs1);
2298 for (
int i = 1; i < nelmts; ++i)
2301 Exp->IProductWRTBase(phys + i * nq,
2302 tmp = coeffs1 + i * Exp->GetNcoeffs());
2306 double epsilon = 1.0e-4;
2307 for (
int i = 0; i < coeffs1.size(); ++i)
2310 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2311 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2312 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2336 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2342 unsigned int numQuadPoints = 6;
2344 quadPointsTypeDir1);
2350 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
2354 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2356 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2357 CollExp.push_back(Exp);
2366 const int nq = Exp->GetTotPoints();
2372 Exp->GetCoords(xc, yc, zc);
2374 for (
int i = 0; i < nq; ++i)
2376 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2379 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
2381 tmp2 = diff2 + 2 * nq);
2383 double epsilon = 1.0e-8;
2384 for (
int i = 0; i < diff1.size(); ++i)
2386 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2410 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2416 unsigned int numQuadPoints = 6;
2417 unsigned int numModes = 2;
2419 quadPointsTypeDir1);
2425 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
2429 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2431 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2432 CollExp.push_back(Exp);
2441 const int nq = Exp->GetTotPoints();
2447 Exp->GetCoords(xc, yc, zc);
2449 for (
int i = 0; i < nq; ++i)
2451 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2454 Exp->PhysDeriv(phys, diffRef, tmp = diffRef + nq, tmp1 = diffRef + 2 * nq);
2456 tmp2 = diff + 2 * nq);
2458 double epsilon = 1.0e-8;
2459 for (
int i = 0; i < diffRef.size(); ++i)
2461 diffRef[i] = (
std::abs(diffRef[i]) < 1e-14) ? 0.0 : diffRef[i];
2462 diff[i] = (
std::abs(diff[i]) < 1e-14) ? 0.0 : diff[i];
2463 BOOST_CHECK_CLOSE(diffRef[i], diff[i], epsilon);
2487 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2493 unsigned int numQuadPoints = 5;
2494 unsigned int numModes = 2;
2496 quadPointsTypeDir1);
2502 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
2506 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2508 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2509 CollExp.push_back(Exp);
2518 const int nq = Exp->GetTotPoints();
2524 Exp->GetCoords(xc, yc, zc);
2526 for (
int i = 0; i < nq; ++i)
2528 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2531 Exp->PhysDeriv(phys, diffRef, tmp = diffRef + nq, tmp1 = diffRef + 2 * nq);
2533 tmp2 = diff + 2 * nq);
2535 double epsilon = 1.0e-8;
2536 for (
int i = 0; i < diffRef.size(); ++i)
2538 diffRef[i] = (
std::abs(diffRef[i]) < 1e-14) ? 0.0 : diffRef[i];
2539 diff[i] = (
std::abs(diff[i]) < 1e-14) ? 0.0 : diff[i];
2540 BOOST_CHECK_CLOSE(diffRef[i], diff[i], epsilon);
2564 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2571 quadPointsTypeDir1);
2573 quadPointsTypeDir1);
2575 quadPointsTypeDir1);
2585 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
2589 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2593 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2594 for (
int i = 0; i < nelmts; ++i)
2596 CollExp.push_back(Exp);
2606 const int nq = Exp->GetTotPoints();
2612 Exp->GetCoords(xc, yc, zc);
2614 for (
int i = 0; i < nq; ++i)
2616 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2618 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
2619 tmp2 = diff1 + (2 * nelmts) * nq);
2620 for (
int i = 1; i < nelmts; ++i)
2623 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2624 tmp1 = diff1 + (nelmts + i) * nq,
2625 tmp2 = diff1 + (2 * nelmts + i) * nq);
2629 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2631 double epsilon = 1.0e-8;
2632 for (
int i = 0; i < diff1.size(); ++i)
2634 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2658 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2665 quadPointsTypeDir1);
2667 quadPointsTypeDir1);
2669 quadPointsTypeDir1);
2679 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
2683 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2687 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2688 for (
int i = 0; i < nelmts; ++i)
2690 CollExp.push_back(Exp);
2700 const int nq = Exp->GetTotPoints();
2706 Exp->GetCoords(xc, yc, zc);
2708 for (
int i = 0; i < nq; ++i)
2710 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2712 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
2713 tmp2 = diff1 + (2 * nelmts) * nq);
2715 for (
int i = 1; i < nelmts; ++i)
2718 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2719 tmp1 = diff1 + (nelmts + i) * nq,
2720 tmp2 = diff1 + (2 * nelmts + i) * nq);
2724 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2726 double epsilon = 1.0e-8;
2727 for (
int i = 0; i < diff1.size(); ++i)
2729 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2753 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2759 unsigned int numQuadPoints = 4;
2761 quadPointsTypeDir1);
2767 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
2771 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2773 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2774 CollExp.push_back(Exp);
2783 const int nq = Exp->GetTotPoints();
2789 Exp->GetCoords(xc, yc, zc);
2791 for (
int i = 0; i < nq; ++i)
2793 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2796 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
2798 tmp2 = diff2 + 2 * nq);
2800 double epsilon = 1.0e-8;
2801 for (
int i = 0; i < diff1.size(); ++i)
2803 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2827 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2834 quadPointsTypeDir1);
2836 quadPointsTypeDir1);
2838 quadPointsTypeDir1);
2848 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
2852 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2856 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2857 for (
int i = 0; i < nelmts; ++i)
2859 CollExp.push_back(Exp);
2869 const int nq = Exp->GetTotPoints();
2875 Exp->GetCoords(xc, yc, zc);
2877 for (
int i = 0; i < nq; ++i)
2879 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2881 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
2882 tmp2 = diff1 + (2 * nelmts) * nq);
2883 for (
int i = 1; i < nelmts; ++i)
2886 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2887 tmp1 = diff1 + (nelmts + i) * nq,
2888 tmp2 = diff1 + (2 * nelmts + i) * nq);
2892 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2894 double epsilon = 1.0e-8;
2895 for (
int i = 0; i < diff1.size(); ++i)
2897 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2921 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
2927 unsigned int numQuadPoints = 6;
2929 quadPointsTypeDir1);
2935 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
2939 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2941 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2942 CollExp.push_back(Exp);
2951 const int nq = Exp->GetTotPoints();
2957 Exp->GetCoords(xc, yc, zc);
2959 for (
int i = 0; i < nq; ++i)
2961 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2964 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
2966 tmp2 = diff2 + 2 * nq);
2968 double epsilon = 1.0e-8;
2969 for (
int i = 0; i < diff1.size(); ++i)
2971 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2995 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3002 quadPointsTypeDir1);
3004 quadPointsTypeDir1);
3006 quadPointsTypeDir1);
3016 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
3020 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3024 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3025 for (
int i = 0; i < nelmts; ++i)
3027 CollExp.push_back(Exp);
3037 const int nq = Exp->GetTotPoints();
3043 Exp->GetCoords(xc, yc, zc);
3045 for (
int i = 0; i < nq; ++i)
3047 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3049 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
3050 tmp2 = diff1 + (2 * nelmts) * nq);
3051 for (
int i = 1; i < nelmts; ++i)
3054 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
3055 tmp1 = diff1 + (nelmts + i) * nq,
3056 tmp2 = diff1 + (2 * nelmts + i) * nq);
3060 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
3062 double epsilon = 1.0e-8;
3063 for (
int i = 0; i < diff1.size(); ++i)
3065 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
3089 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3095 unsigned int numQuadPoints = 6;
3097 quadPointsTypeDir1);
3103 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
3107 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3109 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3110 CollExp.push_back(Exp);
3119 const int nq = Exp->GetTotPoints();
3120 const int nm = Exp->GetNcoeffs();
3129 Exp->GetCoords(xc, yc, zc);
3131 for (
int i = 0; i < nq; ++i)
3133 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3134 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3135 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3139 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
3140 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
3141 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3142 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
3143 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3148 double epsilon = 1.0e-8;
3149 for (
int i = 0; i < nm; ++i)
3151 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3152 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3153 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3177 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3183 unsigned int numQuadPoints = 5;
3184 unsigned int numModes = 4;
3186 quadPointsTypeDir1);
3192 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
3196 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3198 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3199 CollExp.push_back(Exp);
3208 const int nq = Exp->GetTotPoints();
3209 const int nm = Exp->GetNcoeffs();
3218 Exp->GetCoords(xc, yc, zc);
3220 for (
int i = 0; i < nq; ++i)
3222 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3223 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3224 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3228 Exp->IProductWRTDerivBase(0, phys1, coeffsRef);
3229 Exp->IProductWRTDerivBase(1, phys2, coeffs);
3230 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3231 Exp->IProductWRTDerivBase(2, phys3, coeffs);
3232 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3237 double epsilon = 1.0e-8;
3238 for (
int i = 0; i < nm; ++i)
3240 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3241 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3242 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3266 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3272 unsigned int numQuadPoints = 5;
3273 unsigned int numModes = 4;
3275 quadPointsTypeDir1);
3281 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
3285 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3287 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3288 CollExp.push_back(Exp);
3297 const int nq = Exp->GetTotPoints();
3298 const int nm = Exp->GetNcoeffs();
3307 Exp->GetCoords(xc, yc, zc);
3309 for (
int i = 0; i < nq; ++i)
3311 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3312 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3313 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3317 Exp->IProductWRTDerivBase(0, phys1, coeffsRef);
3318 Exp->IProductWRTDerivBase(1, phys2, coeffs);
3319 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3320 Exp->IProductWRTDerivBase(2, phys3, coeffs);
3321 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3326 double epsilon = 1.0e-8;
3327 for (
int i = 0; i < nm; ++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 TestHexIProductWRTDerivBase_MatrixFree_UniformP_Deformed_OverInt)
3356 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3362 unsigned int numQuadPoints = 8;
3363 unsigned int numModes = 4;
3365 quadPointsTypeDir1);
3371 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
3375 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3377 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3378 CollExp.push_back(Exp);
3387 const int nq = Exp->GetTotPoints();
3388 const int nm = Exp->GetNcoeffs();
3397 Exp->GetCoords(xc, yc, zc);
3399 for (
int i = 0; i < nq; ++i)
3401 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3402 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3403 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3407 Exp->IProductWRTDerivBase(0, phys1, coeffsRef);
3408 Exp->IProductWRTDerivBase(1, phys2, coeffs);
3409 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3410 Exp->IProductWRTDerivBase(2, phys3, coeffs);
3411 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3416 double epsilon = 1.0e-8;
3417 for (
int i = 0; i < nm; ++i)
3419 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3420 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3421 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3445 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3452 quadPointsTypeDir1);
3454 quadPointsTypeDir1);
3456 quadPointsTypeDir1);
3466 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
3470 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3474 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3475 for (
int i = 0; i < nelmts; ++i)
3477 CollExp.push_back(Exp);
3487 const int nq = Exp->GetTotPoints();
3488 const int nm = Exp->GetNcoeffs();
3498 Exp->GetCoords(xc, yc, zc);
3500 for (
int i = 0; i < nq; ++i)
3502 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3503 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3504 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3507 for (
int i = 1; i < nelmts; ++i)
3515 for (
int i = 0; i < nelmts; ++i)
3518 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
3519 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
3520 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3521 tmp = coeffs1 + i * nm, 1);
3522 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
3523 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3524 tmp = coeffs1 + i * nm, 1);
3530 double epsilon = 1.0e-6;
3531 for (
int i = 0; i < coeffs1.size(); ++i)
3533 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3534 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3535 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3559 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3565 unsigned int numQuadPoints = 6;
3567 quadPointsTypeDir1);
3573 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
3577 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3579 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3580 CollExp.push_back(Exp);
3589 const int nq = Exp->GetTotPoints();
3590 const int nm = Exp->GetNcoeffs();
3599 Exp->GetCoords(xc, yc, zc);
3601 for (
int i = 0; i < nq; ++i)
3603 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3604 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3605 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3609 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
3610 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
3611 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3612 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
3613 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3618 double epsilon = 1.0e-8;
3619 for (
int i = 0; i < coeffs1.size(); ++i)
3621 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3622 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3623 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3647 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3654 quadPointsTypeDir1);
3656 quadPointsTypeDir1);
3658 quadPointsTypeDir1);
3668 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
3672 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3676 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3677 for (
int i = 0; i < nelmts; ++i)
3679 CollExp.push_back(Exp);
3689 const int nq = Exp->GetTotPoints();
3690 const int nm = Exp->GetNcoeffs();
3700 Exp->GetCoords(xc, yc, zc);
3702 for (
int i = 0; i < nq; ++i)
3704 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3705 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3706 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3709 for (
int i = 1; i < nelmts; ++i)
3717 for (
int i = 0; i < nelmts; ++i)
3720 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
3721 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
3722 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3723 tmp = coeffs1 + i * nm, 1);
3724 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
3725 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3726 tmp = coeffs1 + i * nm, 1);
3732 double epsilon = 1.0e-8;
3733 for (
int i = 0; i < coeffs1.size(); ++i)
3735 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3736 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3737 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3742 TestHexIProductWRTDerivBase_NoCollection_VariableP_MultiElmt)
3762 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3769 quadPointsTypeDir1);
3771 quadPointsTypeDir1);
3773 quadPointsTypeDir1);
3783 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
3787 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3791 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3792 for (
int i = 0; i < nelmts; ++i)
3794 CollExp.push_back(Exp);
3804 const int nq = Exp->GetTotPoints();
3805 const int nm = Exp->GetNcoeffs();
3814 Exp->GetCoords(xc, yc, zc);
3816 for (
int i = 0; i < nq; ++i)
3818 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3819 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3820 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3823 for (
int i = 1; i < nelmts; ++i)
3831 for (
int i = 0; i < nelmts; ++i)
3834 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
3835 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
3836 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3837 tmp = coeffs1 + i * nm, 1);
3838 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
3839 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3840 tmp = coeffs1 + i * nm, 1);
3846 double epsilon = 1.0e-6;
3847 for (
int i = 0; i < coeffs1.size(); ++i)
3849 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3850 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3851 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3875 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3881 unsigned int numQuadPoints = 6;
3883 quadPointsTypeDir1);
3889 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
3893 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3895 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3896 CollExp.push_back(Exp);
3905 const int nq = Exp->GetTotPoints();
3906 const int nm = Exp->GetNcoeffs();
3915 Exp->GetCoords(xc, yc, zc);
3917 for (
int i = 0; i < nq; ++i)
3919 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3920 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3921 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3925 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
3926 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
3927 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3928 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
3929 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3934 double epsilon = 1.0e-8;
3935 for (
int i = 0; i < coeffs1.size(); ++i)
3937 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3938 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3939 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3963 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
3970 quadPointsTypeDir1);
3972 quadPointsTypeDir1);
3974 quadPointsTypeDir1);
3984 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom);
3988 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3992 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3993 for (
int i = 0; i < nelmts; ++i)
3995 CollExp.push_back(Exp);
4005 const int nq = Exp->GetTotPoints();
4006 const int nm = Exp->GetNcoeffs();
4016 Exp->GetCoords(xc, yc, zc);
4018 for (
int i = 0; i < nq; ++i)
4020 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
4021 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
4022 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
4025 for (
int i = 1; i < nelmts; ++i)
4033 for (
int i = 0; i < nelmts; ++i)
4035 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
4036 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
4037 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
4038 tmp = coeffs1 + i * nm, 1);
4039 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
4040 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
4041 tmp = coeffs1 + i * nm, 1);
4047 double epsilon = 1.0e-8;
4048 for (
int i = 0; i < coeffs1.size(); ++i)
4050 coeffs1[i] = (
std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
4051 coeffs2[i] = (
std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
4052 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
4076 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
4082 unsigned int numQuadPoints = 5;
4083 unsigned int numModes = 4;
4086 quadPointsTypeDir1);
4092 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
4096 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4100 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4101 for (
int i = 0; i < nelmts; ++i)
4103 CollExp.push_back(Exp);
4116 const int nm = Exp->GetNcoeffs();
4121 for (
int i = 0; i < nm; ++i)
4126 for (
int i = 1; i < nelmts; ++i)
4128 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4134 for (
int i = 0; i < nelmts; ++i)
4137 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4142 double epsilon = 1.0e-8;
4143 for (
int i = 0; i < coeffsRef.size(); ++i)
4145 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4146 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4147 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4171 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
4177 unsigned int numQuadPoints = 5;
4178 unsigned int numModes = 4;
4181 quadPointsTypeDir1);
4187 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
4191 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4195 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4196 for (
int i = 0; i < nelmts; ++i)
4198 CollExp.push_back(Exp);
4211 const int nm = Exp->GetNcoeffs();
4216 for (
int i = 0; i < nm; ++i)
4221 for (
int i = 1; i < nelmts; ++i)
4223 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4229 for (
int i = 0; i < nelmts; ++i)
4232 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4237 double epsilon = 1.0e-8;
4238 for (
int i = 0; i < coeffsRef.size(); ++i)
4240 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4241 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4242 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4266 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
4272 unsigned int numQuadPoints = 5;
4273 unsigned int numModes = 4;
4276 quadPointsTypeDir1);
4282 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
4286 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4290 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4291 for (
int i = 0; i < nelmts; ++i)
4293 CollExp.push_back(Exp);
4312 const int nm = Exp->GetNcoeffs();
4317 for (
int i = 0; i < nm; ++i)
4322 for (
int i = 1; i < nelmts; ++i)
4324 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4330 for (
int i = 0; i < nelmts; ++i)
4333 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4338 double epsilon = 1.0e-8;
4339 for (
int i = 0; i < coeffsRef.size(); ++i)
4341 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4342 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4343 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4367 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
4373 unsigned int numQuadPoints = 5;
4374 unsigned int numModes = 4;
4377 quadPointsTypeDir1);
4383 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
4387 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4391 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4392 for (
int i = 0; i < nelmts; ++i)
4394 CollExp.push_back(Exp);
4407 const int nm = Exp->GetNcoeffs();
4412 for (
int i = 0; i < nm; ++i)
4417 for (
int i = 1; i < nelmts; ++i)
4419 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4425 for (
int i = 0; i < nelmts; ++i)
4428 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4433 double epsilon = 1.0e-8;
4434 for (
int i = 0; i < coeffsRef.size(); ++i)
4436 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4437 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4438 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4462 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
4468 unsigned int numQuadPoints = 8;
4469 unsigned int numModes = 4;
4472 quadPointsTypeDir1);
4478 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
4482 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4486 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4487 for (
int i = 0; i < nelmts; ++i)
4489 CollExp.push_back(Exp);
4502 const int nm = Exp->GetNcoeffs();
4507 for (
int i = 0; i < nm; ++i)
4512 for (
int i = 1; i < nelmts; ++i)
4514 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4520 for (
int i = 0; i < nelmts; ++i)
4523 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4528 double epsilon = 1.0e-8;
4529 for (
int i = 0; i < coeffsRef.size(); ++i)
4531 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4532 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4533 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4557 CreateHex(v0, v1, v2, v3, v4, v5, v6, v7);
4563 unsigned int numQuadPoints = 5;
4564 unsigned int numModes = 4;
4567 quadPointsTypeDir1);
4573 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom);
4577 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4581 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4582 for (
int i = 0; i < nelmts; ++i)
4584 CollExp.push_back(Exp);
4603 const int nm = Exp->GetNcoeffs();
4608 for (
int i = 0; i < nm; ++i)
4613 for (
int i = 1; i < nelmts; ++i)
4615 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4621 for (
int i = 0; i < nelmts; ++i)
4624 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4629 double epsilon = 1.0e-8;
4630 for (
int i = 0; i < coeffsRef.size(); ++i)
4632 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4633 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4634 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
COLLECTIONS_EXPORT void Initialise(const OperatorType opType, StdRegions::FactorMap factors=StdRegions::NullFactorMap)
void ApplyOperator(const OperatorType &op, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &output)
COLLECTIONS_EXPORT OperatorImpMap GetOperatorImpMap(StdRegions::StdExpansionSharedPtr pExp)
Get Operator Implementation Map from XMl or using default;.
Describes the specification for a Basis.
Defines a specification for a set of points.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::map< OperatorType, ImplementationType > OperatorImpMap
BOOST_AUTO_TEST_CASE(TestHexBwdTrans_StdMat_UniformP)
SpatialDomains::HexGeomSharedPtr CreateHex(SpatialDomains::PointGeomSharedPtr v0, SpatialDomains::PointGeomSharedPtr v1, SpatialDomains::PointGeomSharedPtr v2, SpatialDomains::PointGeomSharedPtr v3, SpatialDomains::PointGeomSharedPtr v4, SpatialDomains::PointGeomSharedPtr v5, SpatialDomains::PointGeomSharedPtr v6, SpatialDomains::PointGeomSharedPtr v7)
SpatialDomains::SegGeomSharedPtr CreateSegGeom(unsigned int id, SpatialDomains::PointGeomSharedPtr v0, SpatialDomains::PointGeomSharedPtr v1)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
std::shared_ptr< HexExp > HexExpSharedPtr
std::shared_ptr< QuadGeom > QuadGeomSharedPtr
std::shared_ptr< HexGeom > HexGeomSharedPtr
std::shared_ptr< SegGeom > SegGeomSharedPtr
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::map< ConstFactorType, NekDouble > ConstFactorMap
std::shared_ptr< StdHexExp > StdHexExpSharedPtr
StdRegions::ConstFactorMap factors
The above copyright notice and this permission notice shall be included.
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > abs(scalarT< T > in)