Nektar++
Public Member Functions | Protected Member Functions | Private Attributes | List of all members
Nektar::LocalRegions::TriExp Class Reference

#include <TriExp.h>

Inheritance diagram for Nektar::LocalRegions::TriExp:
[legend]

Public Member Functions

 TriExp (const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const SpatialDomains::Geometry2DSharedPtr &geom)
 Constructor using BasisKey class for quadrature points and order definition. More...
 
 TriExp (const TriExp &T)
 
virtual ~TriExp () override=default
 
- Public Member Functions inherited from Nektar::StdRegions::StdTriExp
 StdTriExp ()
 
 StdTriExp (const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb)
 
 StdTriExp (const StdTriExp &T)
 
virtual ~StdTriExp () override
 
- Public Member Functions inherited from Nektar::StdRegions::StdExpansion2D
 StdExpansion2D ()
 
 StdExpansion2D (int numcoeffs, const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb)
 
 StdExpansion2D (const StdExpansion2D &T)
 
virtual ~StdExpansion2D () override
 
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. More...
 
NekDouble Integral (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &w0, const Array< OneD, const NekDouble > &w1)
 
NekDouble BaryTensorDeriv (const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs)
 
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 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)
 
- Public Member Functions inherited from Nektar::StdRegions::StdExpansion
 StdExpansion ()
 Default Constructor. More...
 
 StdExpansion (const int numcoeffs, const int numbases, const LibUtilities::BasisKey &Ba=LibUtilities::NullBasisKey, const LibUtilities::BasisKey &Bb=LibUtilities::NullBasisKey, const LibUtilities::BasisKey &Bc=LibUtilities::NullBasisKey)
 Constructor. More...
 
 StdExpansion (const StdExpansion &T)
 Copy Constructor. More...
 
virtual ~StdExpansion ()
 Destructor. More...
 
int GetNumBases () const
 This function returns the number of 1D bases used in the expansion. More...
 
const Array< OneD, const LibUtilities::BasisSharedPtr > & GetBase () const
 This function gets the shared point to basis. More...
 
const LibUtilities::BasisSharedPtrGetBasis (int dir) const
 This function gets the shared point to basis in the dir direction. More...
 
int GetNcoeffs (void) const
 This function returns the total number of coefficients used in the expansion. More...
 
int GetTotPoints () const
 This function returns the total number of quadrature points used in the element. More...
 
LibUtilities::BasisType GetBasisType (const int dir) const
 This function returns the type of basis used in the dir direction. More...
 
int GetBasisNumModes (const int dir) const
 This function returns the number of expansion modes in the dir direction. More...
 
int EvalBasisNumModesMax (void) const
 This function returns the maximum number of expansion modes over all local directions. More...
 
LibUtilities::PointsType GetPointsType (const int dir) const
 This function returns the type of quadrature points used in the dir direction. More...
 
int GetNumPoints (const int dir) const
 This function returns the number of quadrature points in the dir direction. More...
 
const Array< OneD, const NekDouble > & GetPoints (const int dir) const
 This function returns a pointer to the array containing the quadrature points in dir direction. More...
 
int GetNverts () const
 This function returns the number of vertices of the expansion domain. More...
 
int GetTraceNcoeffs (const int i) const
 This function returns the number of expansion coefficients belonging to the i-th trace. More...
 
int GetTraceIntNcoeffs (const int i) const
 
int GetTraceNumPoints (const int i) const
 This function returns the number of quadrature points belonging to the i-th trace. More...
 
const LibUtilities::BasisKey GetTraceBasisKey (const int i, int k=-1) const
 This function returns the basis key belonging to the i-th trace. More...
 
LibUtilities::PointsKey GetTracePointsKey (const int i, int k=-1) const
 This function returns the basis key belonging to the i-th trace. More...
 
int NumBndryCoeffs (void) const
 
int NumDGBndryCoeffs (void) const
 
const LibUtilities::PointsKey GetNodalPointsKey () const
 This function returns the type of expansion Nodal point type if defined. More...
 
int GetNtraces () const
 Returns the number of trace elements connected to this element. More...
 
LibUtilities::ShapeType DetShapeType () const
 This function returns the shape of the expansion domain. More...
 
std::shared_ptr< StdExpansionGetStdExp () const
 
std::shared_ptr< StdExpansionGetLinStdExp (void) const
 
int GetShapeDimension () const
 
bool IsBoundaryInteriorExpansion () const
 
bool IsNodalNonTensorialExp ()
 
void BwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function performs the Backward transformation from coefficient space to physical space. More...
 
void FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function performs the Forward transformation from physical space to coefficient space. More...
 
void FwdTransBndConstrained (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
NekDouble Integral (const Array< OneD, const NekDouble > &inarray)
 This function integrates the specified function over the domain. More...
 
void FillMode (const int mode, Array< OneD, NekDouble > &outarray)
 This function fills the array outarray with the mode-th mode of the expansion. More...
 
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 expansion More...
 
void IProductWRTBase (const Array< OneD, const NekDouble > &base, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, int coll_check)
 
void IProductWRTDerivBase (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDirectionalDerivBase (const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
int GetElmtId ()
 Get the element id of this expansion when used in a list by returning value of m_elmt_id. More...
 
void SetElmtId (const int id)
 Set the element id of this expansion when used in a list by returning value of m_elmt_id. More...
 
void GetCoords (Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2=NullNekDouble1DArray, Array< OneD, NekDouble > &coords_3=NullNekDouble1DArray)
 this function returns the physical coordinates of the quadrature points of the expansion More...
 
void GetCoord (const Array< OneD, const NekDouble > &Lcoord, Array< OneD, NekDouble > &coord)
 given the coordinates of a point of the element in the local collapsed coordinate system, this function calculates the physical coordinates of the point More...
 
DNekMatSharedPtr GetStdMatrix (const StdMatrixKey &mkey)
 
DNekBlkMatSharedPtr GetStdStaticCondMatrix (const StdMatrixKey &mkey)
 
void NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
 
void NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
void NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, const Array< OneD, const NekDouble > &Fz, Array< OneD, NekDouble > &outarray)
 
void NormVectorIProductWRTBase (const Array< OneD, const Array< OneD, NekDouble > > &Fvec, Array< OneD, NekDouble > &outarray)
 
DNekScalBlkMatSharedPtr GetLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
void DropLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
int CalcNumberOfCoefficients (const std::vector< unsigned int > &nummodes, int &modes_offset)
 
NekDouble StdPhysEvaluate (const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals)
 
int GetCoordim ()
 
void GetBoundaryMap (Array< OneD, unsigned int > &outarray)
 
void GetInteriorMap (Array< OneD, unsigned int > &outarray)
 
int GetVertexMap (const int localVertexId, bool useCoeffPacking=false)
 
void GetTraceToElementMap (const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards, int P=-1, int Q=-1)
 
void GetTraceCoeffMap (const unsigned int traceid, Array< OneD, unsigned int > &maparray)
 
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 GetTraceInteriorToElementMap (const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eForwards)
 
void GetTraceNumModes (const int tid, int &numModes0, int &numModes1, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
 
void MultiplyByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void MultiplyByStdQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
DNekMatSharedPtr CreateGeneralMatrix (const StdMatrixKey &mkey)
 this function generates the mass matrix \(\mathbf{M}[i][j] = \int \phi_i(\mathbf{x}) \phi_j(\mathbf{x}) d\mathbf{x}\) More...
 
void GeneralMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void ReduceOrderCoeffs (int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
 
void ExponentialFilter (Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff)
 
void LaplacianMatrixOp (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDerivMatrixOp (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDirectionalDerivMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassLevelCurvatureMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LinearAdvectionMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LinearAdvectionDiffusionReactionMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey, bool addDiffusionTerm=true)
 
void HelmholtzMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
DNekMatSharedPtr GenMatrix (const StdMatrixKey &mkey)
 
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)
 
void PhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void PhysDeriv_s (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_ds)
 
void PhysDeriv_n (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_dn)
 
void PhysDirectionalDeriv (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &direction, Array< OneD, NekDouble > &outarray)
 
void StdPhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
 
void StdPhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
NekDouble PhysEvaluate (const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals)
 This function evaluates the expansion at a single (arbitrary) point of the domain. More...
 
NekDouble PhysEvaluate (const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs)
 This function evaluates the first derivative of the expansion at a single (arbitrary) point of the domain. More...
 
NekDouble PhysEvaluate (const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs, std::array< NekDouble, 6 > &secondOrderDerivs)
 
NekDouble PhysEvaluate (const Array< OneD, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals)
 This function evaluates the expansion at a single (arbitrary) point of the domain. More...
 
NekDouble PhysEvaluateBasis (const Array< OneD, const NekDouble > &coords, int mode)
 This function evaluates the basis function mode mode at a point coords of the domain. More...
 
void LocCoordToLocCollapsed (const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
 Convert local cartesian coordinate xi into local collapsed coordinates eta. More...
 
void LocCollapsedToLocCoord (const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi)
 Convert local collapsed coordinates eta into local cartesian coordinate xi. More...
 
virtual int v_CalcNumberOfCoefficients (const std::vector< unsigned int > &nummodes, int &modes_offset)
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, const Array< OneD, const NekDouble > &Fz, Array< OneD, NekDouble > &outarray)
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const Array< OneD, NekDouble > > &Fvec, Array< OneD, NekDouble > &outarray)
 
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
virtual void v_DropLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
NekDouble Linf (const Array< OneD, const NekDouble > &phys, const Array< OneD, const NekDouble > &sol=NullNekDouble1DArray)
 Function to evaluate the discrete \( L_\infty\) error \( |\epsilon|_\infty = \max |u - u_{exact}|\) where \( u_{exact}\) is given by the array sol. More...
 
NekDouble L2 (const Array< OneD, const NekDouble > &phys, const Array< OneD, const NekDouble > &sol=NullNekDouble1DArray)
 Function to evaluate the discrete \( L_2\) error, \( | \epsilon |_{2} = \left [ \int^1_{-1} [u - u_{exact}]^2 dx \right]^{1/2} d\xi_1 \) where \( u_{exact}\) is given by the array sol. More...
 
NekDouble H1 (const Array< OneD, const NekDouble > &phys, const Array< OneD, const NekDouble > &sol=NullNekDouble1DArray)
 Function to evaluate the discrete \( H^1\) error, \( | \epsilon |^1_{2} = \left [ \int^1_{-1} [u - u_{exact}]^2 + \nabla(u - u_{exact})\cdot\nabla(u - u_{exact})\cdot dx \right]^{1/2} d\xi_1 \) where \( u_{exact}\) is given by the array sol. More...
 
const LibUtilities::PointsKeyVector GetPointsKeys () const
 
DNekMatSharedPtr BuildInverseTransformationMatrix (const DNekScalMatSharedPtr &m_transformationmatrix)
 
void PhysInterpToSimplexEquiSpaced (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, int npset=-1)
 This function performs an interpolation from the physical space points provided at input into an array of equispaced points which are not the collapsed coordinate. So for a tetrahedron you will only get a tetrahedral number of values. More...
 
void GetSimplexEquiSpacedConnectivity (Array< OneD, int > &conn, bool standard=true)
 This function provides the connectivity of local simplices (triangles or tets) to connect the equispaced data points provided by PhysInterpToSimplexEquiSpaced. More...
 
void EquiSpacedToCoeffs (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function performs a projection/interpolation from the equispaced points sometimes used in post-processing onto the coefficient space. More...
 
template<class T >
std::shared_ptr< T > as ()
 
void IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
 
void GenStdMatBwdDeriv (const int dir, DNekMatSharedPtr &mat)
 
- Public Member Functions inherited from Nektar::LocalRegions::Expansion2D
 Expansion2D (SpatialDomains::Geometry2DSharedPtr pGeom)
 
virtual ~Expansion2D () override=default
 
DNekScalMatSharedPtr CreateMatrix (const MatrixKey &mkey)
 
void SetTraceToGeomOrientation (Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &inout)
 
Array< OneD, unsigned int > GetTraceInverseBoundaryMap (int eid)
 
void AddNormTraceInt (const int dir, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &edgeCoeffs, Array< OneD, NekDouble > &outarray)
 
void AddNormTraceInt (const int dir, Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &outarray, const StdRegions::VarCoeffMap &varcoeffs)
 
void AddEdgeBoundaryInt (const int edge, ExpansionSharedPtr &EdgeExp, Array< OneD, NekDouble > &edgePhys, Array< OneD, NekDouble > &outarray, const StdRegions::VarCoeffMap &varcoeffs=StdRegions::NullVarCoeffMap)
 
void AddHDGHelmholtzEdgeTerms (const NekDouble tau, const int edge, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &edgePhys, const StdRegions::VarCoeffMap &dirForcing, Array< OneD, NekDouble > &outarray)
 
void AddHDGHelmholtzTraceTerms (const NekDouble tau, const Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, const StdRegions::VarCoeffMap &dirForcing, Array< OneD, NekDouble > &outarray)
 
SpatialDomains::Geometry2DSharedPtr GetGeom2D () const
 
void ReOrientEdgePhysMap (const int nvert, const StdRegions::Orientation orient, const int nq0, Array< OneD, int > &idmap)
 
virtual DNekMatSharedPtr v_GenMatrix (const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_GenTraceExp (const int traceid, ExpansionSharedPtr &exp) override
 
- Public Member Functions inherited from Nektar::LocalRegions::Expansion
 Expansion (SpatialDomains::GeometrySharedPtr pGeom)
 
 Expansion (const Expansion &pSrc)
 
virtual ~Expansion ()
 
void SetTraceExp (const int traceid, ExpansionSharedPtr &f)
 
ExpansionSharedPtr GetTraceExp (const int traceid)
 
DNekScalMatSharedPtr GetLocMatrix (const LocalRegions::MatrixKey &mkey)
 
void DropLocMatrix (const LocalRegions::MatrixKey &mkey)
 
DNekScalMatSharedPtr GetLocMatrix (const StdRegions::MatrixType mtype, const StdRegions::ConstFactorMap &factors=StdRegions::NullConstFactorMap, const StdRegions::VarCoeffMap &varcoeffs=StdRegions::NullVarCoeffMap)
 
SpatialDomains::GeometrySharedPtr GetGeom () const
 
void Reset ()
 
IndexMapValuesSharedPtr CreateIndexMap (const IndexMapKey &ikey)
 
DNekScalBlkMatSharedPtr CreateStaticCondMatrix (const MatrixKey &mkey)
 
const SpatialDomains::GeomFactorsSharedPtrGetMetricInfo () const
 
DNekMatSharedPtr BuildTransformationMatrix (const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
 
DNekMatSharedPtr BuildVertexMatrix (const DNekScalMatSharedPtr &r_bnd)
 
void ExtractDataToCoeffs (const NekDouble *data, const std::vector< unsigned int > &nummodes, const int nmodes_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType)
 
void AddEdgeNormBoundaryInt (const int edge, const std::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
void AddEdgeNormBoundaryInt (const int edge, const std::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
void AddFaceNormBoundaryInt (const int face, const std::shared_ptr< Expansion > &FaceExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
void DGDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &coeffs, Array< OneD, NekDouble > &outarray)
 
NekDouble VectorFlux (const Array< OneD, Array< OneD, NekDouble > > &vec)
 
void NormalTraceDerivFactors (Array< OneD, Array< OneD, NekDouble > > &factors, Array< OneD, Array< OneD, NekDouble > > &d0factors, Array< OneD, Array< OneD, NekDouble > > &d1factors)
 
IndexMapValuesSharedPtr GetIndexMap (const IndexMapKey &ikey)
 
void AlignVectorToCollapsedDir (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
 
ExpansionSharedPtr GetLeftAdjacentElementExp () const
 
ExpansionSharedPtr GetRightAdjacentElementExp () const
 
int GetLeftAdjacentElementTrace () const
 
int GetRightAdjacentElementTrace () const
 
void SetAdjacentElementExp (int traceid, ExpansionSharedPtr &e)
 
StdRegions::Orientation GetTraceOrient (int trace)
 
void SetCoeffsToOrientation (StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void DivideByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Divided by the metric jacobi and quadrature weights. More...
 
void GetTraceQFactors (const int trace, Array< OneD, NekDouble > &outarray)
 Extract the metric factors to compute the contravariant fluxes along edge edge and stores them into outarray following the local edge orientation (i.e. anticlockwise convention). More...
 
void GetTracePhysVals (const int trace, const StdRegions::StdExpansionSharedPtr &TraceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient=StdRegions::eNoOrientation)
 
void GetTracePhysMap (const int edge, Array< OneD, int > &outarray)
 
void ReOrientTracePhysMap (const StdRegions::Orientation orient, Array< OneD, int > &idmap, const int nq0, const int nq1)
 
const NormalVectorGetTraceNormal (const int id)
 
void ComputeTraceNormal (const int id)
 
const Array< OneD, const NekDouble > & GetPhysNormals (void)
 
void SetPhysNormals (Array< OneD, const NekDouble > &normal)
 
void SetUpPhysNormals (const int trace)
 
void AddRobinMassMatrix (const int traceid, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat)
 
void TraceNormLen (const int traceid, NekDouble &h, NekDouble &p)
 
void AddRobinTraceContribution (const int traceid, const Array< OneD, const NekDouble > &primCoeffs, const Array< OneD, NekDouble > &incoeffs, Array< OneD, NekDouble > &coeffs)
 
const Array< OneD, const NekDouble > & GetElmtBndNormDirElmtLen (const int nbnd) const
 
void StdDerivBaseOnTraceMat (Array< OneD, DNekMatSharedPtr > &DerivMat)
 

Protected Member Functions

virtual NekDouble v_Integral (const Array< OneD, const NekDouble > &inarray) override
 Integrates the specified function over the domain. More...
 
virtual void v_PhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
 Calculate the derivative of the physical points. More...
 
virtual 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. More...
 
virtual void v_PhysDirectionalDeriv (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &direction, Array< OneD, NekDouble > &out) override
 Physical derivative along a direction vector. More...
 
virtual void v_FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 Transform a given function from physical quadrature space to coefficient space. More...
 
virtual void v_FwdTransBndConstrained (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_IProductWRTBase (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 Calculate the inner product of inarray with respect to the basis B=base0[p]*base1[pq] and put into outarray. More...
 
virtual void v_IProductWRTDerivBase (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) override
 
virtual void v_IProductWRTDerivBase_SumFac (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_AlignVectorToCollapsedDir (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray) override
 
virtual void v_IProductWRTDirectionalDerivBase (const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_IProductWRTDirectionalDerivBase_SumFac (const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 Directinoal Derivative in the modal space in the dir direction of varcoeffs. More...
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, const Array< OneD, const NekDouble > &Fz, Array< OneD, NekDouble > &outarray) override
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const Array< OneD, NekDouble > > &Fvec, Array< OneD, NekDouble > &outarray) override
 
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp (void) const override
 
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp (void) const override
 
virtual void v_GetCoord (const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) override
 
virtual void v_GetCoords (Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
 
virtual NekDouble v_StdPhysEvaluate (const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals) override
 
virtual NekDouble v_PhysEvaluate (const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals) override
 This function evaluates the expansion at a single (arbitrary) point of the domain. More...
 
virtual NekDouble v_PhysEvaluate (const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
 
virtual void v_GetTracePhysVals (const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient) override
 
virtual void v_GetTraceQFactors (const int edge, Array< OneD, NekDouble > &outarray) override
 
virtual void v_ComputeTraceNormal (const int edge) override
 
virtual void v_ExtractDataToCoeffs (const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType) override
 
virtual StdRegions::Orientation v_GetTraceOrient (int edge) override
 
virtual void v_GetTracePhysMap (const int edge, Array< OneD, int > &outarray) override
 
virtual DNekMatSharedPtr v_GenMatrix (const StdRegions::StdMatrixKey &mkey) override
 
virtual DNekMatSharedPtr v_CreateStdMatrix (const StdRegions::StdMatrixKey &mkey) override
 
virtual DNekScalMatSharedPtr v_GetLocMatrix (const MatrixKey &mkey) override
 
void v_DropLocMatrix (const MatrixKey &mkey) override
 
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix (const MatrixKey &mkey) override
 
void v_DropLocStaticCondMatrix (const MatrixKey &mkey) override
 
virtual void v_MassMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_LaplacianMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_LaplacianMatrixOp (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_WeakDerivMatrixOp (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_WeakDirectionalDerivMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_MassLevelCurvatureMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_HelmholtzMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_LaplacianMatrixOp_MatFree_Kernel (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp) override
 
virtual void v_ReduceOrderCoeffs (int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_ComputeLaplacianMetric () override
 
virtual void v_SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_NormalTraceDerivFactors (Array< OneD, Array< OneD, NekDouble > > &factors, Array< OneD, Array< OneD, NekDouble > > &d0factors, Array< OneD, Array< OneD, NekDouble > > &d1factors) override
 : This method gets all of the factors which are required as part of the Gradient Jump Penalty stabilisation and involves the product of the normal and geometric factors along the element trace. More...
 
- Protected Member Functions inherited from Nektar::StdRegions::StdTriExp
virtual NekDouble v_Integral (const Array< OneD, const NekDouble > &inarray) override
 Integrates the specified function over the domain. More...
 
void v_PhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
 Calculate the derivative of the physical points. More...
 
virtual 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. More...
 
virtual void v_StdPhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
 
virtual void v_StdPhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
void v_BwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 Backward tranform for triangular elements. More...
 
virtual void v_BwdTrans_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) 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) override
 
virtual void v_FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 Transform a given function from physical quadrature space to coefficient space. More...
 
virtual void v_FwdTransBndConstrained (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
 Calculate the inner product of inarray with respect to the basis B=base0[p]*base1[pq] and put into outarray. More...
 
virtual void v_IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) 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) override
 
virtual void v_IProductWRTDerivBase (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_IProductWRTDerivBase_SumFac (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_LocCoordToLocCollapsed (const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta) override
 
virtual void v_LocCollapsedToLocCoord (const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi) override
 
virtual void v_FillMode (const int mode, Array< OneD, NekDouble > &outarray) override
 
NekDouble v_PhysEvaluateBasis (const Array< OneD, const NekDouble > &coords, int mode) final override
 
NekDouble v_PhysEvaluate (const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) override
 
virtual int v_GetNverts () const final override
 
virtual int v_GetNtraces () const final override
 
virtual LibUtilities::ShapeType v_DetShapeType () const final override
 
virtual int v_NumBndryCoeffs () const override
 
virtual int v_NumDGBndryCoeffs () const override
 
virtual int v_GetTraceNcoeffs (const int i) const override
 
virtual int v_GetTraceIntNcoeffs (const int i) const override
 
virtual int v_GetTraceNumPoints (const int i) const override
 
virtual int v_CalcNumberOfCoefficients (const std::vector< unsigned int > &nummodes, int &modes_offset) override
 
virtual void v_GetCoords (Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z) override
 
virtual bool v_IsBoundaryInteriorExpansion () const override
 
virtual const LibUtilities::BasisKey v_GetTraceBasisKey (const int i, const int j) const override
 
virtual int v_GetVertexMap (int localVertexId, bool useCoeffPacking=false) override
 
virtual void v_GetInteriorMap (Array< OneD, unsigned int > &outarray) override
 
virtual void v_GetBoundaryMap (Array< OneD, unsigned int > &outarray) override
 
virtual void v_GetTraceCoeffMap (const unsigned int traceid, Array< OneD, unsigned int > &maparray) override
 
void v_GetTraceInteriorToElementMap (const int eid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation edgeOrient=eForwards) override
 
virtual DNekMatSharedPtr v_GenMatrix (const StdMatrixKey &mkey) override
 
virtual DNekMatSharedPtr v_CreateStdMatrix (const StdMatrixKey &mkey) override
 
void v_MassMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
 
virtual void v_LaplacianMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
 
virtual void v_SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdMatrixKey &mkey) override
 
virtual void v_ReduceOrderCoeffs (int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_LaplacianMatrixOp (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
 
virtual void v_WeakDerivMatrixOp (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
 
virtual void v_HelmholtzMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey) override
 
virtual void v_MultiplyByStdQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_GetSimplexEquiSpacedConnectivity (Array< OneD, int > &conn, bool standard=true) override
 
- Protected Member Functions inherited from Nektar::StdRegions::StdExpansion2D
virtual 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. More...
 
virtual NekDouble v_PhysEvaluate (const Array< OneD, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals) override
 
virtual NekDouble v_PhysEvaluate (const Array< OneD, NekDouble > &coord, const Array< OneD, const NekDouble > &inarray, std::array< NekDouble, 3 > &firstOrderDerivs) 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
 
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
 
virtual void v_LaplacianMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_HelmholtzMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
 
virtual void v_GetTraceCoeffMap (const unsigned int traceid, Array< OneD, unsigned int > &maparray) override
 
virtual 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 the standard element) into the orientation of the local trace given by edgeOrient. More...
 
virtual 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_GenStdMatBwdDeriv (const int dir, DNekMatSharedPtr &mat) override
 
- Protected Member Functions inherited from Nektar::StdRegions::StdExpansion
DNekMatSharedPtr CreateStdMatrix (const StdMatrixKey &mkey)
 
DNekBlkMatSharedPtr CreateStdStaticCondMatrix (const StdMatrixKey &mkey)
 Create the static condensation of a matrix when using a boundary interior decomposition. More...
 
void BwdTrans_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDerivBase_SumFac (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDirectionalDerivBase_SumFac (const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GeneralMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree_Kernel (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp)
 
void LaplacianMatrixOp_MatFree_GenericImpl (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDerivMatrixOp_MatFree (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDirectionalDerivMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassLevelCurvatureMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LinearAdvectionMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LinearAdvectionDiffusionReactionMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey, bool addDiffusionTerm=true)
 
void HelmholtzMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void HelmholtzMatrixOp_MatFree_GenericImpl (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_SetCoeffsToOrientation (StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_SetCoeffsToOrientation (Array< OneD, NekDouble > &coeffs, StdRegions::Orientation dir)
 
virtual NekDouble v_StdPhysEvaluate (const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals)
 
virtual void v_GenStdMatBwdDeriv (const int dir, DNekMatSharedPtr &mat)
 
virtual void v_MultiplyByStdQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
template<int DIR, bool DERIV = false, bool DERIV2 = false>
NekDouble BaryEvaluate (const NekDouble &coord, const NekDouble *physvals, NekDouble &deriv, NekDouble &deriv2)
 This function performs the barycentric interpolation of the polynomial stored in coord at a point physvals using barycentric interpolation weights in direction. More...
 
template<int DIR>
NekDouble BaryEvaluateBasis (const NekDouble &coord, const int &mode)
 
template<int DIR, bool DERIV = false, bool DERIV2 = false>
NekDouble BaryEvaluate (const NekDouble &coord, const NekDouble *physvals)
 Helper function to pass an unused value by reference into BaryEvaluate. More...
 
template<int DIR, bool DERIV = false, bool DERIV2 = false>
NekDouble BaryEvaluate (const NekDouble &coord, const NekDouble *physvals, NekDouble &deriv)
 
- Protected Member Functions inherited from Nektar::LocalRegions::Expansion2D
virtual void v_DGDeriv (const int dir, const Array< OneD, const NekDouble > &incoeffs, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &edgeCoeffs, Array< OneD, NekDouble > &out_d) override
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const ExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray) override
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const ExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray) override
 
virtual void v_AddRobinMassMatrix (const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat) override
 
virtual void v_AddRobinTraceContribution (const int traceid, const Array< OneD, const NekDouble > &primCoeffs, const Array< OneD, NekDouble > &incoeffs, Array< OneD, NekDouble > &coeffs) override
 
virtual DNekMatSharedPtr v_BuildVertexMatrix (const DNekScalMatSharedPtr &r_bnd) override
 
virtual void v_ReOrientTracePhysMap (const StdRegions::Orientation orient, Array< OneD, int > &idmap, const int nq0, const int nq1) override
 
virtual void v_SetUpPhysNormals (const int edge) override
 
virtual NekDouble v_VectorFlux (const Array< OneD, Array< OneD, NekDouble > > &vec) override
 
virtual void v_TraceNormLen (const int traceid, NekDouble &h, NekDouble &p) override
 
- Protected Member Functions inherited from Nektar::LocalRegions::Expansion
void ComputeLaplacianMetric ()
 
void ComputeQuadratureMetric ()
 
void ComputeGmatcdotMF (const Array< TwoD, const NekDouble > &df, const Array< OneD, const NekDouble > &direction, Array< OneD, Array< OneD, NekDouble > > &dfdir)
 
Array< OneD, NekDoubleGetMF (const int dir, const int shapedim, const StdRegions::VarCoeffMap &varcoeffs)
 
Array< OneD, NekDoubleGetMFDiv (const int dir, const StdRegions::VarCoeffMap &varcoeffs)
 
Array< OneD, NekDoubleGetMFMag (const int dir, const StdRegions::VarCoeffMap &varcoeffs)
 
virtual void v_MultiplyByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_DivideByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_ComputeLaplacianMetric ()
 
virtual int v_GetCoordim () const override
 
virtual void v_GetCoords (Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
 
virtual DNekScalMatSharedPtr v_GetLocMatrix (const LocalRegions::MatrixKey &mkey)
 
virtual void v_DropLocMatrix (const LocalRegions::MatrixKey &mkey)
 
virtual DNekMatSharedPtr v_BuildTransformationMatrix (const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
 
virtual DNekMatSharedPtr v_BuildVertexMatrix (const DNekScalMatSharedPtr &r_bnd)
 
virtual void v_ExtractDataToCoeffs (const NekDouble *data, const std::vector< unsigned int > &nummodes, const int nmodes_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const std::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const std::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddFaceNormBoundaryInt (const int face, const std::shared_ptr< Expansion > &FaceExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
virtual void v_DGDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &coeffs, Array< OneD, NekDouble > &outarray)
 
virtual NekDouble v_VectorFlux (const Array< OneD, Array< OneD, NekDouble > > &vec)
 
virtual void v_NormalTraceDerivFactors (Array< OneD, Array< OneD, NekDouble > > &factors, Array< OneD, Array< OneD, NekDouble > > &d0factors, Array< OneD, Array< OneD, NekDouble > > &d1factors)
 
virtual void v_AlignVectorToCollapsedDir (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
 
virtual StdRegions::Orientation v_GetTraceOrient (int trace)
 
virtual void v_SetCoeffsToOrientation (StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
 
virtual void v_GetTraceQFactors (const int trace, Array< OneD, NekDouble > &outarray)
 
virtual void v_GetTracePhysVals (const int trace, const StdRegions::StdExpansionSharedPtr &TraceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient)
 
virtual void v_GetTracePhysMap (const int edge, Array< OneD, int > &outarray)
 
virtual void v_ReOrientTracePhysMap (const StdRegions::Orientation orient, Array< OneD, int > &idmap, const int nq0, const int nq1=-1)
 
virtual void v_ComputeTraceNormal (const int id)
 
virtual const Array< OneD, const NekDouble > & v_GetPhysNormals ()
 
virtual void v_SetPhysNormals (Array< OneD, const NekDouble > &normal)
 
virtual void v_SetUpPhysNormals (const int id)
 
virtual void v_AddRobinMassMatrix (const int face, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat)
 
virtual void v_AddRobinTraceContribution (const int traceid, const Array< OneD, const NekDouble > &primCoeffs, const Array< OneD, NekDouble > &incoeffs, Array< OneD, NekDouble > &coeffs)
 
virtual void v_TraceNormLen (const int traceid, NekDouble &h, NekDouble &p)
 
virtual void v_GenTraceExp (const int traceid, ExpansionSharedPtr &exp)
 

Private Attributes

LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLessm_matrixManager
 
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLessm_staticCondMatrixManager
 

Additional Inherited Members

- Protected Attributes inherited from Nektar::StdRegions::StdExpansion
Array< OneD, LibUtilities::BasisSharedPtrm_base
 
int m_elmt_id
 
int m_ncoeffs
 
LibUtilities::NekManager< StdMatrixKey, DNekMat, StdMatrixKey::opLessm_stdMatrixManager
 
LibUtilities::NekManager< StdMatrixKey, DNekBlkMat, StdMatrixKey::opLessm_stdStaticCondMatrixManager
 
- Protected Attributes inherited from Nektar::LocalRegions::Expansion2D
std::vector< bool > m_requireNeg
 
- Protected Attributes inherited from Nektar::LocalRegions::Expansion
LibUtilities::NekManager< IndexMapKey, IndexMapValues, IndexMapKey::opLessm_indexMapManager
 
std::map< int, ExpansionWeakPtrm_traceExp
 
SpatialDomains::GeometrySharedPtr m_geom
 
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
 
MetricMap m_metrics
 
std::map< int, NormalVectorm_traceNormals
 
ExpansionWeakPtr m_elementLeft
 
ExpansionWeakPtr m_elementRight
 
int m_elementTraceLeft = -1
 
int m_elementTraceRight = -1
 
std::map< int, Array< OneD, NekDouble > > m_elmtBndNormDirElmtLen
 the element length in each element boundary(Vertex, edge or face) normal direction calculated based on the local m_metricinfo times the standard element length (which is 2.0) More...
 

Detailed Description

Definition at line 50 of file TriExp.h.

Constructor & Destructor Documentation

◆ TriExp() [1/2]

Nektar::LocalRegions::TriExp::TriExp ( const LibUtilities::BasisKey Ba,
const LibUtilities::BasisKey Bb,
const SpatialDomains::Geometry2DSharedPtr geom 
)

Constructor using BasisKey class for quadrature points and order definition.

Definition at line 49 of file TriExp.cpp.

53 Ba.GetNumModes(), (Bb.GetNumModes())),
54 2, Ba, Bb),
56 Ba.GetNumModes(), (Bb.GetNumModes())),
57 Ba, Bb),
58 StdTriExp(Ba, Bb), Expansion(geom), Expansion2D(geom),
60 std::bind(&Expansion2D::CreateMatrix, this, std::placeholders::_1),
61 std::string("TriExpMatrix")),
63 this, std::placeholders::_1),
64 std::string("TriExpStaticCondMatrix"))
65{
66}
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
Definition: Expansion2D.cpp:59
Expansion2D(SpatialDomains::Geometry2DSharedPtr pGeom)
Definition: Expansion2D.cpp:54
DNekScalBlkMatSharedPtr CreateStaticCondMatrix(const MatrixKey &mkey)
Definition: Expansion.cpp:277
Expansion(SpatialDomains::GeometrySharedPtr pGeom)
Definition: Expansion.cpp:47
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:248
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: TriExp.h:250
StdExpansion()
Default Constructor.
int getNumberOfCoefficients(int Na, int Nb)
Definition: ShapeType.hpp:114

◆ TriExp() [2/2]

Nektar::LocalRegions::TriExp::TriExp ( const TriExp T)

Definition at line 68 of file TriExp.cpp.

70 Expansion2D(T), m_matrixManager(T.m_matrixManager),
71 m_staticCondMatrixManager(T.m_staticCondMatrixManager)
72{
73}

◆ ~TriExp()

virtual Nektar::LocalRegions::TriExp::~TriExp ( )
overridevirtualdefault

Member Function Documentation

◆ v_AlignVectorToCollapsedDir()

void Nektar::LocalRegions::TriExp::v_AlignVectorToCollapsedDir ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 467 of file TriExp.cpp.

470{
471 ASSERTL1((dir == 0) || (dir == 1) || (dir == 2), "Invalid direction.");
472 ASSERTL1((dir == 2) ? (m_geom->GetCoordim() == 3) : true,
473 "Invalid direction.");
474
475 int nquad0 = m_base[0]->GetNumPoints();
476 int nquad1 = m_base[1]->GetNumPoints();
477 int nqtot = nquad0 * nquad1;
478 int nmodes0 = m_base[0]->GetNumModes();
479 int wspsize = max(max(nqtot, m_ncoeffs), nquad1 * nmodes0);
480
481 const Array<TwoD, const NekDouble> &df =
482 m_metricinfo->GetDerivFactors(GetPointsKeys());
483
484 Array<OneD, NekDouble> tmp0(wspsize);
485 Array<OneD, NekDouble> tmp3(wspsize);
486 Array<OneD, NekDouble> gfac0(wspsize);
487 Array<OneD, NekDouble> gfac1(wspsize);
488
489 Array<OneD, NekDouble> tmp1 = outarray[0];
490 Array<OneD, NekDouble> tmp2 = outarray[1];
491
492 const Array<OneD, const NekDouble> &z0 = m_base[0]->GetZ();
493 const Array<OneD, const NekDouble> &z1 = m_base[1]->GetZ();
494
495 // set up geometric factor: 2/(1-z1)
496 for (int i = 0; i < nquad1; ++i)
497 {
498 gfac0[i] = 2.0 / (1 - z1[i]);
499 }
500 for (int i = 0; i < nquad0; ++i)
501 {
502 gfac1[i] = 0.5 * (1 + z0[i]);
503 }
504
505 for (int i = 0; i < nquad1; ++i)
506 {
507 Vmath::Smul(nquad0, gfac0[i], &inarray[0] + i * nquad0, 1,
508 &tmp0[0] + i * nquad0, 1);
509 }
510
511 for (int i = 0; i < nquad1; ++i)
512 {
513 Vmath::Vmul(nquad0, &gfac1[0], 1, &tmp0[0] + i * nquad0, 1,
514 &tmp1[0] + i * nquad0, 1);
515 }
516
517 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
518 {
519 Vmath::Vmul(nqtot, &df[2 * dir][0], 1, &tmp0[0], 1, &tmp0[0], 1);
520 Vmath::Vmul(nqtot, &df[2 * dir + 1][0], 1, &tmp1[0], 1, &tmp1[0], 1);
521 Vmath::Vmul(nqtot, &df[2 * dir + 1][0], 1, &inarray[0], 1, &tmp2[0], 1);
522 }
523 else
524 {
525 Vmath::Smul(nqtot, df[2 * dir][0], tmp0, 1, tmp0, 1);
526 Vmath::Smul(nqtot, df[2 * dir + 1][0], tmp1, 1, tmp1, 1);
527 Vmath::Smul(nqtot, df[2 * dir + 1][0], inarray, 1, tmp2, 1);
528 }
529 Vmath::Vadd(nqtot, tmp0, 1, tmp1, 1, tmp1, 1);
530}
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:249
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:275
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:276
const LibUtilities::PointsKeyVector GetPointsKeys() const
Array< OneD, LibUtilities::BasisSharedPtr > m_base
@ eDeformed
Geometry is curved or has non-constant factors.
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.
Definition: Vmath.cpp:207
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.cpp:354
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.cpp:245

References ASSERTL1, Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_geom, Nektar::LocalRegions::Expansion::m_metricinfo, Nektar::StdRegions::StdExpansion::m_ncoeffs, Vmath::Smul(), Vmath::Vadd(), and Vmath::Vmul().

Referenced by v_IProductWRTDerivBase_SumFac().

◆ v_ComputeLaplacianMetric()

void Nektar::LocalRegions::TriExp::v_ComputeLaplacianMetric ( )
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1216 of file TriExp.cpp.

1217{
1218 if (m_metrics.count(eMetricQuadrature) == 0)
1219 {
1221 }
1222
1223 unsigned int i, j;
1224 const SpatialDomains::GeomType type = m_metricinfo->GetGtype();
1225 const unsigned int nqtot = GetTotPoints();
1226 const unsigned int dim = 2;
1227 const MetricType m[3][3] = {
1231
1232 Array<OneD, NekDouble> dEta_dXi[2] = {Array<OneD, NekDouble>(nqtot, 1.0),
1233 Array<OneD, NekDouble>(nqtot, 1.0)};
1234
1235 for (i = 0; i < dim; ++i)
1236 {
1237 for (j = i; j < dim; ++j)
1238 {
1239 m_metrics[m[i][j]] = Array<OneD, NekDouble>(nqtot);
1240 }
1241 }
1242
1243 const Array<OneD, const NekDouble> &z0 = m_base[0]->GetZ();
1244 const Array<OneD, const NekDouble> &z1 = m_base[1]->GetZ();
1245 const unsigned int nquad0 = m_base[0]->GetNumPoints();
1246 const unsigned int nquad1 = m_base[1]->GetNumPoints();
1247 const Array<TwoD, const NekDouble> &df =
1248 m_metricinfo->GetDerivFactors(GetPointsKeys());
1249
1250 for (i = 0; i < nquad1; i++)
1251 {
1252 Blas::Dscal(nquad0, 2.0 / (1 - z1[i]), &dEta_dXi[0][0] + i * nquad0, 1);
1253 Blas::Dscal(nquad0, 2.0 / (1 - z1[i]), &dEta_dXi[1][0] + i * nquad0, 1);
1254 }
1255 for (i = 0; i < nquad0; i++)
1256 {
1257 Blas::Dscal(nquad1, 0.5 * (1 + z0[i]), &dEta_dXi[1][0] + i, nquad0);
1258 }
1259
1260 Array<OneD, NekDouble> tmp(nqtot);
1261 if ((type == SpatialDomains::eRegular ||
1263 {
1264 Vmath::Smul(nqtot, df[0][0], &dEta_dXi[0][0], 1, &tmp[0], 1);
1265 Vmath::Svtvp(nqtot, df[1][0], &dEta_dXi[1][0], 1, &tmp[0], 1, &tmp[0],
1266 1);
1267
1268 Vmath::Vmul(nqtot, &tmp[0], 1, &tmp[0], 1,
1270 Vmath::Smul(nqtot, df[1][0], &tmp[0], 1,
1272
1273 Vmath::Smul(nqtot, df[2][0], &dEta_dXi[0][0], 1, &tmp[0], 1);
1274 Vmath::Svtvp(nqtot, df[3][0], &dEta_dXi[1][0], 1, &tmp[0], 1, &tmp[0],
1275 1);
1276
1277 Vmath::Vvtvp(nqtot, &tmp[0], 1, &tmp[0], 1,
1280 Vmath::Svtvp(nqtot, df[3][0], &tmp[0], 1,
1283
1284 if (GetCoordim() == 3)
1285 {
1286 Vmath::Smul(nqtot, df[4][0], &dEta_dXi[0][0], 1, &tmp[0], 1);
1287 Vmath::Svtvp(nqtot, df[5][0], &dEta_dXi[1][0], 1, &tmp[0], 1,
1288 &tmp[0], 1);
1289
1290 Vmath::Vvtvp(nqtot, &tmp[0], 1, &tmp[0], 1,
1293 Vmath::Svtvp(nqtot, df[5][0], &tmp[0], 1,
1296 }
1297
1298 NekDouble g2 = df[1][0] * df[1][0] + df[3][0] * df[3][0];
1299 if (GetCoordim() == 3)
1300 {
1301 g2 += df[5][0] * df[5][0];
1302 }
1303 Vmath::Fill(nqtot, g2, &m_metrics[eMetricLaplacian11][0], 1);
1304 }
1305 else
1306 {
1307
1308 Vmath::Vmul(nqtot, &df[0][0], 1, &dEta_dXi[0][0], 1, &tmp[0], 1);
1309 Vmath::Vvtvp(nqtot, &df[1][0], 1, &dEta_dXi[1][0], 1, &tmp[0], 1,
1310 &tmp[0], 1);
1311
1312 Vmath::Vmul(nqtot, &tmp[0], 1, &tmp[0], 1,
1314 Vmath::Vmul(nqtot, &df[1][0], 1, &tmp[0], 1,
1316 Vmath::Vmul(nqtot, &df[1][0], 1, &df[1][0], 1,
1318
1319 Vmath::Vmul(nqtot, &df[2][0], 1, &dEta_dXi[0][0], 1, &tmp[0], 1);
1320 Vmath::Vvtvp(nqtot, &df[3][0], 1, &dEta_dXi[1][0], 1, &tmp[0], 1,
1321 &tmp[0], 1);
1322
1323 Vmath::Vvtvp(nqtot, &tmp[0], 1, &tmp[0], 1,
1326 Vmath::Vvtvp(nqtot, &df[3][0], 1, &tmp[0], 1,
1329 Vmath::Vvtvp(nqtot, &df[3][0], 1, &df[3][0], 1,
1332
1333 if (GetCoordim() == 3)
1334 {
1335 Vmath::Vmul(nqtot, &df[4][0], 1, &dEta_dXi[0][0], 1, &tmp[0], 1);
1336 Vmath::Vvtvp(nqtot, &df[5][0], 1, &dEta_dXi[1][0], 1, &tmp[0], 1,
1337 &tmp[0], 1);
1338
1339 Vmath::Vvtvp(nqtot, &tmp[0], 1, &tmp[0], 1,
1342 Vmath::Vvtvp(nqtot, &df[5][0], 1, &tmp[0], 1,
1345 Vmath::Vvtvp(nqtot, &df[5][0], 1, &df[5][0], 1,
1348 }
1349 }
1350
1351 for (unsigned int i = 0; i < dim; ++i)
1352 {
1353 for (unsigned int j = i; j < dim; ++j)
1354 {
1356 }
1357 }
1358}
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:140
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:729
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
Definition: Blas.hpp:151
GeomType
Indicates the type of element geometry.
@ eRegular
Geometry is straight-sided with constant geometric factors.
@ eMovingRegular
Currently unused.
double NekDouble
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
Definition: Vmath.cpp:617
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
Definition: Vmath.cpp:569
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:43

References Nektar::LocalRegions::Expansion::ComputeQuadratureMetric(), Blas::Dscal(), Nektar::LocalRegions::eMetricLaplacian00, Nektar::LocalRegions::eMetricLaplacian01, Nektar::LocalRegions::eMetricLaplacian02, Nektar::LocalRegions::eMetricLaplacian11, Nektar::LocalRegions::eMetricLaplacian12, Nektar::LocalRegions::eMetricLaplacian22, Nektar::LocalRegions::eMetricQuadrature, Nektar::SpatialDomains::eMovingRegular, Nektar::SpatialDomains::eRegular, Vmath::Fill(), Nektar::StdRegions::StdExpansion::GetCoordim(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::GetTotPoints(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_metricinfo, Nektar::LocalRegions::Expansion::m_metrics, Nektar::StdRegions::StdExpansion::MultiplyByQuadratureMetric(), Vmath::Smul(), Vmath::Svtvp(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ v_ComputeTraceNormal()

void Nektar::LocalRegions::TriExp::v_ComputeTraceNormal ( const int  edge)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 822 of file TriExp.cpp.

823{
824 int i;
825 const SpatialDomains::GeomFactorsSharedPtr &geomFactors =
826 GetGeom()->GetMetricInfo();
827
829 for (i = 0; i < ptsKeys.size(); ++i)
830 {
831 // Need at least 2 points for computing normals
832 if (ptsKeys[i].GetNumPoints() == 1)
833 {
834 LibUtilities::PointsKey pKey(2, ptsKeys[i].GetPointsType());
835 ptsKeys[i] = pKey;
836 }
837 }
838
839 const SpatialDomains::GeomType type = geomFactors->GetGtype();
840 const Array<TwoD, const NekDouble> &df =
841 geomFactors->GetDerivFactors(ptsKeys);
842 const Array<OneD, const NekDouble> &jac = geomFactors->GetJac(ptsKeys);
843
844 // The points of normals should follow trace basis, not local basis.
845 LibUtilities::BasisKey tobasis = GetTraceBasisKey(edge);
846
847 int nqe = tobasis.GetNumPoints();
848 int dim = GetCoordim();
849
850 m_traceNormals[edge] = Array<OneD, Array<OneD, NekDouble>>(dim);
851 Array<OneD, Array<OneD, NekDouble>> &normal = m_traceNormals[edge];
852 for (i = 0; i < dim; ++i)
853 {
854 normal[i] = Array<OneD, NekDouble>(nqe);
855 }
856
857 size_t nqb = nqe;
858 size_t nbnd = edge;
859 m_elmtBndNormDirElmtLen[nbnd] = Array<OneD, NekDouble>{nqb, 0.0};
860 Array<OneD, NekDouble> &length = m_elmtBndNormDirElmtLen[nbnd];
861
862 // Regular geometry case
863 if ((type == SpatialDomains::eRegular) ||
865 {
866 NekDouble fac;
867 // Set up normals
868 switch (edge)
869 {
870 case 0:
871 for (i = 0; i < GetCoordim(); ++i)
872 {
873 Vmath::Fill(nqe, -df[2 * i + 1][0], normal[i], 1);
874 }
875 break;
876 case 1:
877 for (i = 0; i < GetCoordim(); ++i)
878 {
879 Vmath::Fill(nqe, df[2 * i + 1][0] + df[2 * i][0], normal[i],
880 1);
881 }
882 break;
883 case 2:
884 for (i = 0; i < GetCoordim(); ++i)
885 {
886 Vmath::Fill(nqe, -df[2 * i][0], normal[i], 1);
887 }
888 break;
889 default:
890 ASSERTL0(false, "Edge is out of range (edge < 3)");
891 }
892
893 // normalise
894 fac = 0.0;
895 for (i = 0; i < GetCoordim(); ++i)
896 {
897 fac += normal[i][0] * normal[i][0];
898 }
899 fac = 1.0 / sqrt(fac);
900
901 Vmath::Fill(nqb, fac, length, 1);
902
903 for (i = 0; i < GetCoordim(); ++i)
904 {
905 Vmath::Smul(nqe, fac, normal[i], 1, normal[i], 1);
906 }
907 }
908 else // Set up deformed normals
909 {
910 int j;
911
912 int nquad0 = ptsKeys[0].GetNumPoints();
913 int nquad1 = ptsKeys[1].GetNumPoints();
914
915 LibUtilities::PointsKey from_key;
916
917 Array<OneD, NekDouble> normals(GetCoordim() * max(nquad0, nquad1), 0.0);
918 Array<OneD, NekDouble> edgejac(GetCoordim() * max(nquad0, nquad1), 0.0);
919
920 // Extract Jacobian along edges and recover local
921 // derivates (dx/dr) for polynomial interpolation by
922 // multiplying m_gmat by jacobian
923 switch (edge)
924 {
925 case 0:
926 for (j = 0; j < nquad0; ++j)
927 {
928 edgejac[j] = jac[j];
929 for (i = 0; i < GetCoordim(); ++i)
930 {
931 normals[i * nquad0 + j] =
932 -df[2 * i + 1][j] * edgejac[j];
933 }
934 }
935 from_key = ptsKeys[0];
936 break;
937 case 1:
938 for (j = 0; j < nquad1; ++j)
939 {
940 edgejac[j] = jac[nquad0 * j + nquad0 - 1];
941 for (i = 0; i < GetCoordim(); ++i)
942 {
943 normals[i * nquad1 + j] =
944 (df[2 * i][nquad0 * j + nquad0 - 1] +
945 df[2 * i + 1][nquad0 * j + nquad0 - 1]) *
946 edgejac[j];
947 }
948 }
949 from_key = ptsKeys[1];
950 break;
951 case 2:
952 for (j = 0; j < nquad1; ++j)
953 {
954 edgejac[j] = jac[nquad0 * j];
955 for (i = 0; i < GetCoordim(); ++i)
956 {
957 normals[i * nquad1 + j] =
958 -df[2 * i][nquad0 * j] * edgejac[j];
959 }
960 }
961 from_key = ptsKeys[1];
962 break;
963 default:
964 ASSERTL0(false, "edge is out of range (edge < 3)");
965 }
966
967 int nq = from_key.GetNumPoints();
968 Array<OneD, NekDouble> work(nqe, 0.0);
969
970 // interpolate Jacobian and invert
971 LibUtilities::Interp1D(from_key, jac, tobasis.GetPointsKey(), work);
972 Vmath::Sdiv(nqe, 1.0, &work[0], 1, &work[0], 1);
973
974 // interpolate
975 for (i = 0; i < GetCoordim(); ++i)
976 {
977 LibUtilities::Interp1D(from_key, &normals[i * nq],
978 tobasis.GetPointsKey(), &normal[i][0]);
979 Vmath::Vmul(nqe, work, 1, normal[i], 1, normal[i], 1);
980 }
981
982 // normalise normal vectors
983 Vmath::Zero(nqe, work, 1);
984 for (i = 0; i < GetCoordim(); ++i)
985 {
986 Vmath::Vvtvp(nqe, normal[i], 1, normal[i], 1, work, 1, work, 1);
987 }
988
989 Vmath::Vsqrt(nqe, work, 1, work, 1);
990 Vmath::Sdiv(nqe, 1.0, work, 1, work, 1);
991
992 Vmath::Vcopy(nqb, work, 1, length, 1);
993
994 for (i = 0; i < GetCoordim(); ++i)
995 {
996 Vmath::Vmul(nqe, normal[i], 1, work, 1, normal[i], 1);
997 }
998 }
999
1000 if (GetGeom()->GetEorient(edge) == StdRegions::eBackwards)
1001 {
1002 for (i = 0; i < GetCoordim(); ++i)
1003 {
1004 if (geomFactors->GetGtype() == SpatialDomains::eDeformed)
1005 {
1006 Vmath::Reverse(nqe, normal[i], 1, normal[i], 1);
1007 }
1008 }
1009 }
1010}
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
std::map< int, NormalVector > m_traceNormals
Definition: Expansion.h:278
std::map< int, Array< OneD, NekDouble > > m_elmtBndNormDirElmtLen
the element length in each element boundary(Vertex, edge or face) normal direction calculated based o...
Definition: Expansion.h:288
SpatialDomains::GeometrySharedPtr GetGeom() const
Definition: Expansion.cpp:171
const LibUtilities::BasisKey GetTraceBasisKey(const int i, int k=-1) const
This function returns the basis key belonging to the i-th trace.
Definition: StdExpansion.h:305
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:211
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:224
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 ...
Definition: Interp.cpp:49
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:236
std::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
Definition: GeomFactors.h:62
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
Definition: Vmath.cpp:529
void Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/x.
Definition: Vmath.cpp:319
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:487
void Reverse(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1222
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1191
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:294

References ASSERTL0, Nektar::StdRegions::eBackwards, Nektar::SpatialDomains::eDeformed, Nektar::SpatialDomains::eMovingRegular, Nektar::SpatialDomains::eRegular, Vmath::Fill(), Nektar::StdRegions::StdExpansion::GetCoordim(), Nektar::LocalRegions::Expansion::GetGeom(), Nektar::LibUtilities::BasisKey::GetNumPoints(), Nektar::LibUtilities::PointsKey::GetNumPoints(), Nektar::StdRegions::StdExpansion::GetNumPoints(), Nektar::LibUtilities::BasisKey::GetPointsKey(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::GetPointsType(), Nektar::StdRegions::StdExpansion::GetTraceBasisKey(), Nektar::LibUtilities::Interp1D(), Nektar::LocalRegions::Expansion::m_elmtBndNormDirElmtLen, Nektar::LocalRegions::Expansion::m_traceNormals, Vmath::Reverse(), Vmath::Sdiv(), Vmath::Smul(), tinysimd::sqrt(), Vmath::Vcopy(), Vmath::Vmul(), Vmath::Vsqrt(), Vmath::Vvtvp(), and Vmath::Zero().

◆ v_CreateStdMatrix()

DNekMatSharedPtr Nektar::LocalRegions::TriExp::v_CreateStdMatrix ( const StdRegions::StdMatrixKey mkey)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1079 of file TriExp.cpp.

1080{
1081 LibUtilities::BasisKey bkey0 = m_base[0]->GetBasisKey();
1082 LibUtilities::BasisKey bkey1 = m_base[1]->GetBasisKey();
1085
1086 return tmp->GetStdMatrix(mkey);
1087}
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< StdTriExp > StdTriExpSharedPtr
Definition: StdTriExp.h:232

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and Nektar::StdRegions::StdExpansion::m_base.

◆ v_DropLocMatrix()

void Nektar::LocalRegions::TriExp::v_DropLocMatrix ( const MatrixKey mkey)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1094 of file TriExp.cpp.

1095{
1096 m_matrixManager.DeleteObject(mkey);
1097}

References m_matrixManager.

◆ v_DropLocStaticCondMatrix()

void Nektar::LocalRegions::TriExp::v_DropLocStaticCondMatrix ( const MatrixKey mkey)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1104 of file TriExp.cpp.

1105{
1106 m_staticCondMatrixManager.DeleteObject(mkey);
1107}

References m_staticCondMatrixManager.

◆ v_ExtractDataToCoeffs()

void Nektar::LocalRegions::TriExp::v_ExtractDataToCoeffs ( const NekDouble data,
const std::vector< unsigned int > &  nummodes,
const int  mode_offset,
NekDouble coeffs,
std::vector< LibUtilities::BasisType > &  fromType 
)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1012 of file TriExp.cpp.

1016{
1017 boost::ignore_unused(fromType);
1018
1019 int data_order0 = nummodes[mode_offset];
1020 int fillorder0 = min(m_base[0]->GetNumModes(), data_order0);
1021 int data_order1 = nummodes[mode_offset + 1];
1022 int order1 = m_base[1]->GetNumModes();
1023 int fillorder1 = min(order1, data_order1);
1024
1025 switch (m_base[0]->GetBasisType())
1026 {
1029 {
1030 int i;
1031 int cnt = 0;
1032 int cnt1 = 0;
1033
1036 "Extraction routine not set up for this basis");
1037
1038 Vmath::Zero(m_ncoeffs, coeffs, 1);
1039 for (i = 0; i < fillorder0; ++i)
1040 {
1041 Vmath::Vcopy(fillorder1 - i, &data[cnt], 1, &coeffs[cnt1], 1);
1042 cnt += data_order1 - i;
1043 cnt1 += order1 - i;
1044 }
1045 }
1046 break;
1047 default:
1048 ASSERTL0(false, "basis is either not set up or not hierarchicial");
1049 }
1050}
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:162
@ eModified_B
Principle Modified Functions .
Definition: BasisType.h:51
@ eOrtho_A
Principle Orthogonal Functions .
Definition: BasisType.h:44
@ eOrtho_B
Principle Orthogonal Functions .
Definition: BasisType.h:46
@ eModified_A
Principle Modified Functions .
Definition: BasisType.h:50

References ASSERTL0, ASSERTL1, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::LibUtilities::eOrtho_A, Nektar::LibUtilities::eOrtho_B, Nektar::StdRegions::StdExpansion::GetBasisType(), Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion::m_ncoeffs, Vmath::Vcopy(), and Vmath::Zero().

◆ v_FwdTrans()

void Nektar::LocalRegions::TriExp::v_FwdTrans ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Transform a given function from physical quadrature space to coefficient space.

See also
StdExpansion::FwdTrans

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 253 of file TriExp.cpp.

255{
256 IProductWRTBase(inarray, outarray);
257
258 // get Mass matrix inverse
259 MatrixKey masskey(StdRegions::eInvMass, DetShapeType(), *this);
260 DNekScalMatSharedPtr matsys = m_matrixManager[masskey];
261
262 // copy inarray in case inarray == outarray
263 NekVector<NekDouble> in(m_ncoeffs, outarray, eCopy);
264 NekVector<NekDouble> out(m_ncoeffs, outarray, eWrapper);
265
266 out = (*matsys) * in;
267}
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...
Definition: StdExpansion.h:534
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:373
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr

References Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::eCopy, Nektar::StdRegions::eInvMass, Nektar::eWrapper, Nektar::StdRegions::StdExpansion::IProductWRTBase(), m_matrixManager, and Nektar::StdRegions::StdExpansion::m_ncoeffs.

◆ v_FwdTransBndConstrained()

void Nektar::LocalRegions::TriExp::v_FwdTransBndConstrained ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 269 of file TriExp.cpp.

272{
273 int i, j;
274 int npoints[2] = {m_base[0]->GetNumPoints(), m_base[1]->GetNumPoints()};
275 int nmodes[2] = {m_base[0]->GetNumModes(), m_base[1]->GetNumModes()};
276
277 fill(outarray.get(), outarray.get() + m_ncoeffs, 0.0);
278
279 if (nmodes[0] == 1 && nmodes[1] == 1)
280 {
281 outarray[0] = inarray[0];
282 return;
283 }
284
285 Array<OneD, NekDouble> physEdge[3];
286 Array<OneD, NekDouble> coeffEdge[3];
287 for (i = 0; i < 3; i++)
288 {
289 // define physEdge and add 1 so can interpolate grl10 points if
290 // necessary
291 physEdge[i] = Array<OneD, NekDouble>(max(npoints[i != 0], npoints[0]));
292 coeffEdge[i] = Array<OneD, NekDouble>(nmodes[i != 0]);
293 }
294
295 for (i = 0; i < npoints[0]; i++)
296 {
297 physEdge[0][i] = inarray[i];
298 }
299
300 // extract data in cartesian directions
301 for (i = 0; i < npoints[1]; i++)
302 {
303 physEdge[1][i] = inarray[npoints[0] - 1 + i * npoints[0]];
304 physEdge[2][i] = inarray[i * npoints[0]];
305 }
306
307 SegExpSharedPtr segexp[3];
309 m_base[0]->GetBasisKey(), GetGeom2D()->GetEdge(0));
310
312 {
313 for (i = 1; i < 3; i++)
314 {
316 m_base[i != 0]->GetBasisKey(), GetGeom2D()->GetEdge(i));
317 }
318 }
319 else // interploate using edge 0 GLL distribution
320 {
321 for (i = 1; i < 3; i++)
322 {
324 m_base[0]->GetBasisKey(), GetGeom2D()->GetEdge(i));
325
326 LibUtilities::Interp1D(m_base[1]->GetPointsKey(), physEdge[i],
327 m_base[0]->GetPointsKey(), physEdge[i]);
328 }
329 npoints[1] = npoints[0];
330 }
331
332 Array<OneD, unsigned int> mapArray;
333 Array<OneD, int> signArray;
335 // define an orientation to get EdgeToElmtMapping from Cartesian data
336 StdRegions::Orientation orient[3] = {
338
339 for (i = 0; i < 3; i++)
340 {
341 segexp[i]->FwdTransBndConstrained(physEdge[i], coeffEdge[i]);
342
343 // this orient goes with the one above and so could
344 // probably set both to eForwards
345 GetTraceToElementMap(i, mapArray, signArray, orient[i]);
346 for (j = 0; j < nmodes[i != 0]; j++)
347 {
348 sign = (NekDouble)signArray[j];
349 outarray[mapArray[j]] = sign * coeffEdge[i][j];
350 }
351 }
352
353 int nBoundaryDofs = NumBndryCoeffs();
354 int nInteriorDofs = m_ncoeffs - nBoundaryDofs;
355
356 if (nInteriorDofs > 0)
357 {
358 Array<OneD, NekDouble> tmp0(m_ncoeffs);
359 Array<OneD, NekDouble> tmp1(m_ncoeffs);
360
361 StdRegions::StdMatrixKey stdmasskey(StdRegions::eMass, DetShapeType(),
362 *this);
363 MassMatrixOp(outarray, tmp0, stdmasskey);
364 IProductWRTBase(inarray, tmp1);
365
366 Vmath::Vsub(m_ncoeffs, tmp1, 1, tmp0, 1, tmp1, 1);
367
368 // get Mass matrix inverse (only of interior DOF)
369 // use block (1,1) of the static condensed system
370 // note: this block alreay contains the inverse matrix
371 MatrixKey masskey(StdRegions::eMass, DetShapeType(), *this);
372 DNekScalMatSharedPtr matsys =
373 (m_staticCondMatrixManager[masskey])->GetBlock(1, 1);
374
375 Array<OneD, NekDouble> rhs(nInteriorDofs);
376 Array<OneD, NekDouble> result(nInteriorDofs);
377
378 GetInteriorMap(mapArray);
379
380 for (i = 0; i < nInteriorDofs; i++)
381 {
382 rhs[i] = tmp1[mapArray[i]];
383 }
384
385 Blas::Dgemv('N', nInteriorDofs, nInteriorDofs, matsys->Scale(),
386 &((matsys->GetOwnedMatrix())->GetPtr())[0], nInteriorDofs,
387 rhs.get(), 1, 0.0, result.get(), 1);
388
389 for (i = 0; i < nInteriorDofs; i++)
390 {
391 outarray[mapArray[i]] = result[i];
392 }
393 }
394}
#define sign(a, b)
return the sign(b)*a
Definition: Polylib.cpp:49
SpatialDomains::Geometry2DSharedPtr GetGeom2D() const
Definition: Expansion2D.h:172
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Definition: StdExpansion.h:758
void GetTraceToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards, int P=-1, int Q=-1)
Definition: StdExpansion.h:690
void GetInteriorMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:680
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].
Definition: Blas.hpp:213
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:53
std::shared_ptr< SegExp > SegExpSharedPtr
Definition: SegExp.h:251
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.
Definition: Vmath.cpp:414

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::StdRegions::StdExpansion::DetShapeType(), Blas::Dgemv(), Nektar::StdRegions::eForwards, Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::StdRegions::eMass, Nektar::LocalRegions::Expansion2D::GetGeom2D(), Nektar::StdRegions::StdExpansion::GetInteriorMap(), Nektar::StdRegions::StdExpansion::GetPointsType(), Nektar::StdRegions::StdExpansion::GetTraceToElementMap(), Nektar::LibUtilities::Interp1D(), Nektar::StdRegions::StdExpansion::IProductWRTBase(), Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion::m_ncoeffs, m_staticCondMatrixManager, Nektar::StdRegions::StdExpansion::MassMatrixOp(), Nektar::StdRegions::StdExpansion::NumBndryCoeffs(), sign, and Vmath::Vsub().

◆ v_GenMatrix()

DNekMatSharedPtr Nektar::LocalRegions::TriExp::v_GenMatrix ( const StdRegions::StdMatrixKey mkey)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1057 of file TriExp.cpp.

1058{
1059 DNekMatSharedPtr returnval;
1060 switch (mkey.GetMatrixType())
1061 {
1069 returnval = Expansion2D::v_GenMatrix(mkey);
1070 break;
1071 default:
1072 returnval = StdTriExp::v_GenMatrix(mkey);
1073 break;
1074 }
1075
1076 return returnval;
1077}
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:75

References Nektar::StdRegions::eHybridDGHelmBndLam, Nektar::StdRegions::eHybridDGHelmholtz, Nektar::StdRegions::eHybridDGLamToQ0, Nektar::StdRegions::eHybridDGLamToQ1, Nektar::StdRegions::eHybridDGLamToQ2, Nektar::StdRegions::eHybridDGLamToU, Nektar::StdRegions::eInvLaplacianWithUnityMean, Nektar::StdRegions::StdMatrixKey::GetMatrixType(), and Nektar::LocalRegions::Expansion2D::v_GenMatrix().

◆ v_GetCoord()

void Nektar::LocalRegions::TriExp::v_GetCoord ( const Array< OneD, const NekDouble > &  Lcoords,
Array< OneD, NekDouble > &  coords 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 663 of file TriExp.cpp.

665{
666 int i;
667
668 ASSERTL1(Lcoords[0] >= -1.0 && Lcoords[1] <= 1.0 && Lcoords[1] >= -1.0 &&
669 Lcoords[1] <= 1.0,
670 "Local coordinates are not in region [-1,1]");
671
672 m_geom->FillGeom();
673
674 for (i = 0; i < m_geom->GetCoordim(); ++i)
675 {
676 coords[i] = m_geom->GetCoord(i, Lcoords);
677 }
678}

References ASSERTL1, and Nektar::LocalRegions::Expansion::m_geom.

◆ v_GetCoords()

void Nektar::LocalRegions::TriExp::v_GetCoords ( Array< OneD, NekDouble > &  coords_1,
Array< OneD, NekDouble > &  coords_2,
Array< OneD, NekDouble > &  coords_3 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 680 of file TriExp.cpp.

683{
684 Expansion::v_GetCoords(coords_0, coords_1, coords_2);
685}
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
Definition: Expansion.cpp:535

References Nektar::LocalRegions::Expansion::v_GetCoords().

◆ v_GetLinStdExp()

StdRegions::StdExpansionSharedPtr Nektar::LocalRegions::TriExp::v_GetLinStdExp ( void  ) const
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 652 of file TriExp.cpp.

653{
654 LibUtilities::BasisKey bkey0(m_base[0]->GetBasisType(), 2,
655 m_base[0]->GetPointsKey());
656 LibUtilities::BasisKey bkey1(m_base[1]->GetBasisType(), 2,
657 m_base[1]->GetPointsKey());
658
660 bkey1);
661}

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::StdRegions::StdExpansion::GetBasisType(), and Nektar::StdRegions::StdExpansion::m_base.

◆ v_GetLocMatrix()

DNekScalMatSharedPtr Nektar::LocalRegions::TriExp::v_GetLocMatrix ( const MatrixKey mkey)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1089 of file TriExp.cpp.

1090{
1091 return m_matrixManager[mkey];
1092}

References m_matrixManager.

◆ v_GetLocStaticCondMatrix()

DNekScalBlkMatSharedPtr Nektar::LocalRegions::TriExp::v_GetLocStaticCondMatrix ( const MatrixKey mkey)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1099 of file TriExp.cpp.

1100{
1101 return m_staticCondMatrixManager[mkey];
1102}

References m_staticCondMatrixManager.

◆ v_GetStdExp()

StdRegions::StdExpansionSharedPtr Nektar::LocalRegions::TriExp::v_GetStdExp ( void  ) const
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 645 of file TriExp.cpp.

646{
647
649 m_base[0]->GetBasisKey(), m_base[1]->GetBasisKey());
650}

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and Nektar::StdRegions::StdExpansion::m_base.

◆ v_GetTraceOrient()

StdRegions::Orientation Nektar::LocalRegions::TriExp::v_GetTraceOrient ( int  edge)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1052 of file TriExp.cpp.

1053{
1054 return GetGeom2D()->GetEorient(edge);
1055}

References Nektar::LocalRegions::Expansion2D::GetGeom2D().

◆ v_GetTracePhysMap()

void Nektar::LocalRegions::TriExp::v_GetTracePhysMap ( const int  edge,
Array< OneD, int > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 787 of file TriExp.cpp.

788{
789 int nquad0 = m_base[0]->GetNumPoints();
790 int nquad1 = m_base[1]->GetNumPoints();
791
792 // Get points in Cartesian orientation
793 switch (edge)
794 {
795 case 0:
796 outarray = Array<OneD, int>(nquad0);
797 for (int i = 0; i < nquad0; ++i)
798 {
799 outarray[i] = i;
800 }
801 break;
802 case 1:
803 outarray = Array<OneD, int>(nquad1);
804 for (int i = 0; i < nquad1; ++i)
805 {
806 outarray[i] = (nquad0 - 1) + i * nquad0;
807 }
808 break;
809 case 2:
810 outarray = Array<OneD, int>(nquad1);
811 for (int i = 0; i < nquad1; ++i)
812 {
813 outarray[i] = i * nquad0;
814 }
815 break;
816 default:
817 ASSERTL0(false, "edge value (< 3) is out of range");
818 break;
819 }
820}

References ASSERTL0, and Nektar::StdRegions::StdExpansion::m_base.

◆ v_GetTracePhysVals()

void Nektar::LocalRegions::TriExp::v_GetTracePhysVals ( const int  edge,
const StdRegions::StdExpansionSharedPtr EdgeExp,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
StdRegions::Orientation  orient 
)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 721 of file TriExp.cpp.

725{
726 int nquad0 = m_base[0]->GetNumPoints();
727 int nquad1 = m_base[1]->GetNumPoints();
728 int nt = 0;
729 // Extract in Cartesian direction because we have to deal with
730 // e.g. Gauss-Radau points.
731 switch (edge)
732 {
733 case 0:
734 Vmath::Vcopy(nquad0, &(inarray[0]), 1, &(outarray[0]), 1);
735 nt = nquad0;
736 break;
737 case 1:
738 Vmath::Vcopy(nquad1, &(inarray[0]) + (nquad0 - 1), nquad0,
739 &(outarray[0]), 1);
740 nt = nquad1;
741 break;
742 case 2:
743 Vmath::Vcopy(nquad1, &(inarray[0]), nquad0, &(outarray[0]), 1);
744 nt = nquad1;
745 break;
746 default:
747 ASSERTL0(false, "edge value (< 3) is out of range");
748 break;
749 }
750
751 ASSERTL1(EdgeExp->GetBasis(0)->GetPointsType() ==
753 "Edge expansion should be GLL");
754
755 // Interpolate if required
756 if (m_base[edge ? 1 : 0]->GetPointsKey() !=
757 EdgeExp->GetBasis(0)->GetPointsKey())
758 {
759 Array<OneD, NekDouble> outtmp(max(nquad0, nquad1));
760
761 Vmath::Vcopy(nt, outarray, 1, outtmp, 1);
762
763 LibUtilities::Interp1D(m_base[edge ? 1 : 0]->GetPointsKey(), outtmp,
764 EdgeExp->GetBasis(0)->GetPointsKey(), outarray);
765 }
766
767 if (orient == StdRegions::eNoOrientation)
768 {
769 orient = GetTraceOrient(edge);
770 }
771
772 // Reverse data if necessary
773 if (orient == StdRegions::eBackwards)
774 {
775 Vmath::Reverse(EdgeExp->GetNumPoints(0), &outarray[0], 1, &outarray[0],
776 1);
777 }
778}
StdRegions::Orientation GetTraceOrient(int trace)
Definition: Expansion.h:170

References ASSERTL0, ASSERTL1, Nektar::StdRegions::eBackwards, Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::StdRegions::eNoOrientation, Nektar::LocalRegions::Expansion::GetTraceOrient(), Nektar::LibUtilities::Interp1D(), Nektar::StdRegions::StdExpansion::m_base, Vmath::Reverse(), and Vmath::Vcopy().

◆ v_GetTraceQFactors()

void Nektar::LocalRegions::TriExp::v_GetTraceQFactors ( const int  edge,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 780 of file TriExp.cpp.

782{
783 boost::ignore_unused(edge, outarray);
784 ASSERTL0(false, "Routine not implemented for triangular elements");
785}

References ASSERTL0.

◆ v_HelmholtzMatrixOp()

void Nektar::LocalRegions::TriExp::v_HelmholtzMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1153 of file TriExp.cpp.

1156{
1157 TriExp::HelmholtzMatrixOp_MatFree(inarray, outarray, mkey);
1158}
void HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)

References Nektar::StdRegions::StdExpansion::HelmholtzMatrixOp_MatFree().

◆ v_Integral()

NekDouble Nektar::LocalRegions::TriExp::v_Integral ( const Array< OneD, const NekDouble > &  inarray)
overrideprotectedvirtual

Integrates the specified function over the domain.

See also
StdRegions::StdExpansion::Integral.

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 75 of file TriExp.cpp.

76{
77 int nquad0 = m_base[0]->GetNumPoints();
78 int nquad1 = m_base[1]->GetNumPoints();
79 Array<OneD, const NekDouble> jac = m_metricinfo->GetJac(GetPointsKeys());
80 NekDouble ival;
81 Array<OneD, NekDouble> tmp(nquad0 * nquad1);
82
83 // multiply inarray with Jacobian
84 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
85 {
86 Vmath::Vmul(nquad0 * nquad1, jac, 1, inarray, 1, tmp, 1);
87 }
88 else
89 {
90 Vmath::Smul(nquad0 * nquad1, jac[0], inarray, 1, tmp, 1);
91 }
92
93 // call StdQuadExp version;
94 ival = StdTriExp::v_Integral(tmp);
95 return ival;
96}

References Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_metricinfo, Vmath::Smul(), and Vmath::Vmul().

◆ v_IProductWRTBase()

void Nektar::LocalRegions::TriExp::v_IProductWRTBase ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Calculate the inner product of inarray with respect to the basis B=base0[p]*base1[pq] and put into outarray.

\( \begin{array}{rcl} I_{pq} = (\phi^A_q \phi^B_{pq}, u) &=& \sum_{i=0}^{nq_0}\sum_{j=0}^{nq_1} \phi^A_p(\eta_{0,i})\phi^B_{pq}(\eta_{1,j}) w^0_i w^1_j u(\xi_{0,i} \xi_{1,j}) \\ & = & \sum_{i=0}^{nq_0} \phi^A_p(\eta_{0,i}) \sum_{j=0}^{nq_1} \phi^B_{pq}(\eta_{1,j}) \tilde{u}_{i,j} \end{array} \)

where

\( \tilde{u}_{i,j} = w^0_i w^1_j u(\xi_{0,i},\xi_{1,j}) \)

which can be implemented as

\( f_{pj} = \sum_{i=0}^{nq_0} \phi^A_p(\eta_{0,i}) \tilde{u}_{i,j} \rightarrow {\bf B_1 U} \) \( I_{pq} = \sum_{j=0}^{nq_1} \phi^B_{pq}(\eta_{1,j}) f_{pj} \rightarrow {\bf B_2[p*skip] f[skip]} \)

Recall: \( \eta_{1} = \frac{2(1+\xi_1)}{(1-\xi_2)}-1, \, \eta_2 = \xi_2\)

Note: For the orthgonality of this expansion to be realised the 'q' ordering must run fastest in contrast to the Quad and Hex ordering where 'p' index runs fastest to be consistent with the quadrature ordering.

In the triangular space the i (i.e. \(\eta_1\) direction) ordering still runs fastest by convention.

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 396 of file TriExp.cpp.

398{
399 IProductWRTBase_SumFac(inarray, outarray);
400}
void IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)

References Nektar::StdRegions::StdExpansion::IProductWRTBase_SumFac().

◆ v_IProductWRTBase_SumFac()

void Nektar::LocalRegions::TriExp::v_IProductWRTBase_SumFac ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
bool  multiplybyweights = true 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 409 of file TriExp.cpp.

412{
413 int nquad0 = m_base[0]->GetNumPoints();
414 int nquad1 = m_base[1]->GetNumPoints();
415 int order0 = m_base[0]->GetNumModes();
416
417 if (multiplybyweights)
418 {
419 Array<OneD, NekDouble> tmp(nquad0 * nquad1 + nquad1 * order0);
420 Array<OneD, NekDouble> wsp(tmp + nquad0 * nquad1);
421
422 MultiplyByQuadratureMetric(inarray, tmp);
424 m_base[1]->GetBdata(), tmp, outarray, wsp);
425 }
426 else
427 {
428 Array<OneD, NekDouble> wsp(+nquad1 * order0);
429
431 m_base[1]->GetBdata(), inarray, outarray,
432 wsp);
433 }
434}
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)

References Nektar::StdRegions::StdExpansion2D::IProductWRTBase_SumFacKernel(), Nektar::StdRegions::StdExpansion::m_base, and Nektar::StdRegions::StdExpansion::MultiplyByQuadratureMetric().

◆ v_IProductWRTDerivBase()

void Nektar::LocalRegions::TriExp::v_IProductWRTDerivBase ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 402 of file TriExp.cpp.

405{
406 IProductWRTDerivBase_SumFac(dir, inarray, outarray);
407}
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)

References Nektar::StdRegions::StdExpansion::IProductWRTDerivBase_SumFac().

◆ v_IProductWRTDerivBase_SumFac()

void Nektar::LocalRegions::TriExp::v_IProductWRTDerivBase_SumFac ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 436 of file TriExp.cpp.

439{
440 int nquad0 = m_base[0]->GetNumPoints();
441 int nquad1 = m_base[1]->GetNumPoints();
442 int nqtot = nquad0 * nquad1;
443 int nmodes0 = m_base[0]->GetNumModes();
444 int wspsize = max(max(nqtot, m_ncoeffs), nquad1 * nmodes0);
445
446 Array<OneD, NekDouble> tmp0(4 * wspsize);
447 Array<OneD, NekDouble> tmp1(tmp0 + wspsize);
448 Array<OneD, NekDouble> tmp2(tmp0 + 2 * wspsize);
449 Array<OneD, NekDouble> tmp3(tmp0 + 3 * wspsize);
450
451 Array<OneD, Array<OneD, NekDouble>> tmp2D{2};
452 tmp2D[0] = tmp1;
453 tmp2D[1] = tmp2;
454
455 TriExp::v_AlignVectorToCollapsedDir(dir, inarray, tmp2D);
456
457 MultiplyByQuadratureMetric(tmp1, tmp1);
458 MultiplyByQuadratureMetric(tmp2, tmp2);
459
460 IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(), m_base[1]->GetBdata(),
461 tmp1, tmp3, tmp0);
462 IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(), m_base[1]->GetDbdata(),
463 tmp2, outarray, tmp0);
464 Vmath::Vadd(m_ncoeffs, tmp3, 1, outarray, 1, outarray, 1);
465}
virtual void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray) override
Definition: TriExp.cpp:467

References Nektar::StdRegions::StdExpansion2D::IProductWRTBase_SumFacKernel(), Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion::m_ncoeffs, Nektar::StdRegions::StdExpansion::MultiplyByQuadratureMetric(), v_AlignVectorToCollapsedDir(), and Vmath::Vadd().

◆ v_IProductWRTDirectionalDerivBase()

void Nektar::LocalRegions::TriExp::v_IProductWRTDirectionalDerivBase ( const Array< OneD, const NekDouble > &  direction,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 532 of file TriExp.cpp.

536{
537 IProductWRTDirectionalDerivBase_SumFac(direction, inarray, outarray);
538}
void IProductWRTDirectionalDerivBase_SumFac(const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)

References Nektar::StdRegions::StdExpansion::IProductWRTDirectionalDerivBase_SumFac().

◆ v_IProductWRTDirectionalDerivBase_SumFac()

void Nektar::LocalRegions::TriExp::v_IProductWRTDirectionalDerivBase_SumFac ( const Array< OneD, const NekDouble > &  direction,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Directinoal Derivative in the modal space in the dir direction of varcoeffs.

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 544 of file TriExp.cpp.

548{
549 int i;
550 int shapedim = 2;
551 int nquad0 = m_base[0]->GetNumPoints();
552 int nquad1 = m_base[1]->GetNumPoints();
553 int nqtot = nquad0 * nquad1;
554 int nmodes0 = m_base[0]->GetNumModes();
555 int wspsize = max(max(nqtot, m_ncoeffs), nquad1 * nmodes0);
556
557 const Array<TwoD, const NekDouble> &df =
558 m_metricinfo->GetDerivFactors(GetPointsKeys());
559
560 Array<OneD, NekDouble> tmp0(6 * wspsize);
561 Array<OneD, NekDouble> tmp1(tmp0 + wspsize);
562 Array<OneD, NekDouble> tmp2(tmp0 + 2 * wspsize);
563 Array<OneD, NekDouble> tmp3(tmp0 + 3 * wspsize);
564 Array<OneD, NekDouble> gfac0(tmp0 + 4 * wspsize);
565 Array<OneD, NekDouble> gfac1(tmp0 + 5 * wspsize);
566
567 const Array<OneD, const NekDouble> &z0 = m_base[0]->GetZ();
568 const Array<OneD, const NekDouble> &z1 = m_base[1]->GetZ();
569
570 // set up geometric factor: 2/(1-z1)
571 for (i = 0; i < nquad1; ++i)
572 {
573 gfac0[i] = 2.0 / (1 - z1[i]);
574 }
575 for (i = 0; i < nquad0; ++i)
576 {
577 gfac1[i] = 0.5 * (1 + z0[i]);
578 }
579 for (i = 0; i < nquad1; ++i)
580 {
581 Vmath::Smul(nquad0, gfac0[i], &inarray[0] + i * nquad0, 1,
582 &tmp0[0] + i * nquad0, 1);
583 }
584 for (i = 0; i < nquad1; ++i)
585 {
586 Vmath::Vmul(nquad0, &gfac1[0], 1, &tmp0[0] + i * nquad0, 1,
587 &tmp1[0] + i * nquad0, 1);
588 }
589
590 // Compute gmat \cdot e^j
591 Array<OneD, Array<OneD, NekDouble>> dfdir(shapedim);
592 Expansion::ComputeGmatcdotMF(df, direction, dfdir);
593
594 Vmath::Vmul(nqtot, &dfdir[0][0], 1, &tmp0[0], 1, &tmp0[0], 1);
595 Vmath::Vmul(nqtot, &dfdir[1][0], 1, &tmp1[0], 1, &tmp1[0], 1);
596 Vmath::Vmul(nqtot, &dfdir[1][0], 1, &inarray[0], 1, &tmp2[0], 1);
597
598 Vmath::Vadd(nqtot, &tmp0[0], 1, &tmp1[0], 1, &tmp1[0], 1);
599
600 MultiplyByQuadratureMetric(tmp1, tmp1);
601 MultiplyByQuadratureMetric(tmp2, tmp2);
602
603 IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(), m_base[1]->GetBdata(),
604 tmp1, tmp3, tmp0);
605 IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(), m_base[1]->GetDbdata(),
606 tmp2, outarray, tmp0);
607 Vmath::Vadd(m_ncoeffs, tmp3, 1, outarray, 1, outarray, 1);
608}
void ComputeGmatcdotMF(const Array< TwoD, const NekDouble > &df, const Array< OneD, const NekDouble > &direction, Array< OneD, Array< OneD, NekDouble > > &dfdir)
Definition: Expansion.cpp:608

References Nektar::LocalRegions::Expansion::ComputeGmatcdotMF(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion2D::IProductWRTBase_SumFacKernel(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_metricinfo, Nektar::StdRegions::StdExpansion::m_ncoeffs, Nektar::StdRegions::StdExpansion::MultiplyByQuadratureMetric(), Vmath::Smul(), Vmath::Vadd(), and Vmath::Vmul().

◆ v_LaplacianMatrixOp() [1/2]

void Nektar::LocalRegions::TriExp::v_LaplacianMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1116 of file TriExp.cpp.

1119{
1120 TriExp::LaplacianMatrixOp_MatFree(inarray, outarray, mkey);
1121}
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)

References Nektar::StdRegions::StdExpansion::LaplacianMatrixOp_MatFree().

◆ v_LaplacianMatrixOp() [2/2]

void Nektar::LocalRegions::TriExp::v_LaplacianMatrixOp ( const int  k1,
const int  k2,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1123 of file TriExp.cpp.

1127{
1128 StdExpansion::LaplacianMatrixOp_MatFree(k1, k2, inarray, outarray, mkey);
1129}

◆ v_LaplacianMatrixOp_MatFree_Kernel()

void Nektar::LocalRegions::TriExp::v_LaplacianMatrixOp_MatFree_Kernel ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
Array< OneD, NekDouble > &  wsp 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1160 of file TriExp.cpp.

1163{
1164 if (m_metrics.count(eMetricLaplacian00) == 0)
1165 {
1167 }
1168
1169 int nquad0 = m_base[0]->GetNumPoints();
1170 int nquad1 = m_base[1]->GetNumPoints();
1171 int nqtot = nquad0 * nquad1;
1172 int nmodes0 = m_base[0]->GetNumModes();
1173 int nmodes1 = m_base[1]->GetNumModes();
1174 int wspsize =
1175 max(max(max(nqtot, m_ncoeffs), nquad1 * nmodes0), nquad0 * nmodes1);
1176
1177 ASSERTL1(wsp.size() >= 3 * wspsize, "Workspace is of insufficient size.");
1178
1179 const Array<OneD, const NekDouble> &base0 = m_base[0]->GetBdata();
1180 const Array<OneD, const NekDouble> &base1 = m_base[1]->GetBdata();
1181 const Array<OneD, const NekDouble> &dbase0 = m_base[0]->GetDbdata();
1182 const Array<OneD, const NekDouble> &dbase1 = m_base[1]->GetDbdata();
1183 const Array<OneD, const NekDouble> &metric00 =
1185 const Array<OneD, const NekDouble> &metric01 =
1187 const Array<OneD, const NekDouble> &metric11 =
1189
1190 // Allocate temporary storage
1191 Array<OneD, NekDouble> wsp0(wsp);
1192 Array<OneD, NekDouble> wsp1(wsp + wspsize);
1193 Array<OneD, NekDouble> wsp2(wsp + 2 * wspsize);
1194
1195 StdExpansion2D::PhysTensorDeriv(inarray, wsp1, wsp2);
1196
1197 // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1198 // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1199 // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
1200 // especially for this purpose
1201 Vmath::Vvtvvtp(nqtot, &metric00[0], 1, &wsp1[0], 1, &metric01[0], 1,
1202 &wsp2[0], 1, &wsp0[0], 1);
1203 Vmath::Vvtvvtp(nqtot, &metric01[0], 1, &wsp1[0], 1, &metric11[0], 1,
1204 &wsp2[0], 1, &wsp2[0], 1);
1205
1206 // outarray = m = (D_xi1 * B)^T * k
1207 // wsp1 = n = (D_xi2 * B)^T * l
1208 IProductWRTBase_SumFacKernel(dbase0, base1, wsp0, outarray, wsp1);
1209 IProductWRTBase_SumFacKernel(base0, dbase1, wsp2, wsp1, wsp0);
1210
1211 // outarray = outarray + wsp1
1212 // = L * u_hat
1213 Vmath::Vadd(m_ncoeffs, wsp1.get(), 1, outarray.get(), 1, outarray.get(), 1);
1214}
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
Definition: Vmath.cpp:687

References ASSERTL1, Nektar::LocalRegions::Expansion::ComputeLaplacianMetric(), Nektar::LocalRegions::eMetricLaplacian00, Nektar::LocalRegions::eMetricLaplacian01, Nektar::LocalRegions::eMetricLaplacian11, Nektar::StdRegions::StdExpansion2D::IProductWRTBase_SumFacKernel(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_metrics, Nektar::StdRegions::StdExpansion::m_ncoeffs, Vmath::Vadd(), and Vmath::Vvtvvtp().

◆ v_MassLevelCurvatureMatrixOp()

void Nektar::LocalRegions::TriExp::v_MassLevelCurvatureMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1146 of file TriExp.cpp.

1149{
1150 StdExpansion::MassLevelCurvatureMatrixOp_MatFree(inarray, outarray, mkey);
1151}

◆ v_MassMatrixOp()

void Nektar::LocalRegions::TriExp::v_MassMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1109 of file TriExp.cpp.

1112{
1113 StdExpansion::MassMatrixOp_MatFree(inarray, outarray, mkey);
1114}

◆ v_NormalTraceDerivFactors()

void Nektar::LocalRegions::TriExp::v_NormalTraceDerivFactors ( Array< OneD, Array< OneD, NekDouble > > &  factors,
Array< OneD, Array< OneD, NekDouble > > &  d0factors,
Array< OneD, Array< OneD, NekDouble > > &  d1factors 
)
overrideprotectedvirtual

: This method gets all of the factors which are required as part of the Gradient Jump Penalty stabilisation and involves the product of the normal and geometric factors along the element trace.

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1460 of file TriExp.cpp.

1464{
1465 boost::ignore_unused(d2factors); // for 3D shapes
1466 int nquad0 = GetNumPoints(0);
1467 int nquad1 = GetNumPoints(1);
1468
1469 const Array<TwoD, const NekDouble> &df =
1470 m_metricinfo->GetDerivFactors(GetPointsKeys());
1471
1472 if (d0factors.size() != 3)
1473 {
1474 d0factors = Array<OneD, Array<OneD, NekDouble>>(3);
1475 d1factors = Array<OneD, Array<OneD, NekDouble>>(3);
1476 }
1477
1478 if (d0factors[0].size() != nquad0)
1479 {
1480 d0factors[0] = Array<OneD, NekDouble>(nquad0);
1481 d1factors[0] = Array<OneD, NekDouble>(nquad0);
1482 }
1483
1484 if (d0factors[1].size() != nquad1)
1485 {
1486 d0factors[1] = Array<OneD, NekDouble>(nquad1);
1487 d0factors[2] = Array<OneD, NekDouble>(nquad1);
1488 d1factors[1] = Array<OneD, NekDouble>(nquad1);
1489 d1factors[2] = Array<OneD, NekDouble>(nquad1);
1490 }
1491
1492 // Outwards normals
1493 const Array<OneD, const Array<OneD, NekDouble>> &normal_0 =
1494 GetTraceNormal(0);
1495 const Array<OneD, const Array<OneD, NekDouble>> &normal_1 =
1496 GetTraceNormal(1);
1497 const Array<OneD, const Array<OneD, NekDouble>> &normal_2 =
1498 GetTraceNormal(2);
1499
1500 int ncoords = normal_0.size();
1501
1502 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1503 {
1504
1505 // d xi_2/dx n_x
1506 for (int i = 0; i < nquad0; ++i)
1507 {
1508 d1factors[0][i] = df[1][i] * normal_0[0][i];
1509 }
1510
1511 // d xi_1/dx n_x
1512 for (int i = 0; i < nquad1; ++i)
1513 {
1514 d0factors[1][i] = df[0][(i + 1) * nquad0 - 1] * normal_1[0][i];
1515 d0factors[2][i] = df[0][i * nquad0] * normal_2[0][i];
1516 }
1517
1518 for (int n = 1; n < ncoords; ++n)
1519 {
1520 // d xi_2/dy n_y
1521 // needs checking for 3D coords
1522 for (int i = 0; i < nquad0; ++i)
1523 {
1524 d1factors[0][i] += df[2 * n + 1][i] * normal_0[n][i];
1525 }
1526
1527 // d xi_1/dy n_y
1528 // needs checking for 3D coords
1529 for (int i = 0; i < nquad1; ++i)
1530 {
1531 d0factors[1][i] +=
1532 df[2 * n][(i + 1) * nquad0 - 1] * normal_1[n][i];
1533 d0factors[2][i] += df[2 * n][i * nquad0] * normal_2[n][i];
1534 }
1535 }
1536
1537 // d0 factors
1538 // d xi_1/dx n_x
1539 for (int i = 0; i < nquad0; ++i)
1540 {
1541 d0factors[0][i] = df[0][i] * normal_0[0][i];
1542 }
1543
1544 // d xi_2/dx n_x
1545 for (int i = 0; i < nquad1; ++i)
1546 {
1547 d1factors[1][i] = df[1][(i + 1) * nquad0 - 1] * normal_1[0][i];
1548 d1factors[2][i] = df[1][i * nquad0] * normal_2[0][i];
1549 }
1550
1551 for (int n = 1; n < ncoords; ++n)
1552 {
1553 // d xi_1/dy n_y
1554 // needs checking for 3D coords
1555 for (int i = 0; i < nquad0; ++i)
1556 {
1557 d0factors[0][i] += df[2 * n][i] * normal_0[n][i];
1558 }
1559
1560 // d xi_2/dy n_y
1561 // needs checking for 3D coords
1562 for (int i = 0; i < nquad1; ++i)
1563 {
1564 d1factors[1][i] +=
1565 df[2 * n + 1][(i + 1) * nquad0 - 1] * normal_1[n][i];
1566 d1factors[2][i] += df[2 * n + 1][i * nquad0] * normal_2[n][i];
1567 }
1568 }
1569 }
1570 else
1571 {
1572 // d xi_2/dx n_x
1573 for (int i = 0; i < nquad0; ++i)
1574 {
1575 d1factors[0][i] = df[1][0] * normal_0[0][i];
1576 }
1577
1578 // d xi_1/dx n_x
1579 for (int i = 0; i < nquad1; ++i)
1580 {
1581 d0factors[1][i] = df[0][0] * normal_1[0][i];
1582 d0factors[2][i] = df[0][0] * normal_2[0][i];
1583 }
1584
1585 for (int n = 1; n < ncoords; ++n)
1586 {
1587 // d xi_2/dy n_y
1588 // needs checking for 3D coords
1589 for (int i = 0; i < nquad0; ++i)
1590 {
1591 d1factors[0][i] += df[2 * n + 1][0] * normal_0[n][i];
1592 }
1593
1594 // d xi_1/dy n_y
1595 // needs checking for 3D coords
1596 for (int i = 0; i < nquad1; ++i)
1597 {
1598 d0factors[1][i] += df[2 * n][0] * normal_1[n][i];
1599 d0factors[2][i] += df[2 * n][0] * normal_2[n][i];
1600 }
1601 }
1602
1603 // d1factors
1604 // d xi_1/dx n_x
1605 for (int i = 0; i < nquad0; ++i)
1606 {
1607 d0factors[0][i] = df[0][0] * normal_0[0][i];
1608 }
1609
1610 // d xi_2/dx n_x
1611 for (int i = 0; i < nquad1; ++i)
1612 {
1613 d1factors[1][i] = df[1][0] * normal_1[0][i];
1614 d1factors[2][i] = df[1][0] * normal_2[0][i];
1615 }
1616
1617 for (int n = 1; n < ncoords; ++n)
1618 {
1619 // d xi_1/dy n_y
1620 // needs checking for 3D coords
1621 for (int i = 0; i < nquad0; ++i)
1622 {
1623 d0factors[0][i] += df[2 * n][0] * normal_0[n][i];
1624 }
1625
1626 // d xi_2/dy n_y
1627 // needs checking for 3D coords
1628 for (int i = 0; i < nquad1; ++i)
1629 {
1630 d1factors[1][i] += df[2 * n + 1][0] * normal_1[n][i];
1631 d1factors[2][i] += df[2 * n + 1][0] * normal_2[n][i];
1632 }
1633 }
1634 }
1635}
const NormalVector & GetTraceNormal(const int id)
Definition: Expansion.cpp:255

References Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::StdExpansion::GetNumPoints(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::LocalRegions::Expansion::GetTraceNormal(), and Nektar::LocalRegions::Expansion::m_metricinfo.

◆ v_NormVectorIProductWRTBase() [1/2]

void Nektar::LocalRegions::TriExp::v_NormVectorIProductWRTBase ( const Array< OneD, const Array< OneD, NekDouble > > &  Fvec,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 638 of file TriExp.cpp.

641{
642 NormVectorIProductWRTBase(Fvec[0], Fvec[1], Fvec[2], outarray);
643}
void NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:619

References Nektar::StdRegions::StdExpansion::NormVectorIProductWRTBase().

◆ v_NormVectorIProductWRTBase() [2/2]

void Nektar::LocalRegions::TriExp::v_NormVectorIProductWRTBase ( const Array< OneD, const NekDouble > &  Fx,
const Array< OneD, const NekDouble > &  Fy,
const Array< OneD, const NekDouble > &  Fz,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 610 of file TriExp.cpp.

614{
615 int nq = m_base[0]->GetNumPoints() * m_base[1]->GetNumPoints();
616 Array<OneD, NekDouble> Fn(nq);
617
618 const Array<OneD, const Array<OneD, NekDouble>> &normals =
619 GetLeftAdjacentElementExp()->GetTraceNormal(
621
622 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
623 {
624 Vmath::Vvtvvtp(nq, &normals[0][0], 1, &Fx[0], 1, &normals[1][0], 1,
625 &Fy[0], 1, &Fn[0], 1);
626 Vmath::Vvtvp(nq, &normals[2][0], 1, &Fz[0], 1, &Fn[0], 1, &Fn[0], 1);
627 }
628 else
629 {
630 Vmath::Svtsvtp(nq, normals[0][0], &Fx[0], 1, normals[1][0], &Fy[0], 1,
631 &Fn[0], 1);
632 Vmath::Svtvp(nq, normals[2][0], &Fz[0], 1, &Fn[0], 1, &Fn[0], 1);
633 }
634
635 IProductWRTBase(Fn, outarray);
636}
ExpansionSharedPtr GetLeftAdjacentElementExp() const
Definition: Expansion.h:443
int GetLeftAdjacentElementTrace() const
Definition: Expansion.h:456
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
svtvvtp (scalar times vector plus scalar times vector):
Definition: Vmath.cpp:746

References Nektar::SpatialDomains::eDeformed, Nektar::LocalRegions::Expansion::GetLeftAdjacentElementExp(), Nektar::LocalRegions::Expansion::GetLeftAdjacentElementTrace(), Nektar::StdRegions::StdExpansion::IProductWRTBase(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_metricinfo, Vmath::Svtsvtp(), Vmath::Svtvp(), Vmath::Vvtvp(), and Vmath::Vvtvvtp().

◆ v_PhysDeriv() [1/2]

void Nektar::LocalRegions::TriExp::v_PhysDeriv ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out_d0,
Array< OneD, NekDouble > &  out_d1,
Array< OneD, NekDouble > &  out_d2 = NullNekDouble1DArray 
)
overrideprotectedvirtual

Calculate the derivative of the physical points.

\( \frac{\partial u}{\partial x_1} = \left . \frac{2.0}{1-\eta_2} \frac{\partial u}{\partial d\eta_1} \right |_{\eta_2}\)

\( \frac{\partial u}{\partial x_2} = \left . \frac{1+\eta_1}{1-\eta_2} \frac{\partial u}{\partial d\eta_1} \right |_{\eta_2} + \left . \frac{\partial u}{\partial d\eta_2} \right |_{\eta_1} \)

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 98 of file TriExp.cpp.

102{
103 int nquad0 = m_base[0]->GetNumPoints();
104 int nquad1 = m_base[1]->GetNumPoints();
105 int nqtot = nquad0 * nquad1;
106 const Array<TwoD, const NekDouble> &df =
107 m_metricinfo->GetDerivFactors(GetPointsKeys());
108
109 Array<OneD, NekDouble> diff0(2 * nqtot);
110 Array<OneD, NekDouble> diff1(diff0 + nqtot);
111
112 StdTriExp::v_PhysDeriv(inarray, diff0, diff1);
113
114 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
115 {
116 if (out_d0.size())
117 {
118 Vmath::Vmul(nqtot, df[0], 1, diff0, 1, out_d0, 1);
119 Vmath::Vvtvp(nqtot, df[1], 1, diff1, 1, out_d0, 1, out_d0, 1);
120 }
121
122 if (out_d1.size())
123 {
124 Vmath::Vmul(nqtot, df[2], 1, diff0, 1, out_d1, 1);
125 Vmath::Vvtvp(nqtot, df[3], 1, diff1, 1, out_d1, 1, out_d1, 1);
126 }
127
128 if (out_d2.size())
129 {
130 Vmath::Vmul(nqtot, df[4], 1, diff0, 1, out_d2, 1);
131 Vmath::Vvtvp(nqtot, df[5], 1, diff1, 1, out_d2, 1, out_d2, 1);
132 }
133 }
134 else // regular geometry
135 {
136 if (out_d0.size())
137 {
138 Vmath::Smul(nqtot, df[0][0], diff0, 1, out_d0, 1);
139 Blas::Daxpy(nqtot, df[1][0], diff1, 1, out_d0, 1);
140 }
141
142 if (out_d1.size())
143 {
144 Vmath::Smul(nqtot, df[2][0], diff0, 1, out_d1, 1);
145 Blas::Daxpy(nqtot, df[3][0], diff1, 1, out_d1, 1);
146 }
147
148 if (out_d2.size())
149 {
150 Vmath::Smul(nqtot, df[4][0], diff0, 1, out_d2, 1);
151 Blas::Daxpy(nqtot, df[5][0], diff1, 1, out_d2, 1);
152 }
153 }
154}
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.
Definition: Blas.hpp:137

References Blas::Daxpy(), Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_metricinfo, Vmath::Smul(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ v_PhysDeriv() [2/2]

void Nektar::LocalRegions::TriExp::v_PhysDeriv ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out_d0 
)
overrideprotectedvirtual

Calculate the derivative of the physical points in a given direction.

See also
StdRegions::StdExpansion::PhysDeriv

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 156 of file TriExp.cpp.

159{
160 switch (dir)
161 {
162 case 0:
163 {
164 PhysDeriv(inarray, outarray, NullNekDouble1DArray,
166 }
167 break;
168 case 1:
169 {
170 PhysDeriv(inarray, NullNekDouble1DArray, outarray,
172 }
173 break;
174 case 2:
175 {
177 outarray);
178 }
179 break;
180 default:
181 {
182 ASSERTL1(false, "input dir is out of range");
183 }
184 break;
185 }
186}
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)
Definition: StdExpansion.h:855
static Array< OneD, NekDouble > NullNekDouble1DArray

References ASSERTL1, Nektar::NullNekDouble1DArray, and Nektar::StdRegions::StdExpansion::PhysDeriv().

◆ v_PhysDirectionalDeriv()

void Nektar::LocalRegions::TriExp::v_PhysDirectionalDeriv ( const Array< OneD, const NekDouble > &  inarray,
const Array< OneD, const NekDouble > &  direction,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Physical derivative along a direction vector.

See also
StdRegions::StdExpansion::PhysDirectionalDeriv

D_v = D^v_xi * du/d_xi + D^v_eta * du/d_eta

D_v = D^v_xi * du/d_xi + D^v_eta * du/d_eta

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 188 of file TriExp.cpp.

191{
192 if (!out.size())
193 {
194 return;
195 }
196
197 int nquad0 = m_base[0]->GetNumPoints();
198 int nquad1 = m_base[1]->GetNumPoints();
199 int nqtot = nquad0 * nquad1;
200
201 const Array<TwoD, const NekDouble> &df =
202 m_metricinfo->GetDerivFactors(GetPointsKeys());
203
204 Array<OneD, NekDouble> diff0(2 * nqtot);
205 Array<OneD, NekDouble> diff1(diff0 + nqtot);
206
207 // diff0 = du/d_xi, diff1 = du/d_eta
208 StdTriExp::v_PhysDeriv(inarray, diff0, diff1);
209
210 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
211 {
212 Array<OneD, Array<OneD, NekDouble>> tangmat(2);
213
214 // D^v_xi = v_x*d_xi/dx + v_y*d_xi/dy + v_z*d_xi/dz
215 // D^v_eta = v_x*d_eta/dx + v_y*d_eta/dy + v_z*d_eta/dz
216 for (int i = 0; i < 2; ++i)
217 {
218 tangmat[i] = Array<OneD, NekDouble>(nqtot, 0.0);
219 for (int k = 0; k < (m_geom->GetCoordim()); ++k)
220 {
221 Vmath::Vvtvp(nqtot, &df[2 * k + i][0], 1, &direction[k * nqtot],
222 1, &tangmat[i][0], 1, &tangmat[i][0], 1);
223 }
224 }
225
226 /// D_v = D^v_xi * du/d_xi + D^v_eta * du/d_eta
227 Vmath::Vmul(nqtot, &tangmat[0][0], 1, &diff0[0], 1, &out[0], 1);
228 Vmath::Vvtvp(nqtot, &tangmat[1][0], 1, &diff1[0], 1, &out[0], 1,
229 &out[0], 1);
230 }
231 else
232 {
233 Array<OneD, Array<OneD, NekDouble>> tangmat(2);
234
235 for (int i = 0; i < 2; ++i)
236 {
237 tangmat[i] = Array<OneD, NekDouble>(nqtot, 0.0);
238 for (int k = 0; k < (m_geom->GetCoordim()); ++k)
239 {
240 Vmath::Svtvp(nqtot, df[2 * k + i][0], &direction[k * nqtot], 1,
241 &tangmat[i][0], 1, &tangmat[i][0], 1);
242 }
243 }
244
245 /// D_v = D^v_xi * du/d_xi + D^v_eta * du/d_eta
246 Vmath::Vmul(nqtot, &tangmat[0][0], 1, &diff0[0], 1, &out[0], 1);
247
248 Vmath::Vvtvp(nqtot, &tangmat[1][0], 1, &diff1[0], 1, &out[0], 1,
249 &out[0], 1);
250 }
251}

References Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion::m_geom, Nektar::LocalRegions::Expansion::m_metricinfo, Vmath::Svtvp(), Vmath::Vmul(), and Vmath::Vvtvp().

◆ v_PhysEvaluate() [1/2]

NekDouble Nektar::LocalRegions::TriExp::v_PhysEvaluate ( const Array< OneD, const NekDouble > &  coords,
const Array< OneD, const NekDouble > &  physvals 
)
overrideprotectedvirtual

This function evaluates the expansion at a single (arbitrary) point of the domain.

This function is a wrapper around the virtual function v_PhysEvaluate()

Based on the value of the expansion at the quadrature points, this function calculates the value of the expansion at an arbitrary single points (with coordinates \( \mathbf{x_c}\) given by the pointer coords). This operation, equivalent to

\[ u(\mathbf{x_c}) = \sum_p \phi_p(\mathbf{x_c}) \hat{u}_p \]

is evaluated using Lagrangian interpolants through the quadrature points:

\[ u(\mathbf{x_c}) = \sum_p h_p(\mathbf{x_c}) u_p\]

This function requires that the physical value array \(\mathbf{u}\) (implemented as the attribute #m_phys) is set.

Parameters
coordsthe coordinates of the single point
Returns
returns the value of the expansion at the single point

Reimplemented from Nektar::StdRegions::StdExpansion2D.

Definition at line 700 of file TriExp.cpp.

702{
703 Array<OneD, NekDouble> Lcoord = Array<OneD, NekDouble>(2);
704
705 ASSERTL0(m_geom, "m_geom not defined");
706 m_geom->GetLocCoords(coord, Lcoord);
707
708 return StdExpansion2D::v_PhysEvaluate(Lcoord, physvals);
709}

References ASSERTL0, and Nektar::LocalRegions::Expansion::m_geom.

◆ v_PhysEvaluate() [2/2]

NekDouble Nektar::LocalRegions::TriExp::v_PhysEvaluate ( const Array< OneD, NekDouble > &  coord,
const Array< OneD, const NekDouble > &  inarray,
std::array< NekDouble, 3 > &  firstOrderDerivs 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 711 of file TriExp.cpp.

714{
715 Array<OneD, NekDouble> Lcoord(2);
716 ASSERTL0(m_geom, "m_geom not defined");
717 m_geom->GetLocCoords(coord, Lcoord);
718 return StdTriExp::v_PhysEvaluate(Lcoord, inarray, firstOrderDerivs);
719}

References ASSERTL0, and Nektar::LocalRegions::Expansion::m_geom.

◆ v_ReduceOrderCoeffs()

void Nektar::LocalRegions::TriExp::v_ReduceOrderCoeffs ( int  numMin,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
overrideprotectedvirtual

Function is used to compute exactly the advective numerical flux on theinterface of two elements with different expansions, hence an appropriate number of Gauss points has to be used. The number of Gauss points has to be equal to the number used by the highest polynomial degree of the two adjacent elements. Furthermore, this function is used to compute the sensor value in each element.

Parameters
numMinIs the reduced polynomial order
inarrayInput array of coefficients
dumpVarOutput array of reduced coefficients.

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1372 of file TriExp.cpp.

1375{
1376 int n_coeffs = inarray.size();
1377 int nquad0 = m_base[0]->GetNumPoints();
1378 int nquad1 = m_base[1]->GetNumPoints();
1379 int nqtot = nquad0 * nquad1;
1380 int nmodes0 = m_base[0]->GetNumModes();
1381 int nmodes1 = m_base[1]->GetNumModes();
1382 int numMin2 = nmodes0, i;
1383
1384 Array<OneD, NekDouble> coeff(n_coeffs, 0.0);
1385 Array<OneD, NekDouble> phys_tmp(nqtot, 0.0);
1386 Array<OneD, NekDouble> tmp, tmp2;
1387
1388 const LibUtilities::PointsKey Pkey0 = m_base[0]->GetPointsKey();
1389 const LibUtilities::PointsKey Pkey1 = m_base[1]->GetPointsKey();
1390
1391 LibUtilities::BasisKey b0(m_base[0]->GetBasisType(), nmodes0, Pkey0);
1392 LibUtilities::BasisKey b1(m_base[1]->GetBasisType(), nmodes1, Pkey1);
1393 LibUtilities::BasisKey bortho0(LibUtilities::eOrtho_A, nmodes0, Pkey0);
1394 LibUtilities::BasisKey bortho1(LibUtilities::eOrtho_B, nmodes1, Pkey1);
1395
1396 // Check if it is also possible to use the same InterCoeff routine
1397 // which is also used for Quadrilateral and Hexagonal shaped
1398 // elements
1399
1400 // For now, set up the used basis on the standard element to
1401 // calculate the phys values, set up the orthogonal basis to do a
1402 // forward transform, to obtain the coefficients in orthogonal
1403 // coefficient space
1404 StdRegions::StdTriExpSharedPtr m_OrthoTriExp;
1406
1409 bortho0, bortho1);
1410
1411 m_TriExp->BwdTrans(inarray, phys_tmp);
1412 m_OrthoTriExp->FwdTrans(phys_tmp, coeff);
1413
1414 for (i = 0; i < n_coeffs; i++)
1415 {
1416 if (i == numMin)
1417 {
1418 coeff[i] = 0.0;
1419 numMin += numMin2 - 1;
1420 numMin2 -= 1.0;
1421 }
1422 }
1423
1424 m_OrthoTriExp->BwdTrans(coeff, phys_tmp);
1425 m_TriExp->FwdTrans(phys_tmp, outarray);
1426}

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::LibUtilities::eOrtho_A, Nektar::LibUtilities::eOrtho_B, Nektar::StdRegions::StdExpansion::GetBasisType(), and Nektar::StdRegions::StdExpansion::m_base.

◆ v_StdPhysEvaluate()

NekDouble Nektar::LocalRegions::TriExp::v_StdPhysEvaluate ( const Array< OneD, const NekDouble > &  Lcoord,
const Array< OneD, const NekDouble > &  physvals 
)
overrideprotectedvirtual

Given the local cartesian coordinate Lcoord evaluate the value of physvals at this point by calling through to the StdExpansion method

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 692 of file TriExp.cpp.

695{
696 // Evaluate point in local (eta) coordinates.
697 return StdExpansion2D::v_PhysEvaluate(Lcoord, physvals);
698}

◆ v_SVVLaplacianFilter()

void Nektar::LocalRegions::TriExp::v_SVVLaplacianFilter ( Array< OneD, NekDouble > &  array,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1428 of file TriExp.cpp.

1430{
1431 int nq = GetTotPoints();
1432
1433 // Calculate sqrt of the Jacobian
1434 Array<OneD, const NekDouble> jac = m_metricinfo->GetJac(GetPointsKeys());
1435 Array<OneD, NekDouble> sqrt_jac(nq);
1436 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1437 {
1438 Vmath::Vsqrt(nq, jac, 1, sqrt_jac, 1);
1439 }
1440 else
1441 {
1442 Vmath::Fill(nq, sqrt(jac[0]), sqrt_jac, 1);
1443 }
1444
1445 // Multiply array by sqrt(Jac)
1446 Vmath::Vmul(nq, sqrt_jac, 1, array, 1, array, 1);
1447
1448 // Apply std region filter
1449 StdTriExp::v_SVVLaplacianFilter(array, mkey);
1450
1451 // Divide by sqrt(Jac)
1452 Vmath::Vdiv(nq, array, 1, sqrt_jac, 1, array, 1);
1453}
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
Definition: Vmath.cpp:280

References Nektar::SpatialDomains::eDeformed, Vmath::Fill(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::GetTotPoints(), Nektar::LocalRegions::Expansion::m_metricinfo, tinysimd::sqrt(), Vmath::Vdiv(), Vmath::Vmul(), and Vmath::Vsqrt().

◆ v_WeakDerivMatrixOp()

void Nektar::LocalRegions::TriExp::v_WeakDerivMatrixOp ( const int  i,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1131 of file TriExp.cpp.

1135{
1136 StdExpansion::WeakDerivMatrixOp_MatFree(i, inarray, outarray, mkey);
1137}

◆ v_WeakDirectionalDerivMatrixOp()

void Nektar::LocalRegions::TriExp::v_WeakDirectionalDerivMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
overrideprotectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1139 of file TriExp.cpp.

1142{
1143 StdExpansion::WeakDirectionalDerivMatrixOp_MatFree(inarray, outarray, mkey);
1144}

Member Data Documentation

◆ m_matrixManager

LibUtilities::NekManager<MatrixKey, DNekScalMat, MatrixKey::opLess> Nektar::LocalRegions::TriExp::m_matrixManager
private

Definition at line 248 of file TriExp.h.

Referenced by v_DropLocMatrix(), v_FwdTrans(), and v_GetLocMatrix().

◆ m_staticCondMatrixManager

LibUtilities::NekManager<MatrixKey, DNekScalBlkMat, MatrixKey::opLess> Nektar::LocalRegions::TriExp::m_staticCondMatrixManager
private