47 : StdExpansion(LibUtilities::StdPyrData::getNumberOfCoefficients(
48 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
50 StdExpansion3D(LibUtilities::StdPyrData::getNumberOfCoefficients(
51 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
56 m_staticCondMatrixManager(
std::bind(&
Expansion::CreateStaticCondMatrix,
57 this,
std::placeholders::_1))
62 : StdExpansion(T), StdExpansion3D(T), StdPyrExp(T),
Expansion(T),
64 m_staticCondMatrixManager(T.m_staticCondMatrixManager)
106 const int nquad1 =
m_base[1]->GetNumPoints();
107 const int nquad2 =
m_base[2]->GetNumPoints();
108 const int nqtot = nquad0 * nquad1 * nquad2;
126 m_base[2]->GetBdata(), tmp2, outarray, jac,
130 m_base[2]->GetBdata(), tmp3, tmp6, jac, Deformed);
134 m_base[2]->GetDbdata(), tmp4, tmp6, jac, Deformed);
142 const int nquad0 =
m_base[0]->GetNumPoints();
143 const int nquad1 =
m_base[1]->GetNumPoints();
144 const int nquad2 =
m_base[2]->GetNumPoints();
145 const int nqtot = nquad0 * nquad1 * nquad2;
159 Vmath::Vmul(nqtot, &df[3 * dir][0], 1, inarray.data(), 1, tmp2.data(),
161 Vmath::Vmul(nqtot, &df[3 * dir + 1][0], 1, inarray.data(), 1,
163 Vmath::Vmul(nqtot, &df[3 * dir + 2][0], 1, inarray.data(), 1,
168 Vmath::Smul(nqtot, df[3 * dir][0], inarray.data(), 1, tmp2.data(), 1);
169 Vmath::Smul(nqtot, df[3 * dir + 1][0], inarray.data(), 1, tmp3.data(),
171 Vmath::Smul(nqtot, df[3 * dir + 2][0], inarray.data(), 1, tmp4.data(),
178 for (
int k = 0, cnt = 0; k < nquad2; ++k)
180 g2 = 2.0 / (1.0 - z2[k]);
182 for (j = 0; j < nquad1; ++j)
184 g1 = 0.5 * (1.0 + z1[j]) * g2;
186 for (i = 0; i < nquad0; ++i, ++cnt)
188 g0 = 0.5 * (1.0 + z0[i]);
191 outarray[0][cnt] = g2 * tmp2[cnt] + g02 * tmp4[cnt];
192 outarray[1][cnt] = g2 * tmp3[cnt] + g1 * tmp4[cnt];
206 m_base[2]->GetBasisKey());
212 m_base[0]->GetPointsKey());
214 m_base[1]->GetPointsKey());
216 m_base[2]->GetPointsKey());
231 ASSERTL1(Lcoords[0] <= -1.0 && Lcoords[0] >= 1.0 && Lcoords[1] <= -1.0 &&
232 Lcoords[1] >= 1.0 && Lcoords[2] <= -1.0 && Lcoords[2] >= 1.0,
233 "Local coordinates are not in region [-1,1]");
251 const NekDouble *data,
const std::vector<unsigned int> &nummodes,
252 const int mode_offset,
NekDouble *coeffs,
253 std::vector<LibUtilities::BasisType> &fromType)
255 int data_order0 = nummodes[mode_offset];
256 int fillorder0 =
min(
m_base[0]->GetNumModes(), data_order0);
257 int data_order1 = nummodes[mode_offset + 1];
258 int order1 =
m_base[1]->GetNumModes();
259 int fillorder1 =
min(order1, data_order1);
260 int data_order2 = nummodes[mode_offset + 2];
261 int order2 =
m_base[2]->GetNumModes();
262 int fillorder2 =
min(order2, data_order2);
269 data_order1 != fillorder1 || data_order2 != fillorder2)
276 m_base[0]->GetPointsKey()),
278 m_base[1]->GetPointsKey()),
280 m_base[2]->GetPointsKey()));
284 m_base[2]->GetBasisKey());
303 std::array<NekDouble, 3> &firstOrderDerivs)
308 return StdPyrExp::v_PhysEvalFirstDeriv(Lcoord, inarray, firstOrderDerivs);
317 int nquad0 =
m_base[0]->GetNumPoints();
318 int nquad1 =
m_base[1]->GetNumPoints();
319 int nquad2 =
m_base[2]->GetNumPoints();
329 if (outarray.size() != nq0 * nq1)
335 for (
int i = 0; i < nquad0 * nquad1; ++i)
344 if (outarray.size() != nq0 * nq1)
350 for (
int k = 0; k < nquad2; k++)
352 for (
int i = 0; i < nquad0; ++i)
354 outarray[k * nquad0 + i] = (nquad0 * nquad1 * k) + i;
362 if (outarray.size() != nq0 * nq1)
368 for (
int j = 0; j < nquad1 * nquad2; ++j)
370 outarray[j] = nquad0 - 1 + j * nquad0;
377 if (outarray.size() != nq0 * nq1)
383 for (
int k = 0; k < nquad2; k++)
385 for (
int i = 0; i < nquad0; ++i)
387 outarray[k * nquad0 + i] =
388 nquad0 * (nquad1 - 1) + (nquad0 * nquad1 * k) + i;
396 if (outarray.size() != nq0 * nq1)
402 for (
int j = 0; j < nquad1 * nquad2; ++j)
404 outarray[j] = j * nquad0;
408 ASSERTL0(
false,
"face value (> 4) is out of range");
416 for (
int i = 0; i < ptsKeys.size(); ++i)
443 for (i = 0; i < vCoordDim; ++i)
448 size_t nqb = nq_face;
463 for (i = 0; i < vCoordDim; ++i)
465 normal[i][0] = -df[3 * i + 2][0];
471 for (i = 0; i < vCoordDim; ++i)
473 normal[i][0] = -df[3 * i + 1][0];
479 for (i = 0; i < vCoordDim; ++i)
481 normal[i][0] = df[3 * i][0] + df[3 * i + 2][0];
487 for (i = 0; i < vCoordDim; ++i)
489 normal[i][0] = df[3 * i + 1][0] + df[3 * i + 2][0];
495 for (i = 0; i < vCoordDim; ++i)
497 normal[i][0] = -df[3 * i][0];
502 ASSERTL0(
false,
"face is out of range (face < 4)");
507 for (i = 0; i < vCoordDim; ++i)
509 fac += normal[i][0] * normal[i][0];
511 fac = 1.0 /
sqrt(fac);
515 for (i = 0; i < vCoordDim; ++i)
517 Vmath::Fill(nq_face, fac * normal[i][0], normal[i], 1);
525 int nq0 = ptsKeys[0].GetNumPoints();
526 int nq1 = ptsKeys[1].GetNumPoints();
527 int nq2 = ptsKeys[2].GetNumPoints();
528 int nq01 = nq0 * nq1;
536 else if (face == 1 || face == 3)
558 for (j = 0; j < nq01; ++j)
560 normals[j] = -df[2][j] * jac[j];
561 normals[nqtot + j] = -df[5][j] * jac[j];
562 normals[2 * nqtot + j] = -df[8][j] * jac[j];
566 points0 = ptsKeys[0];
567 points1 = ptsKeys[1];
573 for (j = 0; j < nq0; ++j)
575 for (k = 0; k < nq2; ++k)
577 int tmp = j + nq01 * k;
578 normals[j + k * nq0] = -df[1][tmp] * jac[tmp];
579 normals[nqtot + j + k * nq0] = -df[4][tmp] * jac[tmp];
580 normals[2 * nqtot + j + k * nq0] =
581 -df[7][tmp] * jac[tmp];
582 faceJac[j + k * nq0] = jac[tmp];
586 points0 = ptsKeys[0];
587 points1 = ptsKeys[2];
593 for (j = 0; j < nq1; ++j)
595 for (k = 0; k < nq2; ++k)
597 int tmp = nq0 - 1 + nq0 * j + nq01 * k;
598 normals[j + k * nq1] =
599 (df[0][tmp] + df[2][tmp]) * jac[tmp];
600 normals[nqtot + j + k * nq1] =
601 (df[3][tmp] + df[5][tmp]) * jac[tmp];
602 normals[2 * nqtot + j + k * nq1] =
603 (df[6][tmp] + df[8][tmp]) * jac[tmp];
604 faceJac[j + k * nq1] = jac[tmp];
608 points0 = ptsKeys[1];
609 points1 = ptsKeys[2];
615 for (j = 0; j < nq0; ++j)
617 for (k = 0; k < nq2; ++k)
619 int tmp = nq0 * (nq1 - 1) + j + nq01 * k;
620 normals[j + k * nq0] =
621 (df[1][tmp] + df[2][tmp]) * jac[tmp];
622 normals[nqtot + j + k * nq0] =
623 (df[4][tmp] + df[5][tmp]) * jac[tmp];
624 normals[2 * nqtot + j + k * nq0] =
625 (df[7][tmp] + df[8][tmp]) * jac[tmp];
626 faceJac[j + k * nq0] = jac[tmp];
630 points0 = ptsKeys[0];
631 points1 = ptsKeys[2];
637 for (j = 0; j < nq1; ++j)
639 for (k = 0; k < nq2; ++k)
641 int tmp = j * nq0 + nq01 * k;
642 normals[j + k * nq1] = -df[0][tmp] * jac[tmp];
643 normals[nqtot + j + k * nq1] = -df[3][tmp] * jac[tmp];
644 normals[2 * nqtot + j + k * nq1] =
645 -df[6][tmp] * jac[tmp];
646 faceJac[j + k * nq1] = jac[tmp];
650 points0 = ptsKeys[1];
651 points1 = ptsKeys[2];
656 ASSERTL0(
false,
"face is out of range (face < 4)");
664 Vmath::Sdiv(nq_face, 1.0, &work[0], 1, &work[0], 1);
667 for (i = 0; i < vCoordDim; ++i)
672 Vmath::Vmul(nq_face, work, 1, normal[i], 1, normal[i], 1);
679 Vmath::Vvtvp(nq_face, normal[i], 1, normal[i], 1, work, 1, work, 1);
689 Vmath::Vmul(nq_face, normal[i], 1, work, 1, normal[i], 1);
715 StdPyrExp::v_SVVLaplacianFilter(array, mkey);
740 returnval = StdPyrExp::v_GenMatrix(mkey);
754 return tmp->GetStdMatrix(mkey);
781 const unsigned int dim = 3;
787 for (
unsigned int i = 0; i < dim; ++i)
789 for (
unsigned int j = i; j < dim; ++j)
819 const unsigned int nquad0 =
m_base[0]->GetNumPoints();
820 const unsigned int nquad1 =
m_base[1]->GetNumPoints();
821 const unsigned int nquad2 =
m_base[2]->GetNumPoints();
824 for (j = 0; j < nquad2; ++j)
826 for (i = 0; i < nquad1; ++i)
829 &h0[0] + i * nquad0 + j * nquad0 * nquad1, 1);
831 &h1[0] + i * nquad0 + j * nquad0 * nquad1, 1);
833 &h2[0] + i * nquad0 + j * nquad0 * nquad1, 1);
836 for (i = 0; i < nquad0; i++)
838 Blas::Dscal(nquad1 * nquad2, 1 + z0[i], &h1[0] + i, nquad0);
847 Vmath::Vvtvvtp(nqtot, &df[0][0], 1, &h0[0], 1, &df[2][0], 1, &h1[0], 1,
849 Vmath::Vvtvvtp(nqtot, &df[3][0], 1, &h0[0], 1, &df[5][0], 1, &h1[0], 1,
851 Vmath::Vvtvvtp(nqtot, &df[6][0], 1, &h0[0], 1, &df[8][0], 1, &h1[0], 1,
855 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0],
857 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1);
860 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp1[0], 1, &df[5][0], 1, &wsp2[0],
862 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp3[0], 1, &g4[0], 1, &g4[0], 1);
865 Vmath::Vvtvvtp(nqtot, &df[1][0], 1, &h0[0], 1, &df[2][0], 1, &h2[0], 1,
867 Vmath::Vvtvvtp(nqtot, &df[4][0], 1, &h0[0], 1, &df[5][0], 1, &h2[0], 1,
869 Vmath::Vvtvvtp(nqtot, &df[7][0], 1, &h0[0], 1, &df[8][0], 1, &h2[0], 1,
873 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
875 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1);
878 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0],
880 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1);
883 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp4[0], 1, &df[5][0], 1, &wsp5[0],
885 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp6[0], 1, &g5[0], 1, &g5[0], 1);
889 &df[5][0], 1, &g2[0], 1);
890 Vmath::Vvtvp(nqtot, &df[8][0], 1, &df[8][0], 1, &g2[0], 1, &g2[0], 1);
903 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0],
905 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1);
908 Vmath::Svtsvtp(nqtot, df[2][0], &wsp1[0], 1, df[5][0], &wsp2[0], 1,
910 Vmath::Svtvp(nqtot, df[8][0], &wsp3[0], 1, &g4[0], 1, &g4[0], 1);
921 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
923 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1);
926 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0],
928 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1);
931 Vmath::Svtsvtp(nqtot, df[2][0], &wsp4[0], 1, df[5][0], &wsp5[0], 1,
933 Vmath::Svtvp(nqtot, df[8][0], &wsp6[0], 1, &g5[0], 1, &g5[0], 1);
937 df[2][0] * df[2][0] + df[5][0] * df[5][0] +
954 int nquad0 =
m_base[0]->GetNumPoints();
955 int nquad1 =
m_base[1]->GetNumPoints();
956 int nq2 =
m_base[2]->GetNumPoints();
957 int nqtot = nquad0 * nquad1 * nq2;
959 ASSERTL1(wsp.size() >= 6 * nqtot,
"Insufficient workspace size.");
960 ASSERTL1(m_ncoeffs <= nqtot, "Workspace not set up for ncoeffs > nqtot
");
962 const Array<OneD, const NekDouble> &base0 = m_base[0]->GetBdata();
963 const Array<OneD, const NekDouble> &base1 = m_base[1]->GetBdata();
964 const Array<OneD, const NekDouble> &base2 = m_base[2]->GetBdata();
965 const Array<OneD, const NekDouble> &dbase0 = m_base[0]->GetDbdata();
966 const Array<OneD, const NekDouble> &dbase1 = m_base[1]->GetDbdata();
967 const Array<OneD, const NekDouble> &dbase2 = m_base[2]->GetDbdata();
968 const Array<OneD, const NekDouble> &metric00 =
969 m_metrics[eMetricLaplacian00];
970 const Array<OneD, const NekDouble> &metric01 =
971 m_metrics[eMetricLaplacian01];
972 const Array<OneD, const NekDouble> &metric02 =
973 m_metrics[eMetricLaplacian02];
974 const Array<OneD, const NekDouble> &metric11 =
975 m_metrics[eMetricLaplacian11];
976 const Array<OneD, const NekDouble> &metric12 =
977 m_metrics[eMetricLaplacian12];
978 const Array<OneD, const NekDouble> &metric22 =
979 m_metrics[eMetricLaplacian22];
981 // Allocate temporary storage
982 Array<OneD, NekDouble> wsp0(2 * nqtot, wsp);
983 Array<OneD, NekDouble> wsp1(nqtot, wsp + 1 * nqtot);
984 Array<OneD, NekDouble> wsp2(nqtot, wsp + 2 * nqtot);
985 Array<OneD, NekDouble> wsp3(nqtot, wsp + 3 * nqtot);
986 Array<OneD, NekDouble> wsp4(nqtot, wsp + 4 * nqtot);
987 Array<OneD, NekDouble> wsp5(nqtot, wsp + 5 * nqtot);
989 // LAPLACIAN MATRIX OPERATION
990 // wsp1 = du_dxi1 = D_xi1 * inarray = D_xi1 * u
991 // wsp2 = du_dxi2 = D_xi2 * inarray = D_xi2 * u
992 // wsp2 = du_dxi3 = D_xi3 * inarray = D_xi3 * u
993 PhysTensorDeriv(inarray, wsp0, wsp1, wsp2);
995 // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
996 // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
997 // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
998 // especially for this purpose
999 Vmath::Vvtvvtp(nqtot, &metric00[0], 1, &wsp0[0], 1, &metric01[0], 1,
1000 &wsp1[0], 1, &wsp3[0], 1);
1001 Vmath::Vvtvp(nqtot, &metric02[0], 1, &wsp2[0], 1, &wsp3[0], 1, &wsp3[0], 1);
1002 Vmath::Vvtvvtp(nqtot, &metric01[0], 1, &wsp0[0], 1, &metric11[0], 1,
1003 &wsp1[0], 1, &wsp4[0], 1);
1004 Vmath::Vvtvp(nqtot, &metric12[0], 1, &wsp2[0], 1, &wsp4[0], 1, &wsp4[0], 1);
1005 Vmath::Vvtvvtp(nqtot, &metric02[0], 1, &wsp0[0], 1, &metric12[0], 1,
1006 &wsp1[0], 1, &wsp5[0], 1);
1007 Vmath::Vvtvp(nqtot, &metric22[0], 1, &wsp2[0], 1, &wsp5[0], 1, &wsp5[0], 1);
1009 const Array<OneD, const NekDouble> &jac = m_geomFactors->GetJac();
1010 bool Deformed = (m_geomFactors->GetGtype() == SpatialDomains::eDeformed);
1012 v_IProductWRTBaseKernel(dbase0, base1, base2, wsp3, outarray, jac,
1014 v_IProductWRTBaseKernel(base0, dbase1, base2, wsp4, wsp2, jac, Deformed);
1015 Vmath::Vadd(m_ncoeffs, wsp2.data(), 1, outarray.data(), 1, outarray.data(),
1017 v_IProductWRTBaseKernel(base0, base1, dbase2, wsp5, wsp2, jac, Deformed);
1018 Vmath::Vadd(m_ncoeffs, wsp2.data(), 1, outarray.data(), 1, outarray.data(),
1022} // namespace Nektar::LocalRegions
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Describes the specification for a Basis.
int GetNumPoints() const
Return points order at which basis is defined.
PointsKey GetPointsKey() const
Return distribution of points.
Defines a specification for a set of points.
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
std::map< int, NormalVector > m_traceNormals
std::map< int, Array< OneD, NekDouble > > m_elmtBndNormDirElmtLen
the element length in each element boundary(Vertex, edge or face) normal direction calculated based o...
void ComputeLaplacianMetric()
SpatialDomains::Geometry * m_geom
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
SpatialDomains::GeomFactorsUniquePtr m_geomFactors
void v_ExtractDataToCoeffs(const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType) override
void v_ComputeLaplacianMetric() override
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) override
PyrExp(const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::BasisKey &Bc, SpatialDomains::Geometry3D *geom)
Constructor using BasisKey class for quadrature points and order definition.
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey) override
NekDouble v_PhysEvalFirstDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
void v_ComputeTraceNormal(const int face) override
void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) override
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculates the inner product .
StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const override
void v_DropLocMatrix(const MatrixKey &mkey) override
void v_LaplacianMatrixOp_MatFree_Kernel(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp) override
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const override
DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey) override
void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray) override
void v_GetTracePhysMap(const int face, Array< OneD, int > &outarray) override
void v_DropLocStaticCondMatrix(const MatrixKey &mkey) override
DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey) override
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
NekDouble GetCoord(const int i, const Array< OneD, const NekDouble > &Lcoord)
Given local collapsed coordinate Lcoord, return the value of physical coordinate in direction i.
NekDouble GetLocCoords(const Array< OneD, const NekDouble > &coords, Array< OneD, NekDouble > &Lcoords)
Determine the local collapsed coordinates that correspond to a given Cartesian coordinate for this ge...
int GetCoordim() const
Return the coordinate dimension of this object (i.e. the dimension of the space in which this object ...
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
const LibUtilities::PointsKeyVector GetPointsKeys() const
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
const LibUtilities::BasisKey GetTraceBasisKey(const int i, int k=-1, bool UseGLL=false) const
This function returns the basis key belonging to the i-th trace.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
MatrixType GetMatrixType() const
void v_IProductWRTBaseKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const Array< OneD, NekDouble > &jac, const bool Deformed, bool CollDir0=false, bool CollDir1=false, bool CollDir2=false) override
Inner product of inarray over region with respect to the expansion basis (this)->m_base[0] and return...
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
void Interp2D(const BasisKey &fbasis0, const BasisKey &fbasis1, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, Array< OneD, NekDouble > &to)
this function interpolates a 2D function evaluated at the quadrature points of the 2D basis,...
std::vector< PointsKey > PointsKeyVector
GeomType
Indicates the type of element geometry.
@ eRegular
Geometry is straight-sided with constant geometric factors.
@ eMovingRegular
Currently unused.
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
std::shared_ptr< StdPyrExp > StdPyrExpSharedPtr
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
Svtsvtp (scalar times vector plus scalar times vector):
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Svtvp (scalar times vector plus vector): z = alpha*x + y.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/x.
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > min(scalarT< T > lhs, scalarT< T > rhs)
scalarT< T > sqrt(scalarT< T > in)