39#include <boost/test/tools/floating_point_comparison.hpp>
40#include <boost/test/unit_test.hpp>
44namespace TetCollectionTests
117 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
126 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
136 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
138 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
139 CollExp.push_back(Exp);
152 Exp->BwdTrans(coeffs, phys1);
155 double epsilon = 1.0e-8;
156 for (
int i = 0; i < phys1.size(); ++i)
158 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
185 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
194 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
204 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
208 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
209 for (
int i = 0; i < nelmts; ++i)
210 CollExp.push_back(Exp);
223 for (
int i = 0; i < nelmts; ++i)
225 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
226 tmp = phys1 + i * Exp->GetTotPoints());
231 double epsilon = 1.0e-8;
232 for (
int i = 0; i < phys1.size(); ++i)
234 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
261 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
270 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
280 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
282 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
283 CollExp.push_back(Exp);
292 const int nq = Exp->GetTotPoints();
299 Exp->GetCoords(xc, yc, zc);
301 for (
int i = 0; i < nq; ++i)
303 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
306 Exp->IProductWRTBase(phys, coeffs1);
309 double epsilon = 1.0e-8;
310 for (
int i = 0; i < coeffs1.size(); ++i)
312 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
339 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
350 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
360 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
364 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
365 for (
int i = 0; i < nelmts; ++i)
367 CollExp.push_back(Exp);
377 const int nq = Exp->GetTotPoints();
384 Exp->GetCoords(xc, yc, zc);
386 for (
int i = 0; i < nq; ++i)
388 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
390 Exp->IProductWRTBase(phys, coeffs1);
392 for (
int i = 1; i < nelmts; ++i)
395 Exp->IProductWRTBase(phys + i * nq,
396 tmp = coeffs1 + i * Exp->GetNcoeffs());
400 double epsilon = 1.0e-4;
401 for (
int i = 0; i < coeffs1.size(); ++i)
404 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
405 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
406 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
433 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
442 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
452 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
454 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
455 CollExp.push_back(Exp);
468 Exp->BwdTrans(coeffs, phys1);
471 double epsilon = 1.0e-8;
472 for (
int i = 0; i < phys1.size(); ++i)
474 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
501 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
510 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
520 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
524 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
525 for (
int i = 0; i < nelmts; ++i)
527 CollExp.push_back(Exp);
541 for (
int i = 0; i < nelmts; ++i)
543 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
544 tmp = phys1 + i * Exp->GetTotPoints());
549 double epsilon = 1.0e-8;
550 for (
int i = 0; i < phys1.size(); ++i)
552 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
579 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
588 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
598 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
600 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
601 CollExp.push_back(Exp);
614 Exp->BwdTrans(coeffs, phys1);
617 double epsilon = 1.0e-8;
618 for (
int i = 0; i < phys1.size(); ++i)
620 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
647 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
656 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
666 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
670 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
671 for (
int i = 0; i < nelmts; ++i)
672 CollExp.push_back(Exp);
685 for (
int i = 0; i < nelmts; ++i)
687 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
688 tmp = phys1 + i * Exp->GetTotPoints());
693 double epsilon = 1.0e-8;
694 for (
int i = 0; i < phys1.size(); ++i)
696 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
723 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
732 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
742 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
746 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
747 for (
int i = 0; i < nelmts; ++i)
748 CollExp.push_back(Exp);
761 for (
int i = 0; i < nelmts; ++i)
763 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
764 tmp = phys1 + i * Exp->GetTotPoints());
769 double epsilon = 1.0e-8;
770 for (
int i = 0; i < phys1.size(); ++i)
772 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
789 unsigned int numQuadPoints = 5;
790 unsigned int numModes = 4;
802 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
811 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
821 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
823 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
824 CollExp.push_back(Exp);
839 Exp->BwdTrans(coeffs, physRef);
842 double epsilon = 1.0e-8;
843 for (
int i = 0; i < physRef.size(); ++i)
845 BOOST_CHECK_CLOSE(physRef[i], phys[i], epsilon);
862 unsigned int numQuadPoints = 8;
863 unsigned int numModes = 4;
875 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
884 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
894 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
896 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
897 CollExp.push_back(Exp);
912 Exp->BwdTrans(coeffs, physRef);
915 double epsilon = 1.0e-8;
916 for (
int i = 0; i < physRef.size(); ++i)
918 BOOST_CHECK_CLOSE(physRef[i], phys[i], epsilon);
945 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
954 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
964 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
966 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
967 CollExp.push_back(Exp);
976 const int nq = Exp->GetTotPoints();
983 Exp->GetCoords(xc, yc, zc);
985 for (
int i = 0; i < nq; ++i)
987 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
990 Exp->IProductWRTBase(phys, coeffs1);
993 double epsilon = 1.0e-8;
994 for (
int i = 0; i < coeffs1.size(); ++i)
996 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1023 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1032 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1042 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1046 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1047 for (
int i = 0; i < nelmts; ++i)
1049 CollExp.push_back(Exp);
1059 const int nq = Exp->GetTotPoints();
1066 Exp->GetCoords(xc, yc, zc);
1068 for (
int i = 0; i < nq; ++i)
1070 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1072 Exp->IProductWRTBase(phys, coeffs1);
1074 for (
int i = 1; i < nelmts; ++i)
1077 Exp->IProductWRTBase(phys + i * nq,
1078 tmp = coeffs1 + i * Exp->GetNcoeffs());
1082 double epsilon = 1.0e-4;
1083 for (
int i = 0; i < coeffs1.size(); ++i)
1086 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1087 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1088 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1115 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1124 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1134 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1136 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1137 CollExp.push_back(Exp);
1146 const int nq = Exp->GetTotPoints();
1153 Exp->GetCoords(xc, yc, zc);
1155 for (
int i = 0; i < nq; ++i)
1157 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1160 Exp->IProductWRTBase(phys, coeffs1);
1163 double epsilon = 1.0e-8;
1164 for (
int i = 0; i < coeffs1.size(); ++i)
1166 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1193 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1204 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1214 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1218 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1219 for (
int i = 0; i < nelmts; ++i)
1221 CollExp.push_back(Exp);
1231 const int nq = Exp->GetTotPoints();
1238 Exp->GetCoords(xc, yc, zc);
1240 for (
int i = 0; i < nq; ++i)
1242 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1244 Exp->IProductWRTBase(phys, coeffs1);
1246 for (
int i = 1; i < nelmts; ++i)
1249 Exp->IProductWRTBase(phys + i * nq,
1250 tmp = coeffs1 + i * Exp->GetNcoeffs());
1254 double epsilon = 1.0e-4;
1255 for (
int i = 0; i < coeffs1.size(); ++i)
1258 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
1259 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
1260 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1277 unsigned int numQuadPoints = 5;
1278 unsigned int numModes = 4;
1290 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1299 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1309 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1311 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1312 CollExp.push_back(Exp);
1323 const int nq = Exp->GetTotPoints();
1330 Exp->GetCoords(xc, yc, zc);
1332 for (
int i = 0; i < nq; ++i)
1334 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1337 Exp->IProductWRTBase(phys, coeffsRef);
1340 double epsilon = 1.0e-8;
1341 for (
int i = 0; i < coeffsRef.size(); ++i)
1343 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1360 unsigned int numQuadPoints = 5;
1361 unsigned int numModes = 4;
1373 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1382 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1392 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1394 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1395 CollExp.push_back(Exp);
1406 const int nq = Exp->GetTotPoints();
1413 Exp->GetCoords(xc, yc, zc);
1415 for (
int i = 0; i < nq; ++i)
1417 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1420 Exp->IProductWRTBase(phys, coeffsRef);
1423 double epsilon = 1.0e-8;
1424 for (
int i = 0; i < coeffsRef.size(); ++i)
1426 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1431 TestTetIProductWRTBase_MatrixFree_UniformP_Deformed_OverInt)
1444 unsigned int numQuadPoints = 8;
1445 unsigned int numModes = 4;
1457 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1466 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1476 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1478 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1479 CollExp.push_back(Exp);
1490 const int nq = Exp->GetTotPoints();
1497 Exp->GetCoords(xc, yc, zc);
1499 for (
int i = 0; i < nq; ++i)
1501 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1504 Exp->IProductWRTBase(phys, coeffsRef);
1507 double epsilon = 1.0e-8;
1508 for (
int i = 0; i < coeffsRef.size(); ++i)
1510 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1537 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1546 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1556 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1558 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1559 CollExp.push_back(Exp);
1568 const int nq = Exp->GetTotPoints();
1574 Exp->GetCoords(xc, yc, zc);
1576 for (
int i = 0; i < nq; ++i)
1578 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1581 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
1583 tmp2 = diff2 + 2 * nq);
1585 double epsilon = 1.0e-8;
1586 for (
int i = 0; i < diff1.size(); ++i)
1588 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1615 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1624 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1634 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1638 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1639 for (
int i = 0; i < nelmts; ++i)
1641 CollExp.push_back(Exp);
1651 const int nq = Exp->GetTotPoints();
1657 Exp->GetCoords(xc, yc, zc);
1659 for (
int i = 0; i < nq; ++i)
1661 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1663 Exp->PhysDeriv(phys, diff1, tmp1 = diff1 + (nelmts)*nq,
1664 tmp2 = diff1 + (2 * nelmts) * nq);
1666 for (
int i = 1; i < nelmts; ++i)
1669 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
1670 tmp1 = diff1 + (nelmts + i) * nq,
1671 tmp2 = diff1 + (2 * nelmts + i) * nq);
1675 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
1677 double epsilon = 1.0e-8;
1678 for (
int i = 0; i < diff1.size(); ++i)
1680 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1707 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1716 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1726 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1728 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1729 CollExp.push_back(Exp);
1738 const int nq = Exp->GetTotPoints();
1744 Exp->GetCoords(xc, yc, zc);
1746 for (
int i = 0; i < nq; ++i)
1748 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1751 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
1753 tmp2 = diff2 + 2 * nq);
1755 double epsilon = 1.0e-8;
1756 for (
int i = 0; i < diff1.size(); ++i)
1758 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1785 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1794 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1804 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1808 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1809 for (
int i = 0; i < nelmts; ++i)
1811 CollExp.push_back(Exp);
1821 const int nq = Exp->GetTotPoints();
1827 Exp->GetCoords(xc, yc, zc);
1829 for (
int i = 0; i < nq; ++i)
1831 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1833 Exp->PhysDeriv(phys, diff1, tmp1 = diff1 + (nelmts)*nq,
1834 tmp2 = diff1 + (2 * nelmts) * nq);
1836 for (
int i = 1; i < nelmts; ++i)
1839 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
1840 tmp1 = diff1 + (nelmts + i) * nq,
1841 tmp2 = diff1 + (2 * nelmts + i) * nq);
1845 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
1847 double epsilon = 1.0e-8;
1848 for (
int i = 0; i < diff1.size(); ++i)
1850 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1877 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1886 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1896 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1898 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1899 CollExp.push_back(Exp);
1908 const int nq = Exp->GetTotPoints();
1914 Exp->GetCoords(xc, yc, zc);
1916 for (
int i = 0; i < nq; ++i)
1918 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1921 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
1923 tmp2 = diff2 + 2 * nq);
1925 double epsilon = 1.0e-8;
1926 for (
int i = 0; i < diff1.size(); ++i)
1928 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
1955 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
1964 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
1974 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
1978 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1979 for (
int i = 0; i < nelmts; ++i)
1981 CollExp.push_back(Exp);
1991 const int nq = Exp->GetTotPoints();
1997 Exp->GetCoords(xc, yc, zc);
1999 for (
int i = 0; i < nq; ++i)
2001 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2003 Exp->PhysDeriv(phys, diff1, tmp1 = diff1 + (nelmts)*nq,
2004 tmp2 = diff1 + (2 * nelmts) * nq);
2006 for (
int i = 1; i < nelmts; ++i)
2009 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2010 tmp1 = diff1 + (nelmts + i) * nq,
2011 tmp2 = diff1 + (2 * nelmts + i) * nq);
2015 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2017 double epsilon = 1.0e-8;
2018 for (
int i = 0; i < diff1.size(); ++i)
2020 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2037 unsigned int numQuadPoints = 5;
2038 unsigned int numModes = 4;
2050 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2059 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2069 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2071 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2072 CollExp.push_back(Exp);
2083 const int nq = Exp->GetTotPoints();
2089 Exp->GetCoords(xc, yc, zc);
2091 for (
int i = 0; i < nq; ++i)
2093 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2096 Exp->PhysDeriv(phys, diffRef, tmp = diffRef + nq, tmp1 = diffRef + 2 * nq);
2098 tmp2 = diff + 2 * nq);
2100 double epsilon = 1.0e-8;
2101 for (
int i = 0; i < diffRef.size(); ++i)
2103 BOOST_CHECK_CLOSE(diffRef[i], diff[i], epsilon);
2130 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2139 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2149 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2151 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2152 CollExp.push_back(Exp);
2161 const int nq = Exp->GetTotPoints();
2162 const int nm = Exp->GetNcoeffs();
2171 Exp->GetCoords(xc, yc, zc);
2173 for (
int i = 0; i < nq; ++i)
2175 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2176 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2177 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2181 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
2182 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
2183 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
2184 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
2185 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
2190 double epsilon = 1.0e-8;
2191 for (
int i = 0; i < coeffs1.size(); ++i)
2193 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2194 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2195 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2222 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2233 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2243 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2247 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2248 for (
int i = 0; i < nelmts; ++i)
2250 CollExp.push_back(Exp);
2260 const int nq = Exp->GetTotPoints();
2261 const int nm = Exp->GetNcoeffs();
2270 Exp->GetCoords(xc, yc, zc);
2272 for (
int i = 0; i < nq; ++i)
2274 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2275 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2276 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2278 for (
int i = 1; i < nelmts; ++i)
2286 for (
int i = 0; i < nelmts; ++i)
2288 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2289 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2290 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2291 tmp = coeffs1 + i * nm, 1);
2292 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2293 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2294 tmp = coeffs1 + i * nm, 1);
2300 double epsilon = 1.0e-8;
2301 for (
int i = 0; i < coeffs1.size(); ++i)
2303 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2304 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2305 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2332 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2341 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2351 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2353 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2354 CollExp.push_back(Exp);
2363 const int nq = Exp->GetTotPoints();
2364 const int nm = Exp->GetNcoeffs();
2373 Exp->GetCoords(xc, yc, zc);
2375 for (
int i = 0; i < nq; ++i)
2377 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2378 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2379 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2383 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
2384 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
2385 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
2386 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
2387 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
2392 double epsilon = 1.0e-8;
2393 for (
int i = 0; i < coeffs1.size(); ++i)
2395 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2396 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2397 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2424 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2435 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2445 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2449 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2450 for (
int i = 0; i < nelmts; ++i)
2452 CollExp.push_back(Exp);
2462 const int nq = Exp->GetTotPoints();
2463 const int nm = Exp->GetNcoeffs();
2472 Exp->GetCoords(xc, yc, zc);
2474 for (
int i = 0; i < nq; ++i)
2476 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2477 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2478 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2480 for (
int i = 1; i < nelmts; ++i)
2488 for (
int i = 0; i < nelmts; ++i)
2490 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2491 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2492 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2493 tmp = coeffs1 + i * nm, 1);
2494 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2495 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2496 tmp = coeffs1 + i * nm, 1);
2502 double epsilon = 1.0e-8;
2503 for (
int i = 0; i < coeffs1.size(); ++i)
2505 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2506 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2507 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2534 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2543 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2553 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2555 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2556 CollExp.push_back(Exp);
2565 const int nq = Exp->GetTotPoints();
2566 const int nm = Exp->GetNcoeffs();
2575 Exp->GetCoords(xc, yc, zc);
2577 for (
int i = 0; i < nq; ++i)
2579 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2580 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2581 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2585 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
2586 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
2587 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
2588 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
2589 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
2594 double epsilon = 1.0e-7;
2595 for (
int i = 0; i < coeffs1.size(); ++i)
2597 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2598 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2599 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2626 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2637 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2647 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2651 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2652 for (
int i = 0; i < nelmts; ++i)
2654 CollExp.push_back(Exp);
2664 const int nq = Exp->GetTotPoints();
2665 const int nm = Exp->GetNcoeffs();
2674 Exp->GetCoords(xc, yc, zc);
2676 for (
int i = 0; i < nq; ++i)
2678 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2679 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
2680 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
2682 for (
int i = 1; i < nelmts; ++i)
2690 for (
int i = 0; i < nelmts; ++i)
2692 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
2693 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
2694 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2695 tmp = coeffs1 + i * nm, 1);
2696 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
2697 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
2698 tmp = coeffs1 + i * nm, 1);
2704 double epsilon = 1.0e-7;
2705 for (
int i = 0; i < coeffs1.size(); ++i)
2707 coeffs1[i] = (fabs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2708 coeffs2[i] = (fabs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2709 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2726 unsigned int numQuadPoints = 5;
2727 unsigned int numModes = 4;
2739 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2748 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2758 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2762 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2766 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2767 for (
int i = 0; i < nelmts; ++i)
2769 CollExp.push_back(Exp);
2788 const int nm = Exp->GetNcoeffs();
2793 for (
int i = 0; i < nm; ++i)
2798 for (
int i = 1; i < nelmts; ++i)
2800 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
2806 for (
int i = 0; i < nelmts; ++i)
2809 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
2814 double epsilon = 1.0e-8;
2815 for (
int i = 0; i < coeffsRef.size(); ++i)
2817 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
2818 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
2819 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
2836 unsigned int numQuadPoints = 5;
2837 unsigned int numModes = 4;
2849 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2858 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2868 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2872 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2876 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2877 for (
int i = 0; i < nelmts; ++i)
2879 CollExp.push_back(Exp);
2892 const int nm = Exp->GetNcoeffs();
2897 for (
int i = 0; i < nm; ++i)
2902 for (
int i = 1; i < nelmts; ++i)
2904 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
2910 for (
int i = 0; i < nelmts; ++i)
2913 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
2918 double epsilon = 1.0e-8;
2919 for (
int i = 0; i < coeffsRef.size(); ++i)
2921 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
2922 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
2923 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
2940 unsigned int numQuadPoints = 8;
2941 unsigned int numModes = 4;
2953 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
2962 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
2972 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
2976 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2980 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2981 for (
int i = 0; i < nelmts; ++i)
2983 CollExp.push_back(Exp);
2996 const int nm = Exp->GetNcoeffs();
3001 for (
int i = 0; i < nm; ++i)
3006 for (
int i = 1; i < nelmts; ++i)
3008 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
3014 for (
int i = 0; i < nelmts; ++i)
3017 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
3022 double epsilon = 1.0e-8;
3023 for (
int i = 0; i < coeffsRef.size(); ++i)
3025 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3026 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3027 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3044 unsigned int numQuadPoints = 5;
3045 unsigned int numModes = 4;
3057 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3066 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
3076 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
3078 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3079 CollExp.push_back(Exp);
3090 const int nq = Exp->GetTotPoints();
3091 const int nm = Exp->GetNcoeffs();
3100 Exp->GetCoords(xc, yc, zc);
3102 for (
int i = 0; i < nq; ++i)
3104 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3105 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3106 phys3[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3110 Exp->IProductWRTDerivBase(0, phys1, coeffsRef);
3111 Exp->IProductWRTDerivBase(1, phys2, coeffs);
3112 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3113 Exp->IProductWRTDerivBase(2, phys3, coeffs);
3114 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3119 double epsilon = 1.0e-7;
3120 for (
int i = 0; i < coeffsRef.size(); ++i)
3122 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3123 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3124 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3141 unsigned int numQuadPoints = 5;
3142 unsigned int numModes = 4;
3154 Nektar::LibUtilities::eGaussRadauMAlpha1Beta0;
3163 Nektar::LibUtilities::eGaussRadauMAlpha2Beta0;
3173 basisKeyDir1, basisKeyDir2, basisKeyDir3, tetGeom);
3177 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3181 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3182 for (
int i = 0; i < nelmts; ++i)
3184 CollExp.push_back(Exp);
3203 const int nm = Exp->GetNcoeffs();
3208 for (
int i = 0; i < nm; ++i)
3213 for (
int i = 1; i < nelmts; ++i)
3215 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
3221 for (
int i = 0; i < nelmts; ++i)
3224 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
3229 double epsilon = 1.0e-8;
3230 for (
int i = 0; i < coeffsRef.size(); ++i)
3232 coeffsRef[i] = (
std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3233 coeffs[i] = (
std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3234 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.
static const int kNedges
Get the orientation of face1.
std::map< OperatorType, ImplementationType > OperatorImpMap
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eModified_B
Principle Modified Functions .
@ eModified_C
Principle Modified Functions .
@ eModified_A
Principle Modified Functions .
std::shared_ptr< TetExp > TetExpSharedPtr
std::shared_ptr< SegGeom > SegGeomSharedPtr
std::shared_ptr< TetGeom > TetGeomSharedPtr
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< TriGeom > TriGeomSharedPtr
std::shared_ptr< StdTetExp > StdTetExpSharedPtr
std::map< ConstFactorType, NekDouble > ConstFactorMap
BOOST_AUTO_TEST_CASE(TestTetBwdTrans_IterPerExp_UniformP)
SpatialDomains::TetGeomSharedPtr CreateTet(SpatialDomains::PointGeomSharedPtr v0, SpatialDomains::PointGeomSharedPtr v1, SpatialDomains::PointGeomSharedPtr v2, SpatialDomains::PointGeomSharedPtr v3)
SpatialDomains::SegGeomSharedPtr CreateSegGeom(unsigned int id, SpatialDomains::PointGeomSharedPtr v0, SpatialDomains::PointGeomSharedPtr v1)
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)