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

#include <TriExp.h>

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

Public Member Functions

 TriExp (const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const SpatialDomains::TriGeomSharedPtr &geom)
 Constructor using BasisKey class for quadrature points and order definition. More...
 
 TriExp (const TriExp &T)
 
 ~TriExp ()
 
- Public Member Functions inherited from Nektar::StdRegions::StdTriExp
 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
 
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...
 
boost::shared_ptr< StdExpansionGetStdExp (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)
 
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, const Array< OneD, const 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)
 
DNekScalBlkMatSharedPtr GetLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
void DropLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
StdRegions::Orientation GetForient (int face)
 
StdRegions::Orientation GetEorient (int edge)
 
StdRegions::Orientation GetPorient (int point)
 
StdRegions::Orientation GetCartesianEorient (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)
 
void ExtractDataToCoeffs (const NekDouble *data, const std::vector< unsigned int > &nummodes, const int nmodes_offset, NekDouble *coeffs)
 
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 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)
 
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 boost::shared_ptr< StdExpansion > &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GetTracePhysVals (const int edge, const boost::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 boost::shared_ptr< StdExpansion > &FaceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient=eNoOrientation)
 
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 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...
 
const boost::shared_ptr< SpatialDomains::GeomFactors > & GetMetricInfo (void) const
 
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_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual StdRegions::Orientation v_GetForient (int face)
 
virtual StdRegions::Orientation v_GetPorient (int point)
 
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)
 
void ComputeVertexNormal (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)
 
DNekMatSharedPtr BuildInverseTransformationMatrix (const DNekScalMatSharedPtr &m_transformationmatrix)
 
void PhysInterpToSimplexEquiSpaced (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 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...
 
template<class T >
boost::shared_ptr< T > as ()
 
void IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
 
- Public Member Functions inherited from Nektar::LocalRegions::Expansion2D
 Expansion2D (SpatialDomains::Geometry2DSharedPtr pGeom)
 
virtual ~Expansion2D ()
 
void SetTraceToGeomOrientation (Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &inout)
 
ExpansionSharedPtr GetEdgeExp (int edge, bool SetUpNormal=true)
 
void SetEdgeExp (const int edge, ExpansionSharedPtr &e)
 
void AddNormTraceInt (const int dir, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &edgeCoeffs, Array< OneD, NekDouble > &outarray)
 
void AddNormTraceInt (const int dir, Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &outarray, const StdRegions::VarCoeffMap &varcoeffs)
 
void AddEdgeBoundaryInt (const int edge, ExpansionSharedPtr &EdgeExp, Array< OneD, NekDouble > &edgePhys, Array< OneD, NekDouble > &outarray, const StdRegions::VarCoeffMap &varcoeffs=StdRegions::NullVarCoeffMap)
 
void AddHDGHelmholtzEdgeTerms (const NekDouble tau, const int edge, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, NekDouble > &edgePhys, const StdRegions::VarCoeffMap &dirForcing, Array< OneD, NekDouble > &outarray)
 
void AddHDGHelmholtzTraceTerms (const NekDouble tau, const Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, const StdRegions::VarCoeffMap &dirForcing, Array< OneD, NekDouble > &outarray)
 
Expansion3DSharedPtr GetLeftAdjacentElementExp () const
 
Expansion3DSharedPtr GetRightAdjacentElementExp () const
 
int GetLeftAdjacentElementFace () const
 
int GetRightAdjacentElementFace () const
 
void SetAdjacentElementExp (int face, Expansion3DSharedPtr &f)
 
SpatialDomains::Geometry2DSharedPtr GetGeom2D () const
 
- Public Member Functions inherited from Nektar::LocalRegions::Expansion
 Expansion (SpatialDomains::GeometrySharedPtr pGeom)
 
 Expansion (const Expansion &pSrc)
 
virtual ~Expansion ()
 
DNekScalMatSharedPtr GetLocMatrix (const LocalRegions::MatrixKey &mkey)
 
DNekScalMatSharedPtr GetLocMatrix (const StdRegions::MatrixType mtype, const StdRegions::ConstFactorMap &factors=StdRegions::NullConstFactorMap, const StdRegions::VarCoeffMap &varcoeffs=StdRegions::NullVarCoeffMap)
 
SpatialDomains::GeometrySharedPtr GetGeom () const
 
void Reset ()
 
virtual const SpatialDomains::GeomFactorsSharedPtrv_GetMetricInfo () const
 
DNekMatSharedPtr BuildTransformationMatrix (const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
 
DNekMatSharedPtr BuildVertexMatrix (const DNekScalMatSharedPtr &r_bnd)
 
void AddEdgeNormBoundaryInt (const int edge, const boost::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
void AddEdgeNormBoundaryInt (const int edge, const boost::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
void AddFaceNormBoundaryInt (const int face, const boost::shared_ptr< Expansion > &FaceExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
void DGDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &coeffs, Array< OneD, NekDouble > &outarray)
 

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_PhysDirectionalDeriv (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &direction, Array< OneD, NekDouble > &out)
 Physical derivative along a direction vector. More...
 
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_IProductWRTDerivBase (const int dir, 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_MatOp (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_IProductWRTDerivBase_MatOp (const int dir, const Array< OneD, const NekDouble > &inarray, 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 StdRegions::StdExpansionSharedPtr v_GetStdExp (void) const
 
virtual void v_GetCoord (const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords)
 
virtual void v_GetCoords (Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3)
 
virtual NekDouble v_StdPhysEvaluate (const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals)
 
virtual NekDouble v_PhysEvaluate (const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals)
 This function evaluates the expansion at a single (arbitrary) point of the domain. More...
 
virtual void v_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...
 
virtual void v_GetEdgePhysVals (const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_GetTracePhysVals (const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient)
 
virtual void v_GetEdgeInterpVals (const int edge, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_GetEdgeQFactors (const int edge, Array< OneD, NekDouble > &outarray)
 
virtual void v_ComputeEdgeNormal (const int edge)
 
virtual int v_GetCoordim ()
 
virtual void v_ExtractDataToCoeffs (const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs)
 Unpack data from input file assuming it comes from the same expansion type. More...
 
virtual StdRegions::Orientation v_GetEorient (int edge)
 
virtual StdRegions::Orientation v_GetCartesianEorient (int edge)
 
virtual const LibUtilities::BasisSharedPtrv_GetBasis (int dir) const
 
virtual int v_GetNumPoints (const int dir) const
 
virtual DNekMatSharedPtr v_GenMatrix (const StdRegions::StdMatrixKey &mkey)
 
virtual DNekMatSharedPtr v_CreateStdMatrix (const StdRegions::StdMatrixKey &mkey)
 
virtual DNekScalMatSharedPtr CreateMatrix (const MatrixKey &mkey)
 
virtual DNekScalBlkMatSharedPtr CreateStaticCondMatrix (const MatrixKey &mkey)
 
virtual DNekScalMatSharedPtr v_GetLocMatrix (const MatrixKey &mkey)
 
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix (const MatrixKey &mkey)
 
void v_DropLocStaticCondMatrix (const MatrixKey &mkey)
 
virtual void v_MassMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_LaplacianMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_LaplacianMatrixOp (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_WeakDerivMatrixOp (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_WeakDirectionalDerivMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_MassLevelCurvatureMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_HelmholtzMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_GeneralMatrixOp_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_LaplacianMatrixOp_MatFree_Kernel (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp)
 
virtual void v_ReduceOrderCoeffs (int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_ComputeLaplacianMetric ()
 
virtual void v_SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey)
 
- Protected Member Functions inherited from Nektar::StdRegions::StdTriExp
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_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_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 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)
 
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 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, 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)
 
- 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 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)
 
- Protected Member Functions inherited from Nektar::LocalRegions::Expansion2D
virtual void v_DGDeriv (const int dir, const Array< OneD, const NekDouble > &incoeffs, Array< OneD, ExpansionSharedPtr > &EdgeExp, Array< OneD, Array< OneD, NekDouble > > &edgeCoeffs, Array< OneD, NekDouble > &out_d)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const ExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const ExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddRobinMassMatrix (const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat)
 
virtual void v_AddRobinEdgeContribution (const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, Array< OneD, NekDouble > &coeffs)
 
virtual DNekMatSharedPtr v_BuildVertexMatrix (const DNekScalMatSharedPtr &r_bnd)
 
void GetPhysEdgeVarCoeffsFromElement (const int edge, ExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &varcoeff, Array< OneD, NekDouble > &outarray)
 
Array< OneD, unsigned int > v_GetEdgeInverseBoundaryMap (int eid)
 
virtual void v_NegateEdgeNormal (const int edge)
 
virtual bool v_EdgeNormalNegated (const int edge)
 
virtual void v_SetUpPhysNormals (const int edge)
 
const StdRegions::NormalVectorv_GetEdgeNormal (const int edge) const
 
const StdRegions::NormalVectorv_GetSurfaceNormal (const int id) const
 
- Protected Member Functions inherited from Nektar::LocalRegions::Expansion
void ComputeLaplacianMetric ()
 
void ComputeQuadratureMetric ()
 
virtual void v_MultiplyByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual DNekMatSharedPtr v_BuildTransformationMatrix (const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const boost::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const boost::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddFaceNormBoundaryInt (const int face, const boost::shared_ptr< Expansion > &FaceExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 

Private Member Functions

 TriExp ()
 

Private Attributes

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

Additional Inherited Members

- Protected Attributes inherited from Nektar::StdRegions::StdExpansion
Array< OneD, LibUtilities::BasisSharedPtrm_base
 
int m_elmt_id
 
int m_ncoeffs
 
LibUtilities::NekManager< StdMatrixKey, DNekMat, StdMatrixKey::opLessm_stdMatrixManager
 
LibUtilities::NekManager< StdMatrixKey, DNekBlkMat, StdMatrixKey::opLessm_stdStaticCondMatrixManager
 
LibUtilities::NekManager< IndexMapKey, IndexMapValues, IndexMapKey::opLessm_IndexMapManager
 
- Protected Attributes inherited from Nektar::LocalRegions::Expansion2D
std::vector< ExpansionWeakPtrm_edgeExp
 
std::vector< bool > m_requireNeg
 
std::map< int, StdRegions::NormalVectorm_edgeNormals
 
std::map< int, bool > m_negatedNormals
 
Expansion3DWeakPtr m_elementLeft
 
Expansion3DWeakPtr m_elementRight
 
int m_elementFaceLeft
 
int m_elementFaceRight
 
- Protected Attributes inherited from Nektar::LocalRegions::Expansion
SpatialDomains::GeometrySharedPtr m_geom
 
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
 
MetricMap m_metrics
 

Detailed Description

Definition at line 51 of file TriExp.h.

Constructor & Destructor Documentation

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

Constructor using BasisKey class for quadrature points and order definition.

Definition at line 46 of file TriExp.cpp.

48  :
49  StdExpansion (LibUtilities::StdTriData::getNumberOfCoefficients(Ba.GetNumModes(),(Bb.GetNumModes())),2,Ba,Bb),
50  StdExpansion2D(LibUtilities::StdTriData::getNumberOfCoefficients(Ba.GetNumModes(),(Bb.GetNumModes())),Ba,Bb),
51  StdTriExp(Ba,Bb),
52  Expansion (geom),
53  Expansion2D (geom),
55  boost::bind(&TriExp::CreateMatrix, this, _1),
56  std::string("TriExpMatrix")),
58  boost::bind(&TriExp::CreateStaticCondMatrix, this, _1),
59  std::string("TriExpStaticCondMatrix"))
60  {
61  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:276
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: TriExp.h:277
Expansion(SpatialDomains::GeometrySharedPtr pGeom)
Definition: Expansion.cpp:46
virtual DNekScalBlkMatSharedPtr CreateStaticCondMatrix(const MatrixKey &mkey)
Definition: TriExp.cpp:1270
int getNumberOfCoefficients(int Na, int Nb)
Definition: ShapeType.hpp:111
Expansion2D(SpatialDomains::Geometry2DSharedPtr pGeom)
Definition: Expansion2D.cpp:47
StdExpansion()
Default Constructor.
virtual DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
Definition: TriExp.cpp:1003
Nektar::LocalRegions::TriExp::TriExp ( const TriExp T)

Definition at line 64 of file TriExp.cpp.

64  :
65  StdExpansion(T),
66  StdExpansion2D(T),
67  StdTriExp(T),
68  Expansion(T),
69  Expansion2D(T),
70  m_matrixManager(T.m_matrixManager),
71  m_staticCondMatrixManager(T.m_staticCondMatrixManager)
72  {
73  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:276
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: TriExp.h:277
Expansion(SpatialDomains::GeometrySharedPtr pGeom)
Definition: Expansion.cpp:46
Expansion2D(SpatialDomains::Geometry2DSharedPtr pGeom)
Definition: Expansion2D.cpp:47
StdExpansion()
Default Constructor.
Nektar::LocalRegions::TriExp::~TriExp ( )

Definition at line 76 of file TriExp.cpp.

77  {
78  }
Nektar::LocalRegions::TriExp::TriExp ( )
private

Member Function Documentation

DNekScalMatSharedPtr Nektar::LocalRegions::TriExp::CreateMatrix ( const MatrixKey mkey)
protectedvirtual

Definition at line 1003 of file TriExp.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL2, Nektar::LocalRegions::Expansion::BuildVertexMatrix(), Nektar::StdRegions::StdMatrixKey::ConstFactorExists(), Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::eFactorLambda, Nektar::StdRegions::eFactorSVVCutoffRatio, Nektar::StdRegions::eHelmholtz, Nektar::StdRegions::eHybridDGHelmholtz, Nektar::StdRegions::eInvHybridDGHelmholtz, Nektar::StdRegions::eInvLaplacianWithUnityMean, Nektar::StdRegions::eInvMass, Nektar::StdRegions::eIProductWRTBase, Nektar::StdRegions::eIProductWRTDerivBase0, Nektar::StdRegions::eIProductWRTDerivBase1, Nektar::StdRegions::eIProductWRTDerivBase2, Nektar::StdRegions::eLaplacian, Nektar::StdRegions::eLaplacian00, Nektar::StdRegions::eLaplacian01, Nektar::StdRegions::eLaplacian11, Nektar::StdRegions::eMass, Nektar::SpatialDomains::eNoGeomType, Nektar::StdRegions::ePreconLinearSpace, Nektar::StdRegions::eWeakDeriv0, Nektar::StdRegions::eWeakDeriv1, Nektar::StdRegions::eWeakDeriv2, Nektar::StdRegions::StdExpansion::GenMatrix(), Nektar::StdRegions::StdMatrixKey::GetConstFactor(), Nektar::StdRegions::StdMatrixKey::GetConstFactors(), Nektar::StdRegions::StdExpansion::GetLocStaticCondMatrix(), Nektar::StdRegions::StdMatrixKey::GetMatrixType(), Nektar::StdRegions::StdMatrixKey::GetNVarCoeff(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdMatrixKey::GetShapeType(), Nektar::StdRegions::StdExpansion::GetStdMatrix(), Nektar::StdRegions::StdMatrixKey::GetVarCoeffs(), m_matrixManager, Nektar::LocalRegions::Expansion::m_metricinfo, and Nektar::Transpose().

1004  {
1005  DNekScalMatSharedPtr returnval;
1007 
1008  ASSERTL2(m_metricinfo->GetGtype() != SpatialDomains::eNoGeomType,"Geometric information is not set up");
1009 
1010  switch(mkey.GetMatrixType())
1011  {
1012  case StdRegions::eMass:
1013  {
1014  if((m_metricinfo->GetGtype() == SpatialDomains::eDeformed)||
1015  (mkey.GetNVarCoeff()))
1016  {
1017  NekDouble one = 1.0;
1018  DNekMatSharedPtr mat = GenMatrix(mkey);
1019  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1020  }
1021  else
1022  {
1023  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1024  DNekMatSharedPtr mat = GetStdMatrix(mkey);
1025  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,mat);
1026  }
1027  }
1028  break;
1029  case StdRegions::eInvMass:
1030  {
1031  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1032  {
1033  NekDouble one = 1.0;
1034  StdRegions::StdMatrixKey masskey(StdRegions::eMass,DetShapeType(),
1035  *this);
1036  DNekMatSharedPtr mat = GenMatrix(masskey);
1037  mat->Invert();
1038 
1039  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1040  }
1041  else
1042  {
1043  NekDouble fac = 1.0/(m_metricinfo->GetJac(ptsKeys))[0];
1044  DNekMatSharedPtr mat = GetStdMatrix(mkey);
1045  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(fac,mat);
1046 
1047  }
1048  }
1049  break;
1053  {
1054  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed || mkey.GetNVarCoeff())
1055  {
1056  NekDouble one = 1.0;
1057  DNekMatSharedPtr mat = GenMatrix(mkey);
1058 
1059  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1060  }
1061  else
1062  {
1063  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1064  Array<TwoD, const NekDouble> df = m_metricinfo->GetDerivFactors(ptsKeys);
1065  int dir = 0;
1066  switch(mkey.GetMatrixType())
1067  {
1069  dir = 0;
1070  break;
1072  dir = 1;
1073  break;
1075  dir = 2;
1076  break;
1077  default:
1078  break;
1079  }
1080 
1081  MatrixKey deriv0key(StdRegions::eWeakDeriv0,
1082  mkey.GetShapeType(), *this);
1083  MatrixKey deriv1key(StdRegions::eWeakDeriv1,
1084  mkey.GetShapeType(), *this);
1085 
1086  DNekMat &deriv0 = *GetStdMatrix(deriv0key);
1087  DNekMat &deriv1 = *GetStdMatrix(deriv1key);
1088 
1089  int rows = deriv0.GetRows();
1090  int cols = deriv1.GetColumns();
1091 
1093  (*WeakDeriv) = df[2*dir][0]*deriv0 + df[2*dir+1][0]*deriv1;
1094 
1095  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,WeakDeriv);
1096  }
1097  }
1098  break;
1100  {
1101  if( (m_metricinfo->GetGtype() == SpatialDomains::eDeformed) ||
1102  (mkey.GetNVarCoeff() > 0)||(mkey.ConstFactorExists(StdRegions::eFactorSVVCutoffRatio)))
1103  {
1104  NekDouble one = 1.0;
1105  DNekMatSharedPtr mat = GenMatrix(mkey);
1106 
1107  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1108  }
1109  else
1110  {
1111  MatrixKey lap00key(StdRegions::eLaplacian00,
1112  mkey.GetShapeType(), *this);
1113  MatrixKey lap01key(StdRegions::eLaplacian01,
1114  mkey.GetShapeType(), *this);
1115  MatrixKey lap11key(StdRegions::eLaplacian11,
1116  mkey.GetShapeType(), *this);
1117 
1118  DNekMat &lap00 = *GetStdMatrix(lap00key);
1119  DNekMat &lap01 = *GetStdMatrix(lap01key);
1120  DNekMat &lap11 = *GetStdMatrix(lap11key);
1121 
1122  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1123  Array<TwoD, const NekDouble> gmat =
1124  m_metricinfo->GetGmat(ptsKeys);
1125 
1126  int rows = lap00.GetRows();
1127  int cols = lap00.GetColumns();
1128 
1130 
1131  (*lap) = gmat[0][0] * lap00 +
1132  gmat[1][0] * (lap01 + Transpose(lap01)) +
1133  gmat[3][0] * lap11;
1134 
1135  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,lap);
1136  }
1137  }
1138  break;
1140  {
1141  DNekMatSharedPtr mat = GenMatrix(mkey);
1142  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(1.0,mat);
1143  }
1144  break;
1146  {
1147  NekDouble factor = mkey.GetConstFactor(StdRegions::eFactorLambda);
1148 
1149  MatrixKey masskey(mkey, StdRegions::eMass);
1150  DNekScalMat &MassMat = *(this->m_matrixManager[masskey]);
1151 
1152  MatrixKey lapkey(mkey, StdRegions::eLaplacian);
1153  DNekScalMat &LapMat = *(this->m_matrixManager[lapkey]);
1154 
1155  int rows = LapMat.GetRows();
1156  int cols = LapMat.GetColumns();
1157 
1159 
1160  NekDouble one = 1.0;
1161  (*helm) = LapMat + factor*MassMat;
1162 
1163  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,helm);
1164  }
1165  break;
1167  {
1168  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1169  {
1170  NekDouble one = 1.0;
1171  DNekMatSharedPtr mat = GenMatrix(mkey);
1172  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1173  }
1174  else
1175  {
1176  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1177  DNekMatSharedPtr mat = GetStdMatrix(mkey);
1178  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,mat);
1179  }
1180  }
1181  break;
1185  {
1186  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1187  {
1188  NekDouble one = 1.0;
1189  DNekMatSharedPtr mat = GenMatrix(mkey);
1190  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1191  }
1192  else
1193  {
1194  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1195 
1196  const Array<TwoD, const NekDouble>& df = m_metricinfo->GetDerivFactors(ptsKeys);
1197  int dir = 0;
1198 
1199  switch(mkey.GetMatrixType())
1200  {
1202  dir = 0;
1203  break;
1205  dir = 1;
1206  break;
1208  dir = 2;
1209  break;
1210  default:
1211  break;
1212  }
1213 
1214  MatrixKey iProdDeriv0Key(StdRegions::eIProductWRTDerivBase0,
1215  mkey.GetShapeType(), *this);
1216  MatrixKey iProdDeriv1Key(StdRegions::eIProductWRTDerivBase1,
1217  mkey.GetShapeType(), *this);
1218 
1219  DNekMat &stdiprod0 = *GetStdMatrix(iProdDeriv0Key);
1220  DNekMat &stdiprod1 = *GetStdMatrix(iProdDeriv0Key);
1221 
1222  int rows = stdiprod0.GetRows();
1223  int cols = stdiprod1.GetColumns();
1224 
1226  (*mat) = df[2*dir][0]*stdiprod0 + df[2*dir+1][0]*stdiprod1;
1227 
1228  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,mat);
1229  }
1230  }
1231  break;
1232 
1234  {
1235  NekDouble one = 1.0;
1236 
1237  MatrixKey hkey(StdRegions::eHybridDGHelmholtz, DetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1238 
1239  DNekMatSharedPtr mat = GenMatrix(hkey);
1240 
1241  mat->Invert();
1242  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1243  }
1244  break;
1246  {
1247  NekDouble one = 1.0;
1248  MatrixKey helmkey(StdRegions::eHelmholtz, mkey.GetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1249  DNekScalBlkMatSharedPtr helmStatCond = GetLocStaticCondMatrix(helmkey);
1250  DNekScalMatSharedPtr A =helmStatCond->GetBlock(0,0);
1252 
1254  }
1255  break;
1256  default:
1257  {
1258  NekDouble one = 1.0;
1259  DNekMatSharedPtr mat = GenMatrix(mkey);
1260 
1261  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1262  }
1263  break;
1264  }
1265 
1266  return returnval;
1267  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:276
const LibUtilities::PointsKeyVector GetPointsKeys() const
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:454
DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey)
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:220
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
DNekMatSharedPtr BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd)
Definition: Expansion.cpp:96
DNekScalBlkMatSharedPtr GetLocStaticCondMatrix(const LocalRegions::MatrixKey &mkey)
Definition: StdExpansion.h:721
boost::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:70
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:684
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
boost::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:74
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)
NekMatrix< NekDouble, StandardMatrixTag > DNekMat
Definition: NekTypeDefs.hpp:52
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:213
Geometry is curved or has non-constant factors.
NekMatrix< NekMatrix< NekDouble, StandardMatrixTag >, ScaledMatrixTag > DNekScalMat
DNekScalBlkMatSharedPtr Nektar::LocalRegions::TriExp::CreateStaticCondMatrix ( const MatrixKey mkey)
protectedvirtual

Definition at line 1270 of file TriExp.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL2, Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::eMass, Nektar::SpatialDomains::eNoGeomType, Nektar::StdRegions::StdExpansion::GetBoundaryMap(), Nektar::StdRegions::StdExpansion::GetInteriorMap(), Nektar::LocalRegions::Expansion::GetLocMatrix(), Nektar::StdRegions::StdMatrixKey::GetMatrixType(), Nektar::StdRegions::StdMatrixKey::GetNVarCoeff(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::GetStdStaticCondMatrix(), Nektar::LocalRegions::Expansion::m_metricinfo, Nektar::StdRegions::StdExpansion::m_ncoeffs, and Nektar::StdRegions::StdExpansion::NumBndryCoeffs().

1271  {
1272  DNekScalBlkMatSharedPtr returnval;
1274 
1275  ASSERTL2(m_metricinfo->GetGtype() != SpatialDomains::eNoGeomType,"Geometric information is not set up");
1276 
1277  // set up block matrix system
1278  unsigned int nbdry = NumBndryCoeffs();
1279  unsigned int nint = (unsigned int)(m_ncoeffs - nbdry);
1280  unsigned int exp_size[] = {nbdry,nint};
1281  unsigned int nblks = 2;
1282  returnval = MemoryManager<DNekScalBlkMat>::AllocateSharedPtr(nblks,nblks,exp_size,exp_size); //Really need a constructor which takes Arrays
1283  NekDouble factor = 1.0;
1284 
1285  switch(mkey.GetMatrixType())
1286  {
1287  // this can only use stdregions statically condensed system for mass matrix
1288  case StdRegions::eMass:
1289  if((m_metricinfo->GetGtype() == SpatialDomains::eDeformed)||(mkey.GetNVarCoeff()))
1290  {
1291  factor = 1.0;
1292  goto UseLocRegionsMatrix;
1293  }
1294  else
1295  {
1296  factor = (m_metricinfo->GetJac(ptsKeys))[0];
1297  goto UseStdRegionsMatrix;
1298  }
1299  break;
1300  default: // use Deformed case for both regular and deformed geometries
1301  factor = 1.0;
1302  goto UseLocRegionsMatrix;
1303  break;
1304  UseStdRegionsMatrix:
1305  {
1306  NekDouble invfactor = 1.0/factor;
1307  NekDouble one = 1.0;
1309  DNekScalMatSharedPtr Atmp;
1310  DNekMatSharedPtr Asubmat;
1311 
1312  returnval->SetBlock(0,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,Asubmat = mat->GetBlock(0,0)));
1313  returnval->SetBlock(0,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,Asubmat = mat->GetBlock(0,1)));
1314  returnval->SetBlock(1,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,Asubmat = mat->GetBlock(1,0)));
1315  returnval->SetBlock(1,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(invfactor,Asubmat = mat->GetBlock(1,1)));
1316  }
1317  break;
1318 
1319  UseLocRegionsMatrix:
1320  {
1321  int i,j;
1322  NekDouble invfactor = 1.0/factor;
1323  NekDouble one = 1.0;
1324 
1325  DNekScalMat &mat = *GetLocMatrix(mkey);
1326 
1331 
1332  Array<OneD,unsigned int> bmap(nbdry);
1333  Array<OneD,unsigned int> imap(nint);
1334  GetBoundaryMap(bmap);
1335  GetInteriorMap(imap);
1336 
1337  for(i = 0; i < nbdry; ++i)
1338  {
1339  for(j = 0; j < nbdry; ++j)
1340  {
1341  (*A)(i,j) = mat(bmap[i],bmap[j]);
1342  }
1343 
1344  for(j = 0; j < nint; ++j)
1345  {
1346  (*B)(i,j) = mat(bmap[i],imap[j]);
1347  }
1348  }
1349 
1350  for(i = 0; i < nint; ++i)
1351  {
1352  for(j = 0; j < nbdry; ++j)
1353  {
1354  (*C)(i,j) = mat(imap[i],bmap[j]);
1355  }
1356 
1357  for(j = 0; j < nint; ++j)
1358  {
1359  (*D)(i,j) = mat(imap[i],imap[j]);
1360  }
1361  }
1362 
1363  // Calculate static condensed system
1364  if(nint)
1365  {
1366  D->Invert();
1367  (*B) = (*B)*(*D);
1368  (*A) = (*A) - (*B)*(*C);
1369  }
1370 
1371  DNekScalMatSharedPtr Atmp;
1372 
1373  returnval->SetBlock(0,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,A));
1374  returnval->SetBlock(0,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,B));
1375  returnval->SetBlock(1,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,C));
1376  returnval->SetBlock(1,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(invfactor,D));
1377 
1378  }
1379  }
1380 
1381  return returnval;
1382  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:220
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
boost::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:70
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
DNekBlkMatSharedPtr GetStdStaticCondMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:689
boost::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:74
void GetInteriorMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:795
double NekDouble
boost::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
Definition: NekTypeDefs.hpp:72
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
Definition: Expansion.cpp:83
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:213
Geometry is curved or has non-constant factors.
NekMatrix< NekMatrix< NekDouble, StandardMatrixTag >, ScaledMatrixTag > DNekScalMat
void GetBoundaryMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:790
void Nektar::LocalRegions::TriExp::v_ComputeEdgeNormal ( const int  edge)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 738 of file TriExp.cpp.

References ASSERTL0, Nektar::StdRegions::eBackwards, Nektar::SpatialDomains::eDeformed, Nektar::SpatialDomains::eMovingRegular, Nektar::SpatialDomains::eRegular, Vmath::Fill(), Nektar::StdRegions::StdExpansion::GetCoordim(), Nektar::StdRegions::StdExpansion::GetEorient(), Nektar::LocalRegions::Expansion::GetGeom(), Nektar::LibUtilities::PointsKey::GetNumPoints(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::LibUtilities::Interp1D(), Nektar::StdRegions::StdExpansion::m_base, Nektar::LocalRegions::Expansion2D::m_edgeNormals, Vmath::Reverse(), Vmath::Sdiv(), Vmath::Smul(), Vmath::Vmul(), Vmath::Vsqrt(), Vmath::Vvtvp(), and Vmath::Zero().

739  {
740  int i;
741  const SpatialDomains::GeomFactorsSharedPtr & geomFactors = GetGeom()->GetMetricInfo();
743  const SpatialDomains::GeomType type = geomFactors->GetGtype();
744  const Array<TwoD, const NekDouble> & df = geomFactors->GetDerivFactors(ptsKeys);
745  const Array<OneD, const NekDouble> & jac = geomFactors->GetJac(ptsKeys);
746  int nqe = m_base[0]->GetNumPoints();
747  int dim = GetCoordim();
748 
749  m_edgeNormals[edge] = Array<OneD, Array<OneD, NekDouble> >(dim);
750  Array<OneD, Array<OneD, NekDouble> > &normal = m_edgeNormals[edge];
751  for (i = 0; i < dim; ++i)
752  {
753  normal[i] = Array<OneD, NekDouble>(nqe);
754  }
755 
756  // Regular geometry case
758  {
759  NekDouble fac;
760  // Set up normals
761  switch(edge)
762  {
763  case 0:
764  for(i = 0; i < GetCoordim(); ++i)
765  {
766  Vmath::Fill(nqe,-df[2*i+1][0],normal[i],1);
767  }
768  break;
769  case 1:
770  for(i = 0; i < GetCoordim(); ++i)
771  {
772  Vmath::Fill(nqe,df[2*i+1][0] + df[2*i][0],normal[i],1);
773  }
774  break;
775  case 2:
776  for(i = 0; i < GetCoordim(); ++i)
777  {
778  Vmath::Fill(nqe,-df[2*i][0],normal[i],1);
779  }
780  break;
781  default:
782  ASSERTL0(false,"Edge is out of range (edge < 3)");
783  }
784 
785  // normalise
786  fac = 0.0;
787  for(i =0 ; i < GetCoordim(); ++i)
788  {
789  fac += normal[i][0]*normal[i][0];
790  }
791  fac = 1.0/sqrt(fac);
792  for (i = 0; i < GetCoordim(); ++i)
793  {
794  Vmath::Smul(nqe,fac,normal[i],1,normal[i],1);
795  }
796  }
797  else // Set up deformed normals
798  {
799  int j;
800 
801  int nquad0 = ptsKeys[0].GetNumPoints();
802  int nquad1 = ptsKeys[1].GetNumPoints();
803 
804  LibUtilities::PointsKey from_key;
805 
806  Array<OneD,NekDouble> normals(GetCoordim()*max(nquad0,nquad1),0.0);
807  Array<OneD,NekDouble> edgejac(GetCoordim()*max(nquad0,nquad1),0.0);
808 
809  // Extract Jacobian along edges and recover local
810  // derivates (dx/dr) for polynomial interpolation by
811  // multiplying m_gmat by jacobian
812  switch(edge)
813  {
814  case 0:
815  for(j = 0; j < nquad0; ++j)
816  {
817  edgejac[j] = jac[j];
818  for(i = 0; i < GetCoordim(); ++i)
819  {
820  normals[i*nquad0+j] = -df[2*i+1][j]*edgejac[j];
821  }
822  }
823  from_key = ptsKeys[0];
824  break;
825  case 1:
826  for(j = 0; j < nquad1; ++j)
827  {
828  edgejac[j] = jac[nquad0*j+nquad0-1];
829  for(i = 0; i < GetCoordim(); ++i)
830  {
831  normals[i*nquad1+j] = (df[2*i][nquad0*j + nquad0-1] + df[2*i+1][nquad0*j + nquad0-1])*edgejac[j];
832  }
833  }
834  from_key = ptsKeys[1];
835  break;
836  case 2:
837  for(j = 0; j < nquad1; ++j)
838  {
839  edgejac[j] = jac[nquad0*j];
840  for(i = 0; i < GetCoordim(); ++i)
841  {
842  normals[i*nquad1+j] = -df[2*i][nquad0*j]*edgejac[j];
843  }
844  }
845  from_key = ptsKeys[1];
846  break;
847  default:
848  ASSERTL0(false,"edge is out of range (edge < 3)");
849 
850  }
851 
852  int nq = from_key.GetNumPoints();
853  Array<OneD,NekDouble> work(nqe,0.0);
854 
855  // interpolate Jacobian and invert
856  LibUtilities::Interp1D(from_key,jac,m_base[0]->GetPointsKey(),work);
857  Vmath::Sdiv(nq,1.0,&work[0],1,&work[0],1);
858 
859  // interpolate
860  for(i = 0; i < GetCoordim(); ++i)
861  {
862  LibUtilities::Interp1D(from_key,&normals[i*nq],m_base[0]->GetPointsKey(),&normal[i][0]);
863  Vmath::Vmul(nqe,work,1,normal[i],1,normal[i],1);
864  }
865 
866  //normalise normal vectors
867  Vmath::Zero(nqe,work,1);
868  for(i = 0; i < GetCoordim(); ++i)
869  {
870  Vmath::Vvtvp(nqe,normal[i],1, normal[i],1,work,1,work,1);
871  }
872 
873  Vmath::Vsqrt(nqe,work,1,work,1);
874  Vmath::Sdiv(nqe,1.0,work,1,work,1);
875 
876  for(i = 0; i < GetCoordim(); ++i)
877  {
878  Vmath::Vmul(nqe,normal[i],1,work,1,normal[i],1);
879  }
880 
881  // Reverse direction so that points are in
882  // anticlockwise direction if edge >=2
883  if(edge >= 2)
884  {
885  for(i = 0; i < GetCoordim(); ++i)
886  {
887  Vmath::Reverse(nqe,normal[i],1, normal[i],1);
888  }
889  }
890  }
892  {
893  for(i = 0; i < GetCoordim(); ++i)
894  {
895  if(geomFactors->GetGtype() == SpatialDomains::eDeformed)
896  {
897  Vmath::Reverse(nqe, normal[i], 1, normal[i],1);
898  }
899  }
900  }
901  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:220
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
Definition: Vmath.cpp:394
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:46
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:428
std::map< int, StdRegions::NormalVector > m_edgeNormals
Definition: Expansion2D.h:124
StdRegions::Orientation GetEorient(int edge)
Definition: StdExpansion.h:736
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:257
void Reverse(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1062
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:199
double NekDouble
SpatialDomains::GeometrySharedPtr GetGeom() const
Definition: Expansion.cpp:148
boost::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
Definition: GeomFactors.h:62
Geometry is straight-sided with constant geometric factors.
void Interp1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
this function interpolates a 1D function evaluated at the quadrature points of the basis fbasis0 to ...
Definition: Interp.cpp:54
GeomType
Indicates the type of element geometry.
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:359
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:169
void Nektar::LocalRegions::TriExp::v_ComputeLaplacianMetric ( )
protectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1536 of file TriExp.cpp.

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

1537  {
1538  if (m_metrics.count(eMetricQuadrature) == 0)
1539  {
1541  }
1542 
1543  unsigned int i, j;
1544  const SpatialDomains::GeomType type = m_metricinfo->GetGtype();
1545  const unsigned int nqtot = GetTotPoints();
1546  const unsigned int dim = 2;
1550  };
1551 
1552  Array<OneD, NekDouble> dEta_dXi[2] = {Array<OneD, NekDouble>(nqtot,1.0),
1553  Array<OneD, NekDouble>(nqtot,1.0)};
1554 
1555  for (i = 0; i < dim; ++i)
1556  {
1557  for (j = i; j < dim; ++j)
1558  {
1559  m_metrics[m[i][j]] = Array<OneD, NekDouble>(nqtot);
1560  }
1561  }
1562 
1563  const Array<OneD, const NekDouble>& z0 = m_base[0]->GetZ();
1564  const Array<OneD, const NekDouble>& z1 = m_base[1]->GetZ();
1565  const unsigned int nquad0 = m_base[0]->GetNumPoints();
1566  const unsigned int nquad1 = m_base[1]->GetNumPoints();
1567  const Array<TwoD, const NekDouble>& df =
1568  m_metricinfo->GetDerivFactors(GetPointsKeys());
1569 
1570  for(i = 0; i < nquad1; i++)
1571  {
1572  Blas::Dscal(nquad0,2.0/(1-z1[i]),&dEta_dXi[0][0]+i*nquad0,1);
1573  Blas::Dscal(nquad0,2.0/(1-z1[i]),&dEta_dXi[1][0]+i*nquad0,1);
1574  }
1575  for(i = 0; i < nquad0; i++)
1576  {
1577  Blas::Dscal(nquad1,0.5*(1+z0[i]),&dEta_dXi[1][0]+i,nquad0);
1578  }
1579 
1580  Array<OneD, NekDouble> tmp(nqtot);
1581  if((type == SpatialDomains::eRegular ||
1583  {
1584  Vmath::Smul (nqtot,df[0][0],&dEta_dXi[0][0],1,&tmp[0],1);
1585  Vmath::Svtvp(nqtot,df[1][0],&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1586 
1587  Vmath::Vmul (nqtot,&tmp[0],1, &tmp[0],1,&m_metrics[eMetricLaplacian00][0],1);
1588  Vmath::Smul (nqtot,df[1][0],&tmp[0],1,&m_metrics[eMetricLaplacian01][0],1);
1589 
1590 
1591  Vmath::Smul (nqtot,df[2][0],&dEta_dXi[0][0],1,&tmp[0],1);
1592  Vmath::Svtvp(nqtot,df[3][0],&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1593 
1594  Vmath::Vvtvp(nqtot,&tmp[0],1, &tmp[0],1,&m_metrics[eMetricLaplacian00][0],1,&m_metrics[eMetricLaplacian00][0],1);
1595  Vmath::Svtvp(nqtot,df[3][0],&tmp[0],1,&m_metrics[eMetricLaplacian01][0],1,&m_metrics[eMetricLaplacian01][0],1);
1596 
1597  if(GetCoordim() == 3)
1598  {
1599  Vmath::Smul (nqtot,df[4][0],&dEta_dXi[0][0],1,&tmp[0],1);
1600  Vmath::Svtvp(nqtot,df[5][0],&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1601 
1602  Vmath::Vvtvp(nqtot,&tmp[0],1, &tmp[0],1,&m_metrics[eMetricLaplacian00][0],1,&m_metrics[eMetricLaplacian00][0],1);
1603  Vmath::Svtvp(nqtot,df[5][0],&tmp[0],1,&m_metrics[eMetricLaplacian01][0],1,&m_metrics[eMetricLaplacian01][0],1);
1604  }
1605 
1606  NekDouble g2 = df[1][0]*df[1][0] + df[3][0]*df[3][0];
1607  if(GetCoordim() == 3)
1608  {
1609  g2 += df[5][0]*df[5][0];
1610  }
1611  Vmath::Fill(nqtot,g2,&m_metrics[eMetricLaplacian11][0],1);
1612  }
1613  else
1614  {
1615 
1616  Vmath::Vmul (nqtot,&df[0][0],1,&dEta_dXi[0][0],1,&tmp[0],1);
1617  Vmath::Vvtvp(nqtot,&df[1][0],1,&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1618 
1619  Vmath::Vmul (nqtot,&tmp[0], 1,&tmp[0], 1,&m_metrics[eMetricLaplacian00][0],1);
1620  Vmath::Vmul (nqtot,&df[1][0],1,&tmp[0], 1,&m_metrics[eMetricLaplacian01][0],1);
1621  Vmath::Vmul (nqtot,&df[1][0],1,&df[1][0],1,&m_metrics[eMetricLaplacian11][0],1);
1622 
1623 
1624  Vmath::Vmul (nqtot,&df[2][0],1,&dEta_dXi[0][0],1,&tmp[0],1);
1625  Vmath::Vvtvp(nqtot,&df[3][0],1,&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1626 
1627  Vmath::Vvtvp(nqtot,&tmp[0], 1,&tmp[0], 1,&m_metrics[eMetricLaplacian00][0],1,&m_metrics[eMetricLaplacian00][0],1);
1628  Vmath::Vvtvp(nqtot,&df[3][0],1,&tmp[0], 1,&m_metrics[eMetricLaplacian01][0],1,&m_metrics[eMetricLaplacian01][0],1);
1629  Vmath::Vvtvp(nqtot,&df[3][0],1,&df[3][0],1,&m_metrics[eMetricLaplacian11][0],1,&m_metrics[eMetricLaplacian11][0],1);
1630 
1631  if(GetCoordim() == 3)
1632  {
1633  Vmath::Vmul (nqtot,&df[4][0],1,&dEta_dXi[0][0],1,&tmp[0],1);
1634  Vmath::Vvtvp(nqtot,&df[5][0],1,&dEta_dXi[1][0],1,&tmp[0],1,&tmp[0],1);
1635 
1636  Vmath::Vvtvp(nqtot,&tmp[0], 1,&tmp[0], 1,&m_metrics[eMetricLaplacian00][0],1,&m_metrics[eMetricLaplacian00][0],1);
1637  Vmath::Vvtvp(nqtot,&df[5][0],1,&tmp[0], 1,&m_metrics[eMetricLaplacian01][0],1,&m_metrics[eMetricLaplacian01][0],1);
1638  Vmath::Vvtvp(nqtot,&df[5][0],1,&df[5][0],1,&m_metrics[eMetricLaplacian11][0],1,&m_metrics[eMetricLaplacian11][0],1);
1639  }
1640  }
1641 
1642  for (unsigned int i = 0; i < dim; ++i)
1643  {
1644  for (unsigned int j = i; j < dim; ++j)
1645  {
1647  m_metrics[m[i][j]]);
1648 
1649  }
1650  }
1651  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:902
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:46
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
Definition: Vmath.cpp:471
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:428
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:141
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:199
double NekDouble
Geometry is straight-sided with constant geometric factors.
GeomType
Indicates the type of element geometry.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
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:169
DNekMatSharedPtr Nektar::LocalRegions::TriExp::v_CreateStdMatrix ( const StdRegions::StdMatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 992 of file TriExp.cpp.

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

993  {
994  LibUtilities::BasisKey bkey0 = m_base[0]->GetBasisKey();
995  LibUtilities::BasisKey bkey1 = m_base[1]->GetBasisKey();
997  AllocateSharedPtr(bkey0,bkey1);
998 
999  return tmp->GetStdMatrix(mkey);
1000  }
boost::shared_ptr< StdTriExp > StdTriExpSharedPtr
Definition: StdTriExp.h:266
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Nektar::LocalRegions::TriExp::v_DropLocStaticCondMatrix ( const MatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1396 of file TriExp.cpp.

References m_staticCondMatrixManager.

1397  {
1398  m_staticCondMatrixManager.DeleteObject(mkey);
1399  }
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: TriExp.h:277
void Nektar::LocalRegions::TriExp::v_ExtractDataToCoeffs ( const NekDouble data,
const std::vector< unsigned int > &  nummodes,
const int  nmode_offset,
NekDouble coeffs 
)
protectedvirtual

Unpack data from input file assuming it comes from the same expansion type.

See also
StdExpansion::ExtractDataToCoeffs

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 909 of file TriExp.cpp.

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

911  {
912  int data_order0 = nummodes[mode_offset];
913  int fillorder0 = min(m_base[0]->GetNumModes(),data_order0);
914  int data_order1 = nummodes[mode_offset+1];
915  int order1 = m_base[1]->GetNumModes();
916  int fillorder1 = min(order1,data_order1);
917 
918  switch(m_base[0]->GetBasisType())
919  {
921  {
922  int i;
923  int cnt = 0;
924  int cnt1 = 0;
925 
927  "Extraction routine not set up for this basis");
928 
929  Vmath::Zero(m_ncoeffs,coeffs,1);
930  for(i = 0; i < fillorder0; ++i)
931  {
932  Vmath::Vcopy(fillorder1-i,&data[cnt],1,&coeffs[cnt1],1);
933  cnt += data_order1-i;
934  cnt1 += order1-i;
935  }
936  }
937  break;
938  default:
939  ASSERTL0(false,"basis is either not set up or not hierarchicial");
940  }
941  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
Principle Modified Functions .
Definition: BasisType.h:49
Principle Modified Functions .
Definition: BasisType.h:50
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:165
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:359
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:191
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1038
void Nektar::LocalRegions::TriExp::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

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 244 of file TriExp.cpp.

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

246  {
247  IProductWRTBase(inarray,outarray);
248 
249  // get Mass matrix inverse
250  MatrixKey masskey(StdRegions::eInvMass,
251  DetShapeType(),*this);
252  DNekScalMatSharedPtr matsys = m_matrixManager[masskey];
253 
254  // copy inarray in case inarray == outarray
255  NekVector<NekDouble> in (m_ncoeffs,outarray,eCopy);
256  NekVector<NekDouble> out(m_ncoeffs,outarray,eWrapper);
257 
258  out = (*matsys)*in;
259  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:276
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:454
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
this function calculates the inner product of a given function f with the different modes of the expa...
Definition: StdExpansion.h:613
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
void Nektar::LocalRegions::TriExp::v_FwdTrans_BndConstrained ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 262 of file TriExp.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::StdRegions::eBackwards, Nektar::StdRegions::eMass, Nektar::StdRegions::StdExpansion::GetEdgeToElementMap(), Nektar::StdRegions::StdExpansion::GetEorient(), Nektar::LocalRegions::Expansion2D::GetGeom2D(), Nektar::StdRegions::StdExpansion::GetInteriorMap(), Nektar::StdRegions::StdExpansion::IProductWRTBase(), Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion::m_ncoeffs, m_staticCondMatrixManager, Nektar::StdRegions::StdExpansion::MassMatrixOp(), Nektar::StdRegions::StdExpansion::NumBndryCoeffs(), sign, and Vmath::Vsub().

264  {
265  int i,j;
266  int npoints[2] = {m_base[0]->GetNumPoints(),
267  m_base[1]->GetNumPoints()};
268  int nmodes[2] = {m_base[0]->GetNumModes(),
269  m_base[1]->GetNumModes()};
270 
271  fill(outarray.get(), outarray.get()+m_ncoeffs, 0.0 );
272 
273  Array<OneD, NekDouble> physEdge[3];
274  Array<OneD, NekDouble> coeffEdge[3];
275  StdRegions::Orientation orient[3];
276  for(i = 0; i < 3; i++)
277  {
278  physEdge[i] = Array<OneD, NekDouble>(npoints[i!=0]);
279  coeffEdge[i] = Array<OneD, NekDouble>(nmodes[i!=0]);
280  orient[i] = GetEorient(i);
281  }
282 
283  for(i = 0; i < npoints[0]; i++)
284  {
285  physEdge[0][i] = inarray[i];
286  }
287 
288  for(i = 0; i < npoints[1]; i++)
289  {
290  physEdge[1][i] = inarray[npoints[0]-1+i*npoints[0]];
291  physEdge[2][i] = inarray[(npoints[1]-1)*npoints[0]-i*npoints[0]];
292  }
293 
294  for(i = 0; i < 3; i++)
295  {
296  if( orient[i] == StdRegions::eBackwards )
297  {
298  reverse( (physEdge[i]).get() , (physEdge[i]).get() + npoints[i!=0] );
299  }
300  }
301 
302  SegExpSharedPtr segexp[3];
303  for(i = 0; i < 3; i++)
304  {
305  segexp[i] = MemoryManager<LocalRegions::SegExp>::AllocateSharedPtr(m_base[i!=0]->GetBasisKey(),GetGeom2D()->GetEdge(i));
306  }
307 
308  Array<OneD, unsigned int> mapArray;
309  Array<OneD, int> signArray;
310  NekDouble sign;
311 
312  for(i = 0; i < 3; i++)
313  {
314  segexp[i!=0]->FwdTrans_BndConstrained(physEdge[i],coeffEdge[i]);
315 
316  GetEdgeToElementMap(i,orient[i],mapArray,signArray);
317  for(j=0; j < nmodes[i!=0]; j++)
318  {
319  sign = (NekDouble) signArray[j];
320  outarray[ mapArray[j] ] = sign * coeffEdge[i][j];
321  }
322  }
323 
324  int nBoundaryDofs = NumBndryCoeffs();
325  int nInteriorDofs = m_ncoeffs - nBoundaryDofs;
326 
327  if (nInteriorDofs > 0) {
328  Array<OneD, NekDouble> tmp0(m_ncoeffs);
329  Array<OneD, NekDouble> tmp1(m_ncoeffs);
330 
331  StdRegions::StdMatrixKey stdmasskey(StdRegions::eMass,DetShapeType(),*this);
332  MassMatrixOp(outarray,tmp0,stdmasskey);
333  IProductWRTBase(inarray,tmp1);
334 
335  Vmath::Vsub(m_ncoeffs, tmp1, 1, tmp0, 1, tmp1, 1);
336 
337  // get Mass matrix inverse (only of interior DOF)
338  // use block (1,1) of the static condensed system
339  // note: this block alreay contains the inverse matrix
340  MatrixKey masskey(StdRegions::eMass,DetShapeType(),*this);
341  DNekScalMatSharedPtr matsys = (m_staticCondMatrixManager[masskey])->GetBlock(1,1);
342 
343  Array<OneD, NekDouble> rhs(nInteriorDofs);
344  Array<OneD, NekDouble> result(nInteriorDofs);
345 
346  GetInteriorMap(mapArray);
347 
348  for(i = 0; i < nInteriorDofs; i++)
349  {
350  rhs[i] = tmp1[ mapArray[i] ];
351  }
352 
353  Blas::Dgemv('N', nInteriorDofs, nInteriorDofs, matsys->Scale(), &((matsys->GetOwnedMatrix())->GetPtr())[0],
354  nInteriorDofs,rhs.get(),1,0.0,result.get(),1);
355 
356  for(i = 0; i < nInteriorDofs; i++)
357  {
358  outarray[ mapArray[i] ] = result[i];
359  }
360  }
361  }
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:454
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Definition: StdExpansion.h:931
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: TriExp.h:277
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
#define sign(a, b)
return the sign(b)*a
Definition: Polylib.cpp:22
void GetEdgeToElementMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
Definition: StdExpansion.h:820
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
this function calculates the inner product of a given function f with the different modes of the expa...
Definition: StdExpansion.h:613
StdRegions::Orientation GetEorient(int edge)
Definition: StdExpansion.h:736
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
boost::shared_ptr< SegExp > SegExpSharedPtr
Definition: SegExp.h:255
SpatialDomains::Geometry2DSharedPtr GetGeom2D() const
Definition: Expansion2D.h:231
void GetInteriorMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:795
double NekDouble
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:329
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Nektar::LocalRegions::TriExp::v_GeneralMatrixOp_MatOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1461 of file TriExp.cpp.

References Nektar::LocalRegions::Expansion::GetLocMatrix(), Nektar::StdRegions::StdExpansion::m_ncoeffs, and Vmath::Vcopy().

1464  {
1465  DNekScalMatSharedPtr mat = GetLocMatrix(mkey);
1466 
1467  if(inarray.get() == outarray.get())
1468  {
1469  Array<OneD,NekDouble> tmp(m_ncoeffs);
1470  Vmath::Vcopy(m_ncoeffs,inarray.get(),1,tmp.get(),1);
1471 
1472  Blas::Dgemv('N',m_ncoeffs,m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1473  m_ncoeffs, tmp.get(), 1, 0.0, outarray.get(), 1);
1474  }
1475  else
1476  {
1477  Blas::Dgemv('N',m_ncoeffs,m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1478  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
1479  }
1480  }
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
Definition: Expansion.cpp:83
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1038
DNekMatSharedPtr Nektar::LocalRegions::TriExp::v_GenMatrix ( const StdRegions::StdMatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 969 of file TriExp.cpp.

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

970  {
971  DNekMatSharedPtr returnval;
972  switch(mkey.GetMatrixType())
973  {
981  returnval = Expansion2D::v_GenMatrix(mkey);
982  break;
983  default:
984  returnval = StdTriExp::v_GenMatrix(mkey);
985  break;
986  }
987 
988  return returnval;
989  }
boost::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:70
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey)
const LibUtilities::BasisSharedPtr & Nektar::LocalRegions::TriExp::v_GetBasis ( int  dir) const
protectedvirtual

Definition at line 956 of file TriExp.cpp.

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

957  {
958  ASSERTL1(dir >= 0 &&dir <= 1,"input dir is out of range");
959  return m_base[dir];
960  }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:191
Array< OneD, LibUtilities::BasisSharedPtr > m_base
StdRegions::Orientation Nektar::LocalRegions::TriExp::v_GetCartesianEorient ( int  edge)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 950 of file TriExp.cpp.

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

951  {
952  return GetGeom2D()->GetCartesianEorient(edge);
953  }
SpatialDomains::Geometry2DSharedPtr GetGeom2D() const
Definition: Expansion2D.h:231
void Nektar::LocalRegions::TriExp::v_GetCoord ( const Array< OneD, const NekDouble > &  Lcoords,
Array< OneD, NekDouble > &  coords 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 564 of file TriExp.cpp.

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

566  {
567  int i;
568 
569  ASSERTL1(Lcoords[0] >= -1.0 && Lcoords[1] <= 1.0 &&
570  Lcoords[1] >= -1.0 && Lcoords[1] <=1.0,
571  "Local coordinates are not in region [-1,1]");
572 
573  m_geom->FillGeom();
574 
575  for(i = 0; i < m_geom->GetCoordim(); ++i)
576  {
577  coords[i] = m_geom->GetCoord(i,Lcoords);
578  }
579  }
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:125
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:191
int Nektar::LocalRegions::TriExp::v_GetCoordim ( void  )
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion2D.

Definition at line 903 of file TriExp.cpp.

References Nektar::LocalRegions::Expansion::m_geom.

904  {
905  return m_geom->GetCoordim();
906  }
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:125
void Nektar::LocalRegions::TriExp::v_GetCoords ( Array< OneD, NekDouble > &  coords_1,
Array< OneD, NekDouble > &  coords_2,
Array< OneD, NekDouble > &  coords_3 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 581 of file TriExp.cpp.

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

585  {
586  Expansion::v_GetCoords(coords_0, coords_1, coords_2);
587  }
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3)
Definition: Expansion.cpp:211
void Nektar::LocalRegions::TriExp::v_GetEdgeInterpVals ( const int  edge,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 721 of file TriExp.cpp.

References ASSERTL0.

724  {
725  ASSERTL0(false,
726  "Routine not implemented for triangular elements");
727  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
void Nektar::LocalRegions::TriExp::v_GetEdgePhysVals ( const int  edge,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Extract the physical values along edge edge from inarray into outarray following the local edge orientation and point distribution defined by defined in EdgeExp.

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 624 of file TriExp.cpp.

References ASSERTL0, Nektar::StdRegions::eForwards, Nektar::StdRegions::StdExpansion::GetEorient(), Nektar::StdRegions::StdExpansion::m_base, and Vmath::Vcopy().

Referenced by v_GetTracePhysVals().

628  {
629  int nquad0 = m_base[0]->GetNumPoints();
630  int nquad1 = m_base[1]->GetNumPoints();
631 
632  StdRegions::Orientation edgedir = GetEorient(edge);
633  switch(edge)
634  {
635  case 0:
636  if (edgedir == StdRegions::eForwards)
637  {
638  Vmath::Vcopy(nquad0,&(inarray[0]),1,&(outarray[0]),1);
639  }
640  else
641  {
642  Vmath::Vcopy(nquad0,&(inarray[0])+(nquad0-1),-1,
643  &(outarray[0]),1);
644  }
645  break;
646  case 1:
647  if (edgedir == StdRegions::eForwards)
648  {
649  Vmath::Vcopy(nquad1,&(inarray[0])+(nquad0-1),nquad0,
650  &(outarray[0]),1);
651  }
652  else
653  {
654  Vmath::Vcopy(nquad1,&(inarray[0])+(nquad0*nquad1-1),
655  -nquad0, &(outarray[0]),1);
656  }
657  break;
658  case 2:
659  if (edgedir == StdRegions::eForwards)
660  {
661  Vmath::Vcopy(nquad1,&(inarray[0]) + nquad0*(nquad1-1),
662  -nquad0,&(outarray[0]),1);
663  }
664  else
665  {
666  Vmath::Vcopy(nquad1,&(inarray[0]),nquad0,
667  &(outarray[0]),1);
668  }
669  break;
670  default:
671  ASSERTL0(false,"edge value (< 3) is out of range");
672  break;
673  }
674  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
StdRegions::Orientation GetEorient(int edge)
Definition: StdExpansion.h:736
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1038
void Nektar::LocalRegions::TriExp::v_GetEdgePhysVals ( const int  edge,
const StdRegions::StdExpansionSharedPtr EdgeExp,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Definition at line 676 of file TriExp.cpp.

References ASSERTL0, Nektar::StdRegions::eBackwards, Nektar::StdRegions::StdExpansion::GetCartesianEorient(), Nektar::LibUtilities::Interp1D(), Nektar::StdRegions::StdExpansion::m_base, Vmath::Reverse(), and Vmath::Vcopy().

679  {
680  int nquad0 = m_base[0]->GetNumPoints();
681  int nquad1 = m_base[1]->GetNumPoints();
682 
683  // get points in Cartesian orientation
684  switch(edge)
685  {
686  case 0:
687  Vmath::Vcopy(nquad0,&(inarray[0]),1,&(outarray[0]),1);
688  break;
689  case 1:
690  Vmath::Vcopy(nquad1,&(inarray[0])+(nquad0-1),nquad0,&(outarray[0]),1);
691  break;
692  case 2:
693  Vmath::Vcopy(nquad1,&(inarray[0]),nquad0,&(outarray[0]),1);
694  break;
695  default:
696  ASSERTL0(false,"edge value (< 3) is out of range");
697  break;
698  }
699 
700  // Interpolate if required
701  if(m_base[edge?1:0]->GetPointsKey() != EdgeExp->GetBasis(0)->GetPointsKey())
702  {
703  Array<OneD,NekDouble> outtmp(max(nquad0,nquad1));
704 
705  outtmp = outarray;
706 
707  LibUtilities::Interp1D(m_base[edge?1:0]->GetPointsKey(),outtmp,
708  EdgeExp->GetBasis(0)->GetPointsKey(),outarray);
709  }
710 
711  //Reverse data if necessary
713  {
714  Vmath::Reverse(EdgeExp->GetNumPoints(0),&outarray[0],1,
715  &outarray[0],1);
716  }
717 
718  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
StdRegions::Orientation GetCartesianEorient(int edge)
Definition: StdExpansion.h:746
void Reverse(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1062
void Interp1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
this function interpolates a 1D function evaluated at the quadrature points of the basis fbasis0 to ...
Definition: Interp.cpp:54
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1038
void Nektar::LocalRegions::TriExp::v_GetEdgeQFactors ( const int  edge,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 729 of file TriExp.cpp.

References ASSERTL0.

732  {
733  ASSERTL0(false,
734  "Routine not implemented for triangular elements");
735  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
StdRegions::Orientation Nektar::LocalRegions::TriExp::v_GetEorient ( int  edge)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 944 of file TriExp.cpp.

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

945  {
946  return GetGeom2D()->GetEorient(edge);
947  }
SpatialDomains::Geometry2DSharedPtr GetGeom2D() const
Definition: Expansion2D.h:231
DNekScalMatSharedPtr Nektar::LocalRegions::TriExp::v_GetLocMatrix ( const MatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1385 of file TriExp.cpp.

References m_matrixManager.

1386  {
1387  return m_matrixManager[mkey];
1388  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:276
DNekScalBlkMatSharedPtr Nektar::LocalRegions::TriExp::v_GetLocStaticCondMatrix ( const MatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1391 of file TriExp.cpp.

References m_staticCondMatrixManager.

1392  {
1393  return m_staticCondMatrixManager[mkey];
1394  }
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: TriExp.h:277
int Nektar::LocalRegions::TriExp::v_GetNumPoints ( const int  dir) const
protectedvirtual

Definition at line 963 of file TriExp.cpp.

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

964  {
965  return GetNumPoints(dir);
966  }
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:229
StdRegions::StdExpansionSharedPtr Nektar::LocalRegions::TriExp::v_GetStdExp ( void  ) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 556 of file TriExp.cpp.

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

557  {
558 
560  ::AllocateSharedPtr(m_base[0]->GetBasisKey(),
561  m_base[1]->GetBasisKey());
562  }
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Nektar::LocalRegions::TriExp::v_GetTracePhysVals ( const int  edge,
const StdRegions::StdExpansionSharedPtr EdgeExp,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
StdRegions::Orientation  orient 
)
protectedvirtual

Definition at line 614 of file TriExp.cpp.

References v_GetEdgePhysVals().

620  {
621  v_GetEdgePhysVals(edge,EdgeExp,inarray,outarray);
622  }
virtual void v_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 orien...
Definition: TriExp.cpp:624
void Nektar::LocalRegions::TriExp::v_HelmholtzMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1453 of file TriExp.cpp.

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

1456  {
1457  TriExp::HelmholtzMatrixOp_MatFree(inarray,outarray,mkey);
1458  }
void HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
NekDouble Nektar::LocalRegions::TriExp::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::StdTriExp.

Definition at line 82 of file TriExp.cpp.

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

83  {
84  int nquad0 = m_base[0]->GetNumPoints();
85  int nquad1 = m_base[1]->GetNumPoints();
86  Array<OneD, const NekDouble> jac = m_metricinfo->GetJac(GetPointsKeys());
87  NekDouble ival;
88  Array<OneD,NekDouble> tmp(nquad0*nquad1);
89 
90  // multiply inarray with Jacobian
91  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
92  {
93  Vmath::Vmul(nquad0*nquad1, jac, 1, inarray, 1,tmp, 1);
94  }
95  else
96  {
97  Vmath::Smul(nquad0*nquad1, jac[0], inarray, 1, tmp, 1);
98  }
99 
100  // call StdQuadExp version;
101  ival = StdTriExp::v_Integral(tmp);
102  return ival;
103  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
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:199
double NekDouble
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:169
void Nektar::LocalRegions::TriExp::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.

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 364 of file TriExp.cpp.

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

366  {
367  IProductWRTBase_SumFac(inarray,outarray);
368  }
void IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
void Nektar::LocalRegions::TriExp::v_IProductWRTBase_MatOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 405 of file TriExp.cpp.

References Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::StdRegions::eIProductWRTBase, Nektar::StdRegions::StdExpansion::GetTotPoints(), m_matrixManager, and Nektar::StdRegions::StdExpansion::m_ncoeffs.

407  {
408  int nq = GetTotPoints();
409  MatrixKey iprodmatkey(StdRegions::eIProductWRTBase,DetShapeType(),*this);
410  DNekScalMatSharedPtr iprodmat = m_matrixManager[iprodmatkey];
411 
412  Blas::Dgemv('N',m_ncoeffs,nq,iprodmat->Scale(),(iprodmat->GetOwnedMatrix())->GetPtr().get(),
413  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
414 
415  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:276
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:454
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:141
void Nektar::LocalRegions::TriExp::v_IProductWRTBase_SumFac ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
bool  multiplybyweights = true 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 379 of file TriExp.cpp.

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

382  {
383  int nquad0 = m_base[0]->GetNumPoints();
384  int nquad1 = m_base[1]->GetNumPoints();
385  int order0 = m_base[0]->GetNumModes();
386 
387  if(multiplybyweights)
388  {
389  Array<OneD,NekDouble> tmp(nquad0*nquad1+nquad1*order0);
390  Array<OneD,NekDouble> wsp(tmp+nquad0*nquad1);
391 
392  MultiplyByQuadratureMetric(inarray,tmp);
393  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),m_base[1]->GetBdata(),tmp,outarray,wsp);
394  }
395  else
396  {
397  Array<OneD,NekDouble> wsp(+nquad1*order0);
398 
399  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),m_base[1]->GetBdata(),
400  inarray,outarray,wsp);
401  }
402  }
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:902
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
void Nektar::LocalRegions::TriExp::v_IProductWRTDerivBase ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 371 of file TriExp.cpp.

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

374  {
375  IProductWRTDerivBase_SumFac(dir,inarray,outarray);
376  }
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void Nektar::LocalRegions::TriExp::v_IProductWRTDerivBase_MatOp ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 488 of file TriExp.cpp.

References ASSERTL1, Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::StdRegions::eIProductWRTDerivBase0, Nektar::StdRegions::eIProductWRTDerivBase1, Nektar::StdRegions::eIProductWRTDerivBase2, Nektar::StdRegions::StdExpansion::GetTotPoints(), m_matrixManager, and Nektar::StdRegions::StdExpansion::m_ncoeffs.

491  {
492  int nq = GetTotPoints();
494 
495  switch(dir)
496  {
497  case 0:
498  {
500  }
501  break;
502  case 1:
503  {
505  }
506  break;
507  case 2:
508  {
510  }
511  break;
512  default:
513  {
514  ASSERTL1(false,"input dir is out of range");
515  }
516  break;
517  }
518 
519  MatrixKey iprodmatkey(mtype,DetShapeType(),*this);
520  DNekScalMatSharedPtr iprodmat = m_matrixManager[iprodmatkey];
521 
522  Blas::Dgemv('N',m_ncoeffs,nq,iprodmat->Scale(),(iprodmat->GetOwnedMatrix())->GetPtr().get(),
523  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
524 
525  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TriExp.h:276
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:454
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:141
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:191
void Nektar::LocalRegions::TriExp::v_IProductWRTDerivBase_SumFac ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 418 of file TriExp.cpp.

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

421  {
422  ASSERTL1((dir==0)||(dir==1)||(dir==2),"Invalid direction.");
423  ASSERTL1((dir==2)?(m_geom->GetCoordim()==3):true,"Invalid direction.");
424 
425  int i;
426  int nquad0 = m_base[0]->GetNumPoints();
427  int nquad1 = m_base[1]->GetNumPoints();
428  int nqtot = nquad0*nquad1;
429  int nmodes0 = m_base[0]->GetNumModes();
430  int wspsize = max(max(nqtot,m_ncoeffs),nquad1*nmodes0);
431 
432  const Array<TwoD, const NekDouble>& df =
433  m_metricinfo->GetDerivFactors(GetPointsKeys());
434 
435  Array<OneD, NekDouble> tmp0 (6*wspsize);
436  Array<OneD, NekDouble> tmp1 (tmp0 + wspsize);
437  Array<OneD, NekDouble> tmp2 (tmp0 + 2*wspsize);
438  Array<OneD, NekDouble> tmp3 (tmp0 + 3*wspsize);
439  Array<OneD, NekDouble> gfac0(tmp0 + 4*wspsize);
440  Array<OneD, NekDouble> gfac1(tmp0 + 5*wspsize);
441 
442  const Array<OneD, const NekDouble>& z0 = m_base[0]->GetZ();
443  const Array<OneD, const NekDouble>& z1 = m_base[1]->GetZ();
444 
445  // set up geometric factor: 2/(1-z1)
446  for(i = 0; i < nquad1; ++i)
447  {
448  gfac0[i] = 2.0/(1-z1[i]);
449  }
450  for(i = 0; i < nquad0; ++i)
451  {
452  gfac1[i] = 0.5*(1+z0[i]);
453  }
454 
455  for(i = 0; i < nquad1; ++i)
456  {
457  Vmath::Smul(nquad0,gfac0[i],&inarray[0]+i*nquad0,1,&tmp0[0]+i*nquad0,1);
458  }
459 
460  for(i = 0; i < nquad1; ++i)
461  {
462  Vmath::Vmul(nquad0,&gfac1[0],1,&tmp0[0]+i*nquad0,1,&tmp1[0]+i*nquad0,1);
463  }
464 
465  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
466  {
467  Vmath::Vmul(nqtot,&df[2*dir][0], 1,&tmp0[0], 1,&tmp0[0],1);
468  Vmath::Vmul(nqtot,&df[2*dir+1][0],1,&tmp1[0], 1,&tmp1[0],1);
469  Vmath::Vmul(nqtot,&df[2*dir+1][0],1,&inarray[0],1,&tmp2[0],1);
470  }
471  else
472  {
473  Vmath::Smul(nqtot, df[2*dir][0], tmp0, 1, tmp0, 1);
474  Vmath::Smul(nqtot, df[2*dir+1][0], tmp1, 1, tmp1, 1);
475  Vmath::Smul(nqtot, df[2*dir+1][0], inarray, 1, tmp2, 1);
476  }
477  Vmath::Vadd(nqtot, tmp0, 1, tmp1, 1, tmp1, 1);
478 
479  MultiplyByQuadratureMetric(tmp1,tmp1);
480  MultiplyByQuadratureMetric(tmp2,tmp2);
481 
482  IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(),m_base[1]->GetBdata() ,tmp1,tmp3 ,tmp0);
483  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata() ,m_base[1]->GetDbdata(),tmp2,outarray,tmp0);
484  Vmath::Vadd(m_ncoeffs, tmp3, 1, outarray, 1, outarray, 1);
485  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:902
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:125
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:199
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:191
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
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:285
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:169
void Nektar::LocalRegions::TriExp::v_LaplacianMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1411 of file TriExp.cpp.

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

1414  {
1415  TriExp::LaplacianMatrixOp_MatFree(inarray,outarray,mkey);
1416  }
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
void Nektar::LocalRegions::TriExp::v_LaplacianMatrixOp ( const int  k1,
const int  k2,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1419 of file TriExp.cpp.

1423  {
1424  StdExpansion::LaplacianMatrixOp_MatFree(k1,k2,inarray,outarray,mkey);
1425  }
void Nektar::LocalRegions::TriExp::v_LaplacianMatrixOp_MatFree_Kernel ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
Array< OneD, NekDouble > &  wsp 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1483 of file TriExp.cpp.

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

1487  {
1488  if (m_metrics.count(eMetricLaplacian00) == 0)
1489  {
1491  }
1492 
1493  int nquad0 = m_base[0]->GetNumPoints();
1494  int nquad1 = m_base[1]->GetNumPoints();
1495  int nqtot = nquad0*nquad1;
1496  int nmodes0 = m_base[0]->GetNumModes();
1497  int nmodes1 = m_base[1]->GetNumModes();
1498  int wspsize = max(max(max(nqtot,m_ncoeffs),nquad1*nmodes0),nquad0*nmodes1);
1499 
1500  ASSERTL1(wsp.num_elements() >= 3*wspsize,
1501  "Workspace is of insufficient size.");
1502 
1503  const Array<OneD, const NekDouble>& base0 = m_base[0]->GetBdata();
1504  const Array<OneD, const NekDouble>& base1 = m_base[1]->GetBdata();
1505  const Array<OneD, const NekDouble>& dbase0 = m_base[0]->GetDbdata();
1506  const Array<OneD, const NekDouble>& dbase1 = m_base[1]->GetDbdata();
1507  const Array<OneD, const NekDouble>& metric00 = m_metrics[eMetricLaplacian00];
1508  const Array<OneD, const NekDouble>& metric01 = m_metrics[eMetricLaplacian01];
1509  const Array<OneD, const NekDouble>& metric11 = m_metrics[eMetricLaplacian11];
1510 
1511  // Allocate temporary storage
1512  Array<OneD,NekDouble> wsp0(wsp);
1513  Array<OneD,NekDouble> wsp1(wsp+wspsize);
1514  Array<OneD,NekDouble> wsp2(wsp+2*wspsize);
1515 
1516  StdExpansion2D::PhysTensorDeriv(inarray,wsp1,wsp2);
1517 
1518  // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1519  // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1520  // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
1521  // especially for this purpose
1522  Vmath::Vvtvvtp(nqtot,&metric00[0],1,&wsp1[0],1,&metric01[0],1,&wsp2[0],1,&wsp0[0],1);
1523  Vmath::Vvtvvtp(nqtot,&metric01[0],1,&wsp1[0],1,&metric11[0],1,&wsp2[0],1,&wsp2[0],1);
1524 
1525  // outarray = m = (D_xi1 * B)^T * k
1526  // wsp1 = n = (D_xi2 * B)^T * l
1527  IProductWRTBase_SumFacKernel(dbase0,base1,wsp0,outarray,wsp1);
1528  IProductWRTBase_SumFacKernel(base0,dbase1,wsp2,wsp1, wsp0);
1529 
1530  // outarray = outarray + wsp1
1531  // = L * u_hat
1532  Vmath::Vadd(m_ncoeffs,wsp1.get(),1,outarray.get(),1,outarray.get(),1);
1533  }
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
Definition: Vmath.cpp:523
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:191
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:285
void Nektar::LocalRegions::TriExp::v_MassLevelCurvatureMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1445 of file TriExp.cpp.

1448  {
1449  StdExpansion::MassLevelCurvatureMatrixOp_MatFree(inarray,outarray,mkey);
1450  }
void Nektar::LocalRegions::TriExp::v_MassMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1403 of file TriExp.cpp.

1406  {
1407  StdExpansion::MassMatrixOp_MatFree(inarray,outarray,mkey);
1408  }
void Nektar::LocalRegions::TriExp::v_NormVectorIProductWRTBase ( const Array< OneD, const NekDouble > &  Fx,
const Array< OneD, const NekDouble > &  Fy,
const Array< OneD, const NekDouble > &  Fz,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 527 of file TriExp.cpp.

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

532  {
533  int nq = m_base[0]->GetNumPoints()*m_base[1]->GetNumPoints();
534  Array<OneD, NekDouble > Fn(nq);
535 
536  const Array<OneD, const Array<OneD, NekDouble> > &normals =
537  GetLeftAdjacentElementExp()->GetFaceNormal(
539 
540  if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
541  {
542  Vmath::Vvtvvtp(nq,&normals[0][0],1,&Fx[0],1,
543  &normals[1][0],1,&Fy[0],1,&Fn[0],1);
544  Vmath::Vvtvp (nq,&normals[2][0],1,&Fz[0],1,&Fn[0],1,&Fn[0],1);
545  }
546  else
547  {
548  Vmath::Svtsvtp(nq,normals[0][0],&Fx[0],1,
549  normals[1][0],&Fy[0],1,&Fn[0],1);
550  Vmath::Svtvp (nq,normals[2][0],&Fz[0],1,&Fn[0],1,&Fn[0],1);
551  }
552 
553  IProductWRTBase(Fn,outarray);
554  }
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
this function calculates the inner product of a given function f with the different modes of the expa...
Definition: StdExpansion.h:613
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
Definition: Vmath.cpp:471
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:428
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
Expansion3DSharedPtr GetLeftAdjacentElementExp() const
Definition: Expansion2D.h:193
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
Definition: Vmath.cpp:523
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
vvtvvtp (scalar times vector plus scalar times vector):
Definition: Vmath.cpp:577
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
void Nektar::LocalRegions::TriExp::v_PhysDeriv ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out_d0,
Array< OneD, NekDouble > &  out_d1,
Array< OneD, NekDouble > &  out_d2 = NullNekDouble1DArray 
)
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::StdTriExp.

Definition at line 106 of file TriExp.cpp.

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

110  {
111  int nquad0 = m_base[0]->GetNumPoints();
112  int nquad1 = m_base[1]->GetNumPoints();
113  int nqtot = nquad0*nquad1;
114  const Array<TwoD, const NekDouble>& df
115  = m_metricinfo->GetDerivFactors(GetPointsKeys());
116 
117  Array<OneD,NekDouble> diff0(2*nqtot);
118  Array<OneD,NekDouble> diff1(diff0+nqtot);
119 
120  StdTriExp::v_PhysDeriv(inarray, diff0, diff1);
121 
122  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
123  {
124  if(out_d0.num_elements())
125  {
126  Vmath::Vmul (nqtot,df[0],1,diff0,1, out_d0, 1);
127  Vmath::Vvtvp (nqtot,df[1],1,diff1,1, out_d0, 1, out_d0,1);
128  }
129 
130  if(out_d1.num_elements())
131  {
132  Vmath::Vmul (nqtot,df[2],1,diff0,1, out_d1, 1);
133  Vmath::Vvtvp (nqtot,df[3],1,diff1,1, out_d1, 1, out_d1,1);
134  }
135 
136  if(out_d2.num_elements())
137  {
138  Vmath::Vmul (nqtot,df[4],1,diff0,1, out_d2, 1);
139  Vmath::Vvtvp (nqtot,df[5],1,diff1,1, out_d2, 1, out_d2,1);
140  }
141  }
142  else // regular geometry
143  {
144  if(out_d0.num_elements())
145  {
146  Vmath::Smul (nqtot, df[0][0], diff0, 1, out_d0, 1);
147  Blas::Daxpy (nqtot, df[1][0], diff1, 1, out_d0, 1);
148  }
149 
150  if(out_d1.num_elements())
151  {
152  Vmath::Smul (nqtot, df[2][0], diff0, 1, out_d1, 1);
153  Blas::Daxpy (nqtot, df[3][0], diff1, 1, out_d1, 1);
154  }
155 
156  if(out_d2.num_elements())
157  {
158  Vmath::Smul (nqtot, df[4][0], diff0, 1, out_d2, 1);
159  Blas::Daxpy (nqtot, df[5][0], diff1, 1, out_d2, 1);
160  }
161  }
162  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
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:428
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
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:199
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:169
void Nektar::LocalRegions::TriExp::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::StdTriExp.

Definition at line 165 of file TriExp.cpp.

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

168  {
169  switch(dir)
170  {
171  case 0:
172  {
174  }
175  break;
176  case 1:
177  {
179  }
180  break;
181  case 2:
182  {
184  }
185  break;
186  default:
187  {
188  ASSERTL1(false,"input dir is out of range");
189  }
190  break;
191  }
192  }
static Array< OneD, NekDouble > NullNekDouble1DArray
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)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:191
void Nektar::LocalRegions::TriExp::v_PhysDirectionalDeriv ( const Array< OneD, const NekDouble > &  inarray,
const Array< OneD, const NekDouble > &  direction,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Physical derivative along a direction vector.

See also
StdRegions::StdExpansion::PhysDirectionalDeriv

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 194 of file TriExp.cpp.

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

198  {
199  if(! out.num_elements())
200  {
201  return;
202  }
203 
204  int nquad0 = m_base[0]->GetNumPoints();
205  int nquad1 = m_base[1]->GetNumPoints();
206  int nqtot = nquad0*nquad1;
207 
208  const Array<TwoD, const NekDouble>& df =
209  m_metricinfo->GetDerivFactors(GetPointsKeys());
210 
211  Array<OneD,NekDouble> diff0(2*nqtot);
212  Array<OneD,NekDouble> diff1(diff0+nqtot);
213 
214  // diff0 = du/d_xi, diff1 = du/d_eta
215  StdTriExp::v_PhysDeriv(inarray, diff0, diff1);
216 
217  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
218  {
219  Array<OneD, Array<OneD, NekDouble> > tangmat(2);
220 
221 
222  // D^v_xi = v_x*d_xi/dx + v_y*d_xi/dy + v_z*d_xi/dz
223  // D^v_eta = v_x*d_eta/dx + v_y*d_eta/dy + v_z*d_eta/dz
224  for (int i=0; i< 2; ++i)
225  {
226  tangmat[i] = Array<OneD, NekDouble>(nqtot,0.0);
227  for (int k=0; k<(m_geom->GetCoordim()); ++k)
228  {
229  Vmath::Vvtvp(nqtot,&df[2*k+i][0],1,&direction[k*nqtot],1,&tangmat[i][0],1,&tangmat[i][0],1);
230  }
231  }
232 
233  /// D_v = D^v_xi * du/d_xi + D^v_eta * du/d_eta
234  Vmath::Vmul (nqtot,&tangmat[0][0],1,&diff0[0],1, &out[0], 1);
235  Vmath::Vvtvp (nqtot,&tangmat[1][0],1,&diff1[0],1, &out[0], 1, &out[0],1);
236  }
237  else
238  {
239  ASSERTL1(m_metricinfo->GetGtype() == SpatialDomains::eDeformed,"Wrong route");
240  }
241  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
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:428
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:125
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:191
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:169
NekDouble Nektar::LocalRegions::TriExp::v_PhysEvaluate ( const Array< OneD, const NekDouble > &  coords,
const Array< OneD, const NekDouble > &  physvals 
)
protectedvirtual

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

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

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

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

is evaluated using Lagrangian interpolants through the quadrature points:

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

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

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

Reimplemented from Nektar::StdRegions::StdExpansion2D.

Definition at line 603 of file TriExp.cpp.

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

604  {
605  Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(2);
606 
607  ASSERTL0(m_geom,"m_geom not defined");
608  m_geom->GetLocCoords(coord,Lcoord);
609 
610  return StdTriExp::v_PhysEvaluate(Lcoord, physvals);
611  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:125
void Nektar::LocalRegions::TriExp::v_ReduceOrderCoeffs ( int  numMin,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

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

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

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1665 of file TriExp.cpp.

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

1669  {
1670  int n_coeffs = inarray.num_elements();
1671  int nquad0 = m_base[0]->GetNumPoints();
1672  int nquad1 = m_base[1]->GetNumPoints();
1673  int nqtot = nquad0*nquad1;
1674  int nmodes0 = m_base[0]->GetNumModes();
1675  int nmodes1 = m_base[1]->GetNumModes();
1676  int numMin2 = nmodes0, i;
1677 
1678  Array<OneD, NekDouble> coeff(n_coeffs,0.0);
1679  Array<OneD, NekDouble> phys_tmp(nqtot,0.0);
1680  Array<OneD, NekDouble> tmp, tmp2;
1681 
1682  const LibUtilities::PointsKey Pkey0 = m_base[0]->GetPointsKey();
1683  const LibUtilities::PointsKey Pkey1 = m_base[1]->GetPointsKey();
1684 
1685  LibUtilities::BasisKey b0(
1686  m_base[0]->GetBasisType(), nmodes0, Pkey0);
1687  LibUtilities::BasisKey b1(
1688  m_base[1]->GetBasisType(), nmodes1, Pkey1);
1689  LibUtilities::BasisKey bortho0(
1690  LibUtilities::eOrtho_A, nmodes0, Pkey0);
1691  LibUtilities::BasisKey bortho1(
1692  LibUtilities::eOrtho_B, nmodes1, Pkey1);
1693 
1694  // Check if it is also possible to use the same InterCoeff routine
1695  // which is also used for Quadrilateral and Hexagonal shaped
1696  // elements
1697 
1698  // For now, set up the used basis on the standard element to
1699  // calculate the phys values, set up the orthogonal basis to do a
1700  // forward transform, to obtain the coefficients in orthogonal
1701  // coefficient space
1702  StdRegions::StdTriExpSharedPtr m_OrthoTriExp;
1704 
1706  ::AllocateSharedPtr(b0, b1);
1707  m_OrthoTriExp = MemoryManager<StdRegions::StdTriExp>
1708  ::AllocateSharedPtr(bortho0, bortho1);
1709 
1710  m_TriExp ->BwdTrans(inarray,phys_tmp);
1711  m_OrthoTriExp->FwdTrans(phys_tmp, coeff);
1712 
1713  for (i = 0; i < n_coeffs; i++)
1714  {
1715  if (i == numMin)
1716  {
1717  coeff[i] = 0.0;
1718  numMin += numMin2 - 1;
1719  numMin2 -= 1.0;
1720  }
1721  }
1722 
1723  m_OrthoTriExp->BwdTrans(coeff,phys_tmp);
1724  m_TriExp ->FwdTrans(phys_tmp, outarray);
1725  }
boost::shared_ptr< StdTriExp > StdTriExpSharedPtr
Definition: StdTriExp.h:266
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
Principle Orthogonal Functions .
Definition: BasisType.h:47
Principle Orthogonal Functions .
Definition: BasisType.h:46
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:165
Array< OneD, LibUtilities::BasisSharedPtr > m_base
NekDouble Nektar::LocalRegions::TriExp::v_StdPhysEvaluate ( const Array< OneD, const NekDouble > &  Lcoord,
const Array< OneD, const NekDouble > &  physvals 
)
protectedvirtual

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 595 of file TriExp.cpp.

598  {
599  // Evaluate point in local (eta) coordinates.
600  return StdTriExp::v_PhysEvaluate(Lcoord,physvals);
601  }
void Nektar::LocalRegions::TriExp::v_SVVLaplacianFilter ( Array< OneD, NekDouble > &  array,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1727 of file TriExp.cpp.

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

1730  {
1731  int nq = GetTotPoints();
1732 
1733  // Calculate sqrt of the Jacobian
1734  Array<OneD, const NekDouble> jac =
1735  m_metricinfo->GetJac(GetPointsKeys());
1736  Array<OneD, NekDouble> sqrt_jac(nq);
1737  if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1738  {
1739  Vmath::Vsqrt(nq,jac,1,sqrt_jac,1);
1740  }
1741  else
1742  {
1743  Vmath::Fill(nq,sqrt(jac[0]),sqrt_jac,1);
1744  }
1745 
1746  // Multiply array by sqrt(Jac)
1747  Vmath::Vmul(nq,sqrt_jac,1,array,1,array,1);
1748 
1749  // Apply std region filter
1750  StdTriExp::v_SVVLaplacianFilter( array, mkey);
1751 
1752  // Divide by sqrt(Jac)
1753  Vmath::Vdiv(nq,array,1,sqrt_jac,1,array,1);
1754  }
const LibUtilities::PointsKeyVector GetPointsKeys() const
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
Definition: Vmath.cpp:394
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:46
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:126
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
Definition: Vmath.cpp:227
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:141
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:169
void Nektar::LocalRegions::TriExp::v_WeakDerivMatrixOp ( const int  i,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTriExp.

Definition at line 1428 of file TriExp.cpp.

1432  {
1433  StdExpansion::WeakDerivMatrixOp_MatFree(i,inarray,outarray,mkey);
1434  }
void Nektar::LocalRegions::TriExp::v_WeakDirectionalDerivMatrixOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1437 of file TriExp.cpp.

1440  {
1441  StdExpansion::WeakDirectionalDerivMatrixOp_MatFree(inarray,outarray,mkey);
1442  }

Member Data Documentation

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