57 : StdExpansion(Ba.GetNumModes(), 1, Ba),
58 StdExpansion1D(Ba.GetNumModes(), Ba), StdRegions::StdSegExp(Ba),
61 std::bind(&
SegExp::CreateMatrix, this,
std::placeholders::_1)),
62 m_staticCondMatrixManager(
std::bind(&
Expansion::CreateStaticCondMatrix,
63 this,
std::placeholders::_1))
72 : StdExpansion(S), StdExpansion1D(S), StdRegions::StdSegExp(S),
74 m_staticCondMatrixManager(S.m_staticCondMatrixManager)
85 if (
m_base[0]->Collocation())
93 bool hasEndPoints =
true;
94 bool hasEndModes =
true;
122 ASSERTL0(
false,
"This type of FwdTrans is not defined"
123 "for this expansion type");
130 case LibUtilities::eGaussKronrodLegendre:
132 hasEndPoints =
false;
146 ASSERTL0(
false,
"FwdTransBndConstrained cannot be used "
147 "with this point type");
150 fill(outarray.data(), outarray.data() +
m_ncoeffs, 0.0);
152 if (hasEndPoints && hasEndModes)
178 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, matsys->Scale(),
179 &((matsys->GetOwnedMatrix())->GetPtr())[0],
180 nInteriorDofs, tmp1.data() + offset, 1, 0.0,
181 outarray.data() + offset, 1);
198 ASSERTL1(dir < 3,
"input dir is out of range");
200 "input dir is out of range");
202 int nquad =
m_base[0]->GetNumPoints();
206 const bool Deformed =
211 Vmath::Vmul(nquad, gmat[dir], 1, inarray, 1, tmp1, 1);
215 Vmath::Smul(nquad, gmat[dir][0], inarray, 1, tmp1, 1);
227 int nq =
m_base[0]->GetNumPoints();
235 Vmath::Vmul(nq, &Fx[0], 1, &normals[0][0], 1, &Fn[0], 1);
236 Vmath::Vvtvp(nq, &Fy[0], 1, &normals[1][0], 1, &Fn[0], 1, &Fn[0], 1);
254 std::array<NekDouble, 3> &firstOrderDerivs)
259 return StdSegExp::v_PhysEvalFirstDeriv(Lcoord, inarray, firstOrderDerivs);
265 std::array<NekDouble, 3> &firstOrderDerivs,
266 std::array<NekDouble, 6> &secondOrderDerivs)
271 return StdSegExp::v_PhysEvalFirstSecondDeriv(
272 Lcoord, inarray, firstOrderDerivs, secondOrderDerivs);
280 ASSERTL1(Lcoords[0] >= -1.0 && Lcoords[0] <= 1.0,
281 "Local coordinates are not in region [-1,1]");
302 int nquad =
m_base[0]->GetNumPoints();
309 outarray = inarray[0];
312 outarray = inarray[nquad - 1];
327 Vmath::Dot(nquad, mat_gauss->GetOwnedMatrix()->GetPtr().data(), 1,
342 outarray[0] = result;
348 int nquad =
m_base[0]->GetNumPoints();
350 ASSERTL1(vertex == 0 || vertex == 1,
"Vertex value should be 0 or 1");
354 map[0] = vertex == 0 ? 0 : nquad - 1;
368 if (&inarray[0] != &outarray[0])
383 m_base[0]->GetBasisKey());
389 m_base[0]->GetPointsKey());
413 const NekDouble *data,
const std::vector<unsigned int> &nummodes,
414 const int mode_offset,
NekDouble *coeffs,
415 [[maybe_unused]] std::vector<LibUtilities::BasisType> &fromType)
421 int fillorder =
min((
int)nummodes[mode_offset],
m_ncoeffs);
450 ASSERTL0(
false,
"basis is either not set up or not hierarchicial");
464 for (i = 0; i < vCoordDim; ++i)
470 size_t nbnd = vertex;
483 for (i = 0; i < vCoordDim; ++i)
489 for (i = 0; i < vCoordDim; ++i)
495 ASSERTL0(
false,
"point is out of range (point < 2)");
500 for (i = 0; i < vCoordDim; ++i)
502 vert += normal[i][0] * normal[i][0];
504 vert = 1.0 /
sqrt(vert);
508 for (i = 0; i < vCoordDim; ++i)
510 Vmath::Smul(nqe, vert, normal[i], 1, normal[i], 1);
524 int nquad =
m_base[0]->GetNumPoints();
543 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.data(), 1,
544 dPhysValuesdx.data(), 1);
548 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.data(), 1);
556 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy);
561 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.data(), 1,
562 dPhysValuesdx.data(), 1);
563 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.data(), 1,
564 dPhysValuesdx.data(), 1, dPhysValuesdx.data(), 1);
568 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.data(), 1);
569 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.data(), 1,
570 dPhysValuesdx.data(), 1);
579 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy, dPhysValuesdz);
584 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.data(), 1,
585 dPhysValuesdx.data(), 1);
586 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.data(), 1,
587 dPhysValuesdx.data(), 1, dPhysValuesdx.data(), 1);
588 Vmath::Vvtvp(nquad, &gmat[2][0], 1, dPhysValuesdz.data(), 1,
589 dPhysValuesdx.data(), 1, dPhysValuesdx.data(), 1);
593 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.data(), 1);
594 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.data(), 1,
595 dPhysValuesdx.data(), 1);
596 Blas::Daxpy(nquad, gmat[2][0], dPhysValuesdz.data(), 1,
597 dPhysValuesdx.data(), 1);
602 ASSERTL0(
false,
"Wrong number of dimensions");
607 const bool Deformed =
618 StdExpansion::LaplacianMatrixOp_MatFree(k1, k2, inarray, outarray, mkey);
625 int nquad =
m_base[0]->GetNumPoints();
648 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.data(), 1,
649 dPhysValuesdx.data(), 1);
653 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.data(), 1);
661 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy);
666 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.data(), 1,
667 dPhysValuesdx.data(), 1);
668 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.data(), 1,
669 dPhysValuesdx.data(), 1, dPhysValuesdx.data(), 1);
673 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.data(), 1);
674 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.data(), 1,
675 dPhysValuesdx.data(), 1);
684 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy, dPhysValuesdz);
689 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.data(), 1,
690 dPhysValuesdx.data(), 1);
691 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.data(), 1,
692 dPhysValuesdx.data(), 1, dPhysValuesdx.data(), 1);
693 Vmath::Vvtvp(nquad, &gmat[2][0], 1, dPhysValuesdz.data(), 1,
694 dPhysValuesdx.data(), 1, dPhysValuesdx.data(), 1);
698 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.data(), 1);
699 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.data(), 1,
700 dPhysValuesdx.data(), 1);
701 Blas::Daxpy(nquad, gmat[2][0], dPhysValuesdz.data(), 1,
702 dPhysValuesdx.data(), 1);
707 ASSERTL0(
false,
"Wrong number of dimensions");
712 const bool Deformed =
749 return tmp->GetStdMatrix(mkey);
759 "Geometric information is not set up");
769 goto UseLocRegionsMatrix;
774 goto UseStdRegionsMatrix;
795 goto UseStdRegionsMatrix;
807 goto UseLocRegionsMatrix;
819 "Cannot call eWeakDeriv2 in a "
820 "coordinate system which is not at "
821 "least two-dimensional");
826 "Cannot call eWeakDeriv2 in a "
827 "coordinate system which is not "
828 "three-dimensional");
852 goto UseLocRegionsMatrix;
858 for (
int i = 0; i < coordim; ++i)
864 goto UseStdRegionsMatrix;
874 goto UseLocRegionsMatrix;
879 goto UseStdRegionsMatrix;
892 int rows = LapMat.GetRows();
893 int cols = LapMat.GetColumns();
899 (*helm) = LapMat + factor * MassMat;
928 int rows = MassMat.GetRows();
929 int cols = MassMat.GetColumns();
935 (*adr) = -lambda * MassMat + AdvMat;
941 if (!massVarcoeffs.empty())
992 int rows = LapMat.GetRows();
993 int cols = LapMat.GetColumns();
999 (*adr) = LapMat - lambda * MassMat + AdvMat;
1005 if (!massVarcoeffs.empty())
1009 if (!lapVarcoeffs.empty())
1050 coords[0] = (vertex == 0) ? -1.0 : 1.0;
1052 m_Ix =
m_base[0]->GetI(coords);
1058 UseLocRegionsMatrix:
1064 UseStdRegionsMatrix:
1098 returnval = StdSegExp::v_GenMatrix(mkey);
1120 ASSERTL1(&inarray[0] != &outarray[0],
1121 "inarray and outarray can not be the same");
1126 outarray[0] = inarray[1];
1127 outarray[1] = inarray[0];
1131 outarray[m] = sgn * inarray[m];
1139 outarray[
m_ncoeffs - 1 - m] = inarray[m];
1143 ASSERTL0(
false,
"This basis is not allowed in this method");
1164 out = (*matsys) * in;
#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.
Defines a specification for a set of points.
void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Inner product of inarray over region with respect to expansion basis base and return in outarray.
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
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.
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 DropLocMatrix(const LocalRegions::MatrixKey &mkey)
ExpansionSharedPtr GetLeftAdjacentElementExp() const
SpatialDomains::Geometry * m_geom
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
int GetLeftAdjacentElementTrace() const
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
SpatialDomains::GeomFactorsUniquePtr m_geomFactors
void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_DropLocMatrix(const MatrixKey &mkey) override
StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const override
void v_GetTracePhysVals(const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient) override
void v_GetVertexPhysVals(const int vertex, const Array< OneD, const NekDouble > &inarray, NekDouble &outarray) override
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
void ReverseCoeffsAndSign(const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Reverse the coefficients in a boundary interior expansion this routine is of use when we need the seg...
void v_NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray) override
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const override
void v_FwdTransBndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
SegExp(const LibUtilities::BasisKey &Ba, SpatialDomains::Geometry1D *geom)
Constructor using BasisKey class for quadrature points and order definition.
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_ExtractDataToCoeffs(const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType) override
Unpack data from input file assuming it comes from.
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey) override
void MultiplyByElmtInvMass(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int v_NumBndryCoeffs() const override
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
void v_GetTracePhysMap(const int vertex, Array< OneD, int > &map) override
int v_NumDGBndryCoeffs() const override
DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) override
void v_SetCoeffsToOrientation(StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_DropLocStaticCondMatrix(const MatrixKey &mkey) override
const Array< OneD, const NekDouble > & v_GetPhysNormals() override
DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey) override
void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) 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 vertex) override
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) 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 ...
void FillGeom()
Populate the coordinate mapping Geometry::m_coeffs information from any children geometry elements.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
const LibUtilities::PointsKeyVector GetPointsKeys() const
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
int GetVertexMap(const int localVertexId, bool useCoeffPacking=false)
void NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey)
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
LibUtilities::ShapeType GetShapeType() const
const VarCoeffMap & GetVarCoeffs() const
MatrixType GetMatrixType() const
bool HasVarCoeff(const StdRegions::VarCoeffType &coeff) const
const ConstFactorMap & GetConstFactors() const
const Array< OneD, const NekDouble > & GetVarCoeff(const StdRegions::VarCoeffType &coeff) const
NekDouble GetConstFactor(const ConstFactorType &factor) const
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 Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
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.
void Interp1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
this function interpolates a 1D function evaluated at the quadrature points of the basis fbasis0 to ...
std::vector< PointsKey > PointsKeyVector
@ eGaussLegendreWithMP
1D Gauss-Legendre quadrature points with additional x=-1 and x=1 end points
@ eGaussLobattoChebyshev
1D Gauss-Lobatto-Legendre quadrature points
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussGaussChebyshev
1D Gauss-Gauss-Chebyshev quadrature points
@ ePolyEvenlySpaced
1D Evenly-spaced points using Lagrange polynomial
@ eGaussLobattoKronrodLegendre
1D Lobatto Kronrod quadrature points
@ eGaussGaussLegendre
1D Gauss-Gauss-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 .
GeomType
Indicates the type of element geometry.
@ eRegular
Geometry is straight-sided with constant geometric factors.
@ eNoGeomType
No type defined.
@ eMovingRegular
Currently unused.
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
@ eLinearAdvectionReaction
@ eLinearAdvectionDiffusionReaction
std::map< ConstFactorType, NekDouble > ConstFactorMap
static VarCoeffMap NullVarCoeffMap
std::shared_ptr< StdSegExp > StdSegExpSharedPtr
std::map< StdRegions::VarCoeffType, VarCoeffEntry > VarCoeffMap
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
static Array< OneD, NekDouble > NullNekDouble1DArray
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 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
T Dot(int n, const T *w, const T *x)
dot product
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
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 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.
scalarT< T > min(scalarT< T > lhs, scalarT< T > rhs)
scalarT< T > sqrt(scalarT< T > in)