48 [[maybe_unused]]
int numcoeffs,
61 int nquad0 =
m_base[0]->GetNumPoints();
62 int nquad1 =
m_base[1]->GetNumPoints();
64 if (outarray_d0.size() > 0)
67 if (inarray.data() == outarray_d0.data())
70 Vmath::Vcopy(nquad0 * nquad1, inarray.data(), 1, wsp.data(), 1);
72 &(D0->GetPtr())[0], nquad0, &wsp[0], nquad0, 0.0,
73 &outarray_d0[0], nquad0);
78 &(D0->GetPtr())[0], nquad0, &inarray[0], nquad0, 0.0,
79 &outarray_d0[0], nquad0);
83 if (outarray_d1.size() > 0)
86 if (inarray.data() == outarray_d1.data())
89 Vmath::Vcopy(nquad0 * nquad1, inarray.data(), 1, wsp.data(), 1);
90 Blas::Dgemm(
'N',
'T', nquad0, nquad1, nquad1, 1.0, &wsp[0], nquad0,
91 &(D1->GetPtr())[0], nquad1, 0.0, &outarray_d1[0],
96 Blas::Dgemm(
'N',
'T', nquad0, nquad1, nquad1, 1.0, &inarray[0],
97 nquad0, &(D1->GetPtr())[0], nquad1, 0.0,
98 &outarray_d1[0], nquad0);
115 const int nq0 =
m_base[0]->GetNumPoints();
116 const int nq1 =
m_base[1]->GetNumPoints();
119 for (
int i = 0; i < nq1; ++i)
121 wsp[i] = StdExpansion::BaryEvaluate<0>(coll[0], &physvals[0] + i * nq0);
124 return StdExpansion::BaryEvaluate<1>(coll[1], &wsp[0]);
133 int nq0 =
m_base[0]->GetNumPoints();
134 int nq1 =
m_base[1]->GetNumPoints();
138 for (i = 0; i < nq1; ++i)
141 Blas::Ddot(nq0, &(I[0]->GetPtr())[0], 1, &physvals[i * nq0], 1);
145 val =
Blas::Ddot(nq1, I[1]->GetPtr(), 1, wsp1, 1);
160 int nquad0 =
m_base[0]->GetNumPoints();
161 int nquad1 =
m_base[1]->GetNumPoints();
165 for (i = 0; i < nquad1; ++i)
167 Vmath::Vmul(nquad0, &inarray[0] + i * nquad0, 1, w0.data(), 1,
168 &tmp[0] + i * nquad0, 1);
171 for (i = 0; i < nquad0; ++i)
173 Vmath::Vmul(nquad1, &tmp[0] + i, nquad0, w1.data(), 1, &tmp[0] + i,
186 bool doCheckCollDir0,
bool doCheckCollDir1)
189 doCheckCollDir0, doCheckCollDir1);
197 bool doCheckCollDir0,
bool doCheckCollDir1)
200 doCheckCollDir0, doCheckCollDir1);
205 ASSERTL1((dir == 0) || (dir == 1),
"Invalid direction.");
207 int nquad0 =
m_base[0]->GetNumPoints();
208 int nquad1 =
m_base[1]->GetNumPoints();
209 int nqtot = nquad0 * nquad1;
210 int nmodes0 =
m_base[0]->GetNumModes();
219 for (
int i = 0; i < nqtot; i++)
223 m_base[1]->GetBdata(), tmp1, tmp3,
229 (*mat)(j, i) = tmp3[j];
234 for (
int i = 0; i < nqtot; i++)
238 m_base[1]->GetDbdata(), tmp1, tmp3,
244 (*mat)(j, i) = tmp3[j];
266 int nquad0 =
m_base[0]->GetNumPoints();
267 int nquad1 =
m_base[1]->GetNumPoints();
268 int nqtot = nquad0 * nquad1;
269 int nmodes0 =
m_base[0]->GetNumModes();
270 int nmodes1 =
m_base[1]->GetNumModes();
272 max(max(max(nqtot,
m_ncoeffs), nquad1 * nmodes0), nquad0 * nmodes1);
281 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation()))
313 int nquad0 =
m_base[0]->GetNumPoints();
314 int nquad1 =
m_base[1]->GetNumPoints();
315 int nqtot = nquad0 * nquad1;
316 int nmodes0 =
m_base[0]->GetNumModes();
317 int nmodes1 =
m_base[1]->GetNumModes();
319 max(max(max(nqtot,
m_ncoeffs), nquad1 * nmodes0), nquad0 * nmodes1);
330 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation()))
364 [[maybe_unused]]
const unsigned int traceid,
368 "This method must be defined at the individual shape level");
379 [[maybe_unused]]
int Q)
387 dir = (eid == 0) ? 0 : 1;
394 int numModes =
m_base[dir]->GetNumModes();
397 P = (
P == -1) ? numModes :
P;
400 if (maparray.size() !=
P)
406 for (i = 0; i <
P; ++i)
411 if (signarray.size() !=
P)
417 std::fill(signarray.data(), signarray.data() +
P, 1);
422 for (i = numModes; i <
P; ++i)
425 maparray[i] = maparray[0];
435 std::swap(maparray[0], maparray[1]);
437 for (i = 3; i < std::min(
P, numModes); i += 2)
445 ASSERTL1(
P == numModes,
"Different trace space edge dimension "
446 "and element edge dimension not currently "
447 "possible for GLL-Lagrange bases");
449 std::reverse(maparray.data(), maparray.data() +
P);
453 ASSERTL0(
false,
"Mapping not defined for this type of basis");
468 if (maparray.size() != map2.size())
473 for (
int i = 0; i < map2.size(); ++i)
475 maparray[i] = map1[map2[i]];
485 fromExp->GetBasis(1)->GetPointsKey(), fromData,
#define ASSERTL0(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....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Describes the specification for a Basis.
void v_GenStdMatBwdDeriv(const int dir, DNekMatSharedPtr &mat) override
virtual void v_IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1)=0
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d0, Array< OneD, NekDouble > &outarray_d1)
Calculate the 2D derivative in the local tensor/collapsed coordinate at the physical points.
void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_GetTraceToElementMap(const int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation edgeOrient=eForwards, int P=-1, int Q=-1) override
virtual void v_BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1)=0
NekDouble v_PhysEvaluateInterp(const Array< OneD, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals) override
NekDouble Integral(const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &w0, const Array< OneD, const NekDouble > &w1)
void BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0=true, bool doCheckCollDir1=true)
void v_GetTraceCoeffMap(const unsigned int traceid, Array< OneD, unsigned int > &maparray) override
void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0=true, bool doCheckCollDir1=true)
void v_PhysInterp(std::shared_ptr< StdExpansion > fromExp, const Array< OneD, const NekDouble > &fromData, Array< OneD, NekDouble > &toData) override
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.
void v_GetElmtTraceToTraceMap(const unsigned int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation edgeOrient, int P, int Q) override
Determine the mapping to re-orientate the coefficients along the element trace (assumed to align with...
void LaplacianMatrixOp_MatFree_GenericImpl(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
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 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...
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,...
@ eModified_B
Principle Modified Functions .
@ P
Monomial polynomials .
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
static const NekDouble kNekZeroTol
std::shared_ptr< DNekMat > DNekMatSharedPtr
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.
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)