57 const int nquad0 =
m_base[0]->GetNumPoints();
58 const int nquad1 =
m_base[1]->GetNumPoints();
59 const int nquad2 =
m_base[2]->GetNumPoints();
64 Vmath::Vcopy(nquad0 * nquad1 * nquad2, &inarray[0], 1, &wsp[0], 1);
66 if (out_dx.size() > 0)
70 Blas::Dgemm(
'N',
'N', nquad0, nquad1 * nquad2, nquad0, 1.0, D0, nquad0,
71 &wsp[0], nquad0, 0.0, &out_dx[0], nquad0);
74 if (out_dy.size() > 0)
77 for (
int j = 0; j < nquad2; ++j)
80 &wsp[j * nquad0 * nquad1], nquad0, D1, nquad1, 0.0,
81 &out_dy[j * nquad0 * nquad1], nquad0);
85 if (out_dz.size() > 0)
89 Blas::Dgemm(
'N',
'T', nquad0 * nquad1, nquad2, nquad2, 1.0, &wsp[0],
90 nquad0 * nquad1, D2, nquad2, 0.0, &out_dz[0],
101 bool doCheckCollDir0,
bool doCheckCollDir1,
bool doCheckCollDir2)
104 doCheckCollDir0, doCheckCollDir1, doCheckCollDir2);
113 bool doCheckCollDir0,
bool doCheckCollDir1,
bool doCheckCollDir2)
116 doCheckCollDir0, doCheckCollDir1,
122 ASSERTL1((dir == 0) || (dir == 1) || (dir == 2),
"Invalid direction.");
124 const int nq0 =
m_base[0]->GetNumPoints();
125 const int nq1 =
m_base[1]->GetNumPoints();
126 const int nq2 =
m_base[2]->GetNumPoints();
127 const int nq = nq0 * nq1 * nq2;
128 const int nm0 =
m_base[0]->GetNumModes();
129 const int nm1 =
m_base[1]->GetNumModes();
142 for (
int i = 0; i < nq; i++)
147 m_base[2]->GetBdata(), tmp2, tmp5, wsp,
false,
true,
true);
153 (*mat)(j, i) = tmp5[j];
158 for (
int i = 0; i < nq; i++)
163 m_base[2]->GetBdata(), tmp2, tmp5, wsp,
true,
false,
true);
169 (*mat)(j, i) = tmp5[j];
174 for (
int i = 0; i < nq; i++)
179 m_base[2]->GetDbdata(), tmp2, tmp5, wsp,
true,
true,
false);
184 (*mat)(j, i) = tmp5[j];
210 const int nq0 =
m_base[0]->GetNumPoints();
211 const int nq1 =
m_base[1]->GetNumPoints();
212 const int nq2 =
m_base[2]->GetNumPoints();
218 for (
int i = 0; i < nq1 * nq2; ++i, ptr += nq0)
220 wsp1[i] = StdExpansion::BaryEvaluate<0>(eta[0], ptr);
223 for (
int i = 0; i < nq2; ++i)
225 wsp2[i] = StdExpansion::BaryEvaluate<1>(eta[1], &wsp1[i * nq1]);
228 return StdExpansion::BaryEvaluate<2>(eta[2], &wsp2[0]);
237 int Qx =
m_base[0]->GetNumPoints();
238 int Qy =
m_base[1]->GetNumPoints();
239 int Qz =
m_base[2]->GetNumPoints();
249 interpolatingNodes = &I[0]->GetPtr()[0];
251 Blas::Dgemv(
'T', Qx, Qy * Qz, 1.0, &physvals[0], Qx, &interpolatingNodes[0],
252 1, 0.0, &sumFactorization_qr[0], 1);
255 interpolatingNodes = &I[1]->GetPtr()[0];
257 Blas::Dgemv(
'T', Qy, Qz, 1.0, &sumFactorization_qr[0], Qy,
258 &interpolatingNodes[0], 1, 0.0, &sumFactorization_r[0], 1);
261 interpolatingNodes = &I[2]->GetPtr()[0];
262 value =
Blas::Ddot(Qz, interpolatingNodes, 1, &sumFactorization_r[0], 1);
270 [[maybe_unused]] std::array<NekDouble, 3> &firstOrderDerivs)
300 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
301 m_base[2]->Collocation()))
332 int nquad0 =
m_base[0]->GetNumPoints();
333 int nquad1 =
m_base[1]->GetNumPoints();
334 int nquad2 =
m_base[2]->GetNumPoints();
335 int nmodes0 =
m_base[0]->GetNumModes();
336 int nmodes1 =
m_base[1]->GetNumModes();
337 int nmodes2 =
m_base[2]->GetNumModes();
338 int wspsize = max(nquad0 * nmodes2 * (nmodes1 + nquad1),
339 nquad0 * nquad1 * (nquad2 + nmodes0) +
340 nmodes0 * nmodes1 * nquad2);
351 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
352 m_base[2]->Collocation()))
363 wsp2,
true,
true,
true);
408 [[maybe_unused]]
const int tid,
426 if (maparray.size() != map2.size())
431 for (
int i = 0; i < map2.size(); ++i)
433 maparray[i] = map1[map2[i]];
438 [[maybe_unused]]
const int facedir,
443 switch (faceDirBasisType)
495 const int numpoints,
const int nummodes)
497 switch (faceDirBasisType)
522 numpoints, LibUtilities::eGaussRadauMAlpha1Beta0);
550 numpoints, LibUtilities::eGaussRadauMAlpha1Beta0);
580 numpoints, LibUtilities::eGaussRadauMAlpha1Beta0);
#define WARNINGL2(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Describes the specification for a Basis.
Defines a specification for a set of points.
virtual int v_GetNedges(void) const
void BwdTrans_SumFacKernel(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, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards)
void IProductWRTBase_SumFacKernel(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, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual void v_BwdTrans_SumFacKernel(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, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)=0
void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
virtual int v_GetEdgeNcoeffs(const int i) const
NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals) override
This function evaluates the expansion at a single (arbitrary) point of the domain.
NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrates the specified function over the domain.
void v_GenStdMatBwdDeriv(const int dir, DNekMatSharedPtr &mat) override
void v_GetTraceToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient, int P, int Q) override
virtual void v_IProductWRTBase_SumFacKernel(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, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)=0
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d1, Array< OneD, NekDouble > &outarray_d2, Array< OneD, NekDouble > &outarray_d3)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points.
The base class for all shapes.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
void GetElmtTraceToTraceMap(const unsigned int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards, int P=-1, int Q=-1)
void LaplacianMatrixOp_MatFree_GenericImpl(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
void GetTraceCoeffMap(const unsigned int traceid, Array< OneD, unsigned int > &maparray)
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void HelmholtzMatrixOp_MatFree_GenericImpl(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void LaplacianMatrixOp_MatFree_Kernel(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp)
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n].
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eModified_B
Principle Modified Functions .
@ P
Monomial polynomials .
@ eOrtho_A
Principle Orthogonal Functions .
@ eModified_C
Principle Modified Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eOrtho_C
Principle Orthogonal Functions .
@ eModifiedPyr_C
Principle Modified Functions.
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
@ eOrthoPyr_C
Principle Orthogonal Functions .
static const NekDouble kNekZeroTol
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
std::shared_ptr< DNekMat > DNekMatSharedPtr
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.
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)