55 [[maybe_unused]]
int numcoeffs,
68 const bool Deformed, [[maybe_unused]]
bool CollDir0,
69 [[maybe_unused]]
bool CollDir1, [[maybe_unused]]
bool CollDir2)
72 Deformed, CollDir0, CollDir1, CollDir2);
77 ASSERTL1((dir == 0) || (dir == 1) || (dir == 2),
"Invalid direction.");
79 const int nq0 =
m_base[0]->GetNumPoints();
80 const int nq1 =
m_base[1]->GetNumPoints();
81 const int nq2 =
m_base[2]->GetNumPoints();
82 const int nq = nq0 * nq1 * nq2;
84 const bool CollDir0 =
m_base[0]->Collocation();
85 const bool CollDir1 =
m_base[1]->Collocation();
86 const bool CollDir2 =
m_base[2]->Collocation();
92 for (
int i = 0; i < nq; i++)
95 int m = (i / nq0) % nq1;
96 int n = i / (nq0 * nq1);
106 m_base[2]->GetBdata(), in, out, one,
false,
107 false, CollDir1, CollDir2);
113 m_base[2]->GetBdata(), in, out, one,
false,
114 CollDir0,
false, CollDir2);
120 m_base[2]->GetDbdata(), in, out, one,
false,
121 CollDir0, CollDir1,
false);
127 (*mat)(j, i) = out[j];
136 const int nquad0 =
m_base[0]->GetNumPoints();
137 const int nquad1 =
m_base[1]->GetNumPoints();
138 const int nquad2 =
m_base[2]->GetNumPoints();
140 bool Deriv0 = (out_d0.size() > 0);
141 bool Deriv1 = (out_d1.size() > 0);
142 bool Deriv2 = (out_d2.size() > 0);
149 if ((inarray.data() == out_d0.data()) ||
150 (inarray.data() == out_d1.data()) || (inarray.data() == out_d2.data()))
166#define PHYSDERIV_DEF \
167 PhysDerivTensor3DKernel(nquad0, nquad1, nquad2, \
168 (const vec_t *)intmp.data(), (const vec_t *)D0, \
169 (const vec_t *)D1, (const vec_t *)D2, \
170 (vec_t *)out_d0.data(), (vec_t *)out_d1.data(), \
171 (vec_t *)out_d2.data(), Deriv0, Deriv1, Deriv2)
175#define PHYSDERIV_Q(r, i) \
177 PhysDerivTensor3DKernel( \
178 NQ1(i), NQ1(i), NQ1(i), (const vec_t *)intmp.data(), \
179 (const vec_t *)D0, (const vec_t *)D1, (const vec_t *)D2, \
180 (vec_t *)out_d0.data(), (vec_t *)out_d1.data(), \
181 (vec_t *)out_d2.data(), Deriv0, Deriv1, Deriv2); \
186 if ((nquad0 == nquad1) && (nquad1 == nquad2))
231 ASSERTL1(
false,
"input dir is out of range");
253 const int nq0 =
m_base[0]->GetNumPoints();
254 const int nq1 =
m_base[1]->GetNumPoints();
255 const int nq2 =
m_base[2]->GetNumPoints();
261 for (
int i = 0; i < nq1 * nq2; ++i, ptr += nq0)
263 wsp1[i] = StdExpansion::BaryEvaluate<0>(eta[0], ptr);
266 for (
int i = 0; i < nq2; ++i)
268 wsp2[i] = StdExpansion::BaryEvaluate<1>(eta[1], &wsp1[i * nq1]);
271 return StdExpansion::BaryEvaluate<2>(eta[2], &wsp2[0]);
311 const bool CollDir0 =
m_base[0]->Collocation();
312 const bool CollDir1 =
m_base[1]->Collocation();
313 const bool CollDir2 =
m_base[2]->Collocation();
315 if (CollDir0 && CollDir1 && CollDir2)
323 m_base[2]->GetBdata(), inarray, outarray, one,
324 false, CollDir0, CollDir1, CollDir2);
334 int Qx =
m_base[0]->GetNumPoints();
335 int Qy =
m_base[1]->GetNumPoints();
336 int Qz =
m_base[2]->GetNumPoints();
346 interpolatingNodes = &I[0]->GetPtr()[0];
348 Blas::Dgemv(
'T', Qx, Qy * Qz, 1.0, &physvals[0], Qx, &interpolatingNodes[0],
349 1, 0.0, &sumFactorization_qr[0], 1);
352 interpolatingNodes = &I[1]->GetPtr()[0];
354 Blas::Dgemv(
'T', Qy, Qz, 1.0, &sumFactorization_qr[0], Qy,
355 &interpolatingNodes[0], 1, 0.0, &sumFactorization_r[0], 1);
358 interpolatingNodes = &I[2]->GetPtr()[0];
359 value =
Vmath::Dot(Qz, interpolatingNodes, 1, &sumFactorization_r[0], 1);
368 int nquad0 =
m_base[0]->GetNumPoints();
369 int nquad1 =
m_base[1]->GetNumPoints();
370 int nquad2 =
m_base[2]->GetNumPoints();
373 for (
int i = 0; i < nquad2; ++i)
376 for (
int j = 0; j < nquad1; ++j)
379 for (
int k = 0; k < nquad0; ++k, ++cnt)
381 outarray[cnt] = inarray[cnt] *
m_weights[0][k] * w1w2;
408 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
409 m_base[2]->Collocation()))
439 int nquad0 =
m_base[0]->GetNumPoints();
440 int nquad1 =
m_base[1]->GetNumPoints();
441 int nquad2 =
m_base[2]->GetNumPoints();
442 int nmodes0 =
m_base[0]->GetNumModes();
443 int nmodes1 =
m_base[1]->GetNumModes();
444 int nmodes2 =
m_base[2]->GetNumModes();
445 int wspsize =
max(nquad0 * nmodes2 * (nmodes1 + nquad1),
446 nquad0 * nquad1 * (nquad2 + nmodes0) +
447 nmodes0 * nmodes1 * nquad2);
455 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
456 m_base[2]->Collocation()))
500 [[maybe_unused]]
const int tid,
518 if (maparray.size() != map2.size())
523 for (
int i = 0; i < map2.size(); ++i)
525 maparray[i] = map1[map2[i]];
541 const int nq0,
const int nq1,
bool Forwards)
543 if (idmap.size() != nq0 * nq1)
552 for (
int i = 0; i < nq0 * nq1; ++i)
560 for (
int j = 0; j < nq1; j++)
562 for (
int i = 0; i < nq0; ++i)
564 idmap[j * nq0 + i] = nq0 - 1 - i + j * nq0;
572 for (
int j = 0; j < nq1; j++)
574 for (
int i = 0; i < nq0; ++i)
576 idmap[j * nq0 + i] = nq0 * (nq1 - 1 - j) + i;
584 for (
int j = 0; j < nq1; j++)
586 for (
int i = 0; i < nq0; ++i)
588 idmap[j * nq0 + i] = nq0 * nq1 - 1 - j * nq0 - i;
598 for (
int i = 0; i < nq0; ++i)
600 for (
int j = 0; j < nq1; ++j)
602 idmap[i * nq1 + j] = i + j * nq0;
608 for (
int j = 0; j < nq1; ++j)
610 for (
int i = 0; i < nq0; ++i)
612 idmap[j * nq0 + i] = i * nq1 + j;
624 for (
int i = 0; i < nq0; ++i)
626 for (
int j = 0; j < nq1; ++j)
628 idmap[i * nq1 + j] = i + nq0 * (nq1 - 1) - j * nq0;
634 for (
int j = 0; j < nq1; ++j)
636 for (
int i = 0; i < nq0; ++i)
638 idmap[j * nq0 + i] = nq1 - 1 - j + i * nq1;
650 for (
int i = 0; i < nq0; ++i)
652 for (
int j = 0; j < nq1; ++j)
654 idmap[i * nq1 + j] = nq0 - 1 - i + j * nq0;
660 for (
int j = 0; j < nq1; ++j)
662 for (
int i = 0; i < nq0; ++i)
664 idmap[j * nq0 + i] = nq1 * (nq0 - 1) - i * nq1 + j;
675 for (
int i = 0; i < nq0; ++i)
677 for (
int j = 0; j < nq1; ++j)
679 idmap[i * nq1 + j] = nq0 * nq1 - 1 - i - j * nq0;
685 for (
int j = 0; j < nq1; ++j)
687 for (
int i = 0; i < nq0; ++i)
689 idmap[j * nq0 + i] = nq0 * nq1 - 1 - j - i * nq1;
696 ASSERTL0(
false,
"Unknow orientation");
702 [[maybe_unused]]
const int facedir,
706 auto pointsType = faceDirBasis->GetPointsType();
707 auto nummodes = faceDirBasis->GetNumModes();
708 auto numpoints = faceDirBasis->GetNumPoints();
710 switch (faceDirBasisType)
720 case LibUtilities::eGaussRadauMAlpha2Beta0:
721 case LibUtilities::eGaussRadauMAlpha1Beta0:
723 numpoints = numpoints + 1;
729 numpoints = numpoints + 1;
735 pType = faceDirBasis->GetPointsType();
757 case LibUtilities::eGaussRadauMAlpha2Beta0:
758 case LibUtilities::eGaussRadauMAlpha1Beta0:
760 numpoints = numpoints + 1;
766 numpoints = numpoints + 1;
772 pType = faceDirBasis->GetPointsType();
796 auto pointsType = faceDirBasis->GetPointsType();
797 auto nummodes = faceDirBasis->GetNumModes();
798 auto numpoints = faceDirBasis->GetNumPoints();
800 switch (faceDirBasisType)
820 case LibUtilities::eGaussRadauMAlpha1Beta0:
837 pkey = faceDirBasis->GetPointsKey();
849 case LibUtilities::eGaussRadauMAlpha2Beta0:
850 case LibUtilities::eGaussRadauMAlpha1Beta0:
862 LibUtilities::eGaussRadauMAlpha1Beta0);
869 pkey = faceDirBasis->GetPointsKey();
898 numpoints, LibUtilities::eGaussRadauMAlpha1Beta0);
928 case LibUtilities::eGaussRadauMAlpha2Beta0:
929 case LibUtilities::eGaussRadauMAlpha1Beta0:
946 pkey = faceDirBasis->GetPointsKey();
958 case LibUtilities::eGaussRadauMAlpha2Beta0:
962 LibUtilities::eGaussRadauMAlpha1Beta0);
968 pkey = faceDirBasis->GetPointsKey();
999 fromExp->GetBasis(1)->GetPointsKey(),
1000 fromExp->GetBasis(2)->GetPointsKey(), fromData,
1002 m_base[2]->GetPointsKey(), toData);
#define ASSERTL0(condition, msg)
#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....
#define PHYSDERIV_Q(r, i)
#define STDLEV1UPDATE(r, state)
#define STDLEV1TEST(r, state)
Describes the specification for a Basis.
BasisType GetBasisType() const
Return type of expansion basis.
Defines a specification for a set of points.
void 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)
void v_ReOrientTracePhysMap(const StdRegions::Orientation orient, Array< OneD, int > &idmap, const int nq0, const int nq1, bool Forwards) override
This method produces a mapping.
virtual int v_GetNedges(void) const
virtual void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards)
void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) 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
void v_PhysInterp(std::shared_ptr< StdExpansion > fromExp, const Array< OneD, const NekDouble > &fromData, Array< OneD, NekDouble > &toData, bool Transpose) override
NekDouble v_PhysEvaluateInterp(const Array< OneD, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals) override
virtual 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)=0
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
NekDouble v_StdPhysEvaluate(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 PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points.
void v_PhysDeriv(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculate the derivative of the physical points in a given direction.
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)
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
this function calculates the inner product of a given function f with the different modes of the expa...
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void MultiplyByStdQuadratureMetric(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
std::vector< Array< OneD, const NekDouble > > m_weights
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].
std::shared_ptr< Basis > BasisSharedPtr
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
void Interp3D(const BasisKey &fbasis0, const BasisKey &fbasis1, const BasisKey &fbasis2, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, const BasisKey &tbasis2, Array< OneD, NekDouble > &to)
this function interpolates a 3D function evaluated at the quadrature points of the 3D basis,...
@ eGaussRadauMLegendre
1D Gauss-Radau-Legendre quadrature points, pinned at x=-1
@ eGaussLegendreWithMP
1D Gauss-Legendre quadrature points with additional x=-1 and x=1 end points
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussLegendreWithM
1D Gauss-Legendre quadrature points with additional x=-1 point
@ eModified_B
Principle Modified Functions .
@ 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 PointsKey NullPointsKey(0, eNoPointsType)
static const NekDouble kNekZeroTol
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisSharedPtr &faceDirBasis)
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisSharedPtr &faceDirBasis, bool UseGLL)
tinysimd::scalarT< double > vec_t
@ eDir1BwdDir2_Dir2BwdDir1
@ eDir1FwdDir1_Dir2FwdDir2
@ eDir1BwdDir1_Dir2BwdDir2
@ eDir1BwdDir2_Dir2FwdDir1
@ eDir1FwdDir1_Dir2BwdDir2
@ eDir1BwdDir1_Dir2FwdDir2
@ eDir1FwdDir2_Dir2FwdDir1
@ eDir1FwdDir2_Dir2BwdDir1
static Array< OneD, NekDouble > NullNekDouble1DArray
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)
std::shared_ptr< DNekMat > DNekMatSharedPtr
void CopyArray(const Array< OneD, ConstDataType > &source, Array< OneD, DataType > &dest)
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 Dot(int n, const T *w, const T *x)
dot product
scalarT< T > max(scalarT< T > lhs, scalarT< T > rhs)