Nektar++
Public Member Functions | Protected Member Functions | List of all members
Nektar::StdRegions::StdTriExp Class Reference

#include <StdTriExp.h>

Inheritance diagram for Nektar::StdRegions::StdTriExp:
[legend]

Public Member Functions

 StdTriExp ()
 
 StdTriExp (const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb)
 
 StdTriExp (const StdTriExp &T)
 
 ~StdTriExp ()
 
- 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 ()
 
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)
 
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 GetNedges () const
 This function returns the number of edges of the expansion domain. More...
 
int GetEdgeNcoeffs (const int i) const
 This function returns the number of expansion coefficients belonging to the i-th edge. More...
 
int GetTotalEdgeIntNcoeffs () const
 
int GetEdgeNumPoints (const int i) const
 This function returns the number of quadrature points belonging to the i-th edge. More...
 
int DetCartesianDirOfEdge (const int edge)
 
const LibUtilities::BasisKey DetEdgeBasisKey (const int i) const
 
const LibUtilities::BasisKey DetFaceBasisKey (const int i, const int k) const
 
int GetFaceNumPoints (const int i) const
 This function returns the number of quadrature points belonging to the i-th face. More...
 
int GetFaceNcoeffs (const int i) const
 This function returns the number of expansion coefficients belonging to the i-th face. More...
 
int GetFaceIntNcoeffs (const int i) const
 
int GetTotalFaceIntNcoeffs () const
 
int GetTraceNcoeffs (const int i) const
 This function returns the number of expansion coefficients belonging to the i-th edge/face. More...
 
LibUtilities::PointsKey GetFacePointsKey (const int i, const int j) const
 
int NumBndryCoeffs (void) const
 
int NumDGBndryCoeffs (void) const
 
LibUtilities::BasisType GetEdgeBasisType (const int i) const
 This function returns the type of expansion basis on the i-th edge. More...
 
const LibUtilities::PointsKey GetNodalPointsKey () const
 This function returns the type of expansion Nodal point type if defined. More...
 
int GetNfaces () const
 This function returns the number of faces of the expansion domain. More...
 
int GetNtrace () 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 (void) const
 
std::shared_ptr< StdExpansionGetLinStdExp (void) const
 
int GetShapeDimension () const
 
bool IsBoundaryInteriorExpansion ()
 
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 FwdTrans_BndConstrained (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)
 
IndexMapValuesSharedPtr GetIndexMap (const IndexMapKey &ikey)
 
const Array< OneD, const NekDouble > & GetPhysNormals (void)
 
void SetPhysNormals (Array< OneD, const NekDouble > &normal)
 
virtual void SetUpPhysNormals (const int edge)
 
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)
 
StdRegions::Orientation GetForient (int face)
 
StdRegions::Orientation GetEorient (int edge)
 
void SetCoeffsToOrientation (Array< OneD, NekDouble > &coeffs, StdRegions::Orientation dir)
 
void SetCoeffsToOrientation (StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
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 GetEdgeInteriorMap (const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
 
void GetFaceNumModes (const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
 
void GetFaceInteriorMap (const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
 
void GetEdgeToElementMap (const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P=-1)
 
void GetFaceToElementMap (const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int nummodesA=-1, int nummodesB=-1)
 
void GetEdgePhysVals (const int edge, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Extract the physical values along edge edge from inarray into outarray following the local edge orientation and point distribution defined by defined in EdgeExp. More...
 
void GetEdgePhysVals (const int edge, const std::shared_ptr< StdExpansion > &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GetTracePhysVals (const int edge, const std::shared_ptr< StdExpansion > &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GetVertexPhysVals (const int vertex, const Array< OneD, const NekDouble > &inarray, NekDouble &outarray)
 
void GetEdgeInterpVals (const int edge, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GetEdgeQFactors (const int edge, 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 GetFacePhysVals (const int face, const std::shared_ptr< StdExpansion > &FaceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient=eNoOrientation)
 
void GetEdgePhysMap (const int edge, Array< OneD, int > &outarray)
 
void GetFacePhysMap (const int face, Array< OneD, int > &outarray)
 
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 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)
 
void AddRobinMassMatrix (const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat)
 
void AddRobinEdgeContribution (const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, Array< OneD, NekDouble > &coeffs)
 
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, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals)
 This function evaluates the expansion at a single (arbitrary) point 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...
 
virtual int v_GetElmtId ()
 Get the element id of this expansion when used in a list by returning value of m_elmt_id. More...
 
virtual const Array< OneD, const NekDouble > & v_GetPhysNormals (void)
 
virtual void v_SetPhysNormals (Array< OneD, const NekDouble > &normal)
 
virtual void v_SetUpPhysNormals (const int edge)
 
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)
 
virtual StdRegions::Orientation v_GetForient (int face)
 
virtual StdRegions::Orientation v_GetEorient (int edge)
 
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 NormalVectorGetEdgeNormal (const int edge) const
 
void ComputeEdgeNormal (const int edge)
 
void NegateEdgeNormal (const int edge)
 
bool EdgeNormalNegated (const int edge)
 
void ComputeFaceNormal (const int face)
 
void NegateFaceNormal (const int face)
 
bool FaceNormalNegated (const int face)
 
void ComputeVertexNormal (const int vertex)
 
void NegateVertexNormal (const int vertex)
 
bool VertexNormalNegated (const int vertex)
 
const NormalVectorGetFaceNormal (const int face) const
 
const NormalVectorGetVertexNormal (const int vertex) const
 
const NormalVectorGetSurfaceNormal (const int id) const
 
const LibUtilities::PointsKeyVector GetPointsKeys () const
 
Array< OneD, unsigned int > GetEdgeInverseBoundaryMap (int eid)
 
Array< OneD, unsigned int > GetFaceInverseBoundaryMap (int fid, StdRegions::Orientation faceOrient=eNoOrientation, int P1=-1, int P2=-1)
 
void GetInverseBoundaryMaps (Array< OneD, unsigned int > &vmap, Array< OneD, Array< OneD, unsigned int > > &emap, Array< OneD, Array< OneD, unsigned int > > &fmap)
 
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)
 

Protected Member Functions

virtual NekDouble v_Integral (const Array< OneD, const NekDouble > &inarray)
 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)
 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)
 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)
 
virtual void v_StdPhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_BwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Backward tranform for triangular elements. More...
 
virtual void v_BwdTrans_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
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)
 
virtual void v_FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Transform a given function from physical quadrature space to coefficient space. More...
 
virtual void v_FwdTrans_BndConstrained (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_IProductWRTBase (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 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_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
 
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)
 
virtual void v_IProductWRTDerivBase (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_IProductWRTDerivBase_MatOp (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_IProductWRTDerivBase_SumFac (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_LocCoordToLocCollapsed (const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
 
virtual void v_FillMode (const int mode, Array< OneD, NekDouble > &outarray)
 
virtual int v_GetNverts () const
 
virtual int v_GetNedges () const
 
virtual LibUtilities::ShapeType v_DetShapeType () const
 
virtual int v_NumBndryCoeffs () const
 
virtual int v_NumDGBndryCoeffs () const
 
virtual int v_GetEdgeNcoeffs (const int i) const
 
virtual int v_GetEdgeNumPoints (const int i) const
 
virtual int v_CalcNumberOfCoefficients (const std::vector< unsigned int > &nummodes, int &modes_offset)
 
virtual LibUtilities::BasisType v_GetEdgeBasisType (const int i) const
 
virtual void v_GetCoords (Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z)
 
virtual bool v_IsBoundaryInteriorExpansion ()
 
virtual int v_DetCartesianDirOfEdge (const int edge)
 
virtual const LibUtilities::BasisKey v_DetEdgeBasisKey (const int edge) const
 
virtual void v_GetEdgeToElementMap (const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P=-1)
 
virtual int v_GetVertexMap (int localVertexId, bool useCoeffPacking=false)
 
virtual void v_GetEdgeInteriorMap (const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
 
virtual void v_GetInteriorMap (Array< OneD, unsigned int > &outarray)
 
virtual void v_GetBoundaryMap (Array< OneD, unsigned int > &outarray)
 
virtual DNekMatSharedPtr v_GenMatrix (const StdMatrixKey &mkey)
 
virtual DNekMatSharedPtr v_CreateStdMatrix (const StdMatrixKey &mkey)
 
virtual void v_MassMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_LaplacianMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
 
virtual void v_ReduceOrderCoeffs (int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_LaplacianMatrixOp (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_WeakDerivMatrixOp (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_HelmholtzMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_GeneralMatrixOp_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_MultiplyByStdQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_GetSimplexEquiSpacedConnectivity (Array< OneD, int > &conn, bool standard=true)
 
- Protected Member Functions inherited from Nektar::StdRegions::StdExpansion2D
virtual NekDouble v_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...
 
virtual NekDouble v_PhysEvaluate (const Array< OneD, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals)
 
virtual void v_LaplacianMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_HelmholtzMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual int v_GetTraceNcoeffs (const int i) const
 
- 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...
 
IndexMapValuesSharedPtr CreateIndexMap (const IndexMapKey &ikey)
 Create an IndexMap which contains mapping information linking any specific element shape with either its boundaries, edges, faces, verteces, etc. More...
 
void BwdTrans_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
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 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)
 

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
 
LibUtilities::NekManager< IndexMapKey, IndexMapValues, IndexMapKey::opLessm_IndexMapManager
 

Detailed Description

Definition at line 49 of file StdTriExp.h.

Constructor & Destructor Documentation

◆ StdTriExp() [1/3]

Nektar::StdRegions::StdTriExp::StdTriExp ( )

Definition at line 49 of file StdTriExp.cpp.

50  {
51  }

◆ StdTriExp() [2/3]

Nektar::StdRegions::StdTriExp::StdTriExp ( const LibUtilities::BasisKey Ba,
const LibUtilities::BasisKey Bb 
)

Definition at line 54 of file StdTriExp.cpp.

References ASSERTL0, and Nektar::LibUtilities::BasisKey::GetNumModes().

56  :
58  Ba.GetNumModes(),
59  Bb.GetNumModes()),
60  2,Ba,Bb),
62  Ba.GetNumModes(),
63  Bb.GetNumModes()),
64  Ba,Bb)
65  {
66  ASSERTL0(Ba.GetNumModes() <= Bb.GetNumModes(),
67  "order in 'a' direction is higher than order "
68  "in 'b' direction");
69  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
int getNumberOfCoefficients(int Na, int Nb)
Definition: ShapeType.hpp:113
StdExpansion()
Default Constructor.

◆ StdTriExp() [3/3]

Nektar::StdRegions::StdTriExp::StdTriExp ( const StdTriExp T)

Definition at line 71 of file StdTriExp.cpp.

71  :
72  StdExpansion(T),
74  {
75  }
StdExpansion()
Default Constructor.

◆ ~StdTriExp()

Nektar::StdRegions::StdTriExp::~StdTriExp ( )

Definition at line 77 of file StdTriExp.cpp.

78  {
79  }

Member Function Documentation

◆ v_BwdTrans()

void Nektar::StdRegions::StdTriExp::v_BwdTrans ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Backward tranform for triangular elements.

Note
'q' (base[1]) runs fastest in this element.

Implements Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 251 of file StdTriExp.cpp.

References v_BwdTrans_SumFac().

254  {
255  v_BwdTrans_SumFac(inarray,outarray);
256  }
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdTriExp.cpp:259

◆ v_BwdTrans_SumFac()

void Nektar::StdRegions::StdTriExp::v_BwdTrans_SumFac ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 259 of file StdTriExp.cpp.

References Nektar::StdRegions::StdExpansion2D::BwdTrans_SumFacKernel(), Nektar::StdRegions::StdExpansion::GetNumPoints(), and Nektar::StdRegions::StdExpansion::m_base.

Referenced by v_BwdTrans(), and Nektar::StdRegions::StdNodalTriExp::v_BwdTrans_SumFac().

262  {
263  Array<OneD, NekDouble> wsp(m_base[0]->GetNumPoints()*
264  m_base[1]->GetNumModes());
265 
266  BwdTrans_SumFacKernel(m_base[0]->GetBdata(),
267  m_base[1]->GetBdata(),
268  inarray,outarray,wsp);
269  }
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)
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:228
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_BwdTrans_SumFacKernel()

void Nektar::StdRegions::StdTriExp::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 
)
protectedvirtual

Implements Nektar::StdRegions::StdExpansion2D.

Definition at line 271 of file StdTriExp.cpp.

References ASSERTL1, ASSERTL2, Blas::Daxpy(), Blas::Dgemm(), Blas::Dgemv(), Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::LibUtilities::eOrtho_B, Nektar::StdRegions::StdExpansion::GetBasisType(), and Nektar::StdRegions::StdExpansion::m_base.

279  {
280  boost::ignore_unused(doCheckCollDir0, doCheckCollDir1);
281 
282  int i;
283  int mode;
284  int nquad0 = m_base[0]->GetNumPoints();
285  int nquad1 = m_base[1]->GetNumPoints();
286  int nmodes0 = m_base[0]->GetNumModes();
287  int nmodes1 = m_base[1]->GetNumModes();
288 
289  ASSERTL1(wsp.num_elements() >= nquad0*nmodes1,
290  "Workspace size is not sufficient");
293  "Basis[1] is not of general tensor type");
294 
295  for (i = mode = 0; i < nmodes0; ++i)
296  {
297  Blas::Dgemv('N', nquad1,nmodes1-i,1.0,base1.get()+mode*nquad1,
298  nquad1,&inarray[0]+mode,1,0.0,&wsp[0]+i*nquad1,1);
299  mode += nmodes1-i;
300  }
301 
302  // fix for modified basis by splitting top vertex mode
304  {
305  Blas::Daxpy(nquad1,inarray[1],base1.get()+nquad1,1,
306  &wsp[0]+nquad1,1);
307  }
308 
309  Blas::Dgemm('N','T', nquad0,nquad1,nmodes0,1.0, base0.get(),nquad0,
310  &wsp[0], nquad1,0.0, &outarray[0], nquad0);
311  }
Principle Modified Functions .
Definition: BasisType.h:48
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where A[m x n], B[n x k], C[m x k].
Definition: Blas.hpp:213
Principle Orthogonal Functions .
Definition: BasisType.h:46
Principle Modified Functions .
Definition: BasisType.h:49
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 = A x where A[m x n].
Definition: Blas.hpp:168
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base
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:110

◆ v_CalcNumberOfCoefficients()

int Nektar::StdRegions::StdTriExp::v_CalcNumberOfCoefficients ( const std::vector< unsigned int > &  nummodes,
int &  modes_offset 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 807 of file StdTriExp.cpp.

References Nektar::LibUtilities::StdTriData::getNumberOfCoefficients().

810  {
812  nummodes[modes_offset],
813  nummodes[modes_offset+1]);
814  modes_offset += 2;
815 
816  return nmodes;
817  }
int getNumberOfCoefficients(int Na, int Nb)
Definition: ShapeType.hpp:113

◆ v_CreateStdMatrix()

DNekMatSharedPtr Nektar::StdRegions::StdTriExp::v_CreateStdMatrix ( const StdMatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 1345 of file StdTriExp.cpp.

References v_GenMatrix().

1346  {
1347  return v_GenMatrix(mkey);
1348  }
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
Definition: StdTriExp.cpp:1268

◆ v_DetCartesianDirOfEdge()

int Nektar::StdRegions::StdTriExp::v_DetCartesianDirOfEdge ( const int  edge)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 862 of file StdTriExp.cpp.

References ASSERTL2.

863  {
864  ASSERTL2(edge >= 0 && edge <= 2, "edge id is out of range");
865 
866  return edge == 0 ? 0 : 1;
867  }
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274

◆ v_DetEdgeBasisKey()

const LibUtilities::BasisKey Nektar::StdRegions::StdTriExp::v_DetEdgeBasisKey ( const int  edge) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 869 of file StdTriExp.cpp.

References ASSERTL2, Nektar::ErrorUtil::efatal, Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::LibUtilities::eGaussRadauMAlpha1Beta0, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetBasis(), Nektar::StdRegions::StdExpansion::GetBasisType(), Nektar::StdRegions::StdExpansion::GetNumPoints(), Nektar::StdRegions::StdExpansion::GetPointsType(), Nektar::StdRegions::StdExpansion::m_base, NEKERROR, and Nektar::LibUtilities::NullBasisKey().

871  {
872  ASSERTL2(i >= 0 && i <= 2, "edge id is out of range");
873 
874  if (i == 0)
875  {
876  return GetBasis(0)->GetBasisKey();
877  }
878  else
879  {
880  switch(m_base[1]->GetBasisType())
881  {
883  {
884  switch(m_base[1]->GetPointsType())
885  {
887  {
888  LibUtilities::PointsKey pkey(
889  m_base[1]->GetBasisKey().GetPointsKey().
890  GetNumPoints()+1,
892  return LibUtilities::BasisKey(
894  m_base[1]->GetNumModes(),pkey);
895  break;
896  }
897 
898  default:
900  "unexpected points distribution");
901  break;
902  }
903  break;
904  }
905  default:
907  "Information not available to set edge key");
908  break;
909  }
910  }
912  }
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
Definition: ErrorUtil.hpp:209
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:228
Principle Modified Functions .
Definition: BasisType.h:48
Gauss Radau pinned at x=-1, .
Definition: PointsType.h:58
const LibUtilities::BasisSharedPtr & GetBasis(int dir) const
This function gets the shared point to basis in the dir direction.
Definition: StdExpansion.h:117
Principle Modified Functions .
Definition: BasisType.h:49
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:215
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:51

◆ v_DetShapeType()

LibUtilities::ShapeType Nektar::StdRegions::StdTriExp::v_DetShapeType ( ) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 754 of file StdTriExp.cpp.

References Nektar::LibUtilities::eTriangle.

◆ v_FillMode()

void Nektar::StdRegions::StdTriExp::v_FillMode ( const int  mode,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 695 of file StdTriExp.cpp.

References ASSERTL2, Nektar::LibUtilities::eModified_A, Vmath::Fill(), Nektar::StdRegions::StdExpansion::GetBasisType(), Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion::m_ncoeffs, Vmath::Vcopy(), and Vmath::Vmul().

Referenced by Nektar::StdRegions::StdNodalTriExp::GenNBasisTransMatrix().

697  {
698  int i,m;
699  int nquad0 = m_base[0]->GetNumPoints();
700  int nquad1 = m_base[1]->GetNumPoints();
701  int order0 = m_base[0]->GetNumModes();
702  int order1 = m_base[1]->GetNumModes();
703  int mode0 = 0;
704  Array<OneD, const NekDouble> base0 = m_base[0]->GetBdata();
705  Array<OneD, const NekDouble> base1 = m_base[1]->GetBdata();
706 
707  ASSERTL2(mode <= m_ncoeffs,
708  "calling argument mode is larger than "
709  "total expansion order");
710 
711  m = order1;
712  for (i = 0; i < order0; ++i, m+=order1-i)
713  {
714  if (m > mode)
715  {
716  mode0 = i;
717  break;
718  }
719  }
720 
721  // deal with top vertex mode in modified basis
722  if (mode == 1 &&
724  {
725  Vmath::Fill(nquad0*nquad1 , 1.0, outarray, 1);
726  }
727  else
728  {
729  for (i = 0; i < nquad1; ++i)
730  {
731  Vmath::Vcopy(nquad0,(NekDouble *)(base0.get()+mode0*nquad0),
732  1,&outarray[0]+i*nquad0,1);
733  }
734  }
735 
736  for(i = 0; i < nquad0; ++i)
737  {
738  Vmath::Vmul(nquad1,(NekDouble *)(base1.get() + mode*nquad1),
739  1,&outarray[0]+i,nquad0,&outarray[0]+i,nquad0);
740  }
741  }
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
Principle Modified Functions .
Definition: BasisType.h:48
double NekDouble
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064
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:186

◆ v_FwdTrans()

void Nektar::StdRegions::StdTriExp::v_FwdTrans ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

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

See also
StdExpansion::FwdTrans

Implements Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 313 of file StdTriExp.cpp.

References Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::eCopy, Nektar::StdRegions::eInvMass, Nektar::eWrapper, Nektar::StdRegions::StdExpansion::GetStdMatrix(), Nektar::StdRegions::StdExpansion::m_ncoeffs, and v_IProductWRTBase().

316  {
317  v_IProductWRTBase(inarray,outarray);
318 
319  // get Mass matrix inverse
320  StdMatrixKey masskey(eInvMass,DetShapeType(),*this);
321  DNekMatSharedPtr matsys = GetStdMatrix(masskey);
322 
323  // copy inarray in case inarray == outarray
324  NekVector<NekDouble> in(m_ncoeffs,outarray,eCopy);
325  NekVector<NekDouble> out(m_ncoeffs,outarray,eWrapper);
326 
327  out = (*matsys)*in;
328  }
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:469
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Calculate the inner product of inarray with respect to the basis B=base0[p]*base1[pq] and put into ou...
Definition: StdTriExp.cpp:467
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:714

◆ v_FwdTrans_BndConstrained()

void Nektar::StdRegions::StdTriExp::v_FwdTrans_BndConstrained ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::TriExp.

Definition at line 331 of file StdTriExp.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::StdRegions::StdExpansion::DetShapeType(), Blas::Dgemv(), Nektar::StdRegions::eForwards, Nektar::StdRegions::eMass, Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion::m_ncoeffs, Nektar::StdRegions::StdExpansion::m_stdStaticCondMatrixManager, Nektar::StdRegions::StdExpansion::MassMatrixOp(), Nektar::rhs, sign, v_GetEdgeToElementMap(), v_GetInteriorMap(), v_IProductWRTBase(), v_NumBndryCoeffs(), and Vmath::Vsub().

334  {
335  int i,j;
336  int npoints[2] = {m_base[0]->GetNumPoints(),
337  m_base[1]->GetNumPoints()};
338  int nmodes[2] = {m_base[0]->GetNumModes(),
339  m_base[1]->GetNumModes()};
340 
341  fill(outarray.get(), outarray.get()+m_ncoeffs, 0.0 );
342 
343  Array<OneD, NekDouble> physEdge[3];
344  Array<OneD, NekDouble> coeffEdge[3];
345  for(i = 0; i < 3; i++)
346  {
347  physEdge[i] = Array<OneD, NekDouble>(npoints[i!=0]);
348  coeffEdge[i] = Array<OneD, NekDouble>(nmodes[i!=0]);
349  }
350 
351  for(i = 0; i < npoints[0]; i++)
352  {
353  physEdge[0][i] = inarray[i];
354  }
355 
356  for(i = 0; i < npoints[1]; i++)
357  {
358  physEdge[1][i] = inarray[npoints[0]-1+i*npoints[0]];
359  physEdge[2][i] = inarray[(npoints[1]-1)*npoints[0]-i*npoints[0]];
360  }
361 
362  StdSegExpSharedPtr segexp[2] = {
364  m_base[0]->GetBasisKey()),
366  m_base[1]->GetBasisKey())
367  };
368 
369  Array<OneD, unsigned int> mapArray;
370  Array<OneD, int> signArray;
371  NekDouble sign;
372 
373  for (i = 0; i < 3; i++)
374  {
375  //segexp[i!=0]->v_FwdTrans_BndConstrained(physEdge[i],coeffEdge[i]);
376  segexp[i!=0]->FwdTrans_BndConstrained(physEdge[i],coeffEdge[i]);
377 
378  v_GetEdgeToElementMap(i,eForwards,mapArray,signArray);
379  for (j = 0; j < nmodes[i != 0]; j++)
380  {
381  sign = (NekDouble) signArray[j];
382  outarray[ mapArray[j] ] = sign * coeffEdge[i][j];
383  }
384  }
385 
386  Array<OneD, NekDouble> tmp0(m_ncoeffs);
387  Array<OneD, NekDouble> tmp1(m_ncoeffs);
388 
389  StdMatrixKey masskey(eMass,DetShapeType(),*this);
390  MassMatrixOp(outarray,tmp0,masskey);
391  v_IProductWRTBase(inarray,tmp1);
392 
393  Vmath::Vsub(m_ncoeffs, tmp1, 1, tmp0, 1, tmp1, 1);
394 
395  // get Mass matrix inverse (only of interior DOF)
396  // use block (1,1) of the static condensed system
397  // note: this block alreay contains the inverse matrix
398  DNekMatSharedPtr matsys =
399  (m_stdStaticCondMatrixManager[masskey])->GetBlock(1,1);
400 
401  int nBoundaryDofs = v_NumBndryCoeffs();
402  int nInteriorDofs = m_ncoeffs - nBoundaryDofs;
403 
404  Array<OneD, NekDouble> rhs (nInteriorDofs);
405  Array<OneD, NekDouble> result(nInteriorDofs);
406 
407  v_GetInteriorMap(mapArray);
408 
409  for (i = 0; i < nInteriorDofs; i++)
410  {
411  rhs[i] = tmp1[ mapArray[i] ];
412  }
413 
414  Blas::Dgemv('N',nInteriorDofs,nInteriorDofs,
415  1.0,&(matsys->GetPtr())[0],nInteriorDofs,
416  rhs.get(),1,
417  0.0,result.get(),1);
418 
419  for (i = 0; i < nInteriorDofs; i++)
420  {
421  outarray[ mapArray[i] ] = result[i];
422  }
423  }
virtual void v_GetEdgeToElementMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P=-1)
Definition: StdTriExp.cpp:920
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Definition: StdExpansion.h:974
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:469
#define sign(a, b)
return the sign(b)*a
Definition: Polylib.cpp:16
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Calculate the inner product of inarray with respect to the basis B=base0[p]*base1[pq] and put into ou...
Definition: StdTriExp.cpp:467
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
LibUtilities::NekManager< StdMatrixKey, DNekBlkMat, StdMatrixKey::opLess > m_stdStaticCondMatrixManager
virtual int v_NumBndryCoeffs() const
Definition: StdTriExp.cpp:759
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
Definition: StdTriExp.cpp:1201
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
double NekDouble
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 = A x where A[m x n].
Definition: Blas.hpp:168
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:346
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs
std::shared_ptr< StdSegExp > StdSegExpSharedPtr
Definition: StdSegExp.h:46
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_GeneralMatrixOp_MatOp()

void Nektar::StdRegions::StdTriExp::v_GeneralMatrixOp_MatOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdMatrixKey mkey 
)
protectedvirtual

Reimplemented in Nektar::LocalRegions::TriExp.

Definition at line 1560 of file StdTriExp.cpp.

References Blas::Dgemv(), Nektar::StdRegions::StdExpansion::m_ncoeffs, Nektar::StdRegions::StdExpansion::m_stdMatrixManager, and Vmath::Vcopy().

1564  {
1566 
1567  if(inarray.get() == outarray.get())
1568  {
1569  Array<OneD,NekDouble> tmp(m_ncoeffs);
1570  Vmath::Vcopy(m_ncoeffs,inarray.get(),1,tmp.get(),1);
1571 
1572  Blas::Dgemv('N', m_ncoeffs, m_ncoeffs, 1.0, mat->GetPtr().get(),
1573  m_ncoeffs, tmp.get(), 1, 0.0, outarray.get(), 1);
1574  }
1575  else
1576  {
1577  Blas::Dgemv('N', m_ncoeffs, m_ncoeffs, 1.0, mat->GetPtr().get(),
1578  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
1579  }
1580  }
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
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 = A x where A[m x n].
Definition: Blas.hpp:168
LibUtilities::NekManager< StdMatrixKey, DNekMat, StdMatrixKey::opLess > m_stdMatrixManager
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064

◆ v_GenMatrix()

DNekMatSharedPtr Nektar::StdRegions::StdTriExp::v_GenMatrix ( const StdMatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::TriExp, Nektar::StdRegions::StdNodalTriExp, and Nektar::LocalRegions::NodalTriExp.

Definition at line 1268 of file StdTriExp.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::StdRegions::StdMatrixKey::ConstFactorExists(), Nektar::StdRegions::StdExpansion::CreateGeneralMatrix(), Nektar::StdRegions::eFactorConst, Nektar::StdRegions::ePhysInterpToEquiSpaced, Nektar::StdRegions::StdMatrixKey::GetConstFactor(), Nektar::StdRegions::StdMatrixKey::GetMatrixType(), Nektar::LibUtilities::StdTriData::getNumberOfCoefficients(), Nektar::StdRegions::StdExpansion::LocCoordToLocCollapsed(), Nektar::StdRegions::StdExpansion::m_base, Vmath::Smul(), and Vmath::Vcopy().

Referenced by v_CreateStdMatrix().

1269  {
1270 
1271  MatrixType mtype = mkey.GetMatrixType();
1272 
1273  DNekMatSharedPtr Mat;
1274 
1275  switch(mtype)
1276  {
1278  {
1279  int nq0, nq1, nq;
1280 
1281  nq0 = m_base[0]->GetNumPoints();
1282  nq1 = m_base[1]->GetNumPoints();
1283 
1284  // take definition from key
1285  if(mkey.ConstFactorExists(eFactorConst))
1286  {
1287  nq = (int) mkey.GetConstFactor(eFactorConst);
1288  }
1289  else
1290  {
1291  nq = max(nq0,nq1);
1292  }
1293 
1294  int neq = LibUtilities::StdTriData::
1296  Array<OneD, Array<OneD, NekDouble> > coords(neq);
1297  Array<OneD, NekDouble> coll (2);
1298  Array<OneD, DNekMatSharedPtr> I (2);
1299  Array<OneD, NekDouble> tmp (nq0);
1300 
1301 
1302  Mat = MemoryManager<DNekMat>::AllocateSharedPtr(neq,nq0*nq1);
1303  int cnt = 0;
1304 
1305  for(int i = 0; i < nq; ++i)
1306  {
1307  for(int j = 0; j < nq-i; ++j,++cnt)
1308  {
1309  coords[cnt] = Array<OneD, NekDouble>(2);
1310  coords[cnt][0] = -1.0 + 2*j/(NekDouble)(nq-1);
1311  coords[cnt][1] = -1.0 + 2*i/(NekDouble)(nq-1);
1312  }
1313  }
1314 
1315  for(int i = 0; i < neq; ++i)
1316  {
1317  LocCoordToLocCollapsed(coords[i],coll);
1318 
1319  I[0] = m_base[0]->GetI(coll);
1320  I[1] = m_base[1]->GetI(coll+1);
1321 
1322  // interpolate first coordinate direction
1323  for (int j = 0; j < nq1; ++j)
1324  {
1325  NekDouble fac = (I[1]->GetPtr())[j];
1326  Vmath::Smul(nq0, fac, I[0]->GetPtr(), 1, tmp, 1);
1327 
1328  Vmath::Vcopy(nq0, &tmp[0], 1,
1329  Mat->GetRawPtr() + j*nq0*neq + i, neq);
1330  }
1331 
1332  }
1333  break;
1334  }
1335  default:
1336  {
1338  break;
1339  }
1340  }
1341 
1342  return Mat;
1343  }
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
int getNumberOfCoefficients(int Na, int Nb)
Definition: ShapeType.hpp:113
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
double NekDouble
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064

◆ v_GetBoundaryMap()

void Nektar::StdRegions::StdTriExp::v_GetBoundaryMap ( Array< OneD, unsigned int > &  outarray)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 1231 of file StdTriExp.cpp.

References ASSERTL1, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetBasisType(), Nektar::StdRegions::StdExpansion::m_base, and Nektar::StdRegions::StdExpansion::NumBndryCoeffs().

1232  {
1235  "Expansion not of expected type");
1236  int i;
1237  int cnt;
1238  int nummodes0, nummodes1;
1239  int value;
1240 
1241  if (outarray.num_elements()!=NumBndryCoeffs())
1242  {
1243  outarray = Array<OneD, unsigned int>(NumBndryCoeffs());
1244  }
1245 
1246  nummodes0 = m_base[0]->GetNumModes();
1247  nummodes1 = m_base[1]->GetNumModes();
1248 
1249  value = 2*nummodes1-1;
1250  for(i = 0; i < value; i++)
1251  {
1252  outarray[i]=i;
1253  }
1254  cnt = value;
1255 
1256  for(i = 0; i < nummodes0-2; i++)
1257  {
1258  outarray[cnt++]=value;
1259  value += nummodes1-2-i;
1260  }
1261  }
Principle Modified Functions .
Definition: BasisType.h:48
Principle Modified Functions .
Definition: BasisType.h:49
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_GetCoords()

void Nektar::StdRegions::StdTriExp::v_GetCoords ( Array< OneD, NekDouble > &  coords_x,
Array< OneD, NekDouble > &  coords_y,
Array< OneD, NekDouble > &  coords_z 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, and Nektar::LocalRegions::TriExp.

Definition at line 834 of file StdTriExp.cpp.

References Vmath::Fill(), Nektar::StdRegions::StdExpansion::GetNumPoints(), and Nektar::StdRegions::StdExpansion::m_base.

837  {
838  boost::ignore_unused(coords_2);
839 
840  Array<OneD, const NekDouble> z0 = m_base[0]->GetZ();
841  Array<OneD, const NekDouble> z1 = m_base[1]->GetZ();
842  int nq0 = GetNumPoints(0);
843  int nq1 = GetNumPoints(1);
844  int i,j;
845 
846  for(i = 0; i < nq1; ++i)
847  {
848  for(j = 0; j < nq0; ++j)
849  {
850  coords_0[i*nq0+j] = (1+z0[j])*(1-z1[i])/2.0 - 1.0;
851  }
852  Vmath::Fill(nq0,z1[i],&coords_1[0] + i*nq0,1);
853  }
854  }
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:228
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_GetEdgeBasisType()

LibUtilities::BasisType Nektar::StdRegions::StdTriExp::v_GetEdgeBasisType ( const int  i) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 819 of file StdTriExp.cpp.

References ASSERTL2, and Nektar::StdRegions::StdExpansion::GetBasisType().

820  {
821  ASSERTL2(i >= 0 && i <= 2, "edge id is out of range");
822 
823  if (i == 0)
824  {
825  return GetBasisType(0);
826  }
827  else
828  {
829  return GetBasisType(1);
830  }
831  }
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164

◆ v_GetEdgeInteriorMap()

void Nektar::StdRegions::StdTriExp::v_GetEdgeInteriorMap ( const int  eid,
const Orientation  edgeOrient,
Array< OneD, unsigned int > &  maparray,
Array< OneD, int > &  signarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 1115 of file StdTriExp.cpp.

References ASSERTL0, Nektar::StdRegions::eBackwards, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetEdgeBasisType(), Nektar::StdRegions::StdExpansion::GetEdgeNcoeffs(), and Nektar::StdRegions::StdExpansion::m_base.

1120  {
1123  "Mapping not defined for this type of basis");
1124  int i;
1125  const int nummodes1 = m_base[1]->GetNumModes();
1126  const int nEdgeIntCoeffs = GetEdgeNcoeffs(eid)-2;
1127 
1128  if(maparray.num_elements() != nEdgeIntCoeffs)
1129  {
1130  maparray = Array<OneD, unsigned int>(nEdgeIntCoeffs);
1131  }
1132 
1133  if(signarray.num_elements() != nEdgeIntCoeffs)
1134  {
1135  signarray = Array<OneD, int>(nEdgeIntCoeffs,1);
1136  }
1137  else
1138  {
1139  fill( signarray.get() , signarray.get()+nEdgeIntCoeffs, 1 );
1140  }
1141 
1142  switch(eid)
1143  {
1144  case 0:
1145  {
1146  int cnt = 2*nummodes1 - 1;
1147  for(i = 0; i < nEdgeIntCoeffs; cnt+=nummodes1-2-i, ++i)
1148  {
1149  maparray[i] = cnt;
1150  }
1151 
1152  if(edgeOrient==eBackwards)
1153  {
1154  for(i = 1; i < nEdgeIntCoeffs; i+=2)
1155  {
1156  signarray[i] = -1;
1157  }
1158  }
1159  break;
1160  }
1161  case 1:
1162  {
1163  for(i = 0; i < nEdgeIntCoeffs; i++)
1164  {
1165  maparray[i] = nummodes1+1+i;
1166  }
1167 
1168  if(edgeOrient==eBackwards)
1169  {
1170  for(i = 1; i < nEdgeIntCoeffs; i+=2)
1171  {
1172  signarray[i] = -1;
1173  }
1174  }
1175  break;
1176  }
1177  case 2:
1178  {
1179  for(i = 0; i < nEdgeIntCoeffs; i++)
1180  {
1181  maparray[i] = 2+i;
1182  }
1183 
1184  if(edgeOrient==eBackwards)
1185  {
1186  for(i = 1; i < nEdgeIntCoeffs; i+=2)
1187  {
1188  signarray[i] = -1;
1189  }
1190  }
1191  break;
1192  }
1193  default:
1194  {
1195  ASSERTL0(false,"eid must be between 0 and 2");
1196  break;
1197  }
1198  }
1199  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
Principle Modified Functions .
Definition: BasisType.h:48
int GetEdgeNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th edge.
Definition: StdExpansion.h:286
Principle Modified Functions .
Definition: BasisType.h:49
Array< OneD, LibUtilities::BasisSharedPtr > m_base
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
Definition: StdExpansion.h:412

◆ v_GetEdgeNcoeffs()

int Nektar::StdRegions::StdTriExp::v_GetEdgeNcoeffs ( const int  i) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 779 of file StdTriExp.cpp.

References ASSERTL2, and Nektar::StdRegions::StdExpansion::GetBasisNumModes().

780  {
781  ASSERTL2(i >= 0 && i <= 2, "edge id is out of range");
782 
783  if (i == 0)
784  {
785  return GetBasisNumModes(0);
786  }
787  else
788  {
789  return GetBasisNumModes(1);
790  }
791  }
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Definition: StdExpansion.h:177
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274

◆ v_GetEdgeNumPoints()

int Nektar::StdRegions::StdTriExp::v_GetEdgeNumPoints ( const int  i) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 793 of file StdTriExp.cpp.

References ASSERTL2, and Nektar::StdRegions::StdExpansion::GetNumPoints().

794  {
795  ASSERTL2((i >= 0)&&(i <= 2),"edge id is out of range");
796 
797  if (i == 0)
798  {
799  return GetNumPoints(0);
800  }
801  else
802  {
803  return GetNumPoints(1);
804  }
805  }
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:228
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274

◆ v_GetEdgeToElementMap()

void Nektar::StdRegions::StdTriExp::v_GetEdgeToElementMap ( const int  eid,
const Orientation  edgeOrient,
Array< OneD, unsigned int > &  maparray,
Array< OneD, int > &  signarray,
int  P = -1 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 920 of file StdTriExp.cpp.

References ASSERTL0, ASSERTL1, Nektar::StdRegions::eBackwards, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetEdgeBasisType(), Nektar::StdRegions::StdExpansion::m_base, and class_topology::P.

Referenced by v_FwdTrans_BndConstrained().

926  {
929  "Mapping not defined for this type of basis");
930 
931  int i;
932  int numModes=0;
933  int order0 = m_base[0]->GetNumModes();
934  int order1 = m_base[1]->GetNumModes();
935 
936  switch (eid)
937  {
938  case 0:
939  numModes = order0;
940  break;
941  case 1:
942  case 2:
943  numModes = order1;
944  break;
945  default:
946  ASSERTL0(false,"eid must be between 0 and 2");
947  }
948 
949  bool checkForZeroedModes = false;
950  if (P == -1)
951  {
952  P = numModes;
953  }
954  else if(P != numModes)
955  {
956  checkForZeroedModes = true;
957  }
958 
959 
960  if(maparray.num_elements() != P)
961  {
962  maparray = Array<OneD, unsigned int>(P);
963  }
964 
965  if(signarray.num_elements() != P)
966  {
967  signarray = Array<OneD, int>(P,1);
968  }
969  else
970  {
971  fill(signarray.get() , signarray.get()+P, 1);
972  }
973 
974  switch(eid)
975  {
976  case 0:
977  {
978  int cnt = 0;
979  for(i = 0; i < P; cnt+=order1-i, ++i)
980  {
981  maparray[i] = cnt;
982  }
983 
984  if(edgeOrient==eBackwards)
985  {
986  swap( maparray[0] , maparray[1] );
987 
988  for(i = 3; i < P; i+=2)
989  {
990  signarray[i] = -1;
991  }
992  }
993  break;
994  }
995  case 1:
996  {
997  maparray[0] = order1;
998  maparray[1] = 1;
999  for(i = 2; i < P; i++)
1000  {
1001  maparray[i] = order1-1+i;
1002  }
1003 
1004  if(edgeOrient==eBackwards)
1005  {
1006  swap( maparray[0] , maparray[1] );
1007 
1008  for(i = 3; i < P; i+=2)
1009  {
1010  signarray[i] = -1;
1011  }
1012  }
1013  break;
1014  }
1015  case 2:
1016  {
1017  for(i = 0; i < P; i++)
1018  {
1019  maparray[i] = i;
1020  }
1021 
1022  if(edgeOrient==eBackwards)
1023  {
1024  swap( maparray[0] , maparray[1] );
1025 
1026  for(i = 3; i < P; i+=2)
1027  {
1028  signarray[i] = -1;
1029  }
1030  }
1031  break;
1032  }
1033  default:
1034  ASSERTL0(false,"eid must be between 0 and 2");
1035  break;
1036  }
1037 
1038 
1039  if (checkForZeroedModes)
1040  {
1041  // Zero signmap and set maparray to zero if
1042  // elemental modes are not as large as face modes
1043  for (int j = numModes; j < P; j++)
1044  {
1045  signarray[j] = 0.0;
1046  maparray[j] = maparray[0];
1047  }
1048  }
1049  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
Principle Modified Functions .
Definition: BasisType.h:48
Principle Modified Functions .
Definition: BasisType.h:49
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
Definition: StdExpansion.h:412

◆ v_GetInteriorMap()

void Nektar::StdRegions::StdTriExp::v_GetInteriorMap ( Array< OneD, unsigned int > &  outarray)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 1201 of file StdTriExp.cpp.

References ASSERTL1, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetBasisType(), Nektar::StdRegions::StdExpansion::GetNcoeffs(), Nektar::StdRegions::StdExpansion::m_base, and Nektar::StdRegions::StdExpansion::NumBndryCoeffs().

Referenced by v_FwdTrans_BndConstrained().

1202  {
1205  "Expansion not of a proper type");
1206 
1207  int i,j;
1208  int cnt = 0;
1209  int nummodes0, nummodes1;
1210  int startvalue;
1211  if(outarray.num_elements()!=GetNcoeffs()-NumBndryCoeffs())
1212  {
1213  outarray = Array<OneD, unsigned int>(GetNcoeffs()-NumBndryCoeffs());
1214  }
1215 
1216  nummodes0 = m_base[0]->GetNumModes();
1217  nummodes1 = m_base[1]->GetNumModes();
1218 
1219  startvalue = 2*nummodes1;
1220 
1221  for(i = 0; i < nummodes0-2; i++)
1222  {
1223  for(j = 0; j < nummodes1-3-i; j++)
1224  {
1225  outarray[cnt++]=startvalue+j;
1226  }
1227  startvalue+=nummodes1-2-i;
1228  }
1229  }
Principle Modified Functions .
Definition: BasisType.h:48
Principle Modified Functions .
Definition: BasisType.h:49
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
Definition: StdExpansion.h:130
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_GetNedges()

int Nektar::StdRegions::StdTriExp::v_GetNedges ( ) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 749 of file StdTriExp.cpp.

750  {
751  return 3;
752  }

◆ v_GetNverts()

int Nektar::StdRegions::StdTriExp::v_GetNverts ( ) const
protectedvirtual

Implements Nektar::StdRegions::StdExpansion.

Definition at line 744 of file StdTriExp.cpp.

745  {
746  return 3;
747  }

◆ v_GetSimplexEquiSpacedConnectivity()

void Nektar::StdRegions::StdTriExp::v_GetSimplexEquiSpacedConnectivity ( Array< OneD, int > &  conn,
bool  standard = true 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1631 of file StdTriExp.cpp.

References Nektar::StdRegions::StdExpansion::m_base.

1634  {
1635  boost::ignore_unused(standard);
1636 
1637  int np1 = m_base[0]->GetNumPoints();
1638  int np2 = m_base[1]->GetNumPoints();
1639  int np = max(np1,np2);
1640 
1641  conn = Array<OneD, int>(3*(np-1)*(np-1));
1642 
1643  int row = 0;
1644  int rowp1 = 0;
1645  int cnt = 0;
1646  for(int i = 0; i < np-1; ++i)
1647  {
1648  rowp1 += np-i;
1649  for(int j = 0; j < np-i-2; ++j)
1650  {
1651  conn[cnt++] = row +j;
1652  conn[cnt++] = row +j+1;
1653  conn[cnt++] = rowp1 +j;
1654 
1655  conn[cnt++] = rowp1 +j+1;
1656  conn[cnt++] = rowp1 +j;
1657  conn[cnt++] = row +j+1;
1658  }
1659 
1660  conn[cnt++] = row +np-i-2;
1661  conn[cnt++] = row +np-i-1;
1662  conn[cnt++] = rowp1+np-i-2;
1663 
1664  row += np-i;
1665  }
1666  }
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_GetVertexMap()

int Nektar::StdRegions::StdTriExp::v_GetVertexMap ( int  localVertexId,
bool  useCoeffPacking = false 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 1051 of file StdTriExp.cpp.

References ASSERTL0, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetEdgeBasisType(), and Nektar::StdRegions::StdExpansion::m_base.

1052  {
1053  ASSERTL0(
1054  GetEdgeBasisType(localVertexId) == LibUtilities::eModified_A ||
1055  GetEdgeBasisType(localVertexId) == LibUtilities::eModified_B,
1056  "Mapping not defined for this type of basis");
1057 
1058  int localDOF = 0;
1059  if(useCoeffPacking == true)
1060  {
1061  switch(localVertexId)
1062  {
1063  case 0:
1064  {
1065  localDOF = 0;
1066  break;
1067  }
1068  case 1:
1069  {
1070  localDOF = 1;
1071  break;
1072  }
1073  case 2:
1074  {
1075  localDOF = m_base[1]->GetNumModes();
1076  break;
1077  }
1078  default:
1079  {
1080  ASSERTL0(false,"eid must be between 0 and 2");
1081  break;
1082  }
1083  }
1084  }
1085  else // follow book format for vertex indexing.
1086  {
1087  switch(localVertexId)
1088  {
1089  case 0:
1090  {
1091  localDOF = 0;
1092  break;
1093  }
1094  case 1:
1095  {
1096  localDOF = m_base[1]->GetNumModes();
1097  break;
1098  }
1099  case 2:
1100  {
1101  localDOF = 1;
1102  break;
1103  }
1104  default:
1105  {
1106  ASSERTL0(false,"eid must be between 0 and 2");
1107  break;
1108  }
1109  }
1110  }
1111 
1112  return localDOF;
1113  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
Principle Modified Functions .
Definition: BasisType.h:48
Principle Modified Functions .
Definition: BasisType.h:49
Array< OneD, LibUtilities::BasisSharedPtr > m_base
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
Definition: StdExpansion.h:412

◆ v_HelmholtzMatrixOp()

void Nektar::StdRegions::StdTriExp::v_HelmholtzMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 1391 of file StdTriExp.cpp.

References Nektar::StdRegions::StdExpansion2D::v_HelmholtzMatrixOp_MatFree().

1395  {
1396  StdTriExp::v_HelmholtzMatrixOp_MatFree(inarray,outarray,mkey);
1397  }
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)

◆ v_Integral()

NekDouble Nektar::StdRegions::StdTriExp::v_Integral ( const Array< OneD, const NekDouble > &  inarray)
protectedvirtual

Integrates the specified function over the domain.

See also
StdRegions::StdExpansion::Integral.

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, and Nektar::LocalRegions::TriExp.

Definition at line 84 of file StdTriExp.cpp.

References Nektar::LibUtilities::eGaussRadauMAlpha1Beta0, Nektar::StdRegions::StdExpansion::GetPointsType(), Nektar::StdRegions::StdExpansion2D::Integral(), Nektar::StdRegions::StdExpansion::m_base, and Vmath::Smul().

86  {
87  int i;
88  int nquad1 = m_base[1]->GetNumPoints();
89  Array<OneD, NekDouble> w1_tmp(nquad1);
90 
91  Array<OneD, const NekDouble> w0 = m_base[0]->GetW();
92  Array<OneD, const NekDouble> w1 = m_base[1]->GetW();
93  Array<OneD, const NekDouble> z1 = m_base[1]->GetZ();
94 
95  switch(m_base[1]->GetPointsType())
96  {
97  case LibUtilities::eGaussRadauMAlpha1Beta0: // (0,1) Jacobi Inner product
98  {
99  Vmath::Smul(nquad1, 0.5, w1, 1, w1_tmp,1);
100  break;
101  }
102  default:
103  {
104  // include jacobian factor on whatever coordinates are defined.
105  for(i = 0; i < nquad1; ++i)
106  {
107  w1_tmp[i] = 0.5*(1-z1[i])*w1[i];
108  }
109  break;
110  }
111  }
112 
113  return StdExpansion2D::Integral(inarray,w0,w1_tmp);
114  }
NekDouble Integral(const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &w0, const Array< OneD, const NekDouble > &w1)
Gauss Radau pinned at x=-1, .
Definition: PointsType.h:58
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:215
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_IProductWRTBase()

void Nektar::StdRegions::StdTriExp::v_IProductWRTBase ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

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.

Implements Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 467 of file StdTriExp.cpp.

References v_IProductWRTBase_SumFac().

Referenced by v_FwdTrans(), and v_FwdTrans_BndConstrained().

470  {
471  StdTriExp::v_IProductWRTBase_SumFac(inarray,outarray);
472  }
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
Definition: StdTriExp.cpp:486

◆ v_IProductWRTBase_MatOp()

void Nektar::StdRegions::StdTriExp::v_IProductWRTBase_MatOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented in Nektar::LocalRegions::TriExp.

Definition at line 474 of file StdTriExp.cpp.

References Nektar::StdRegions::StdExpansion::DetShapeType(), Blas::Dgemv(), Nektar::StdRegions::eIProductWRTBase, Nektar::StdRegions::StdExpansion::GetStdMatrix(), Nektar::StdRegions::StdExpansion::GetTotPoints(), and Nektar::StdRegions::StdExpansion::m_ncoeffs.

477  {
478  int nq = GetTotPoints();
479  StdMatrixKey iprodmatkey(eIProductWRTBase,DetShapeType(),*this);
480  DNekMatSharedPtr iprodmat = GetStdMatrix(iprodmatkey);
481 
482  Blas::Dgemv('N',m_ncoeffs,nq,1.0,iprodmat->GetPtr().get(),
483  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
484  }
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:469
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:714
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 = A x where A[m x n].
Definition: Blas.hpp:168
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:140

◆ v_IProductWRTBase_SumFac()

void Nektar::StdRegions::StdTriExp::v_IProductWRTBase_SumFac ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
bool  multiplybyweights = true 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 486 of file StdTriExp.cpp.

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

Referenced by v_IProductWRTBase(), and Nektar::StdRegions::StdNodalTriExp::v_IProductWRTBase_SumFac().

490  {
491  int nquad0 = m_base[0]->GetNumPoints();
492  int nquad1 = m_base[1]->GetNumPoints();
493  int order0 = m_base[0]->GetNumModes();
494 
495  if(multiplybyweights)
496  {
497  Array<OneD,NekDouble> tmp(nquad0*nquad1+nquad1*order0);
498  Array<OneD,NekDouble> wsp(tmp+nquad0*nquad1);
499 
500  // multiply by integration constants
501  MultiplyByQuadratureMetric(inarray,tmp);
502  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
503  m_base[1]->GetBdata(),
504  tmp,outarray,wsp);
505  }
506  else
507  {
508  Array<OneD,NekDouble> wsp(nquad1*order0);
509  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
510  m_base[1]->GetBdata(),
511  inarray,outarray,wsp);
512  }
513  }
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:945
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)
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_IProductWRTBase_SumFacKernel()

void Nektar::StdRegions::StdTriExp::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 
)
protectedvirtual

Implements Nektar::StdRegions::StdExpansion2D.

Definition at line 515 of file StdTriExp.cpp.

References ASSERTL1, Blas::Ddot(), Blas::Dgemm(), Blas::Dgemv(), Nektar::LibUtilities::eModified_A, Nektar::StdRegions::StdExpansion::GetBasisType(), and Nektar::StdRegions::StdExpansion::m_base.

523  {
524  boost::ignore_unused(doCheckCollDir0, doCheckCollDir1);
525 
526  int i;
527  int mode;
528  int nquad0 = m_base[0]->GetNumPoints();
529  int nquad1 = m_base[1]->GetNumPoints();
530  int nmodes0 = m_base[0]->GetNumModes();
531  int nmodes1 = m_base[1]->GetNumModes();
532 
533  ASSERTL1(wsp.num_elements() >= nquad1*nmodes0,
534  "Workspace size is not sufficient");
535 
536  Blas::Dgemm('T','N',nquad1,nmodes0,nquad0,1.0,inarray.get(),nquad0,
537  base0.get(),nquad0,0.0,wsp.get(),nquad1);
538 
539  // Inner product with respect to 'b' direction
540  for (mode=i=0; i < nmodes0; ++i)
541  {
542  Blas::Dgemv('T',nquad1,nmodes1-i,1.0, base1.get()+mode*nquad1,
543  nquad1,wsp.get()+i*nquad1,1, 0.0,
544  outarray.get() + mode,1);
545  mode += nmodes1 - i;
546  }
547 
548  // fix for modified basis by splitting top vertex mode
550  {
551  outarray[1] += Blas::Ddot(nquad1,base1.get()+nquad1,1,
552  wsp.get()+nquad1,1);
553  }
554  }
Principle Modified Functions .
Definition: BasisType.h:48
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where A[m x n], B[n x k], C[m x k].
Definition: Blas.hpp:213
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 = A x where A[m x n].
Definition: Blas.hpp:168
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
Definition: Blas.hpp:140
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_IProductWRTDerivBase()

void Nektar::StdRegions::StdTriExp::v_IProductWRTDerivBase ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::StdRegions::StdNodalTriExp, and Nektar::LocalRegions::TriExp.

Definition at line 556 of file StdTriExp.cpp.

References v_IProductWRTDerivBase_SumFac().

560  {
561  StdTriExp::v_IProductWRTDerivBase_SumFac(dir,inarray,outarray);
562  }
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdTriExp.cpp:598

◆ v_IProductWRTDerivBase_MatOp()

void Nektar::StdRegions::StdTriExp::v_IProductWRTDerivBase_MatOp ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented in Nektar::LocalRegions::TriExp.

Definition at line 564 of file StdTriExp.cpp.

References ASSERTL1, Nektar::StdRegions::StdExpansion::DetShapeType(), Blas::Dgemv(), Nektar::StdRegions::eIProductWRTDerivBase0, Nektar::StdRegions::eIProductWRTDerivBase1, Nektar::StdRegions::StdExpansion::GetStdMatrix(), Nektar::StdRegions::StdExpansion::GetTotPoints(), and Nektar::StdRegions::StdExpansion::m_ncoeffs.

568  {
569  int nq = GetTotPoints();
571 
572  switch(dir)
573  {
574  case 0:
575  {
576  mtype = eIProductWRTDerivBase0;
577  break;
578  }
579  case 1:
580  {
581  mtype = eIProductWRTDerivBase1;
582  break;
583  }
584  default:
585  {
586  ASSERTL1(false,"input dir is out of range");
587  break;
588  }
589  }
590 
591  StdMatrixKey iprodmatkey(mtype,DetShapeType(),*this);
592  DNekMatSharedPtr iprodmat = GetStdMatrix(iprodmatkey);
593 
594  Blas::Dgemv('N',m_ncoeffs,nq,1.0,iprodmat->GetPtr().get(),
595  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
596  }
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:469
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:714
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 = A x where A[m x n].
Definition: Blas.hpp:168
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:140
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ v_IProductWRTDerivBase_SumFac()

void Nektar::StdRegions::StdTriExp::v_IProductWRTDerivBase_SumFac ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 598 of file StdTriExp.cpp.

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

Referenced by v_IProductWRTDerivBase(), and Nektar::StdRegions::StdNodalTriExp::v_IProductWRTDerivBase_SumFac().

602  {
603  int i;
604  int nquad0 = m_base[0]->GetNumPoints();
605  int nquad1 = m_base[1]->GetNumPoints();
606  int nqtot = nquad0*nquad1;
607  int nmodes0 = m_base[0]->GetNumModes();
608  int wspsize = max(max(nqtot,m_ncoeffs),nquad1*nmodes0);
609 
610  Array<OneD, NekDouble> gfac0(2*wspsize);
611  Array<OneD, NekDouble> tmp0 (gfac0+wspsize);
612 
613  const Array<OneD, const NekDouble>& z1 = m_base[1]->GetZ();
614 
615  // set up geometric factor: 2/(1-z1)
616  for(i = 0; i < nquad1; ++i)
617  {
618  gfac0[i] = 2.0/(1-z1[i]);
619  }
620 
621  for(i = 0; i < nquad1; ++i)
622  {
623  Vmath::Smul(nquad0,gfac0[i],&inarray[0]+i*nquad0,1,
624  &tmp0[0]+i*nquad0,1);
625  }
626 
627  MultiplyByQuadratureMetric(tmp0,tmp0);
628 
629  switch(dir)
630  {
631  case 0:
632  {
633  IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(),
634  m_base[1]->GetBdata(),
635  tmp0,outarray,gfac0);
636  break;
637  }
638  case 1:
639  {
640  Array<OneD, NekDouble> tmp3(m_ncoeffs);
641  const Array<OneD, const NekDouble>& z0 = m_base[0]->GetZ();
642 
643  for (i = 0; i < nquad0; ++i)
644  {
645  gfac0[i] = 0.5*(1+z0[i]);
646  }
647 
648  for (i = 0; i < nquad1; ++i)
649  {
650  Vmath::Vmul(nquad0,&gfac0[0],1,&tmp0[0]+i*nquad0,1,
651  &tmp0[0]+i*nquad0,1);
652  }
653 
654  IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(),
655  m_base[1]->GetBdata(),
656  tmp0,tmp3,gfac0);
657 
658  MultiplyByQuadratureMetric(inarray,tmp0);
659  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
660  m_base[1]->GetDbdata(),
661  tmp0,outarray,gfac0);
662  Vmath::Vadd(m_ncoeffs,&tmp3[0],1,&outarray[0],1,
663  &outarray[0],1);
664  break;
665  }
666  default:
667  {
668  ASSERTL1(false, "input dir is out of range");
669  break;
670  }
671  }
672  }
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:945
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
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)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base
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:302
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:186

◆ v_IsBoundaryInteriorExpansion()

bool Nektar::StdRegions::StdTriExp::v_IsBoundaryInteriorExpansion ( )
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 856 of file StdTriExp.cpp.

References Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, and Nektar::StdRegions::StdExpansion::m_base.

857  {
858  return m_base[0]->GetBasisType() == LibUtilities::eModified_A &&
859  m_base[1]->GetBasisType() == LibUtilities::eModified_B;
860  }
Principle Modified Functions .
Definition: BasisType.h:48
Principle Modified Functions .
Definition: BasisType.h:49
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_LaplacianMatrixOp() [1/2]

void Nektar::StdRegions::StdTriExp::v_LaplacianMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 1363 of file StdTriExp.cpp.

References Nektar::StdRegions::StdExpansion2D::v_LaplacianMatrixOp_MatFree().

1367  {
1368  StdTriExp::v_LaplacianMatrixOp_MatFree(inarray,outarray,mkey);
1369  }
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)

◆ v_LaplacianMatrixOp() [2/2]

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 1371 of file StdTriExp.cpp.

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

1377  {
1379  k1,k2,inarray,outarray,mkey);
1380  }
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)

◆ v_LocCoordToLocCollapsed()

void Nektar::StdRegions::StdTriExp::v_LocCoordToLocCollapsed ( const Array< OneD, const NekDouble > &  xi,
Array< OneD, NekDouble > &  eta 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 678 of file StdTriExp.cpp.

References Nektar::NekConstants::kNekZeroTol.

680  {
681 
682  // set up local coordinate system
683  if (fabs(xi[1]-1.0) < NekConstants::kNekZeroTol)
684  {
685  eta[0] = -1.0;
686  eta[1] = 1.0;
687  }
688  else
689  {
690  eta[0] = 2*(1+xi[0])/(1-xi[1])-1.0;
691  eta[1] = xi[1];
692  }
693  }
static const NekDouble kNekZeroTol

◆ v_MassMatrixOp()

void Nektar::StdRegions::StdTriExp::v_MassMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 1355 of file StdTriExp.cpp.

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

1359  {
1360  StdExpansion::MassMatrixOp_MatFree(inarray,outarray,mkey);
1361  }
void MassMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)

◆ v_MultiplyByStdQuadratureMetric()

void Nektar::StdRegions::StdTriExp::v_MultiplyByStdQuadratureMetric ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1586 of file StdTriExp.cpp.

References ASSERTL0, Blas::Dscal(), Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::LibUtilities::eGaussRadauMAlpha1Beta0, Nektar::LibUtilities::ePolyEvenlySpaced, Nektar::StdRegions::StdExpansion::GetPointsType(), Nektar::StdRegions::StdExpansion::m_base, and Vmath::Vmul().

1589  {
1590  int i;
1591  int nquad0 = m_base[0]->GetNumPoints();
1592  int nquad1 = m_base[1]->GetNumPoints();
1593 
1594  const Array<OneD, const NekDouble>& w0 = m_base[0]->GetW();
1595  const Array<OneD, const NekDouble>& w1 = m_base[1]->GetW();
1596  const Array<OneD, const NekDouble>& z1 = m_base[1]->GetZ();
1597 
1598  // multiply by integration constants
1599  for(i = 0; i < nquad1; ++i)
1600  {
1601  Vmath::Vmul(nquad0,inarray.get()+i*nquad0,1,
1602  w0.get(),1, outarray.get()+i*nquad0,1);
1603  }
1604 
1605  switch(m_base[1]->GetPointsType())
1606  {
1607  // Legendre inner product
1610  for(i = 0; i < nquad1; ++i)
1611  {
1612  Blas::Dscal(nquad0,0.5*(1-z1[i])*w1[i],
1613  outarray.get()+i*nquad0,1);
1614  }
1615  break;
1616 
1617  // (1,0) Jacobi Inner product
1619  for(i = 0; i < nquad1; ++i)
1620  {
1621  Blas::Dscal(nquad0,0.5*w1[i],outarray.get()+i*nquad0,1);
1622  }
1623  break;
1624 
1625  default:
1626  ASSERTL0(false, "Unsupported quadrature points type.");
1627  break;
1628  }
1629  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
Gauss Radau pinned at x=-1, .
Definition: PointsType.h:58
1D Evenly-spaced points using Lagrange polynomial
Definition: PointsType.h:64
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
Definition: Blas.hpp:125
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:215
Array< OneD, LibUtilities::BasisSharedPtr > m_base
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:51
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:186

◆ v_NumBndryCoeffs()

int Nektar::StdRegions::StdTriExp::v_NumBndryCoeffs ( ) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::StdRegions::StdNodalTriExp.

Definition at line 759 of file StdTriExp.cpp.

References ASSERTL1, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetBasisNumModes(), and Nektar::StdRegions::StdExpansion::GetBasisType().

Referenced by v_FwdTrans_BndConstrained().

760  {
762  "BasisType is not a boundary interior form");
764  "BasisType is not a boundary interior form");
765 
766  return 3 + (GetBasisNumModes(0)-2) + 2*(GetBasisNumModes(1)-2);
767  }
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Definition: StdExpansion.h:177
Principle Modified Functions .
Definition: BasisType.h:48
Principle Modified Functions .
Definition: BasisType.h:49
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ v_NumDGBndryCoeffs()

int Nektar::StdRegions::StdTriExp::v_NumDGBndryCoeffs ( ) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 769 of file StdTriExp.cpp.

References ASSERTL1, Nektar::LibUtilities::eModified_A, Nektar::LibUtilities::eModified_B, Nektar::StdRegions::StdExpansion::GetBasisNumModes(), and Nektar::StdRegions::StdExpansion::GetBasisType().

770  {
772  "BasisType is not a boundary interior form");
774  "BasisType is not a boundary interior form");
775 
776  return GetBasisNumModes(0) + 2*GetBasisNumModes(1);
777  }
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Definition: StdExpansion.h:177
Principle Modified Functions .
Definition: BasisType.h:48
Principle Modified Functions .
Definition: BasisType.h:49
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ v_PhysDeriv() [1/2]

void Nektar::StdRegions::StdTriExp::v_PhysDeriv ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out_d0,
Array< OneD, NekDouble > &  out_d1,
Array< OneD, NekDouble > &  out_d2 = NullNekDouble1DArray 
)
protectedvirtual

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::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, and Nektar::LocalRegions::TriExp.

Definition at line 132 of file StdTriExp.cpp.

References Blas::Dscal(), Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion2D::PhysTensorDeriv(), Vmath::Sadd(), Vmath::Sdiv(), Vmath::Smul(), and Vmath::Vvtvp().

Referenced by v_PhysDeriv(), and v_StdPhysDeriv().

137  {
138  boost::ignore_unused(out_d2);
139 
140  int i;
141  int nquad0 = m_base[0]->GetNumPoints();
142  int nquad1 = m_base[1]->GetNumPoints();
143  Array<OneD, NekDouble> wsp(std::max(nquad0, nquad1));
144 
145  const Array<OneD, const NekDouble>& z0 = m_base[0]->GetZ();
146  const Array<OneD, const NekDouble>& z1 = m_base[1]->GetZ();
147 
148  // set up geometric factor: 2/(1-z1)
149  Vmath::Sadd(nquad1, -1.0, z1, 1, wsp, 1);
150  Vmath::Sdiv(nquad1, -2.0, wsp, 1, wsp, 1);
151 
152  if (out_d0.num_elements() > 0)
153  {
154  PhysTensorDeriv(inarray, out_d0, out_d1);
155 
156  for (i = 0; i < nquad1; ++i)
157  {
158  Blas::Dscal(nquad0,wsp[i],&out_d0[0]+i*nquad0,1);
159  }
160 
161  // if no d1 required do not need to calculate both deriv
162  if (out_d1.num_elements() > 0)
163  {
164  // set up geometric factor: (1_z0)/(1-z1)
165  Vmath::Sadd(nquad0, 1.0, z0, 1, wsp, 1);
166  Vmath::Smul(nquad0, 0.5, wsp, 1, wsp, 1);
167 
168  for (i = 0; i < nquad1; ++i)
169  {
170  Vmath::Vvtvp(nquad0,&wsp[0],1,&out_d0[0]+i*nquad0,
171  1,&out_d1[0]+i*nquad0,
172  1,&out_d1[0]+i*nquad0,1);
173  }
174  }
175  }
176  else if (out_d1.num_elements() > 0)
177  {
178  Array<OneD, NekDouble> diff0(nquad0*nquad1);
179  PhysTensorDeriv(inarray, diff0, out_d1);
180 
181  for (i = 0; i < nquad1; ++i)
182  {
183  Blas::Dscal(nquad0,wsp[i],&diff0[0]+i*nquad0,1);
184  }
185 
186  Vmath::Sadd(nquad0, 1.0, z0, 1, wsp, 1);
187  Vmath::Smul(nquad0, 0.5, wsp, 1, wsp, 1);
188 
189  for (i = 0; i < nquad1; ++i)
190  {
191  Vmath::Vvtvp(nquad0,&wsp[0],1,&diff0[0]+i*nquad0,
192  1,&out_d1[0]+i*nquad0,
193  1,&out_d1[0]+i*nquad0,1);
194  }
195  }
196  }
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:445
void Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/y.
Definition: Vmath.cpp:274
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d0, Array< OneD, NekDouble > &outarray_d1)
Calculate the 2D derivative in the local tensor/collapsed coordinate at the physical points...
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
Definition: Vmath.cpp:318
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
Definition: Blas.hpp:125
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_PhysDeriv() [2/2]

void Nektar::StdRegions::StdTriExp::v_PhysDeriv ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out_d0 
)
protectedvirtual

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

See also
StdRegions::StdExpansion::PhysDeriv

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, and Nektar::LocalRegions::TriExp.

Definition at line 198 of file StdTriExp.cpp.

References ASSERTL1, Nektar::NullNekDouble1DArray, and v_PhysDeriv().

202  {
203  switch(dir)
204  {
205  case 0:
206  {
207  v_PhysDeriv(inarray, outarray, NullNekDouble1DArray);
208  break;
209  }
210  case 1:
211  {
212  v_PhysDeriv(inarray, NullNekDouble1DArray, outarray);
213  break;
214  }
215  default:
216  {
217  ASSERTL1(false,"input dir is out of range");
218  break;
219  }
220  }
221  }
static Array< OneD, NekDouble > NullNekDouble1DArray
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)
Calculate the derivative of the physical points.
Definition: StdTriExp.cpp:132
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ v_ReduceOrderCoeffs()

void Nektar::StdRegions::StdTriExp::v_ReduceOrderCoeffs ( int  numMin,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::TriExp.

Definition at line 1503 of file StdTriExp.cpp.

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

1507  {
1508  int n_coeffs = inarray.num_elements();
1509  int nquad0 = m_base[0]->GetNumPoints();
1510  int nquad1 = m_base[1]->GetNumPoints();
1511  Array<OneD, NekDouble> coeff(n_coeffs);
1512  Array<OneD, NekDouble> coeff_tmp(n_coeffs,0.0);
1513  Array<OneD, NekDouble> tmp;
1514  Array<OneD, NekDouble> tmp2;
1515  int nqtot = nquad0*nquad1;
1516  Array<OneD, NekDouble> phys_tmp(nqtot,0.0);
1517 
1518  int nmodes0 = m_base[0]->GetNumModes();
1519  int nmodes1 = m_base[1]->GetNumModes();
1520  int numMin2 = nmodes0;
1521  int i;
1522 
1523  const LibUtilities::PointsKey Pkey0(
1525  const LibUtilities::PointsKey Pkey1(
1527 
1528  LibUtilities::BasisKey b0(m_base[0]->GetBasisType(),nmodes0,Pkey0);
1529  LibUtilities::BasisKey b1(m_base[1]->GetBasisType(),nmodes1,Pkey1);
1530 
1531  LibUtilities::BasisKey bortho0(LibUtilities::eOrtho_A,nmodes0,Pkey0);
1532  LibUtilities::BasisKey bortho1(LibUtilities::eOrtho_B,nmodes1,Pkey1);
1533 
1534  StdRegions::StdTriExpSharedPtr m_OrthoTriExp;
1536 
1538  ::AllocateSharedPtr(b0, b1);
1539  m_OrthoTriExp = MemoryManager<StdRegions::StdTriExp>
1540  ::AllocateSharedPtr(bortho0, bortho1);
1541 
1542  m_TriExp ->BwdTrans(inarray,phys_tmp);
1543  m_OrthoTriExp->FwdTrans(phys_tmp, coeff);
1544 
1545  for (i = 0; i < n_coeffs; i++)
1546  {
1547  if (i == numMin)
1548  {
1549  coeff[i] = 0.0;
1550  numMin += numMin2 - 1;
1551  numMin2 -= 1.0;
1552  }
1553  }
1554 
1555  m_OrthoTriExp->BwdTrans(coeff,phys_tmp);
1556  m_TriExp ->FwdTrans(phys_tmp, outarray);
1557 
1558  }
std::shared_ptr< StdTriExp > StdTriExpSharedPtr
Definition: StdTriExp.h:266
Principle Orthogonal Functions .
Definition: BasisType.h:46
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Principle Orthogonal Functions .
Definition: BasisType.h:45
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
Array< OneD, LibUtilities::BasisSharedPtr > m_base
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:51

◆ v_StdPhysDeriv() [1/2]

void Nektar::StdRegions::StdTriExp::v_StdPhysDeriv ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out_d0,
Array< OneD, NekDouble > &  out_d1,
Array< OneD, NekDouble > &  out_d2 = NullNekDouble1DArray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp.

Definition at line 223 of file StdTriExp.cpp.

References v_PhysDeriv().

228  {
229  boost::ignore_unused(out_d2);
230  StdTriExp::v_PhysDeriv(inarray, out_d0, out_d1);
231  }
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)
Calculate the derivative of the physical points.
Definition: StdTriExp.cpp:132

◆ v_StdPhysDeriv() [2/2]

void Nektar::StdRegions::StdTriExp::v_StdPhysDeriv ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 233 of file StdTriExp.cpp.

References v_PhysDeriv().

237  {
238  StdTriExp::v_PhysDeriv(dir,inarray,outarray);
239  }
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)
Calculate the derivative of the physical points.
Definition: StdTriExp.cpp:132

◆ v_SVVLaplacianFilter()

void Nektar::StdRegions::StdTriExp::v_SVVLaplacianFilter ( Array< OneD, NekDouble > &  array,
const StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::TriExp.

Definition at line 1400 of file StdTriExp.cpp.

References Nektar::StdRegions::StdExpansion::BwdTrans(), Nektar::StdRegions::StdMatrixKey::ConstFactorExists(), Nektar::StdRegions::eFactorSVVCutoffRatio, Nektar::StdRegions::eFactorSVVDGKerDiffCoeff, Nektar::StdRegions::eFactorSVVDiffCoeff, Nektar::StdRegions::eFactorSVVPowerKerDiffCoeff, Nektar::LibUtilities::eOrtho_A, Nektar::LibUtilities::eOrtho_B, Nektar::StdRegions::StdExpansion::FwdTrans(), Nektar::StdRegions::StdMatrixKey::GetConstFactor(), Nektar::StdRegions::StdExpansion::GetNcoeffs(), Nektar::StdRegions::StdExpansion::GetPointsType(), Nektar::StdRegions::kSVVDGFilter, Nektar::StdRegions::kSVVDGFiltermodesmax, Nektar::StdRegions::kSVVDGFiltermodesmin, and Nektar::StdRegions::StdExpansion::m_base.

1402  {
1403  int qa = m_base[0]->GetNumPoints();
1404  int qb = m_base[1]->GetNumPoints();
1405  int nmodes_a = m_base[0]->GetNumModes();
1406  int nmodes_b = m_base[1]->GetNumModes();
1407 
1408  // Declare orthogonal basis.
1409  LibUtilities::PointsKey pa(qa,m_base[0]->GetPointsType());
1410  LibUtilities::PointsKey pb(qb,m_base[1]->GetPointsType());
1411 
1412  LibUtilities::BasisKey Ba(LibUtilities::eOrtho_A,nmodes_a,pa);
1413  LibUtilities::BasisKey Bb(LibUtilities::eOrtho_B,nmodes_b,pb);
1414  StdTriExp OrthoExp(Ba,Bb);
1415 
1416  Array<OneD, NekDouble> orthocoeffs(OrthoExp.GetNcoeffs());
1417 
1418  // project onto physical space.
1419  OrthoExp.FwdTrans(array,orthocoeffs);
1420 
1421  if(mkey.ConstFactorExists(eFactorSVVPowerKerDiffCoeff)) // Rodrigo's power kern
1422  {
1423  NekDouble cutoff = mkey.GetConstFactor(eFactorSVVCutoffRatio);
1424  NekDouble SvvDiffCoeff =
1425  mkey.GetConstFactor(eFactorSVVPowerKerDiffCoeff)*
1426  mkey.GetConstFactor(eFactorSVVDiffCoeff);
1427 
1428  int cnt = 0;
1429  for(int j = 0; j < nmodes_a; ++j)
1430  {
1431  for(int k = 0; k < nmodes_b-j; ++k, ++cnt)
1432  {
1433  NekDouble fac = std::max(
1434  pow((1.0*j)/(nmodes_a-1),cutoff*nmodes_a),
1435  pow((1.0*k)/(nmodes_b-1),cutoff*nmodes_b));
1436 
1437  orthocoeffs[cnt] *= (SvvDiffCoeff *fac);
1438  }
1439  }
1440  }
1441  else if(mkey.ConstFactorExists(eFactorSVVDGKerDiffCoeff)) // Rodrigo/mansoor's DG kernel
1442  {
1443  NekDouble SvvDiffCoeff =
1444  mkey.GetConstFactor(eFactorSVVDGKerDiffCoeff)*
1445  mkey.GetConstFactor(eFactorSVVDiffCoeff);
1446  int max_ab = max(nmodes_a-kSVVDGFiltermodesmin,
1447  nmodes_b-kSVVDGFiltermodesmin);
1448  max_ab = max(max_ab,0);
1449  max_ab = min(max_ab,kSVVDGFiltermodesmax-kSVVDGFiltermodesmin);
1450 
1451  int cnt = 0;
1452  for(int j = 0; j < nmodes_a; ++j)
1453  {
1454  for(int k = 0; k < nmodes_b-j; ++k, ++cnt)
1455  {
1456  int maxjk = max(j,k);
1457  maxjk = min(maxjk,kSVVDGFiltermodesmax-1);
1458 
1459  orthocoeffs[cnt] *= SvvDiffCoeff *
1460  kSVVDGFilter[max_ab][maxjk];
1461  }
1462  }
1463  }
1464  else
1465  {
1466  NekDouble SvvDiffCoeff =
1467  mkey.GetConstFactor(eFactorSVVDiffCoeff);
1468 
1469  int cutoff = (int) (mkey.GetConstFactor(eFactorSVVCutoffRatio)*
1470  min(nmodes_a,nmodes_b));
1471 
1472  NekDouble epsilon = 1.0;
1473  int nmodes = min(nmodes_a,nmodes_b);
1474 
1475  int cnt = 0;
1476 
1477  // apply SVV filter (JEL)
1478  for(int j = 0; j < nmodes_a; ++j)
1479  {
1480  for(int k = 0; k < nmodes_b-j; ++k)
1481  {
1482  if(j + k >= cutoff)
1483  {
1484  orthocoeffs[cnt] *= (SvvDiffCoeff
1485  *exp(-(j+k-nmodes)*(j+k-nmodes)
1486  /((NekDouble)((j+k-cutoff+epsilon)
1487  *(j+k-cutoff+epsilon)))));
1488  }
1489  else
1490  {
1491  orthocoeffs[cnt] *= 0.0;
1492  }
1493  cnt++;
1494  }
1495  }
1496 
1497  }
1498 
1499  // backward transform to physical space
1500  OrthoExp.BwdTrans(orthocoeffs,array);
1501  }
const int kSVVDGFiltermodesmax
Definition: StdRegions.hpp:385
const int kSVVDGFiltermodesmin
Definition: StdRegions.hpp:384
Principle Orthogonal Functions .
Definition: BasisType.h:46
Principle Orthogonal Functions .
Definition: BasisType.h:45
double NekDouble
const NekDouble kSVVDGFilter[9][11]
Definition: StdRegions.hpp:387
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:215
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_WeakDerivMatrixOp()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Reimplemented in Nektar::LocalRegions::NodalTriExp, Nektar::LocalRegions::TriExp, and Nektar::StdRegions::StdNodalTriExp.

Definition at line 1382 of file StdTriExp.cpp.

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

1387  {
1388  StdExpansion::WeakDerivMatrixOp_MatFree(i,inarray,outarray,mkey);
1389  }
void WeakDerivMatrixOp_MatFree(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)