48 std::array<SpatialDomains::PointGeom *, 2> vertices = {v0, v1};
55 std::array<SpatialDomains::PointGeom *, 8> v,
56 std::array<SpatialDomains::SegGeomUniquePtr, 12> &segVec,
57 std::array<SpatialDomains::QuadGeomUniquePtr, 6> &faceVec)
59 std::array<std::array<int, 2>, 12> edgeVerts = {{{{0, 1}},
71 std::array<std::array<int, 4>, 6> faceEdges = {{{{0, 1, 2, 3}},
79 for (
int i = 0; i < 12; ++i)
81 segVec[i] =
CreateSegGeom(i, v[edgeVerts[i][0]], v[edgeVerts[i][1]]);
85 std::array<SpatialDomains::QuadGeom *, 6> faces;
86 for (
int i = 0; i < 6; ++i)
88 std::array<SpatialDomains::SegGeom *, 4> face;
89 for (
int j = 0; j < 4; ++j)
91 face[j] = segVec[faceEdges[i][j]].get();
95 faces[i] = faceVec[i].get();
122 std::array<SpatialDomains::PointGeom *, 8> v = {
123 v0.get(), v1.get(), v2.get(), v3.get(),
124 v4.get(), v5.get(), v6.get(), v7.get()};
125 std::array<SpatialDomains::SegGeomUniquePtr, 12> segVec;
126 std::array<SpatialDomains::QuadGeomUniquePtr, 6> faceVec;
133 unsigned int numQuadPoints = 6;
141 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
143 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
144 CollExp.push_back(Exp);
154 for (
int i = 0; i < coeffs.size(); ++i)
161 Exp->BwdTrans(coeffs, phys1);
164 double epsilon = 1.0e-8;
165 for (
int i = 0; i < phys1.size(); ++i)
167 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
190 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
191 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
193 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
214 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
218 basisKeyDir1, basisKeyDir2, basisKeyDir3);
220 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
221 CollExp.push_back(Exp);
231 for (
int i = 0; i < coeffs.size(); ++i)
235 Array<OneD, NekDouble> phys1(Exp->GetTotPoints());
236 Array<OneD, NekDouble> phys2(Exp->GetTotPoints());
238 Exp->BwdTrans(coeffs, phys1);
241 double epsilon = 1.0e-8;
242 for (
int i = 0; i < phys1.size(); ++i)
244 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
251 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
253 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
255 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
257 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
259 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
261 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
263 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
265 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
267 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
268 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
270 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
276 unsigned int numQuadPoints = 6;
284 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
288 basisKeyDir1, basisKeyDir1, basisKeyDir1);
290 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
291 CollExp.push_back(Exp);
294 Collections::CollectionOptimisation colOpt(dummySession, 3,
297 Collections::Collection c(CollExp, impTypes);
300 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs(), 1.0), tmp;
301 for (
int i = 0; i < coeffs.size(); ++i)
305 Array<OneD, NekDouble> phys1(Exp->GetTotPoints());
306 Array<OneD, NekDouble> phys2(Exp->GetTotPoints());
308 Exp->BwdTrans(coeffs, phys1);
311 double epsilon = 1.0e-8;
312 for (
int i = 0; i < phys1.size(); ++i)
314 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
321 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
323 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
325 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
327 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
329 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
331 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
333 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
335 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
337 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
338 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
340 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
346 unsigned int numQuadPoints = 6;
358 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
362 basisKeyDir1, basisKeyDir2, basisKeyDir3);
364 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
365 CollExp.push_back(Exp);
368 Collections::CollectionOptimisation colOpt(dummySession, 3,
371 Collections::Collection c(CollExp, impTypes);
374 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs(), 1.0), tmp;
375 for (
int i = 0; i < coeffs.size(); ++i)
379 Array<OneD, NekDouble> phys1(Exp->GetTotPoints());
380 Array<OneD, NekDouble> phys2(Exp->GetTotPoints());
382 Exp->BwdTrans(coeffs, phys1);
386 double epsilon = 1.0e-8;
387 for (
int i = 0; i < phys1.size(); ++i)
389 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
396 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
398 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
400 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
402 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
404 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
406 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
408 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
410 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
412 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
413 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
415 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
421 unsigned int numQuadPoints = 6;
433 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
437 basisKeyDir1, basisKeyDir2, basisKeyDir3);
441 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
442 for (
int i = 0; i < nelmts; ++i)
444 CollExp.push_back(Exp);
448 Collections::CollectionOptimisation colOpt(dummySession, 3,
451 Collections::Collection c(CollExp, impTypes);
454 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
455 for (
int i = 0; i < coeffs.size(); ++i)
459 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
460 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
462 for (
int i = 0; i < nelmts; ++i)
464 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
465 tmp = phys1 + i * Exp->GetTotPoints());
470 double epsilon = 1.0e-8;
471 for (
int i = 0; i < phys1.size(); ++i)
473 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
480 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
482 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
484 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
486 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
488 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
490 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
492 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
494 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
496 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
497 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
499 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
505 unsigned int numQuadPoints = 6;
517 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
521 basisKeyDir1, basisKeyDir2, basisKeyDir3);
523 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
524 CollExp.push_back(Exp);
527 Collections::CollectionOptimisation colOpt(dummySession, 3,
530 Collections::Collection c(CollExp, impTypes);
533 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs(), 1.0), tmp;
534 for (
int i = 0; i < coeffs.size(); ++i)
538 Array<OneD, NekDouble> phys1(Exp->GetTotPoints());
539 Array<OneD, NekDouble> phys2(Exp->GetTotPoints());
541 Exp->BwdTrans(coeffs, phys1);
545 double epsilon = 1.0e-8;
546 for (
int i = 0; i < phys1.size(); ++i)
548 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
555 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
557 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
559 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
561 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
563 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
565 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
567 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
569 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
571 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
572 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
574 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
580 unsigned int numQuadPoints = 6;
588 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
592 basisKeyDir1, basisKeyDir1, basisKeyDir1);
596 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
597 for (
int i = 0; i < nelmts; ++i)
599 CollExp.push_back(Exp);
603 Collections::CollectionOptimisation colOpt(dummySession, 3,
606 Collections::Collection c(CollExp, impTypes);
609 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
610 for (
int i = 0; i < coeffs.size(); ++i)
614 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
615 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
617 for (
int i = 0; i < nelmts; ++i)
619 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
620 tmp = phys1 + i * Exp->GetTotPoints());
624 double epsilon = 1.0e-8;
625 for (
int i = 0; i < phys1.size(); ++i)
627 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
634 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
636 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
638 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
640 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
642 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
644 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
646 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
648 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
650 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
651 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
653 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
659 unsigned int numQuadPoints = 6;
667 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
671 basisKeyDir1, basisKeyDir1, basisKeyDir1);
675 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
676 for (
int i = 0; i < nelmts; ++i)
678 CollExp.push_back(Exp);
682 Collections::CollectionOptimisation colOpt(dummySession, 3,
685 Collections::Collection c(CollExp, impTypes);
688 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
689 for (
int i = 0; i < coeffs.size(); ++i)
693 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
694 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
696 for (
int i = 0; i < nelmts; ++i)
698 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
699 tmp = phys1 + i * Exp->GetTotPoints());
703 double epsilon = 1.0e-8;
704 for (
int i = 0; i < phys1.size(); ++i)
706 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
713 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
715 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
717 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
719 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
721 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
723 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
725 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
727 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
729 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
730 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
732 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
753 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
757 basisKeyDir1, basisKeyDir2, basisKeyDir3);
761 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
762 for (
int i = 0; i < nelmts; ++i)
764 CollExp.push_back(Exp);
768 Collections::CollectionOptimisation colOpt(dummySession, 3,
771 Collections::Collection c(CollExp, impTypes);
774 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
775 for (
int i = 0; i < coeffs.size(); ++i)
779 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
780 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
782 for (
int i = 0; i < nelmts; ++i)
784 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
785 tmp = phys1 + i * Exp->GetTotPoints());
789 double epsilon = 1.0e-8;
790 for (
int i = 0; i < phys1.size(); ++i)
792 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
799 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
801 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
803 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
805 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
807 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
809 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
811 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
813 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
815 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
816 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
818 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
839 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
843 basisKeyDir1, basisKeyDir2, basisKeyDir3);
847 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
848 for (
int i = 0; i < nelmts; ++i)
850 CollExp.push_back(Exp);
854 Collections::CollectionOptimisation colOpt(dummySession, 3,
857 Collections::Collection c(CollExp, impTypes);
860 Array<OneD, NekDouble> coeffs(nelmts * Exp->GetNcoeffs(), 1.0), tmp;
861 for (
int i = 0; i < coeffs.size(); ++i)
865 Array<OneD, NekDouble> phys1(nelmts * Exp->GetTotPoints());
866 Array<OneD, NekDouble> phys2(nelmts * Exp->GetTotPoints());
868 for (
int i = 0; i < nelmts; ++i)
870 Exp->BwdTrans(coeffs + i * Exp->GetNcoeffs(),
871 tmp = phys1 + i * Exp->GetTotPoints());
875 double epsilon = 1.0e-8;
876 for (
int i = 0; i < phys1.size(); ++i)
878 BOOST_CHECK_CLOSE(phys1[i], phys2[i], epsilon);
885 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
887 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
889 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
891 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
893 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
895 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
897 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
899 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
901 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
902 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
904 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
910 unsigned int numQuadPoints = 6;
911 unsigned int numModes = 4;
919 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
923 basisKeyDir1, basisKeyDir1, basisKeyDir1);
925 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
926 CollExp.push_back(Exp);
929 Collections::CollectionOptimisation colOpt(dummySession, 3,
932 Collections::Collection c(CollExp, impTypes);
935 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs(), 1.0), tmp;
936 for (
int i = 0; i < coeffs.size(); ++i)
940 Array<OneD, NekDouble> physRef(Exp->GetTotPoints());
941 Array<OneD, NekDouble> phys(Exp->GetTotPoints());
943 Exp->BwdTrans(coeffs, physRef);
946 double epsilon = 1.0e-8;
947 for (
int i = 0; i < physRef.size(); ++i)
949 BOOST_CHECK_CLOSE(physRef[i], phys[i], epsilon);
956 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
958 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
960 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
962 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
964 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
966 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
968 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
970 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
972 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
973 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
975 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
981 unsigned int numQuadPoints = 6;
989 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
993 basisKeyDir1, basisKeyDir1, basisKeyDir1);
995 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
996 CollExp.push_back(Exp);
999 Collections::CollectionOptimisation colOpt(dummySession, 3,
1002 Collections::Collection c(CollExp, impTypes);
1005 const int nq = Exp->GetTotPoints();
1006 Array<OneD, NekDouble> phys(nq);
1007 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
1008 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
1010 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1012 Exp->GetCoords(xc, yc, zc);
1014 for (
int i = 0; i < nq; ++i)
1016 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1019 Exp->IProductWRTBase(phys, coeffs1);
1022 double epsilon = 1.0e-8;
1023 for (
int i = 0; i < coeffs1.size(); ++i)
1025 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1032 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
1034 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1036 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1038 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1040 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1042 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1044 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1046 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1048 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1049 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1051 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1057 unsigned int numQuadPoints = 5;
1058 unsigned int numModes = 4;
1060 quadPointsTypeDir1);
1066 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
1070 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1072 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1073 CollExp.push_back(Exp);
1076 Collections::CollectionOptimisation colOpt(dummySession, 3,
1079 Collections::Collection c(CollExp, impTypes);
1082 const int nq = Exp->GetTotPoints();
1083 Array<OneD, NekDouble> phys(nq);
1084 Array<OneD, NekDouble> coeffsRef(Exp->GetNcoeffs());
1085 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs());
1087 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1089 Exp->GetCoords(xc, yc, zc);
1091 for (
int i = 0; i < nq; ++i)
1093 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1096 Exp->IProductWRTBase(phys, coeffsRef);
1099 double epsilon = 1.0e-8;
1100 for (
int i = 0; i < coeffsRef.size(); ++i)
1102 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1103 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1104 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1111 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
1113 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1115 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1117 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1119 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1121 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1123 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
1125 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1127 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1128 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1130 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1136 unsigned int numQuadPoints = 5;
1137 unsigned int numModes = 4;
1139 quadPointsTypeDir1);
1145 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
1149 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1151 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1152 CollExp.push_back(Exp);
1155 Collections::CollectionOptimisation colOpt(dummySession, 3,
1158 Collections::Collection c(CollExp, impTypes);
1161 const int nq = Exp->GetTotPoints();
1162 Array<OneD, NekDouble> phys(nq);
1163 Array<OneD, NekDouble> coeffsRef(Exp->GetNcoeffs());
1164 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs());
1166 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1168 Exp->GetCoords(xc, yc, zc);
1170 for (
int i = 0; i < nq; ++i)
1172 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1175 Exp->IProductWRTBase(phys, coeffsRef);
1178 double epsilon = 1.0e-8;
1179 for (
int i = 0; i < coeffsRef.size(); ++i)
1181 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1182 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1183 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1188 TestHexIProductWRTBase_MatrixFree_UniformP_Deformed_OverInt)
1191 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
1193 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1195 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1197 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1199 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1201 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1203 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
1205 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1207 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1208 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1210 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1216 unsigned int numQuadPoints = 8;
1217 unsigned int numModes = 4;
1219 quadPointsTypeDir1);
1225 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
1229 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1231 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1232 CollExp.push_back(Exp);
1235 Collections::CollectionOptimisation colOpt(dummySession, 3,
1238 Collections::Collection c(CollExp, impTypes);
1241 const int nq = Exp->GetTotPoints();
1242 Array<OneD, NekDouble> phys(nq);
1243 Array<OneD, NekDouble> coeffsRef(Exp->GetNcoeffs());
1244 Array<OneD, NekDouble> coeffs(Exp->GetNcoeffs());
1246 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1248 Exp->GetCoords(xc, yc, zc);
1250 for (
int i = 0; i < nq; ++i)
1252 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1255 Exp->IProductWRTBase(phys, coeffsRef);
1258 double epsilon = 1.0e-8;
1259 for (
int i = 0; i < coeffsRef.size(); ++i)
1261 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
1262 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
1263 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
1270 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1272 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1274 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1276 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1278 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1280 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1282 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1284 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1286 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1287 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1289 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1296 quadPointsTypeDir1);
1298 quadPointsTypeDir1);
1300 quadPointsTypeDir1);
1310 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
1314 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1316 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1317 CollExp.push_back(Exp);
1320 Collections::CollectionOptimisation colOpt(dummySession, 3,
1323 Collections::Collection c(CollExp, impTypes);
1326 const int nq = Exp->GetTotPoints();
1327 Array<OneD, NekDouble> phys(nq);
1328 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
1329 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
1331 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1333 Exp->GetCoords(xc, yc, zc);
1335 for (
int i = 0; i < nq; ++i)
1337 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1340 Exp->IProductWRTBase(phys, coeffs1);
1344 double epsilon = 1.0e-8;
1345 for (
int i = 0; i < coeffs1.size(); ++i)
1347 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1354 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1356 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1358 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1360 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1362 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1364 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1366 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1368 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1370 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1371 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1373 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1380 quadPointsTypeDir1);
1382 quadPointsTypeDir1);
1384 quadPointsTypeDir1);
1394 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
1398 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1400 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1401 CollExp.push_back(Exp);
1404 Collections::CollectionOptimisation colOpt(dummySession, 3,
1407 Collections::Collection c(CollExp, impTypes);
1410 const int nq = Exp->GetTotPoints();
1411 Array<OneD, NekDouble> phys(nq);
1412 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
1413 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
1415 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1417 Exp->GetCoords(xc, yc, zc);
1419 for (
int i = 0; i < nq; ++i)
1421 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1424 Exp->IProductWRTBase(phys, coeffs1);
1428 double epsilon = 1.0e-8;
1429 for (
int i = 0; i < coeffs1.size(); ++i)
1431 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1438 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1440 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1442 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1444 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1446 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1448 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1450 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1452 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1454 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1455 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1457 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1464 quadPointsTypeDir1);
1466 quadPointsTypeDir1);
1468 quadPointsTypeDir1);
1478 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
1482 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1484 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1485 CollExp.push_back(Exp);
1488 Collections::CollectionOptimisation colOpt(dummySession, 3,
1491 Collections::Collection c(CollExp, impTypes);
1494 const int nq = Exp->GetTotPoints();
1495 Array<OneD, NekDouble> phys(nq);
1496 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
1497 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
1499 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1501 Exp->GetCoords(xc, yc, zc);
1503 for (
int i = 0; i < nq; ++i)
1505 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1508 Exp->IProductWRTBase(phys, coeffs1);
1511 double epsilon = 1.0e-8;
1512 for (
int i = 0; i < coeffs1.size(); ++i)
1514 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1521 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1523 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1525 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1527 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1529 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1531 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1533 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1535 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1537 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1538 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1540 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1547 quadPointsTypeDir1);
1549 quadPointsTypeDir1);
1551 quadPointsTypeDir1);
1561 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
1565 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1567 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1568 CollExp.push_back(Exp);
1571 Collections::CollectionOptimisation colOpt(dummySession, 3,
1574 Collections::Collection c(CollExp, impTypes);
1577 const int nq = Exp->GetTotPoints();
1578 Array<OneD, NekDouble> phys(nq);
1579 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
1580 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
1582 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
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);
1604 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1606 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1608 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1610 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1612 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1614 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1616 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1618 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1620 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1621 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1623 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1630 quadPointsTypeDir1);
1632 quadPointsTypeDir1);
1634 quadPointsTypeDir1);
1644 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
1648 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1650 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1651 CollExp.push_back(Exp);
1654 Collections::CollectionOptimisation colOpt(dummySession, 3,
1657 Collections::Collection c(CollExp, impTypes);
1660 const int nq = Exp->GetTotPoints();
1661 Array<OneD, NekDouble> phys(nq);
1662 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
1663 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
1665 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1667 Exp->GetCoords(xc, yc, zc);
1669 for (
int i = 0; i < nq; ++i)
1671 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1674 Exp->IProductWRTBase(phys, coeffs1);
1677 double epsilon = 1.0e-8;
1678 for (
int i = 0; i < coeffs1.size(); ++i)
1680 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1687 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1689 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1691 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1693 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1695 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1697 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1699 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1701 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1703 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1704 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1706 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1713 quadPointsTypeDir1);
1715 quadPointsTypeDir1);
1717 quadPointsTypeDir1);
1727 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
1731 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1735 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1736 for (
int i = 0; i < nelmts; ++i)
1738 CollExp.push_back(Exp);
1742 Collections::CollectionOptimisation colOpt(dummySession, 3,
1745 Collections::Collection c(CollExp, impTypes);
1748 const int nq = Exp->GetTotPoints();
1749 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
1750 Array<OneD, NekDouble> coeffs1(nelmts * Exp->GetNcoeffs());
1751 Array<OneD, NekDouble> coeffs2(nelmts * Exp->GetNcoeffs());
1753 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1755 Exp->GetCoords(xc, yc, zc);
1757 for (
int i = 0; i < nq; ++i)
1759 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1761 Exp->IProductWRTBase(phys, coeffs1);
1763 for (
int i = 1; i < nelmts; ++i)
1766 Exp->IProductWRTBase(phys + i * nq,
1767 tmp = coeffs1 + i * Exp->GetNcoeffs());
1772 double epsilon = 1.0e-8;
1773 for (
int i = 0; i < coeffs1.size(); ++i)
1775 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1782 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1784 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1786 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1788 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1790 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1792 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1794 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1796 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1798 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1799 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1801 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1808 quadPointsTypeDir1);
1810 quadPointsTypeDir1);
1812 quadPointsTypeDir1);
1822 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
1826 basisKeyDir1, basisKeyDir2, basisKeyDir3);
1830 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1831 for (
int i = 0; i < nelmts; ++i)
1833 CollExp.push_back(Exp);
1837 Collections::CollectionOptimisation colOpt(dummySession, 3,
1840 Collections::Collection c(CollExp, impTypes);
1843 const int nq = Exp->GetTotPoints();
1844 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
1845 Array<OneD, NekDouble> coeffs1(nelmts * Exp->GetNcoeffs());
1846 Array<OneD, NekDouble> coeffs2(nelmts * Exp->GetNcoeffs());
1848 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1850 Exp->GetCoords(xc, yc, zc);
1852 for (
int i = 0; i < nq; ++i)
1854 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1856 Exp->IProductWRTBase(phys, coeffs1);
1858 for (
int i = 1; i < nelmts; ++i)
1861 Exp->IProductWRTBase(phys + i * nq,
1862 tmp = coeffs1 + i * Exp->GetNcoeffs());
1867 double epsilon = 1.0e-8;
1868 for (
int i = 0; i < coeffs1.size(); ++i)
1870 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1877 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
1879 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1881 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1883 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1885 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1887 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1889 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1891 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1893 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1894 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1896 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1902 unsigned int numQuadPoints = 6;
1904 quadPointsTypeDir1);
1910 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
1914 basisKeyDir1, basisKeyDir1, basisKeyDir1);
1916 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
1917 CollExp.push_back(Exp);
1920 Collections::CollectionOptimisation colOpt(dummySession, 3,
1923 Collections::Collection c(CollExp, impTypes);
1926 const int nq = Exp->GetTotPoints();
1927 Array<OneD, NekDouble> phys(nq);
1928 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
1929 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
1931 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
1933 Exp->GetCoords(xc, yc, zc);
1935 for (
int i = 0; i < nq; ++i)
1937 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
1940 Exp->IProductWRTBase(phys, coeffs1);
1943 double epsilon = 1.0e-6;
1944 for (
int i = 0; i < coeffs1.size(); ++i)
1947 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-16) ? 0.0 : coeffs1[i];
1948 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-16) ? 0.0 : coeffs2[i];
1949 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
1956 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
1958 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
1960 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
1962 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
1964 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
1966 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
1968 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
1970 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
1972 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
1973 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
1975 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
1982 quadPointsTypeDir1);
1984 quadPointsTypeDir1);
1986 quadPointsTypeDir1);
1996 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
2000 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2002 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2003 CollExp.push_back(Exp);
2006 Collections::CollectionOptimisation colOpt(dummySession, 3,
2009 Collections::Collection c(CollExp, impTypes);
2012 const int nq = Exp->GetTotPoints();
2013 Array<OneD, NekDouble> phys(nq);
2014 Array<OneD, NekDouble> coeffs1(Exp->GetNcoeffs());
2015 Array<OneD, NekDouble> coeffs2(Exp->GetNcoeffs());
2017 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2019 Exp->GetCoords(xc, yc, zc);
2021 for (
int i = 0; i < nq; ++i)
2023 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2026 Exp->IProductWRTBase(phys, coeffs1);
2029 double epsilon = 1.0e-6;
2030 for (
int i = 0; i < coeffs1.size(); ++i)
2033 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-16) ? 0.0 : coeffs1[i];
2034 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-16) ? 0.0 : coeffs2[i];
2035 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2042 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2044 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2046 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2048 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2050 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2052 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2054 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2056 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2058 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2059 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2061 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2068 quadPointsTypeDir1);
2074 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
2078 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2082 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2083 for (
int i = 0; i < nelmts; ++i)
2085 CollExp.push_back(Exp);
2089 Collections::CollectionOptimisation colOpt(dummySession, 3,
2092 Collections::Collection c(CollExp, impTypes);
2095 const int nq = Exp->GetTotPoints();
2096 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
2097 Array<OneD, NekDouble> coeffs1(nelmts * Exp->GetNcoeffs());
2098 Array<OneD, NekDouble> coeffs2(nelmts * Exp->GetNcoeffs());
2100 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
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-6;
2119 for (
int i = 0; i < coeffs1.size(); ++i)
2122 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-16) ? 0.0 : coeffs1[i];
2123 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-16) ? 0.0 : coeffs2[i];
2124 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2131 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2133 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2135 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2137 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2139 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2141 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2143 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2145 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2147 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2148 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2150 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2157 quadPointsTypeDir1);
2159 quadPointsTypeDir1);
2161 quadPointsTypeDir1);
2171 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
2175 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2179 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2180 for (
int i = 0; i < nelmts; ++i)
2182 CollExp.push_back(Exp);
2186 Collections::CollectionOptimisation colOpt(dummySession, 3,
2189 Collections::Collection c(CollExp, impTypes);
2192 const int nq = Exp->GetTotPoints();
2193 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
2194 Array<OneD, NekDouble> coeffs1(nelmts * Exp->GetNcoeffs());
2195 Array<OneD, NekDouble> coeffs2(nelmts * Exp->GetNcoeffs());
2197 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2199 Exp->GetCoords(xc, yc, zc);
2201 for (
int i = 0; i < nq; ++i)
2203 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2205 Exp->IProductWRTBase(phys, coeffs1);
2207 for (
int i = 1; i < nelmts; ++i)
2210 Exp->IProductWRTBase(phys + i * nq,
2211 tmp = coeffs1 + i * Exp->GetNcoeffs());
2215 double epsilon = 1.0e-4;
2216 for (
int i = 0; i < coeffs1.size(); ++i)
2219 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2220 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2221 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2226 TestHexIProductWRTBase_SumFac_VariableP_MultiElmt_CollDir02)
2229 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2231 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2233 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2235 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2237 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2239 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2241 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2243 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2245 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2246 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2248 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2255 quadPointsTypeDir1);
2257 quadPointsTypeDir1);
2259 quadPointsTypeDir1);
2269 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
2273 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2277 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2278 for (
int i = 0; i < nelmts; ++i)
2280 CollExp.push_back(Exp);
2284 Collections::CollectionOptimisation colOpt(dummySession, 3,
2287 Collections::Collection c(CollExp, impTypes);
2290 const int nq = Exp->GetTotPoints();
2291 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
2292 Array<OneD, NekDouble> coeffs1(nelmts * Exp->GetNcoeffs());
2293 Array<OneD, NekDouble> coeffs2(nelmts * Exp->GetNcoeffs());
2295 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2297 Exp->GetCoords(xc, yc, zc);
2299 for (
int i = 0; i < nq; ++i)
2301 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2303 Exp->IProductWRTBase(phys, coeffs1);
2305 for (
int i = 1; i < nelmts; ++i)
2308 Exp->IProductWRTBase(phys + i * nq,
2309 tmp = coeffs1 + i * Exp->GetNcoeffs());
2313 double epsilon = 1.0e-4;
2314 for (
int i = 0; i < coeffs1.size(); ++i)
2317 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2318 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2319 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2324 TestHexIProductWRTBase_SumFac_VariableP_MultiElmt_CollDir12)
2327 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2329 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2331 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2333 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2335 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2337 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2339 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2341 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2343 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2344 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2346 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2353 quadPointsTypeDir1);
2355 quadPointsTypeDir1);
2357 quadPointsTypeDir1);
2367 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
2371 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2375 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2376 for (
int i = 0; i < nelmts; ++i)
2378 CollExp.push_back(Exp);
2382 Collections::CollectionOptimisation colOpt(dummySession, 3,
2385 Collections::Collection c(CollExp, impTypes);
2388 const int nq = Exp->GetTotPoints();
2389 Array<OneD, NekDouble> phys(nelmts * nq), tmp;
2390 Array<OneD, NekDouble> coeffs1(nelmts * Exp->GetNcoeffs());
2391 Array<OneD, NekDouble> coeffs2(nelmts * Exp->GetNcoeffs());
2393 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2395 Exp->GetCoords(xc, yc, zc);
2397 for (
int i = 0; i < nq; ++i)
2399 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2401 Exp->IProductWRTBase(phys, coeffs1);
2403 for (
int i = 1; i < nelmts; ++i)
2406 Exp->IProductWRTBase(phys + i * nq,
2407 tmp = coeffs1 + i * Exp->GetNcoeffs());
2411 double epsilon = 1.0e-4;
2412 for (
int i = 0; i < coeffs1.size(); ++i)
2415 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
2416 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
2417 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
2424 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2426 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2428 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2430 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2432 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2434 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2436 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2438 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2440 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2441 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2443 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2449 unsigned int numQuadPoints = 6;
2451 quadPointsTypeDir1);
2457 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
2461 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2463 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2464 CollExp.push_back(Exp);
2467 Collections::CollectionOptimisation colOpt(dummySession, 3,
2470 Collections::Collection c(CollExp, impTypes);
2473 const int nq = Exp->GetTotPoints();
2474 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2475 Array<OneD, NekDouble> phys(nq), tmp, tmp1, tmp2;
2476 Array<OneD, NekDouble> diff1(3 * nq);
2477 Array<OneD, NekDouble> diff2(3 * nq);
2479 Exp->GetCoords(xc, yc, zc);
2481 for (
int i = 0; i < nq; ++i)
2483 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2486 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
2488 tmp2 = diff2 + 2 * nq);
2490 double epsilon = 1.0e-8;
2491 for (
int i = 0; i < diff1.size(); ++i)
2493 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2500 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
2502 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2504 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2506 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2508 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2510 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2512 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2514 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2516 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2517 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2519 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2525 unsigned int numQuadPoints = 6;
2526 unsigned int numModes = 2;
2528 quadPointsTypeDir1);
2534 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
2538 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2540 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2541 CollExp.push_back(Exp);
2544 Collections::CollectionOptimisation colOpt(dummySession, 2,
2547 Collections::Collection c(CollExp, impTypes);
2550 const int nq = Exp->GetTotPoints();
2551 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2552 Array<OneD, NekDouble> phys(nq), tmp, tmp1, tmp2;
2553 Array<OneD, NekDouble> diffRef(3 * nq);
2554 Array<OneD, NekDouble> diff(3 * nq);
2556 Exp->GetCoords(xc, yc, zc);
2558 for (
int i = 0; i < nq; ++i)
2560 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2563 Exp->PhysDeriv(phys, diffRef, tmp = diffRef + nq, tmp1 = diffRef + 2 * nq);
2565 tmp2 = diff + 2 * nq);
2567 double epsilon = 1.0e-8;
2568 for (
int i = 0; i < diffRef.size(); ++i)
2570 diffRef[i] = (std::abs(diffRef[i]) < 1e-14) ? 0.0 : diffRef[i];
2571 diff[i] = (std::abs(diff[i]) < 1e-14) ? 0.0 : diff[i];
2572 BOOST_CHECK_CLOSE(diffRef[i], diff[i], epsilon);
2579 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
2581 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2583 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2585 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2587 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2589 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2591 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
2593 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2595 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2596 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2598 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2604 unsigned int numQuadPoints = 5;
2605 unsigned int numModes = 2;
2607 quadPointsTypeDir1);
2613 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
2617 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2619 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2620 CollExp.push_back(Exp);
2623 Collections::CollectionOptimisation colOpt(dummySession, 2,
2626 Collections::Collection c(CollExp, impTypes);
2629 const int nq = Exp->GetTotPoints();
2630 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2631 Array<OneD, NekDouble> phys(nq), tmp, tmp1, tmp2;
2632 Array<OneD, NekDouble> diffRef(3 * nq);
2633 Array<OneD, NekDouble> diff(3 * nq);
2635 Exp->GetCoords(xc, yc, zc);
2637 for (
int i = 0; i < nq; ++i)
2639 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2642 Exp->PhysDeriv(phys, diffRef, tmp = diffRef + nq, tmp1 = diffRef + 2 * nq);
2644 tmp2 = diff + 2 * nq);
2646 double epsilon = 1.0e-8;
2647 for (
int i = 0; i < diffRef.size(); ++i)
2649 diffRef[i] = (std::abs(diffRef[i]) < 1e-14) ? 0.0 : diffRef[i];
2650 diff[i] = (std::abs(diff[i]) < 1e-14) ? 0.0 : diff[i];
2651 BOOST_CHECK_CLOSE(diffRef[i], diff[i], epsilon);
2658 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2660 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2662 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2664 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2666 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2668 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2670 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2672 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2674 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2675 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2677 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2684 quadPointsTypeDir1);
2686 quadPointsTypeDir1);
2688 quadPointsTypeDir1);
2698 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
2702 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2706 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2707 for (
int i = 0; i < nelmts; ++i)
2709 CollExp.push_back(Exp);
2713 Collections::CollectionOptimisation colOpt(dummySession, 3,
2716 Collections::Collection c(CollExp, impTypes);
2719 const int nq = Exp->GetTotPoints();
2720 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2721 Array<OneD, NekDouble> phys(nelmts * nq), tmp, tmp1, tmp2;
2722 Array<OneD, NekDouble> diff1(3 * nelmts * nq);
2723 Array<OneD, NekDouble> diff2(3 * nelmts * nq);
2725 Exp->GetCoords(xc, yc, zc);
2727 for (
int i = 0; i < nq; ++i)
2729 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2731 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
2732 tmp2 = diff1 + (2 * nelmts) * nq);
2733 for (
int i = 1; i < nelmts; ++i)
2736 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2737 tmp1 = diff1 + (nelmts + i) * nq,
2738 tmp2 = diff1 + (2 * nelmts + i) * nq);
2742 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2744 double epsilon = 1.0e-8;
2745 for (
int i = 0; i < diff1.size(); ++i)
2747 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2754 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2756 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2758 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2760 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2762 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2764 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2766 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2768 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2770 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2771 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2773 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2780 quadPointsTypeDir1);
2782 quadPointsTypeDir1);
2784 quadPointsTypeDir1);
2794 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
2798 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2802 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2803 for (
int i = 0; i < nelmts; ++i)
2805 CollExp.push_back(Exp);
2809 Collections::CollectionOptimisation colOpt(dummySession, 3,
2812 Collections::Collection c(CollExp, impTypes);
2815 const int nq = Exp->GetTotPoints();
2816 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2817 Array<OneD, NekDouble> phys(nelmts * nq), tmp, tmp1, tmp2;
2818 Array<OneD, NekDouble> diff1(3 * nelmts * nq);
2819 Array<OneD, NekDouble> diff2(3 * nelmts * nq);
2821 Exp->GetCoords(xc, yc, zc);
2823 for (
int i = 0; i < nq; ++i)
2825 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2827 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
2828 tmp2 = diff1 + (2 * nelmts) * nq);
2830 for (
int i = 1; i < nelmts; ++i)
2833 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
2834 tmp1 = diff1 + (nelmts + i) * nq,
2835 tmp2 = diff1 + (2 * nelmts + i) * nq);
2839 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
2841 double epsilon = 1.0e-8;
2842 for (
int i = 0; i < diff1.size(); ++i)
2844 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2851 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2853 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2855 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2857 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2859 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2861 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2863 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2865 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2867 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2868 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2870 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2876 unsigned int numQuadPoints = 4;
2878 quadPointsTypeDir1);
2884 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
2888 basisKeyDir1, basisKeyDir1, basisKeyDir1);
2890 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2891 CollExp.push_back(Exp);
2894 Collections::CollectionOptimisation colOpt(dummySession, 3,
2897 Collections::Collection c(CollExp, impTypes);
2900 const int nq = Exp->GetTotPoints();
2901 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2902 Array<OneD, NekDouble> phys(nq), tmp, tmp1, tmp2;
2903 Array<OneD, NekDouble> diff1(3 * nq);
2904 Array<OneD, NekDouble> diff2(3 * nq);
2906 Exp->GetCoords(xc, yc, zc);
2908 for (
int i = 0; i < nq; ++i)
2910 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
2913 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
2915 tmp2 = diff2 + 2 * nq);
2917 double epsilon = 1.0e-8;
2918 for (
int i = 0; i < diff1.size(); ++i)
2920 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
2927 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
2929 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
2931 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
2933 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
2935 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
2937 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
2939 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
2941 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
2943 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
2944 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
2946 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
2953 quadPointsTypeDir1);
2955 quadPointsTypeDir1);
2957 quadPointsTypeDir1);
2967 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
2971 basisKeyDir1, basisKeyDir2, basisKeyDir3);
2975 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
2976 for (
int i = 0; i < nelmts; ++i)
2978 CollExp.push_back(Exp);
2982 Collections::CollectionOptimisation colOpt(dummySession, 3,
2985 Collections::Collection c(CollExp, impTypes);
2988 const int nq = Exp->GetTotPoints();
2989 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
2990 Array<OneD, NekDouble> phys(nelmts * nq), tmp, tmp1, tmp2;
2991 Array<OneD, NekDouble> diff1(3 * nelmts * nq);
2992 Array<OneD, NekDouble> diff2(3 * nelmts * nq);
2994 Exp->GetCoords(xc, yc, zc);
2996 for (
int i = 0; i < nq; ++i)
2998 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3000 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
3001 tmp2 = diff1 + (2 * nelmts) * nq);
3002 for (
int i = 1; i < nelmts; ++i)
3005 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
3006 tmp1 = diff1 + (nelmts + i) * nq,
3007 tmp2 = diff1 + (2 * nelmts + i) * nq);
3011 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
3013 double epsilon = 1.0e-8;
3014 for (
int i = 0; i < diff1.size(); ++i)
3016 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
3023 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3025 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3027 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3029 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3031 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3033 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3035 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3037 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3039 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3040 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3042 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3048 unsigned int numQuadPoints = 6;
3050 quadPointsTypeDir1);
3056 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
3060 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3062 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3063 CollExp.push_back(Exp);
3066 Collections::CollectionOptimisation colOpt(dummySession, 3,
3069 Collections::Collection c(CollExp, impTypes);
3072 const int nq = Exp->GetTotPoints();
3073 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3074 Array<OneD, NekDouble> phys(nq), tmp, tmp1, tmp2;
3075 Array<OneD, NekDouble> diff1(3 * nq);
3076 Array<OneD, NekDouble> diff2(3 * nq);
3078 Exp->GetCoords(xc, yc, zc);
3080 for (
int i = 0; i < nq; ++i)
3082 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3085 Exp->PhysDeriv(phys, diff1, tmp = diff1 + nq, tmp1 = diff1 + 2 * nq);
3087 tmp2 = diff2 + 2 * nq);
3089 double epsilon = 1.0e-8;
3090 for (
int i = 0; i < diff1.size(); ++i)
3092 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
3099 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3101 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3103 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3105 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3107 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3109 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3111 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3113 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3115 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3116 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3118 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3125 quadPointsTypeDir1);
3127 quadPointsTypeDir1);
3129 quadPointsTypeDir1);
3139 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
3143 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3147 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3148 for (
int i = 0; i < nelmts; ++i)
3150 CollExp.push_back(Exp);
3154 Collections::CollectionOptimisation colOpt(dummySession, 3,
3157 Collections::Collection c(CollExp, impTypes);
3160 const int nq = Exp->GetTotPoints();
3161 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3162 Array<OneD, NekDouble> phys(nelmts * nq), tmp, tmp1, tmp2;
3163 Array<OneD, NekDouble> diff1(3 * nelmts * nq);
3164 Array<OneD, NekDouble> diff2(3 * nelmts * nq);
3166 Exp->GetCoords(xc, yc, zc);
3168 for (
int i = 0; i < nq; ++i)
3170 phys[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3172 Exp->PhysDeriv(phys, tmp = diff1, tmp1 = diff1 + (nelmts)*nq,
3173 tmp2 = diff1 + (2 * nelmts) * nq);
3174 for (
int i = 1; i < nelmts; ++i)
3177 Exp->PhysDeriv(phys, tmp = diff1 + i * nq,
3178 tmp1 = diff1 + (nelmts + i) * nq,
3179 tmp2 = diff1 + (2 * nelmts + i) * nq);
3183 tmp = diff2 + nelmts * nq, tmp2 = diff2 + 2 * nelmts * nq);
3185 double epsilon = 1.0e-8;
3186 for (
int i = 0; i < diff1.size(); ++i)
3188 BOOST_CHECK_CLOSE(diff1[i], diff2[i], epsilon);
3195 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3197 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3199 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3201 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3203 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3205 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3207 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3209 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3211 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3212 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3214 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3220 unsigned int numQuadPoints = 6;
3222 quadPointsTypeDir1);
3228 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
3232 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3234 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3235 CollExp.push_back(Exp);
3238 Collections::CollectionOptimisation colOpt(dummySession, 3,
3241 Collections::Collection c(CollExp, impTypes);
3244 const int nq = Exp->GetTotPoints();
3245 const int nm = Exp->GetNcoeffs();
3246 Array<OneD, NekDouble> phys1(nq, 0.0);
3247 Array<OneD, NekDouble> phys2(nq, 0.0);
3248 Array<OneD, NekDouble> phys3(nq, 0.0);
3249 Array<OneD, NekDouble> coeffs1(nm, 0.0);
3250 Array<OneD, NekDouble> coeffs2(nm, 0.0);
3252 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3254 Exp->GetCoords(xc, yc, zc);
3256 for (
int i = 0; i < nq; ++i)
3258 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3259 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3260 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3264 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
3265 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
3266 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3267 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
3268 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3273 double epsilon = 1.0e-8;
3274 for (
int i = 0; i < nm; ++i)
3276 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3277 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3278 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3285 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
3287 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3289 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3291 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3293 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3295 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3297 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3299 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3301 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3302 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3304 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3310 unsigned int numQuadPoints = 5;
3311 unsigned int numModes = 4;
3313 quadPointsTypeDir1);
3319 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
3323 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3325 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3326 CollExp.push_back(Exp);
3329 Collections::CollectionOptimisation colOpt(dummySession, 2,
3332 Collections::Collection c(CollExp, impTypes);
3335 const int nq = Exp->GetTotPoints();
3336 const int nm = Exp->GetNcoeffs();
3337 Array<OneD, NekDouble> phys1(nq, 0.0);
3338 Array<OneD, NekDouble> phys2(nq, 0.0);
3339 Array<OneD, NekDouble> phys3(nq, 0.0);
3340 Array<OneD, NekDouble> coeffsRef(nm, 0.0);
3341 Array<OneD, NekDouble> coeffs(nm, 0.0);
3343 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3345 Exp->GetCoords(xc, yc, zc);
3347 for (
int i = 0; i < nq; ++i)
3349 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3350 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3351 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3355 Exp->IProductWRTDerivBase(0, phys1, coeffsRef);
3356 Exp->IProductWRTDerivBase(1, phys2, coeffs);
3357 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3358 Exp->IProductWRTDerivBase(2, phys3, coeffs);
3359 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3364 double epsilon = 1.0e-8;
3365 for (
int i = 0; i < nm; ++i)
3367 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3368 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3369 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3376 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
3378 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3380 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3382 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3384 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3386 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3388 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
3390 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3392 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3393 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3395 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3401 unsigned int numQuadPoints = 5;
3402 unsigned int numModes = 4;
3404 quadPointsTypeDir1);
3410 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
3414 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3416 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3417 CollExp.push_back(Exp);
3420 Collections::CollectionOptimisation colOpt(dummySession, 2,
3423 Collections::Collection c(CollExp, impTypes);
3426 const int nq = Exp->GetTotPoints();
3427 const int nm = Exp->GetNcoeffs();
3428 Array<OneD, NekDouble> phys1(nq, 0.0);
3429 Array<OneD, NekDouble> phys2(nq, 0.0);
3430 Array<OneD, NekDouble> phys3(nq, 0.0);
3431 Array<OneD, NekDouble> coeffsRef(nm, 0.0);
3432 Array<OneD, NekDouble> coeffs(nm, 0.0);
3434 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3436 Exp->GetCoords(xc, yc, zc);
3438 for (
int i = 0; i < nq; ++i)
3440 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3441 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3442 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3446 Exp->IProductWRTDerivBase(0, phys1, coeffsRef);
3447 Exp->IProductWRTDerivBase(1, phys2, coeffs);
3448 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3449 Exp->IProductWRTDerivBase(2, phys3, coeffs);
3450 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3455 double epsilon = 1.0e-8;
3456 for (
int i = 0; i < nm; ++i)
3458 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3459 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3460 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3465 TestHexIProductWRTDerivBase_MatrixFree_UniformP_Deformed_OverInt)
3468 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
3470 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3472 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3474 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3476 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3478 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3480 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
3482 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3484 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3485 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3487 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3493 unsigned int numQuadPoints = 8;
3494 unsigned int numModes = 4;
3496 quadPointsTypeDir1);
3502 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
3506 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3508 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3509 CollExp.push_back(Exp);
3512 Collections::CollectionOptimisation colOpt(dummySession, 2,
3515 Collections::Collection c(CollExp, impTypes);
3518 const int nq = Exp->GetTotPoints();
3519 const int nm = Exp->GetNcoeffs();
3520 Array<OneD, NekDouble> phys1(nq, 0.0);
3521 Array<OneD, NekDouble> phys2(nq, 0.0);
3522 Array<OneD, NekDouble> phys3(nq, 0.0);
3523 Array<OneD, NekDouble> coeffsRef(nm, 0.0);
3524 Array<OneD, NekDouble> coeffs(nm, 0.0);
3526 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3528 Exp->GetCoords(xc, yc, zc);
3530 for (
int i = 0; i < nq; ++i)
3532 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3533 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3534 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3538 Exp->IProductWRTDerivBase(0, phys1, coeffsRef);
3539 Exp->IProductWRTDerivBase(1, phys2, coeffs);
3540 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3541 Exp->IProductWRTDerivBase(2, phys3, coeffs);
3542 Vmath::Vadd(nm, coeffsRef, 1, coeffs, 1, coeffsRef, 1);
3547 double epsilon = 1.0e-8;
3548 for (
int i = 0; i < nm; ++i)
3550 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
3551 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
3552 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
3559 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3561 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3563 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3565 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3567 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3569 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3571 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3573 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3575 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3576 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3578 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3585 quadPointsTypeDir1);
3587 quadPointsTypeDir1);
3589 quadPointsTypeDir1);
3599 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
3603 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3607 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3608 for (
int i = 0; i < nelmts; ++i)
3610 CollExp.push_back(Exp);
3614 Collections::CollectionOptimisation colOpt(dummySession, 3,
3617 Collections::Collection c(CollExp, impTypes);
3620 const int nq = Exp->GetTotPoints();
3621 const int nm = Exp->GetNcoeffs();
3622 Array<OneD, NekDouble> phys1(nelmts * nq, 0.0);
3623 Array<OneD, NekDouble> phys2(nelmts * nq, 0.0);
3624 Array<OneD, NekDouble> phys3(nelmts * nq, 0.0);
3625 Array<OneD, NekDouble> coeffs1(nelmts * nm, 0.0);
3626 Array<OneD, NekDouble> coeffs2(nelmts * nm, 0.0);
3627 Array<OneD, NekDouble> tmp;
3629 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3631 Exp->GetCoords(xc, yc, zc);
3633 for (
int i = 0; i < nq; ++i)
3635 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3636 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3637 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3640 for (
int i = 1; i < nelmts; ++i)
3648 for (
int i = 0; i < nelmts; ++i)
3651 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
3652 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
3653 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3654 tmp = coeffs1 + i * nm, 1);
3655 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
3656 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3657 tmp = coeffs1 + i * nm, 1);
3663 double epsilon = 1.0e-6;
3664 for (
int i = 0; i < coeffs1.size(); ++i)
3666 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3667 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3668 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3675 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3677 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3679 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3681 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3683 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3685 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3687 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3689 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3691 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3692 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3694 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3700 unsigned int numQuadPoints = 6;
3702 quadPointsTypeDir1);
3708 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
3712 basisKeyDir1, basisKeyDir1, basisKeyDir1);
3714 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3715 CollExp.push_back(Exp);
3718 Collections::CollectionOptimisation colOpt(dummySession, 3,
3721 Collections::Collection c(CollExp, impTypes);
3724 const int nq = Exp->GetTotPoints();
3725 const int nm = Exp->GetNcoeffs();
3726 Array<OneD, NekDouble> phys1(nq, 0.0);
3727 Array<OneD, NekDouble> phys2(nq, 0.0);
3728 Array<OneD, NekDouble> phys3(nq, 0.0);
3729 Array<OneD, NekDouble> coeffs1(nm, 0.0);
3730 Array<OneD, NekDouble> coeffs2(nm, 0.0);
3732 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3734 Exp->GetCoords(xc, yc, zc);
3736 for (
int i = 0; i < nq; ++i)
3738 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3739 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3740 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3744 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
3745 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
3746 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3747 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
3748 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
3753 double epsilon = 1.0e-8;
3754 for (
int i = 0; i < coeffs1.size(); ++i)
3756 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3757 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3758 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3765 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3767 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3769 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3771 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3773 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3775 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3777 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3779 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3781 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3782 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3784 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3791 quadPointsTypeDir1);
3793 quadPointsTypeDir1);
3795 quadPointsTypeDir1);
3805 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
3809 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3813 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3814 for (
int i = 0; i < nelmts; ++i)
3816 CollExp.push_back(Exp);
3820 Collections::CollectionOptimisation colOpt(dummySession, 3,
3823 Collections::Collection c(CollExp, impTypes);
3826 const int nq = Exp->GetTotPoints();
3827 const int nm = Exp->GetNcoeffs();
3828 Array<OneD, NekDouble> phys1(nelmts * nq, 0.0);
3829 Array<OneD, NekDouble> phys2(nelmts * nq, 0.0);
3830 Array<OneD, NekDouble> phys3(nelmts * nq, 0.0);
3831 Array<OneD, NekDouble> coeffs1(nelmts * nm, 0.0);
3832 Array<OneD, NekDouble> coeffs2(nelmts * nm, 0.0);
3833 Array<OneD, NekDouble> tmp;
3835 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3837 Exp->GetCoords(xc, yc, zc);
3839 for (
int i = 0; i < nq; ++i)
3841 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3842 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3843 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3846 for (
int i = 1; i < nelmts; ++i)
3854 for (
int i = 0; i < nelmts; ++i)
3857 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
3858 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
3859 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3860 tmp = coeffs1 + i * nm, 1);
3861 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
3862 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3863 tmp = coeffs1 + i * nm, 1);
3869 double epsilon = 1.0e-8;
3870 for (
int i = 0; i < coeffs1.size(); ++i)
3872 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3873 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3874 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3879 TestHexIProductWRTDerivBase_NoCollection_VariableP_MultiElmt)
3882 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3884 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
3886 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
3888 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
3890 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
3892 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
3894 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
3896 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
3898 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
3899 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
3901 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
3908 quadPointsTypeDir1);
3910 quadPointsTypeDir1);
3912 quadPointsTypeDir1);
3922 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
3926 basisKeyDir1, basisKeyDir2, basisKeyDir3);
3930 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
3931 for (
int i = 0; i < nelmts; ++i)
3933 CollExp.push_back(Exp);
3937 Collections::CollectionOptimisation colOpt(dummySession, 3,
3940 Collections::Collection c(CollExp, impTypes);
3943 const int nq = Exp->GetTotPoints();
3944 const int nm = Exp->GetNcoeffs();
3945 Array<OneD, NekDouble> phys1(nelmts * nq, 0.0);
3946 Array<OneD, NekDouble> phys2(nelmts * nq, 0.0);
3947 Array<OneD, NekDouble> phys3(nelmts * nq, 0.0);
3948 Array<OneD, NekDouble> coeffs1(nelmts * nm, 0.0);
3949 Array<OneD, NekDouble> coeffs2(nelmts * nm, 0.0);
3950 Array<OneD, NekDouble> tmp;
3951 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
3953 Exp->GetCoords(xc, yc, zc);
3955 for (
int i = 0; i < nq; ++i)
3957 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
3958 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
3959 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
3962 for (
int i = 1; i < nelmts; ++i)
3970 for (
int i = 0; i < nelmts; ++i)
3973 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
3974 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
3975 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3976 tmp = coeffs1 + i * nm, 1);
3977 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
3978 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
3979 tmp = coeffs1 + i * nm, 1);
3985 double epsilon = 1.0e-6;
3986 for (
int i = 0; i < coeffs1.size(); ++i)
3988 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
3989 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
3990 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
3997 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
3999 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4001 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4003 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4005 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4007 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4009 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
4011 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4013 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4014 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4016 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4022 unsigned int numQuadPoints = 6;
4024 quadPointsTypeDir1);
4030 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4034 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4036 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4037 CollExp.push_back(Exp);
4040 Collections::CollectionOptimisation colOpt(dummySession, 3,
4043 Collections::Collection c(CollExp, impTypes);
4046 const int nq = Exp->GetTotPoints();
4047 const int nm = Exp->GetNcoeffs();
4048 Array<OneD, NekDouble> phys1(nq, 0.0);
4049 Array<OneD, NekDouble> phys2(nq, 0.0);
4050 Array<OneD, NekDouble> phys3(nq, 0.0);
4051 Array<OneD, NekDouble> coeffs1(nm, 0.0);
4052 Array<OneD, NekDouble> coeffs2(nm, 0.0);
4054 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
4056 Exp->GetCoords(xc, yc, zc);
4058 for (
int i = 0; i < nq; ++i)
4060 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
4061 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
4062 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
4066 Exp->IProductWRTDerivBase(0, phys1, coeffs1);
4067 Exp->IProductWRTDerivBase(1, phys2, coeffs2);
4068 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
4069 Exp->IProductWRTDerivBase(2, phys3, coeffs2);
4070 Vmath::Vadd(nm, coeffs1, 1, coeffs2, 1, coeffs1, 1);
4075 double epsilon = 1.0e-8;
4076 for (
int i = 0; i < coeffs1.size(); ++i)
4078 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
4079 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
4080 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
4087 new SpatialDomains::PointGeom(3u, 0u, -1.5, -1.5, -1.5));
4089 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4091 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4093 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4095 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4097 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4099 new SpatialDomains::PointGeom(3u, 6u, 1.0, 1.0, 1.0));
4101 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4103 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4104 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4106 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4113 quadPointsTypeDir1);
4115 quadPointsTypeDir1);
4117 quadPointsTypeDir1);
4127 basisKeyDir1, basisKeyDir2, basisKeyDir3, hexGeom.get());
4131 basisKeyDir1, basisKeyDir2, basisKeyDir3);
4135 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4136 for (
int i = 0; i < nelmts; ++i)
4138 CollExp.push_back(Exp);
4142 Collections::CollectionOptimisation colOpt(dummySession, 3,
4145 Collections::Collection c(CollExp, impTypes);
4148 const int nq = Exp->GetTotPoints();
4149 const int nm = Exp->GetNcoeffs();
4150 Array<OneD, NekDouble> phys1(nelmts * nq, 0.0);
4151 Array<OneD, NekDouble> phys2(nelmts * nq, 0.0);
4152 Array<OneD, NekDouble> phys3(nelmts * nq, 0.0);
4153 Array<OneD, NekDouble> coeffs1(nelmts * nm, 0.0);
4154 Array<OneD, NekDouble> coeffs2(nelmts * nm, 0.0);
4155 Array<OneD, NekDouble> tmp;
4157 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
4159 Exp->GetCoords(xc, yc, zc);
4161 for (
int i = 0; i < nq; ++i)
4163 phys1[i] = sin(xc[i]) * cos(yc[i]) * sin(zc[i]);
4164 phys2[i] = cos(xc[i]) * sin(yc[i]) * cos(zc[i]);
4165 phys2[i] = cos(xc[i]) * sin(yc[i]) * sin(zc[i]);
4168 for (
int i = 1; i < nelmts; ++i)
4176 for (
int i = 0; i < nelmts; ++i)
4178 Exp->IProductWRTDerivBase(0, phys1 + i * nq, tmp = coeffs1 + i * nm);
4179 Exp->IProductWRTDerivBase(1, phys2 + i * nq, tmp = coeffs2 + i * nm);
4180 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
4181 tmp = coeffs1 + i * nm, 1);
4182 Exp->IProductWRTDerivBase(2, phys3 + i * nq, tmp = coeffs2 + i * nm);
4183 Vmath::Vadd(nm, coeffs1 + i * nm, 1, coeffs2 + i * nm, 1,
4184 tmp = coeffs1 + i * nm, 1);
4190 double epsilon = 1.0e-8;
4191 for (
int i = 0; i < coeffs1.size(); ++i)
4193 coeffs1[i] = (std::abs(coeffs1[i]) < 1e-14) ? 0.0 : coeffs1[i];
4194 coeffs2[i] = (std::abs(coeffs2[i]) < 1e-14) ? 0.0 : coeffs2[i];
4195 BOOST_CHECK_CLOSE(coeffs1[i], coeffs2[i], epsilon);
4202 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4204 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4206 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4208 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4210 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4212 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4214 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4216 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4218 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4219 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4221 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4227 unsigned int numQuadPoints = 5;
4228 unsigned int numModes = 4;
4231 quadPointsTypeDir1);
4237 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4241 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4245 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4246 for (
int i = 0; i < nelmts; ++i)
4248 CollExp.push_back(Exp);
4252 Collections::CollectionOptimisation colOpt(dummySession, 2,
4255 Collections::Collection c(CollExp, impTypes);
4261 const int nm = Exp->GetNcoeffs();
4262 Array<OneD, NekDouble> coeffsIn(nelmts * nm);
4263 Array<OneD, NekDouble> coeffsRef(nelmts * nm);
4264 Array<OneD, NekDouble> coeffs(nelmts * nm), tmp;
4266 for (
int i = 0; i < nm; ++i)
4271 for (
int i = 1; i < nelmts; ++i)
4273 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4279 for (
int i = 0; i < nelmts; ++i)
4282 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4287 double epsilon = 1.0e-8;
4288 for (
int i = 0; i < coeffsRef.size(); ++i)
4290 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4291 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4292 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4299 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4301 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4303 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4305 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4307 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4309 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4311 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4313 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4315 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4316 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4318 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4324 unsigned int numQuadPoints = 5;
4325 unsigned int numModes = 4;
4328 quadPointsTypeDir1);
4334 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4338 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4342 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4343 for (
int i = 0; i < nelmts; ++i)
4345 CollExp.push_back(Exp);
4349 Collections::CollectionOptimisation colOpt(dummySession, 2,
4352 Collections::Collection c(CollExp, impTypes);
4358 const int nm = Exp->GetNcoeffs();
4359 Array<OneD, NekDouble> coeffsIn(nelmts * nm);
4360 Array<OneD, NekDouble> coeffsRef(nelmts * nm);
4361 Array<OneD, NekDouble> coeffs(nelmts * nm), tmp;
4363 for (
int i = 0; i < nm; ++i)
4368 for (
int i = 1; i < nelmts; ++i)
4370 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4376 for (
int i = 0; i < nelmts; ++i)
4379 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4384 double epsilon = 1.0e-8;
4385 for (
int i = 0; i < coeffsRef.size(); ++i)
4387 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4388 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4389 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4396 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4398 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4400 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4402 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4404 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4406 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4408 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4410 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4412 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4413 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4415 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4421 unsigned int numQuadPoints = 5;
4422 unsigned int numModes = 4;
4425 quadPointsTypeDir1);
4431 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4435 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4439 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4440 for (
int i = 0; i < nelmts; ++i)
4442 CollExp.push_back(Exp);
4446 Collections::CollectionOptimisation colOpt(dummySession, 2,
4449 Collections::Collection c(CollExp, impTypes);
4461 const int nm = Exp->GetNcoeffs();
4462 Array<OneD, NekDouble> coeffsIn(nelmts * nm);
4463 Array<OneD, NekDouble> coeffsRef(nelmts * nm);
4464 Array<OneD, NekDouble> coeffs(nelmts * nm), tmp;
4466 for (
int i = 0; i < nm; ++i)
4471 for (
int i = 1; i < nelmts; ++i)
4473 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4479 for (
int i = 0; i < nelmts; ++i)
4482 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4487 double epsilon = 1.0e-8;
4488 for (
int i = 0; i < coeffsRef.size(); ++i)
4490 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4491 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4492 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4499 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4501 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4503 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4505 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4507 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4509 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4511 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4513 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4515 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4516 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4518 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4524 unsigned int numQuadPoints = 5;
4525 unsigned int numModes = 4;
4528 quadPointsTypeDir1);
4534 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4538 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4542 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4543 for (
int i = 0; i < nelmts; ++i)
4545 CollExp.push_back(Exp);
4549 Collections::CollectionOptimisation colOpt(dummySession, 2,
4552 Collections::Collection c(CollExp, impTypes);
4558 const int nm = Exp->GetNcoeffs();
4559 Array<OneD, NekDouble> coeffsIn(nelmts * nm);
4560 Array<OneD, NekDouble> coeffsRef(nelmts * nm);
4561 Array<OneD, NekDouble> coeffs(nelmts * nm), tmp;
4563 for (
int i = 0; i < nm; ++i)
4568 for (
int i = 1; i < nelmts; ++i)
4570 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4576 for (
int i = 0; i < nelmts; ++i)
4579 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4584 double epsilon = 1.0e-8;
4585 for (
int i = 0; i < coeffsRef.size(); ++i)
4587 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4588 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4589 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4596 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4598 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4600 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4602 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4604 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4606 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4608 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4610 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4612 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4613 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4615 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4621 unsigned int numQuadPoints = 8;
4622 unsigned int numModes = 4;
4625 quadPointsTypeDir1);
4631 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4635 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4639 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4640 for (
int i = 0; i < nelmts; ++i)
4642 CollExp.push_back(Exp);
4646 Collections::CollectionOptimisation colOpt(dummySession, 2,
4649 Collections::Collection c(CollExp, impTypes);
4655 const int nm = Exp->GetNcoeffs();
4656 Array<OneD, NekDouble> coeffsIn(nelmts * nm);
4657 Array<OneD, NekDouble> coeffsRef(nelmts * nm);
4658 Array<OneD, NekDouble> coeffs(nelmts * nm), tmp;
4660 for (
int i = 0; i < nm; ++i)
4665 for (
int i = 1; i < nelmts; ++i)
4667 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4673 for (
int i = 0; i < nelmts; ++i)
4676 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4681 double epsilon = 1.0e-8;
4682 for (
int i = 0; i < coeffsRef.size(); ++i)
4684 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4685 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4686 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4693 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4695 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4697 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4699 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4701 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4703 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4705 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4707 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4709 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4710 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4712 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4718 unsigned int numQuadPoints = 5;
4719 unsigned int numModes = 4;
4722 quadPointsTypeDir1);
4728 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4732 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4736 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4737 for (
int i = 0; i < nelmts; ++i)
4739 CollExp.push_back(Exp);
4743 Collections::CollectionOptimisation colOpt(dummySession, 2,
4746 Collections::Collection c(CollExp, impTypes);
4758 const int nm = Exp->GetNcoeffs();
4759 Array<OneD, NekDouble> coeffsIn(nelmts * nm);
4760 Array<OneD, NekDouble> coeffsRef(nelmts * nm);
4761 Array<OneD, NekDouble> coeffs(nelmts * nm), tmp;
4763 for (
int i = 0; i < nm; ++i)
4768 for (
int i = 1; i < nelmts; ++i)
4770 Vmath::Vcopy(nm, coeffsIn, 1, tmp = coeffsIn + i * nm, 1);
4776 for (
int i = 0; i < nelmts; ++i)
4779 Exp->GeneralMatrixOp(coeffsIn + i * nm, tmp = coeffsRef + i * nm, mkey);
4784 double epsilon = 1.0e-8;
4785 for (
int i = 0; i < coeffsRef.size(); ++i)
4787 coeffsRef[i] = (std::abs(coeffsRef[i]) < 1e-14) ? 0.0 : coeffsRef[i];
4788 coeffs[i] = (std::abs(coeffs[i]) < 1e-14) ? 0.0 : coeffs[i];
4789 BOOST_CHECK_CLOSE(coeffsRef[i], coeffs[i], epsilon);
4796 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4798 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4800 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4802 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4804 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4806 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4808 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4810 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4812 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4813 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4815 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4821 unsigned int numQuadPoints = 5;
4822 unsigned int numModes = 4;
4825 quadPointsTypeDir1);
4831 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4835 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4837 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4838 CollExp.push_back(Exp);
4841 Collections::CollectionOptimisation colOpt(dummySession, 3,
4844 Collections::Collection c(CollExp, impTypes);
4850 const int nq = Exp->GetTotPoints();
4852 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
4853 Array<OneD, NekDouble> phys(nq), tmp;
4855 Exp->GetCoords(xc, yc, zc);
4857 for (
int i = 0; i < nq; ++i)
4859 phys[i] = pow(xc[i], 3) + pow(yc[i], 3) + pow(zc[i], 3);
4863 Array<OneD, NekDouble> xc1(nq1);
4864 Array<OneD, NekDouble> yc1(nq1);
4865 Array<OneD, NekDouble> zc1(nq1);
4866 Array<OneD, NekDouble> phys1(nq1);
4873 double epsilon = 1.0e-8;
4875 for (
int i = 0; i < nq1; ++i)
4877 NekDouble exact = pow(xc1[i], 3) + pow(yc1[i], 3) + pow(zc1[i], 3);
4878 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
4879 exact = (fabs(exact) < 1e-14) ? 0.0 : exact;
4880 BOOST_CHECK_CLOSE(phys1[i], exact, epsilon);
4887 new SpatialDomains::PointGeom(3u, 0u, -1.0, -1.0, -1.0));
4889 new SpatialDomains::PointGeom(3u, 1u, 1.0, -1.0, -1.0));
4891 new SpatialDomains::PointGeom(3u, 2u, 1.0, 1.0, -1.0));
4893 new SpatialDomains::PointGeom(3u, 3u, -1.0, 1.0, -1.0));
4895 new SpatialDomains::PointGeom(3u, 4u, -1.0, -1.0, 1.0));
4897 new SpatialDomains::PointGeom(3u, 5u, 1.0, -1.0, 1.0));
4899 new SpatialDomains::PointGeom(3u, 6u, 2.0, 3.0, 4.0));
4901 new SpatialDomains::PointGeom(3u, 7u, -1.0, 1.0, 1.0));
4903 std::vector<SpatialDomains::SegGeomUniquePtr> segVec;
4904 std::vector<SpatialDomains::QuadGeomUniquePtr> faceVec;
4906 CreateHex(v0.get(), v1.get(), v2.get(), v3.get(), v4.get(), v5.get(), v6.get(), v7.get(), segVec, faceVec);
4912 unsigned int numQuadPoints = 5;
4913 unsigned int numModes = 4;
4916 quadPointsTypeDir1);
4922 basisKeyDir1, basisKeyDir1, basisKeyDir1, hexGeom.get());
4926 basisKeyDir1, basisKeyDir1, basisKeyDir1);
4928 std::vector<StdRegions::StdExpansionSharedPtr> CollExp;
4929 CollExp.push_back(Exp);
4932 Collections::CollectionOptimisation colOpt(dummySession, 3,
4935 Collections::Collection c(CollExp, impTypes);
4941 const int nq = Exp->GetTotPoints();
4943 Array<OneD, NekDouble> xc(nq), yc(nq), zc(nq);
4944 Array<OneD, NekDouble> phys(nq), tmp;
4946 Exp->GetCoords(xc, yc, zc);
4948 for (
int i = 0; i < nq; ++i)
4950 phys[i] = pow(xc[i], 3) + pow(yc[i], 3) + pow(zc[i], 3);
4954 Array<OneD, NekDouble> xc1(nq1);
4955 Array<OneD, NekDouble> yc1(nq1);
4956 Array<OneD, NekDouble> zc1(nq1);
4957 Array<OneD, NekDouble> phys1(nq1);
4964 double epsilon = 1.0e-8;
4966 for (
int i = 0; i < nq1; ++i)
4968 NekDouble exact = pow(xc1[i], 3) + pow(yc1[i], 3) + pow(zc1[i], 3);
4969 phys1[i] = (fabs(phys1[i]) < 1e-14) ? 0.0 : phys1[i];
4970 exact = (fabs(exact) < 1e-14) ? 0.0 : exact;
4971 BOOST_CHECK_CLOSE(phys1[i], exact, epsilon);