76 bool returnval =
false;
137 int nquad0 =
m_base[0]->GetNumPoints();
139 if (
m_base[0]->Collocation())
141 std::memcpy(outarray.data(), inarray.data(),
148 int nmodes0 =
m_base[0]->GetNumModes();
158#define BWDTRANS_DEF \
159 BwdTransSegKernel(nmodes0, nquad0, (const vec_t *)base0.data(), \
160 (const vec_t *)inarray.data(), (vec_t *)outarray.data())
164#define BWDTRANS_Q(r, i) \
166 BwdTransSegKernel(NM(i), NQ(i), (const vec_t *)base0.data(), \
167 (const vec_t *)inarray.data(), \
168 (vec_t *)outarray.data()); \
173#define BWDTRANS_M(r, i) \
178 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
179 STDLEV2TEST1, STDLEV2UPDATE1, BWDTRANS_Q) default \
204 int n_coeffs = inarray.size();
211 int nmodes0 =
m_base[0]->GetNumModes();
226 Vmath::Vcopy(numMin, tmp = coeff, 1, tmp2 = coeff_tmp, 1);
235 if (
m_base[0]->Collocation())
264 ASSERTL0(
false,
"This type of FwdTrans is not defined for this "
268 fill(outarray.data(), outarray.data() +
m_ncoeffs, 0.0);
292 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, 1.0,
293 &(matsys->GetPtr())[0], nInteriorDofs,
294 tmp1.data() + offset, 1, 0.0,
295 outarray.data() + offset, 1);
330 int nquad0 =
m_base[0]->GetNumPoints();
331 int order0 =
m_base[0]->GetNumModes();
342#undef IPRODUCTWRTBASE_DEF
343#define IPRODUCTWRTBASE_DEF \
344 IProductSegKernel<false, false, true>( \
345 order0, nquad0, (const vec_t *)inarray.data(), \
346 (const vec_t *)base0.data(), (const vec_t *)m_weights[0].data(), \
347 (const vec_t *)jac.data(), (vec_t *)outarray.data())
350#undef IPRODUCTWRTBASE_Q
351#define IPRODUCTWRTBASE_Q(r, i) \
353 IProductSegKernel<false, false, true>( \
354 NM(i), NQ(i), (const vec_t *)inarray.data(), \
355 (const vec_t *)base0.data(), (const vec_t *)m_weights[0].data(), \
356 (const vec_t *)jac.data(), (vec_t *)outarray.data()); \
360#undef IPRODUCTWRTBASE_M
361#define IPRODUCTWRTBASE_M(r, i) \
366 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
367 STDLEV2TEST1, STDLEV2UPDATE1, \
368 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
388#undef IPRODUCTWRTBASE_DEF
389#define IPRODUCTWRTBASE_DEF \
390 IProductSegKernel<false, false, false>( \
391 order0, nquad0, (const vec_t *)inarray.data(), \
392 (const vec_t *)base0.data(), (const vec_t *)m_weights[0].data(), \
393 (const vec_t *)jac.data(), (vec_t *)outarray.data())
396#undef IPRODUCTWRTBASE_Q
397#define IPRODUCTWRTBASE_Q(r, i) \
399 IProductSegKernel<false, false, false>( \
400 NM(i), NQ(i), (const vec_t *)inarray.data(), \
401 (const vec_t *)base0.data(), (const vec_t *)m_weights[0].data(), \
402 (const vec_t *)jac.data(), (vec_t *)outarray.data()); \
406#undef IPRODUCTWRTBASE_M
407#define IPRODUCTWRTBASE_M(r, i) \
412 BOOST_PP_FOR_##r((NM(i), NM_P1(i), BOOST_PP_MUL(2, NM(i))), \
413 STDLEV2TEST1, STDLEV2UPDATE1, \
414 IPRODUCTWRTBASE_Q) default : IPRODUCTWRTBASE_DEF; \
437 ASSERTL1(dir == 0,
"input dir is out of range");
460 int nquad =
m_base[0]->GetNumPoints();
464 "calling argument mode is larger than total expansion order");
472 return StdExpansion::BaryEvaluateBasis<0>(coords[0], mode);
478 std::array<NekDouble, 3> &firstOrderDerivs)
486 std::array<NekDouble, 3> &firstOrderDerivs,
487 std::array<NekDouble, 6> &secondOrderDerivs)
496 int nquad =
m_base[0]->GetNumPoints();
521 int nquad =
m_base[0]->GetNumPoints();
546 int nq =
m_base[0]->GetNumPoints();
547 int nmodes =
m_base[0]->GetNumModes();
561 OrthoExp.
FwdTrans(array, orthocoeffs);
564 for (
int j = 0; j < nmodes; ++j)
570 exp(-(j - nmodes) * (j - nmodes) /
571 ((
NekDouble)((j - cutoff + 1) * (j - cutoff + 1)))));
575 orthocoeffs[j] *= 0.0;
580 OrthoExp.
BwdTrans(orthocoeffs, array);
589 int nq =
m_base[0]->GetNumPoints();
590 int nmodes =
m_base[0]->GetNumModes();
599 int Pcut = cutoff *
P;
603 OrthoExp.
FwdTrans(array, orthocoeffs);
607 for (
int j = 0; j < nmodes; ++j)
613 fac = pow(fac, exponent);
614 orthocoeffs[j] *= exp(-alpha * fac);
619 OrthoExp.
BwdTrans(orthocoeffs, array);
670 const std::vector<unsigned int> &nummodes,
int &modes_offset)
672 int nmodes = nummodes[modes_offset];
691 int nq0 =
m_base[0]->GetNumPoints();
709 for (
int i = 0; i < neq; ++i)
711 coords[0] = -1.0 + 2 * i / (
NekDouble)(neq - 1);
712 I =
m_base[0]->GetI(coords);
713 Vmath::Vcopy(nq0, I->GetRawPtr(), 1, Mat->GetRawPtr() + i, neq);
719 int nq0 =
m_base[0]->GetNumPoints();
743 for (
int i = 0; i < neq; ++i)
746 I =
m_base[0]->GetI(coords);
747 Vmath::Vcopy(nq0, I->GetRawPtr(), 1, Mat->GetRawPtr() + i, neq);
760 (*Mat) = Imass * Iprod;
767 if (mattype ==
eMass)
800 int nummodes =
m_base[0]->GetNumModes();
808 case LibUtilities::eChebyshev:
810 outarray[1] = nummodes - 1;
817 ASSERTL0(0,
"Mapping array is not defined for this expansion");
835 case LibUtilities::eChebyshev:
850 ASSERTL0(0,
"Mapping array is not defined for this expansion");
856 [[maybe_unused]]
bool useCoeffPacking)
858 ASSERTL0((localVertexId == 0) || (localVertexId == 1),
860 "must be between 0 or 1");
862 int localDOF = localVertexId;
865 (localVertexId == 1))
867 localDOF =
m_base[0]->GetNumModes() - 1;
875 int np =
m_base[0]->GetNumPoints();
879 for (
int i = 0; i < np - 1; ++i)
893 int order0 =
m_base[0]->GetNumModes();
895 ASSERTL0(traceid < 2,
"eid must be between 0 and 1");
897 if (maparray.size() != 1)
906 maparray[0] = (traceid == 0) ? 0 : 1;
911 maparray[0] = (traceid == 0) ? 0 : order0 - 1;
923 [[maybe_unused]]
int P,
924 [[maybe_unused]]
int Q)
928 if (signarray.size() != 1)
939 [[maybe_unused]]
const unsigned int eid,
941 [[maybe_unused]]
Orientation orient, [[maybe_unused]]
int P,
942 [[maybe_unused]]
int Q)
945 if (maparray.size() != 1)
952 if (signarray.size() != 1)
#define ASSERTL0(condition, msg)
#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...
#define IPRODUCTWRTBASE_DEF
#define IPRODUCTWRTBASE_M(r, i)
#define STDLEV2TEST(r, state)
#define STDLEV2UPDATE(r, state)
Describes the specification for a Basis.
Defines a specification for a set of points.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Evaluate the derivative at the physical quadrature points given by inarray and return in outarray.
NekDouble BaryTensorDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs)
void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Inner product of inarray over region with respect to the expansion basis (this)->m_base[0] and return...
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.
The base class for all shapes.
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
int NumBndryCoeffs(void) const
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
int GetVertexMap(const int localVertexId, bool useCoeffPacking=false)
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Transform a given function from physical quadrature space to coefficient space.
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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)
LibUtilities::NekManager< StdMatrixKey, DNekBlkMat, StdMatrixKey::opLess > m_stdStaticCondMatrixManager
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
std::vector< Array< OneD, const NekDouble > > m_weights
MatrixType GetMatrixType() const
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
Class representing a segment element in reference space All interface of this class sits in StdExpans...
int v_NumDGBndryCoeffs() const override
NekDouble v_PhysEvalFirstDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey) override
void v_GetInteriorMap(Array< OneD, unsigned int > &outarray) override
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
LibUtilities::ShapeType v_DetShapeType() const override
Return Shape of region, using ShapeType enum list. i.e. Segment.
StdSegExp(const LibUtilities::BasisKey &Ba)
Constructor using BasisKey class for quadrature points and order definition.
NekDouble v_PhysEvalFirstSecondDeriv(const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs, std::array< NekDouble, 6 > &secondOrderDerivs) override
int v_NumBndryCoeffs() const override
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi) override
void v_GetTraceCoeffMap(const unsigned int traceid, Array< OneD, unsigned int > &maparray) override
Get the map of the coefficient location to teh local trace coefficients.
int v_GetNverts() const final
int v_GetTraceNumPoints(const int i) const final
void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray) override
int v_GetTraceNcoeffs(const int i) const final
void v_GetSimplexEquiSpacedConnectivity(Array< OneD, int > &conn, bool standard=true) override
void v_GetCoords(Array< OneD, NekDouble > &coords_0, Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2) override
int v_GetTraceIntNcoeffs(const int i) const final
int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false) override
void v_ExponentialFilter(Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff) override
DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey) override
void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Backward transform from coefficient space given in inarray and evaluate at the physical quadrature po...
int v_GetNtraces() const final
void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray) override
void v_GetTraceToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation edgeOrient, int P, int Q) override
void v_GetElmtTraceToTraceMap(const unsigned int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation edgeOrient, int P, int Q) override
void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
Evaluate the derivative at the physical quadrature points given by inarray and return in outarray.
void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta) override
bool v_IsBoundaryInteriorExpansion() const override
int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset) override
DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey) override
void v_FwdTransBndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_IProductWRTBaseKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const Array< OneD, const NekDouble > &jac, const bool Deformed) override
Inner product of inarray over region with respect to the expansion basis (this)->m_base[0] and return...
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 void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
constexpr int getNumberOfCoefficients(int Na)
PointsManagerT & PointsManager(void)
void InterpCoeff1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eModified_B
Principle Modified Functions .
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eOrtho_A
Principle Orthogonal Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
@ eFourier
Fourier Expansion .
tinysimd::scalarT< double > vec_t
@ ePhysInterpToEquiSpaced
static Array< OneD, NekDouble > NullNekDouble1DArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.