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

#include <TetExp.h>

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

Public Member Functions

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

Protected Member Functions

virtual NekDouble v_Integral (const Array< OneD, const NekDouble > &inarray)
 Integrate the physical point list inarray over region. 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)
 Differentiate inarray in the three coordinate directions. More...
 
virtual void v_FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Forward transform from physical quadrature space stored in inarray and evaluate the expansion coefficients and store in (this)->_coeffs. More...
 
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=m_base0*m_base1*m_base2 and put into outarray: More...
 
virtual void v_IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
 
virtual void v_IProductWRTDerivBase (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Calculates the inner product \( I_{pqr} = (u, \partial_{x_i} \phi_{pqr}) \). More...
 
virtual void v_AlignVectorToCollapsedDir (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
 
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 > &coords, const Array< OneD, const NekDouble > &physvals)
 
virtual void v_GetCoord (const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords)
 Get the coordinates "coords" at the local coordinates "Lcoords". More...
 
virtual void v_GetCoords (Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3)
 
virtual LibUtilities::ShapeType v_DetShapeType () const
 Return Shape of region, using ShapeType enum list. More...
 
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp (void) const
 
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp (void) const
 
virtual int v_GetCoordim ()
 
virtual void v_ExtractDataToCoeffs (const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType)
 
virtual void v_GetTracePhysMap (const int face, Array< OneD, int > &outarray)
 Returns the physical values at the quadrature points of a face. More...
 
void v_ComputeTraceNormal (const int face)
 Compute the normal of a triangular face. More...
 
virtual void v_HelmholtzMatrixOp (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_SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey)
 
virtual DNekMatSharedPtr v_GenMatrix (const StdRegions::StdMatrixKey &mkey)
 
DNekScalMatSharedPtr CreateMatrix (const MatrixKey &mkey)
 
DNekScalBlkMatSharedPtr CreateStaticCondMatrix (const MatrixKey &mkey)
 
virtual DNekMatSharedPtr v_CreateStdMatrix (const StdRegions::StdMatrixKey &mkey)
 
virtual DNekScalMatSharedPtr v_GetLocMatrix (const MatrixKey &mkey)
 
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix (const MatrixKey &mkey)
 
void v_DropLocStaticCondMatrix (const MatrixKey &mkey)
 
void SetUpInverseTransformationMatrix (const DNekMatSharedPtr &m_transformationmatrix, DNekMatSharedPtr m_inversetransformationmatrix, DNekMatSharedPtr m_inversetransposedtransformationmatrix)
 
void v_ComputeConditionNumberOfMatrix (const DNekScalMatSharedPtr &mat)
 
virtual void v_ComputeLaplacianMetric ()
 
- Protected Member Functions inherited from Nektar::StdRegions::StdTetExp
virtual void v_PhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
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)
 
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)
 
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 > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
 
virtual void v_IProductWRTBase_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_IProductWRTBase_SumFacKernel (const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
 
virtual void v_IProductWRTDerivBase_MatOp (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_IProductWRTDerivBase_SumFac (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_LocCoordToLocCollapsed (const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
 
virtual void v_LocCollapsedToLocCoord (const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi)
 
virtual void v_FillMode (const int mode, Array< OneD, NekDouble > &outarray)
 
NekDouble v_PhysEvaluateBasis (const Array< OneD, const NekDouble > &coords, int mode) final
 
virtual void v_GetTraceNumModes (const int fid, int &numModes0, int &numModes1, Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
 
virtual int v_GetNverts () const
 
virtual int v_GetNedges () const
 
virtual int v_GetNtraces () const
 
virtual int v_NumBndryCoeffs () const
 
virtual int v_NumDGBndryCoeffs () const
 
virtual int v_GetTraceNcoeffs (const int i) const
 
virtual int v_GetTotalTraceIntNcoeffs () const
 
virtual int v_GetTraceIntNcoeffs (const int i) const
 
virtual int v_GetTraceNumPoints (const int i) const
 
virtual int v_GetEdgeNcoeffs (const int i) const
 
virtual LibUtilities::PointsKey v_GetTracePointsKey (const int i, const int j) const
 
virtual int v_CalcNumberOfCoefficients (const std::vector< unsigned int > &nummodes, int &modes_offset)
 
virtual const LibUtilities::BasisKey v_GetTraceBasisKey (const int i, const int k) const
 
virtual bool v_IsBoundaryInteriorExpansion ()
 
virtual int v_GetVertexMap (int localVertexId, bool useCoeffPacking=false)
 
virtual void v_GetInteriorMap (Array< OneD, unsigned int > &outarray)
 
virtual void v_GetBoundaryMap (Array< OneD, unsigned int > &outarray)
 
virtual void v_GetTraceToElementMap (const int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q)
 
virtual void v_GetEdgeInteriorToElementMap (const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
 
virtual void v_GetTraceInteriorToElementMap (const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
 
virtual void v_MultiplyByStdQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_ReduceOrderCoeffs (int numMin, 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::StdExpansion3D
virtual NekDouble v_PhysEvaluate (const Array< OneD, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals)
 
virtual void v_LaplacianMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_HelmholtzMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_GenStdMatBwdDeriv (const int dir, DNekMatSharedPtr &mat)
 
- Protected Member Functions inherited from Nektar::StdRegions::StdExpansion
DNekMatSharedPtr CreateStdMatrix (const StdMatrixKey &mkey)
 
DNekBlkMatSharedPtr CreateStdStaticCondMatrix (const StdMatrixKey &mkey)
 Create the static condensation of a matrix when using a boundary interior decomposition. More...
 
void BwdTrans_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void BwdTrans_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDerivBase_SumFac (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDirectionalDerivBase_SumFac (const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GeneralMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree_Kernel (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp)
 
void LaplacianMatrixOp_MatFree_GenericImpl (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDerivMatrixOp_MatFree (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDirectionalDerivMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassLevelCurvatureMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LinearAdvectionDiffusionReactionMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey, bool addDiffusionTerm=true)
 
void HelmholtzMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void HelmholtzMatrixOp_MatFree_GenericImpl (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_SetCoeffsToOrientation (Array< OneD, NekDouble > &coeffs, StdRegions::Orientation dir)
 
template<int DIR>
NekDouble BaryEvaluate (const NekDouble &coord, const NekDouble *physvals)
 This function performs the barycentric interpolation of the polynomial stored in coord at a point physvals using barycentric interpolation weights in direction. More...
 
template<int DIR>
NekDouble BaryEvaluateBasis (const NekDouble &coord, const int &mode)
 
- Protected Member Functions inherited from Nektar::LocalRegions::Expansion3D
virtual void v_DGDeriv (const int dir, const Array< OneD, const NekDouble > &incoeffs, Array< OneD, ExpansionSharedPtr > &FaceExp, Array< OneD, Array< OneD, NekDouble > > &faceCoeffs, Array< OneD, NekDouble > &out_d)
 Evaluate coefficients of weak deriviative in the direction dir given the input coefficicents incoeffs and the imposed boundary values in EdgeExp (which will have its phys space updated). More...
 
virtual void v_AddFaceNormBoundaryInt (const int face, const ExpansionSharedPtr &FaceExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddRobinMassMatrix (const int face, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat)
 
virtual StdRegions::Orientation v_GetTraceOrient (int face)
 
virtual void v_GetTracePhysVals (const int face, const StdRegions::StdExpansionSharedPtr &FaceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient)
 Extract the physical values along face face from inarray into outarray following the local face orientation and point distribution defined by defined in FaceExp. More...
 
void GetPhysFaceVarCoeffsFromElement (const int face, ExpansionSharedPtr &FaceExp, const Array< OneD, const NekDouble > &varcoeff, Array< OneD, NekDouble > &outarray)
 
virtual Array< OneD, NekDoublev_GetnFacecdotMF (const int dir, const int face, ExpansionSharedPtr &FaceExp_f, const Array< OneD, const Array< OneD, NekDouble > > &normals, const StdRegions::VarCoeffMap &varcoeffs)
 
virtual DNekMatSharedPtr v_BuildTransformationMatrix (const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
 
virtual DNekMatSharedPtr v_BuildInverseTransformationMatrix (const DNekScalMatSharedPtr &transformationmatrix)
 Build inverse and inverse transposed transformation matrix: \(\mathbf{R^{-1}}\) and \(\mathbf{R^{-T}}\). More...
 
virtual DNekMatSharedPtr v_BuildVertexMatrix (const DNekScalMatSharedPtr &r_bnd)
 
virtual const NormalVectorv_GetTraceNormal (const int face) const
 
- Protected Member Functions inherited from Nektar::LocalRegions::Expansion
void ComputeLaplacianMetric ()
 
void ComputeQuadratureMetric ()
 
void ComputeGmatcdotMF (const Array< TwoD, const NekDouble > &df, const Array< OneD, const NekDouble > &direction, Array< OneD, Array< OneD, NekDouble > > &dfdir)
 
virtual void v_MultiplyByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_DivideByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
Array< OneD, NekDoublev_GetMF (const int dir, const int shapedim, const StdRegions::VarCoeffMap &varcoeffs)
 
Array< OneD, NekDoublev_GetMFDiv (const int dir, const StdRegions::VarCoeffMap &varcoeffs)
 
Array< OneD, NekDoublev_GetMFMag (const int dir, const StdRegions::VarCoeffMap &varcoeffs)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const std::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddEdgeNormBoundaryInt (const int edge, const std::shared_ptr< Expansion > &EdgeExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddFaceNormBoundaryInt (const int face, const std::shared_ptr< Expansion > &FaceExp, const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
virtual NekDouble v_VectorFlux (const Array< OneD, Array< OneD, NekDouble > > &vec)
 
virtual void v_SetCoeffsToOrientation (StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_GetTraceQFactors (const int trace, Array< OneD, NekDouble > &outarray)
 
virtual const Array< OneD, const NekDouble > & v_GetPhysNormals (void)
 
virtual void v_SetPhysNormals (Array< OneD, const NekDouble > &normal)
 
virtual void v_SetUpPhysNormals (const int id)
 
virtual void v_AddRobinTraceContribution (const int traceid, const Array< OneD, const NekDouble > &primCoeffs, const Array< OneD, NekDouble > &incoeffs, Array< OneD, NekDouble > &coeffs)
 

Private Member Functions

 TetExp ()
 
void 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)
 

Private Attributes

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

Additional Inherited Members

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

Detailed Description

Defines a Tetrahedral local expansion.

Definition at line 50 of file TetExp.h.

Constructor & Destructor Documentation

◆ TetExp() [1/3]

Nektar::LocalRegions::TetExp::TetExp ( const LibUtilities::BasisKey Ba,
const LibUtilities::BasisKey Bb,
const LibUtilities::BasisKey Bc,
const SpatialDomains::TetGeomSharedPtr geom 
)

Constructor using BasisKey class for quadrature points and order definition.

Parameters
BaBasis key for first coordinate.
BbBasis key for second coordinate.
BcBasis key for third coordinate.

Definition at line 61 of file TetExp.cpp.

65  :
66  StdExpansion (
68  Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
69  3, Ba, Bb, Bc),
72  Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
73  Ba, Bb, Bc),
74  StdTetExp(Ba,Bb,Bc),
75  Expansion (geom),
76  Expansion3D (geom),
78  std::bind(&TetExp::CreateMatrix, this, std::placeholders::_1),
79  std::string("TetExpMatrix")),
81  std::bind(&TetExp::CreateStaticCondMatrix, this, std::placeholders::_1),
82  std::string("TetExpStaticCondMatrix"))
83  {
84  }
Expansion3D(SpatialDomains::Geometry3DSharedPtr pGeom)
Definition: Expansion3D.h:61
Expansion(SpatialDomains::GeometrySharedPtr pGeom)
Definition: Expansion.cpp:47
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: TetExp.h:216
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: TetExp.h:215
DNekScalBlkMatSharedPtr CreateStaticCondMatrix(const MatrixKey &mkey)
Definition: TetExp.cpp:1388
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
Definition: TetExp.cpp:1105
StdExpansion()
Default Constructor.
int getNumberOfCoefficients(int Na, int Nb, int Nc)
Definition: ShapeType.hpp:194

◆ TetExp() [2/3]

Nektar::LocalRegions::TetExp::TetExp ( const TetExp T)

Copy Constructor.

Definition at line 90 of file TetExp.cpp.

90  :
91  StdRegions::StdExpansion(T),
92  StdRegions::StdExpansion3D(T),
93  StdRegions::StdTetExp(T),
94  Expansion(T),
95  Expansion3D(T),
96  m_matrixManager(T.m_matrixManager),
97  m_staticCondMatrixManager(T.m_staticCondMatrixManager)
98  {
99  }

◆ ~TetExp()

Nektar::LocalRegions::TetExp::~TetExp ( )

Destructor.

Definition at line 104 of file TetExp.cpp.

105  {
106  }

◆ TetExp() [3/3]

Nektar::LocalRegions::TetExp::TetExp ( )
private

Member Function Documentation

◆ CreateMatrix()

DNekScalMatSharedPtr Nektar::LocalRegions::TetExp::CreateMatrix ( const MatrixKey mkey)
protected

Definition at line 1105 of file TetExp.cpp.

1106  {
1107  DNekScalMatSharedPtr returnval;
1109 
1110  ASSERTL2(m_metricinfo->GetGtype() != SpatialDomains::eNoGeomType,"Geometric information is not set up");
1111 
1112  switch(mkey.GetMatrixType())
1113  {
1114  case StdRegions::eMass:
1115  {
1116  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1117  mkey.GetNVarCoeff())
1118  {
1119  NekDouble one = 1.0;
1120  DNekMatSharedPtr mat = GenMatrix(mkey);
1121  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1122  }
1123  else
1124  {
1125  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1126  DNekMatSharedPtr mat = GetStdMatrix(mkey);
1127  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,mat);
1128  }
1129  }
1130  break;
1131  case StdRegions::eInvMass:
1132  {
1133  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1134  {
1135  NekDouble one = 1.0;
1136  StdRegions::StdMatrixKey masskey(StdRegions::eMass,DetShapeType(),
1137  *this);
1138  DNekMatSharedPtr mat = GenMatrix(masskey);
1139  mat->Invert();
1140  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1141  }
1142  else
1143  {
1144  NekDouble fac = 1.0/(m_metricinfo->GetJac(ptsKeys))[0];
1145  DNekMatSharedPtr mat = GetStdMatrix(mkey);
1146  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(fac,mat);
1147  }
1148  }
1149  break;
1153  {
1154  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1155  mkey.GetNVarCoeff())
1156  {
1157  NekDouble one = 1.0;
1158  DNekMatSharedPtr mat = GenMatrix(mkey);
1159 
1160  returnval = MemoryManager<DNekScalMat>
1161  ::AllocateSharedPtr(one,mat);
1162  }
1163  else
1164  {
1165  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1166  Array<TwoD, const NekDouble> df
1167  = m_metricinfo->GetDerivFactors(ptsKeys);
1168  int dir = 0;
1169 
1170  switch(mkey.GetMatrixType())
1171  {
1173  dir = 0;
1174  break;
1176  dir = 1;
1177  break;
1179  dir = 2;
1180  break;
1181  default:
1182  break;
1183  }
1184 
1185  MatrixKey deriv0key(StdRegions::eWeakDeriv0,
1186  mkey.GetShapeType(), *this);
1187  MatrixKey deriv1key(StdRegions::eWeakDeriv1,
1188  mkey.GetShapeType(), *this);
1189  MatrixKey deriv2key(StdRegions::eWeakDeriv2,
1190  mkey.GetShapeType(), *this);
1191 
1192  DNekMat &deriv0 = *GetStdMatrix(deriv0key);
1193  DNekMat &deriv1 = *GetStdMatrix(deriv1key);
1194  DNekMat &deriv2 = *GetStdMatrix(deriv2key);
1195 
1196  int rows = deriv0.GetRows();
1197  int cols = deriv1.GetColumns();
1198 
1200  ::AllocateSharedPtr(rows,cols);
1201  (*WeakDeriv) = df[3*dir][0]*deriv0
1202  + df[3*dir+1][0]*deriv1
1203  + df[3*dir+2][0]*deriv2;
1204 
1205  returnval = MemoryManager<DNekScalMat>
1206  ::AllocateSharedPtr(jac,WeakDeriv);
1207  }
1208  }
1209  break;
1211  {
1212  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1213  (mkey.GetNVarCoeff() > 0)||(mkey.ConstFactorExists(StdRegions::eFactorSVVCutoffRatio)))
1214  {
1215  NekDouble one = 1.0;
1216  DNekMatSharedPtr mat = GenMatrix(mkey);
1217 
1218  returnval = MemoryManager<DNekScalMat>
1219  ::AllocateSharedPtr(one,mat);
1220  }
1221  else
1222  {
1223  MatrixKey lap00key(StdRegions::eLaplacian00,
1224  mkey.GetShapeType(), *this);
1225  MatrixKey lap01key(StdRegions::eLaplacian01,
1226  mkey.GetShapeType(), *this);
1227  MatrixKey lap02key(StdRegions::eLaplacian02,
1228  mkey.GetShapeType(), *this);
1229  MatrixKey lap11key(StdRegions::eLaplacian11,
1230  mkey.GetShapeType(), *this);
1231  MatrixKey lap12key(StdRegions::eLaplacian12,
1232  mkey.GetShapeType(), *this);
1233  MatrixKey lap22key(StdRegions::eLaplacian22,
1234  mkey.GetShapeType(), *this);
1235 
1236  DNekMat &lap00 = *GetStdMatrix(lap00key);
1237  DNekMat &lap01 = *GetStdMatrix(lap01key);
1238  DNekMat &lap02 = *GetStdMatrix(lap02key);
1239  DNekMat &lap11 = *GetStdMatrix(lap11key);
1240  DNekMat &lap12 = *GetStdMatrix(lap12key);
1241  DNekMat &lap22 = *GetStdMatrix(lap22key);
1242 
1243  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1244  Array<TwoD, const NekDouble> gmat
1245  = m_metricinfo->GetGmat(ptsKeys);
1246 
1247  int rows = lap00.GetRows();
1248  int cols = lap00.GetColumns();
1249 
1251  ::AllocateSharedPtr(rows,cols);
1252 
1253  (*lap) = gmat[0][0]*lap00
1254  + gmat[4][0]*lap11
1255  + gmat[8][0]*lap22
1256  + gmat[3][0]*(lap01 + Transpose(lap01))
1257  + gmat[6][0]*(lap02 + Transpose(lap02))
1258  + gmat[7][0]*(lap12 + Transpose(lap12));
1259 
1260  returnval = MemoryManager<DNekScalMat>
1261  ::AllocateSharedPtr(jac,lap);
1262  }
1263  }
1264  break;
1266  {
1267  NekDouble factor = mkey.GetConstFactor(StdRegions::eFactorLambda);
1268  MatrixKey masskey(StdRegions::eMass, mkey.GetShapeType(), *this);
1269  DNekScalMat &MassMat = *(this->m_matrixManager[masskey]);
1270  MatrixKey lapkey(StdRegions::eLaplacian, mkey.GetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1271  DNekScalMat &LapMat = *(this->m_matrixManager[lapkey]);
1272 
1273  int rows = LapMat.GetRows();
1274  int cols = LapMat.GetColumns();
1275 
1277 
1278  NekDouble one = 1.0;
1279  (*helm) = LapMat + factor*MassMat;
1280 
1281  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one, helm);
1282  }
1283  break;
1285  {
1286  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1287  {
1288  NekDouble one = 1.0;
1289  DNekMatSharedPtr mat = GenMatrix(mkey);
1290  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1291  }
1292  else
1293  {
1294  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1295  DNekMatSharedPtr mat = GetStdMatrix(mkey);
1296  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,mat);
1297  }
1298  }
1299  break;
1307  {
1308  NekDouble one = 1.0;
1309 
1310  DNekMatSharedPtr mat = GenMatrix(mkey);
1311  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1312  }
1313  break;
1315  {
1316  NekDouble one = 1.0;
1317 
1318  MatrixKey hkey(StdRegions::eHybridDGHelmholtz, DetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1319  DNekMatSharedPtr mat = GenMatrix(hkey);
1320 
1321  mat->Invert();
1322  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1323  }
1324  break;
1326  {
1327  NekDouble one = 1.0;
1328  MatrixKey helmkey(StdRegions::eHelmholtz, mkey.GetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1329  DNekScalBlkMatSharedPtr helmStatCond = GetLocStaticCondMatrix(helmkey);
1330  DNekScalMatSharedPtr A =helmStatCond->GetBlock(0,0);
1332 
1334  }
1335  break;
1337  {
1338  NekDouble one = 1.0;
1339  MatrixKey masskey(StdRegions::eMass, mkey.GetShapeType(), *this);
1340  DNekScalBlkMatSharedPtr massStatCond = GetLocStaticCondMatrix(masskey);
1341  DNekScalMatSharedPtr A =massStatCond->GetBlock(0,0);
1343 
1345  }
1346  break;
1347  case StdRegions::ePreconR:
1348  {
1349  NekDouble one = 1.0;
1350  MatrixKey helmkey(StdRegions::eHelmholtz, mkey.GetShapeType(), *this,mkey.GetConstFactors(), mkey.GetVarCoeffs());
1351  DNekScalBlkMatSharedPtr helmStatCond = GetLocStaticCondMatrix(helmkey);
1352  DNekScalMatSharedPtr A =helmStatCond->GetBlock(0,0);
1353 
1354  DNekScalMatSharedPtr Atmp;
1355  DNekMatSharedPtr R=BuildTransformationMatrix(A,mkey.GetMatrixType());
1356 
1358  }
1359  break;
1361  {
1362  NekDouble one = 1.0;
1363  MatrixKey masskey(StdRegions::eMass, mkey.GetShapeType(), *this);
1364  DNekScalBlkMatSharedPtr StatCond = GetLocStaticCondMatrix(masskey);
1365  DNekScalMatSharedPtr A =StatCond->GetBlock(0,0);
1366 
1367  DNekScalMatSharedPtr Atmp;
1368  DNekMatSharedPtr R=BuildTransformationMatrix(A,mkey.GetMatrixType());
1369 
1371  }
1372  break;
1373  default:
1374  {
1375  //ASSERTL0(false, "Missing definition for " + (*StdRegions::MatrixTypeMap[mkey.GetMatrixType()]));
1376  NekDouble one = 1.0;
1377  DNekMatSharedPtr mat = GenMatrix(mkey);
1378 
1379  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1380  }
1381  break;
1382  }
1383 
1384  return returnval;
1385  }
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Definition: ErrorUtil.hpp:274
DNekMatSharedPtr BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd)
Definition: Expansion.cpp:103
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:273
DNekMatSharedPtr BuildTransformationMatrix(const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
Definition: Expansion.cpp:95
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:617
const LibUtilities::PointsKeyVector GetPointsKeys() const
DNekScalBlkMatSharedPtr GetLocStaticCondMatrix(const LocalRegions::MatrixKey &mkey)
Definition: StdExpansion.h:660
DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:850
LibUtilities::ShapeType DetShapeType() const
Definition: StdTetExp.h:69
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:246
@ eNoGeomType
No type defined.
@ eDeformed
Geometry is curved or has non-constant factors.
NekMatrix< NekMatrix< NekDouble, StandardMatrixTag >, ScaledMatrixTag > DNekScalMat
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
NekMatrix< NekDouble, StandardMatrixTag > DNekMat
Definition: NekTypeDefs.hpp:51
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:73
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
double NekDouble

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL2, Nektar::LocalRegions::Expansion::BuildTransformationMatrix(), Nektar::LocalRegions::Expansion::BuildVertexMatrix(), Nektar::StdRegions::StdMatrixKey::ConstFactorExists(), Nektar::StdRegions::StdTetExp::DetShapeType(), Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::eFactorLambda, Nektar::StdRegions::eFactorSVVCutoffRatio, Nektar::StdRegions::eHelmholtz, Nektar::StdRegions::eHybridDGHelmBndLam, Nektar::StdRegions::eHybridDGHelmholtz, Nektar::StdRegions::eHybridDGLamToQ0, Nektar::StdRegions::eHybridDGLamToQ1, Nektar::StdRegions::eHybridDGLamToQ2, Nektar::StdRegions::eHybridDGLamToU, Nektar::StdRegions::eInvHybridDGHelmholtz, Nektar::StdRegions::eInvLaplacianWithUnityMean, Nektar::StdRegions::eInvMass, Nektar::StdRegions::eIProductWRTBase, Nektar::StdRegions::eLaplacian, Nektar::StdRegions::eLaplacian00, Nektar::StdRegions::eLaplacian01, Nektar::StdRegions::eLaplacian02, Nektar::StdRegions::eLaplacian11, Nektar::StdRegions::eLaplacian12, Nektar::StdRegions::eLaplacian22, Nektar::StdRegions::eMass, Nektar::SpatialDomains::eNoGeomType, Nektar::StdRegions::ePreconLinearSpace, Nektar::StdRegions::ePreconLinearSpaceMass, Nektar::StdRegions::ePreconR, Nektar::StdRegions::ePreconRMass, 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().

◆ CreateStaticCondMatrix()

DNekScalBlkMatSharedPtr Nektar::LocalRegions::TetExp::CreateStaticCondMatrix ( const MatrixKey mkey)
protected

Definition at line 1388 of file TetExp.cpp.

1390  {
1391  DNekScalBlkMatSharedPtr returnval;
1392 
1393  ASSERTL2(m_metricinfo->GetGtype() != SpatialDomains::eNoGeomType,"Geometric information is not set up");
1394 
1395  // set up block matrix system
1396  unsigned int nbdry = NumBndryCoeffs();
1397  unsigned int nint = (unsigned int)(m_ncoeffs - nbdry);
1398  unsigned int exp_size[] = {nbdry, nint};
1399  unsigned int nblks = 2;
1400  returnval = MemoryManager<DNekScalBlkMat>::AllocateSharedPtr(nblks, nblks, exp_size, exp_size);
1401 
1402  NekDouble factor = 1.0;
1403  MatrixStorage AMatStorage = eFULL;
1404 
1405  switch(mkey.GetMatrixType())
1406  {
1408  case StdRegions::eHelmholtz: // special case since Helmholtz not defined in StdRegions
1409  // use Deformed case for both regular and deformed geometries
1410  factor = 1.0;
1411  goto UseLocRegionsMatrix;
1412  break;
1413  default:
1414  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1415  mkey.GetNVarCoeff())
1416  {
1417  factor = 1.0;
1418  goto UseLocRegionsMatrix;
1419  }
1420  else
1421  {
1422  DNekScalMatSharedPtr mat = GetLocMatrix(mkey);
1423  factor = mat->Scale();
1424  goto UseStdRegionsMatrix;
1425  }
1426  break;
1427  UseStdRegionsMatrix:
1428  {
1429  NekDouble invfactor = 1.0/factor;
1430  NekDouble one = 1.0;
1432  DNekScalMatSharedPtr Atmp;
1433  DNekMatSharedPtr Asubmat;
1434 
1435  //TODO: check below
1436  returnval->SetBlock(0,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,Asubmat = mat->GetBlock(0,0)));
1437  returnval->SetBlock(0,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,Asubmat = mat->GetBlock(0,1)));
1438  returnval->SetBlock(1,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,Asubmat = mat->GetBlock(1,0)));
1439  returnval->SetBlock(1,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(invfactor,Asubmat = mat->GetBlock(1,1)));
1440  }
1441  break;
1442  UseLocRegionsMatrix:
1443  {
1444  int i,j;
1445  NekDouble invfactor = 1.0/factor;
1446  NekDouble one = 1.0;
1447  DNekScalMat &mat = *GetLocMatrix(mkey);
1452 
1453  Array<OneD,unsigned int> bmap(nbdry);
1454  Array<OneD,unsigned int> imap(nint);
1455  GetBoundaryMap(bmap);
1456  GetInteriorMap(imap);
1457 
1458  for(i = 0; i < nbdry; ++i)
1459  {
1460  for(j = 0; j < nbdry; ++j)
1461  {
1462  (*A)(i,j) = mat(bmap[i],bmap[j]);
1463  }
1464 
1465  for(j = 0; j < nint; ++j)
1466  {
1467  (*B)(i,j) = mat(bmap[i],imap[j]);
1468  }
1469  }
1470 
1471  for(i = 0; i < nint; ++i)
1472  {
1473  for(j = 0; j < nbdry; ++j)
1474  {
1475  (*C)(i,j) = mat(imap[i],bmap[j]);
1476  }
1477 
1478  for(j = 0; j < nint; ++j)
1479  {
1480  (*D)(i,j) = mat(imap[i],imap[j]);
1481  }
1482  }
1483 
1484  // Calculate static condensed system
1485  if(nint)
1486  {
1487  D->Invert();
1488  (*B) = (*B)*(*D);
1489  (*A) = (*A) - (*B)*(*C);
1490  }
1491 
1492  DNekScalMatSharedPtr Atmp;
1493 
1494  returnval->SetBlock(0,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,A));
1495  returnval->SetBlock(0,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,B));
1496  returnval->SetBlock(1,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,C));
1497  returnval->SetBlock(1,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(invfactor,D));
1498 
1499  }
1500  break;
1501  }
1502  return returnval;
1503  }
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
Definition: Expansion.cpp:90
void GetBoundaryMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:687
DNekBlkMatSharedPtr GetStdStaticCondMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:622
void GetInteriorMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:692
std::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
Definition: NekTypeDefs.hpp:71

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL2, Nektar::SpatialDomains::eDeformed, Nektar::eFULL, Nektar::StdRegions::eHelmholtz, Nektar::StdRegions::eLaplacian, 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::GetStdStaticCondMatrix(), Nektar::LocalRegions::Expansion::m_metricinfo, Nektar::StdRegions::StdExpansion::m_ncoeffs, and Nektar::StdRegions::StdExpansion::NumBndryCoeffs().

◆ GeneralMatrixOp_MatOp()

void Nektar::LocalRegions::TetExp::GeneralMatrixOp_MatOp ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const StdRegions::StdMatrixKey mkey 
)
private

Definition at line 1532 of file TetExp.cpp.

1536  {
1537  DNekScalMatSharedPtr mat = GetLocMatrix(mkey);
1538 
1539  if(inarray.get() == outarray.get())
1540  {
1541  Array<OneD,NekDouble> tmp(m_ncoeffs);
1542  Vmath::Vcopy(m_ncoeffs,inarray.get(),1,tmp.get(),1);
1543 
1544  Blas::Dgemv('N',m_ncoeffs,m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1545  m_ncoeffs, tmp.get(), 1, 0.0, outarray.get(), 1);
1546  }
1547  else
1548  {
1549  Blas::Dgemv('N',m_ncoeffs,m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1550  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
1551  }
1552  }
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
Definition: Blas.hpp:265
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1199

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

◆ SetUpInverseTransformationMatrix()

void Nektar::LocalRegions::TetExp::SetUpInverseTransformationMatrix ( const DNekMatSharedPtr m_transformationmatrix,
DNekMatSharedPtr  m_inversetransformationmatrix,
DNekMatSharedPtr  m_inversetransposedtransformationmatrix 
)
protected

◆ v_AlignVectorToCollapsedDir()

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

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 419 of file TetExp.cpp.

423  {
424  int i, j;
425 
426  const int nquad0 = m_base[0]->GetNumPoints();
427  const int nquad1 = m_base[1]->GetNumPoints();
428  const int nquad2 = m_base[2]->GetNumPoints();
429  const int nqtot = nquad0*nquad1*nquad2;
430 
431  const Array<OneD, const NekDouble> &z0 = m_base[0]->GetZ();
432  const Array<OneD, const NekDouble> &z1 = m_base[1]->GetZ();
433  const Array<OneD, const NekDouble> &z2 = m_base[2]->GetZ();
434 
435  Array<OneD, NekDouble> tmp2 (nqtot);
436  Array<OneD, NekDouble> tmp3 (nqtot);
437 
438  const Array<TwoD, const NekDouble>& df =
439  m_metricinfo->GetDerivFactors(GetPointsKeys());
440 
441  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
442  {
443  Vmath::Vmul(nqtot,&df[3*dir][0], 1,inarray.get(),1,
444  tmp2.get(),1);
445  Vmath::Vmul(nqtot,&df[3*dir+1][0],1,inarray.get(),1,
446  tmp3.get(),1);
447  Vmath::Vmul(nqtot,&df[3*dir+2][0],1,inarray.get(),1,
448  outarray[2].get(),1);
449  }
450  else
451  {
452  Vmath::Smul(nqtot, df[3*dir ][0],inarray.get(),1,
453  tmp2.get(), 1);
454  Vmath::Smul(nqtot, df[3*dir+1][0],inarray.get(),1,
455  tmp3.get(), 1);
456  Vmath::Smul(nqtot, df[3*dir+2][0],inarray.get(),1,
457  outarray[2].get(), 1);
458  }
459 
460  NekDouble g0,g1,g1a,g2,g3;
461  int k,cnt;
462 
463  for(cnt = 0, k = 0; k < nquad2; ++k)
464  {
465  for(j = 0; j < nquad1; ++j)
466  {
467  g2 = 2.0/(1.0-z2[k]);
468  g1 = g2/(1.0-z1[j]);
469  g0 = 2.0*g1;
470  g3 = (1.0+z1[j])*g2*0.5;
471 
472  for(i = 0; i < nquad0; ++i,++cnt)
473  {
474  g1a = g1*(1+z0[i]);
475 
476  outarray[0][cnt] = g0*tmp2[cnt] + g1a*(tmp3[cnt] +
477  outarray[2][cnt]);
478 
479  outarray[1][cnt] = g2*tmp3[cnt] + g3*outarray[2][cnt];
480 
481  }
482  }
483  }
484  }
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:192
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.cpp:225

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

Referenced by v_IProductWRTDerivBase().

◆ v_ComputeConditionNumberOfMatrix()

void Nektar::LocalRegions::TetExp::v_ComputeConditionNumberOfMatrix ( const DNekScalMatSharedPtr mat)
protected

◆ v_ComputeLaplacianMetric()

void Nektar::LocalRegions::TetExp::v_ComputeLaplacianMetric ( )
protectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1625 of file TetExp.cpp.

1626  {
1627  if (m_metrics.count(eMetricQuadrature) == 0)
1628  {
1630  }
1631 
1632  int i, j;
1633  const unsigned int nqtot = GetTotPoints();
1634  const unsigned int dim = 3;
1638  };
1639 
1640  for (unsigned int i = 0; i < dim; ++i)
1641  {
1642  for (unsigned int j = i; j < dim; ++j)
1643  {
1644  m_metrics[m[i][j]] = Array<OneD, NekDouble>(nqtot);
1645  }
1646  }
1647 
1648  // Define shorthand synonyms for m_metrics storage
1649  Array<OneD,NekDouble> g0 (m_metrics[m[0][0]]);
1650  Array<OneD,NekDouble> g1 (m_metrics[m[1][1]]);
1651  Array<OneD,NekDouble> g2 (m_metrics[m[2][2]]);
1652  Array<OneD,NekDouble> g3 (m_metrics[m[0][1]]);
1653  Array<OneD,NekDouble> g4 (m_metrics[m[0][2]]);
1654  Array<OneD,NekDouble> g5 (m_metrics[m[1][2]]);
1655 
1656  // Allocate temporary storage
1657  Array<OneD,NekDouble> alloc(7*nqtot,0.0);
1658  Array<OneD,NekDouble> h0 (alloc); // h0
1659  Array<OneD,NekDouble> h1 (alloc+ 1*nqtot);// h1
1660  Array<OneD,NekDouble> h2 (alloc+ 2*nqtot);// h2
1661  Array<OneD,NekDouble> h3 (alloc+ 3*nqtot);// h3
1662  Array<OneD,NekDouble> wsp4 (alloc+ 4*nqtot);// wsp4
1663  Array<OneD,NekDouble> wsp5 (alloc+ 5*nqtot);// wsp5
1664  Array<OneD,NekDouble> wsp6 (alloc+ 6*nqtot);// wsp6
1665  // Reuse some of the storage as workspace
1666  Array<OneD,NekDouble> wsp7 (alloc); // wsp7
1667  Array<OneD,NekDouble> wsp8 (alloc+ 1*nqtot);// wsp8
1668  Array<OneD,NekDouble> wsp9 (alloc+ 2*nqtot);// wsp9
1669 
1670  const Array<TwoD, const NekDouble>& df =
1671  m_metricinfo->GetDerivFactors(GetPointsKeys());
1672  const Array<OneD, const NekDouble>& z0 = m_base[0]->GetZ();
1673  const Array<OneD, const NekDouble>& z1 = m_base[1]->GetZ();
1674  const Array<OneD, const NekDouble>& z2 = m_base[2]->GetZ();
1675  const unsigned int nquad0 = m_base[0]->GetNumPoints();
1676  const unsigned int nquad1 = m_base[1]->GetNumPoints();
1677  const unsigned int nquad2 = m_base[2]->GetNumPoints();
1678 
1679  for(j = 0; j < nquad2; ++j)
1680  {
1681  for(i = 0; i < nquad1; ++i)
1682  {
1683  Vmath::Fill(nquad0, 4.0/(1.0-z1[i])/(1.0-z2[j]), &h0[0]+i*nquad0 + j*nquad0*nquad1,1);
1684  Vmath::Fill(nquad0, 2.0/(1.0-z1[i])/(1.0-z2[j]), &h1[0]+i*nquad0 + j*nquad0*nquad1,1);
1685  Vmath::Fill(nquad0, 2.0/(1.0-z2[j]), &h2[0]+i*nquad0 + j*nquad0*nquad1,1);
1686  Vmath::Fill(nquad0, (1.0+z1[i])/(1.0-z2[j]), &h3[0]+i*nquad0 + j*nquad0*nquad1,1);
1687  }
1688  }
1689  for(i = 0; i < nquad0; i++)
1690  {
1691  Blas::Dscal(nquad1*nquad2, 1+z0[i], &h1[0]+i, nquad0);
1692  }
1693 
1694  // Step 3. Construct combined metric terms for physical space to
1695  // collapsed coordinate system.
1696  // Order of construction optimised to minimise temporary storage
1697  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1698  {
1699  // wsp4
1700  Vmath::Vadd(nqtot, &df[1][0], 1, &df[2][0], 1, &wsp4[0], 1);
1701  Vmath::Vvtvvtp(nqtot, &df[0][0], 1, &h0[0], 1, &wsp4[0], 1, &h1[0], 1, &wsp4[0], 1);
1702  // wsp5
1703  Vmath::Vadd(nqtot, &df[4][0], 1, &df[5][0], 1, &wsp5[0], 1);
1704  Vmath::Vvtvvtp(nqtot, &df[3][0], 1, &h0[0], 1, &wsp5[0], 1, &h1[0], 1, &wsp5[0], 1);
1705  // wsp6
1706  Vmath::Vadd(nqtot, &df[7][0], 1, &df[8][0], 1, &wsp6[0], 1);
1707  Vmath::Vvtvvtp(nqtot, &df[6][0], 1, &h0[0], 1, &wsp6[0], 1, &h1[0], 1, &wsp6[0], 1);
1708 
1709  // g0
1710  Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0], 1, &g0[0], 1);
1711  Vmath::Vvtvp (nqtot, &wsp6[0], 1, &wsp6[0], 1, &g0[0], 1, &g0[0], 1);
1712 
1713  // g4
1714  Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp4[0], 1, &df[5][0], 1, &wsp5[0], 1, &g4[0], 1);
1715  Vmath::Vvtvp (nqtot, &df[8][0], 1, &wsp6[0], 1, &g4[0], 1, &g4[0], 1);
1716 
1717  // overwrite h0, h1, h2
1718  // wsp7 (h2f1 + h3f2)
1719  Vmath::Vvtvvtp(nqtot, &df[1][0], 1, &h2[0], 1, &df[2][0], 1, &h3[0], 1, &wsp7[0], 1);
1720  // wsp8 (h2f4 + h3f5)
1721  Vmath::Vvtvvtp(nqtot, &df[4][0], 1, &h2[0], 1, &df[5][0], 1, &h3[0], 1, &wsp8[0], 1);
1722  // wsp9 (h2f7 + h3f8)
1723  Vmath::Vvtvvtp(nqtot, &df[7][0], 1, &h2[0], 1, &df[8][0], 1, &h3[0], 1, &wsp9[0], 1);
1724 
1725  // g3
1726  Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp7[0], 1, &wsp5[0], 1, &wsp8[0], 1, &g3[0], 1);
1727  Vmath::Vvtvp (nqtot, &wsp6[0], 1, &wsp9[0], 1, &g3[0], 1, &g3[0], 1);
1728 
1729  // overwrite wsp4, wsp5, wsp6
1730  // g1
1731  Vmath::Vvtvvtp(nqtot, &wsp7[0], 1, &wsp7[0], 1, &wsp8[0], 1, &wsp8[0], 1, &g1[0], 1);
1732  Vmath::Vvtvp (nqtot, &wsp9[0], 1, &wsp9[0], 1, &g1[0], 1, &g1[0], 1);
1733 
1734  // g5
1735  Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp7[0], 1, &df[5][0], 1, &wsp8[0], 1, &g5[0], 1);
1736  Vmath::Vvtvp (nqtot, &df[8][0], 1, &wsp9[0], 1, &g5[0], 1, &g5[0], 1);
1737 
1738  // g2
1739  Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &df[2][0], 1, &df[5][0], 1, &df[5][0], 1, &g2[0], 1);
1740  Vmath::Vvtvp (nqtot, &df[8][0], 1, &df[8][0], 1, &g2[0], 1, &g2[0], 1);
1741  }
1742  else
1743  {
1744  // wsp4
1745  Vmath::Svtsvtp(nqtot, df[0][0], &h0[0], 1, df[1][0] + df[2][0], &h1[0], 1, &wsp4[0], 1);
1746  // wsp5
1747  Vmath::Svtsvtp(nqtot, df[3][0], &h0[0], 1, df[4][0] + df[5][0], &h1[0], 1, &wsp5[0], 1);
1748  // wsp6
1749  Vmath::Svtsvtp(nqtot, df[6][0], &h0[0], 1, df[7][0] + df[8][0], &h1[0], 1, &wsp6[0], 1);
1750 
1751  // g0
1752  Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0], 1, &g0[0], 1);
1753  Vmath::Vvtvp (nqtot, &wsp6[0], 1, &wsp6[0], 1, &g0[0], 1, &g0[0], 1);
1754 
1755  // g4
1756  Vmath::Svtsvtp(nqtot, df[2][0], &wsp4[0], 1, df[5][0], &wsp5[0], 1, &g4[0], 1);
1757  Vmath::Svtvp (nqtot, df[8][0], &wsp6[0], 1, &g4[0], 1, &g4[0], 1);
1758 
1759  // overwrite h0, h1, h2
1760  // wsp7 (h2f1 + h3f2)
1761  Vmath::Svtsvtp(nqtot, df[1][0], &h2[0], 1, df[2][0], &h3[0], 1, &wsp7[0], 1);
1762  // wsp8 (h2f4 + h3f5)
1763  Vmath::Svtsvtp(nqtot, df[4][0], &h2[0], 1, df[5][0], &h3[0], 1, &wsp8[0], 1);
1764  // wsp9 (h2f7 + h3f8)
1765  Vmath::Svtsvtp(nqtot, df[7][0], &h2[0], 1, df[8][0], &h3[0], 1, &wsp9[0], 1);
1766 
1767  // g3
1768  Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp7[0], 1, &wsp5[0], 1, &wsp8[0], 1, &g3[0], 1);
1769  Vmath::Vvtvp (nqtot, &wsp6[0], 1, &wsp9[0], 1, &g3[0], 1, &g3[0], 1);
1770 
1771  // overwrite wsp4, wsp5, wsp6
1772  // g1
1773  Vmath::Vvtvvtp(nqtot, &wsp7[0], 1, &wsp7[0], 1, &wsp8[0], 1, &wsp8[0], 1, &g1[0], 1);
1774  Vmath::Vvtvp (nqtot, &wsp9[0], 1, &wsp9[0], 1, &g1[0], 1, &g1[0], 1);
1775 
1776  // g5
1777  Vmath::Svtsvtp(nqtot, df[2][0], &wsp7[0], 1, df[5][0], &wsp8[0], 1, &g5[0], 1);
1778  Vmath::Svtvp (nqtot, df[8][0], &wsp9[0], 1, &g5[0], 1, &g5[0], 1);
1779 
1780  // g2
1781  Vmath::Fill(nqtot, df[2][0]*df[2][0] + df[5][0]*df[5][0] + df[8][0]*df[8][0], &g2[0], 1);
1782  }
1783 
1784  for (unsigned int i = 0; i < dim; ++i)
1785  {
1786  for (unsigned int j = i; j < dim; ++j)
1787  {
1789  m_metrics[m[i][j]]);
1790 
1791  }
1792  }
1793 
1794 
1795  }
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:134
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:733
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
Definition: Blas.hpp:182
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:691
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:565
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:513
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:322
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
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:625

References Nektar::LocalRegions::Expansion::ComputeQuadratureMetric(), Blas::Dscal(), Nektar::SpatialDomains::eDeformed, Nektar::LocalRegions::eMetricLaplacian00, Nektar::LocalRegions::eMetricLaplacian01, Nektar::LocalRegions::eMetricLaplacian02, Nektar::LocalRegions::eMetricLaplacian11, Nektar::LocalRegions::eMetricLaplacian12, Nektar::LocalRegions::eMetricLaplacian22, Nektar::LocalRegions::eMetricQuadrature, Vmath::Fill(), 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::Svtsvtp(), Vmath::Svtvp(), Vmath::Vadd(), Vmath::Vvtvp(), and Vmath::Vvtvvtp().

◆ v_ComputeTraceNormal()

void Nektar::LocalRegions::TetExp::v_ComputeTraceNormal ( const int  face)
protectedvirtual

Compute the normal of a triangular face.

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 751 of file TetExp.cpp.

752  {
753  int i;
754  const SpatialDomains::GeomFactorsSharedPtr &geomFactors =
755  GetGeom()->GetMetricInfo();
756 
758  for(int i = 0; i < ptsKeys.size(); ++i)
759  {
760  // Need at least 2 points for computing normals
761  if (ptsKeys[i].GetNumPoints() == 1)
762  {
763  LibUtilities::PointsKey pKey(2, ptsKeys[i].GetPointsType());
764  ptsKeys[i] = pKey;
765  }
766  }
767 
768  SpatialDomains::GeomType type = geomFactors->GetGtype();
769  const Array<TwoD, const NekDouble> &df = geomFactors->GetDerivFactors(ptsKeys);
770  const Array<OneD, const NekDouble> &jac = geomFactors->GetJac(ptsKeys);
771 
772  LibUtilities::BasisKey tobasis0 = GetTraceBasisKey(face,0);
773  LibUtilities::BasisKey tobasis1 = GetTraceBasisKey(face,1);
774 
775  // number of face quadrature points
776  int nq_face = tobasis0.GetNumPoints()*tobasis1.GetNumPoints();
777 
778  int vCoordDim = GetCoordim();
779 
780  m_faceNormals[face] = Array<OneD, Array<OneD, NekDouble> >(vCoordDim);
781  Array<OneD, Array<OneD, NekDouble> > &normal = m_faceNormals[face];
782  for (i = 0; i < vCoordDim; ++i)
783  {
784  normal[i] = Array<OneD, NekDouble>(nq_face);
785  }
786 
787  size_t nqb = nq_face;
788  size_t nbnd= face;
789  m_elmtBndNormDirElmtLen[nbnd] = Array<OneD, NekDouble> {nqb, 0.0};
790  Array<OneD, NekDouble> &length = m_elmtBndNormDirElmtLen[nbnd];
791 
792  // Regular geometry case
793  if (type == SpatialDomains::eRegular ||
795  {
796  NekDouble fac;
797 
798  // Set up normals
799  switch (face)
800  {
801  case 0:
802  {
803  for (i = 0; i < vCoordDim; ++i)
804  {
805  normal[i][0] = -df[3*i+2][0];
806  }
807 
808  break;
809  }
810  case 1:
811  {
812  for (i = 0; i < vCoordDim; ++i)
813  {
814  normal[i][0] = -df[3*i+1][0];
815  }
816 
817  break;
818  }
819  case 2:
820  {
821  for (i = 0; i < vCoordDim; ++i)
822  {
823  normal[i][0] = df[3*i][0]+df[3*i+1][0]+
824  df[3*i+2][0];
825  }
826 
827  break;
828  }
829  case 3:
830  {
831  for(i = 0; i < vCoordDim; ++i)
832  {
833  normal[i][0] = -df[3*i][0];
834  }
835  break;
836  }
837  default:
838  ASSERTL0(false,"face is out of range (edge < 3)");
839  }
840 
841  // normalise
842  fac = 0.0;
843  for (i = 0; i < vCoordDim; ++i)
844  {
845  fac += normal[i][0]*normal[i][0];
846  }
847  fac = 1.0/sqrt(fac);
848  Vmath::Fill(nqb, fac, length, 1);
849 
850  for (i = 0; i < vCoordDim; ++i)
851  {
852  Vmath::Fill(nq_face,fac*normal[i][0],normal[i],1);
853  }
854  }
855  else
856  {
857  // Set up deformed normals
858  int j, k;
859 
860  int nq0 = ptsKeys[0].GetNumPoints();
861  int nq1 = ptsKeys[1].GetNumPoints();
862  int nq2 = ptsKeys[2].GetNumPoints();
863  int nqtot;
864  int nq01 =nq0*nq1;
865 
866  // number of elemental quad points
867  if (face == 0)
868  {
869  nqtot = nq01;
870  }
871  else if (face == 1)
872  {
873  nqtot = nq0*nq2;
874  }
875  else
876  {
877  nqtot = nq1*nq2;
878  }
879 
880  LibUtilities::PointsKey points0;
881  LibUtilities::PointsKey points1;
882 
883  Array<OneD, NekDouble> faceJac(nqtot);
884  Array<OneD,NekDouble> normals(vCoordDim*nqtot, 0.0);
885 
886  // Extract Jacobian along face and recover local derivates
887  // (dx/dr) for polynomial interpolation by multiplying m_gmat by
888  // jacobian
889  switch (face)
890  {
891  case 0:
892  {
893  for(j = 0; j < nq01; ++j)
894  {
895  normals[j] = -df[2][j]*jac[j];
896  normals[nqtot+j] = -df[5][j]*jac[j];
897  normals[2*nqtot+j] = -df[8][j]*jac[j];
898  faceJac[j] = jac[j];
899  }
900 
901  points0 = ptsKeys[0];
902  points1 = ptsKeys[1];
903  break;
904  }
905 
906  case 1:
907  {
908  for (j = 0; j < nq0; ++j)
909  {
910  for(k = 0; k < nq2; ++k)
911  {
912  int tmp = j+nq01*k;
913  normals[j+k*nq0] =
914  -df[1][tmp]*jac[tmp];
915  normals[nqtot+j+k*nq0] =
916  -df[4][tmp]*jac[tmp];
917  normals[2*nqtot+j+k*nq0] =
918  -df[7][tmp]*jac[tmp];
919  faceJac[j+k*nq0] = jac[tmp];
920  }
921  }
922 
923  points0 = ptsKeys[0];
924  points1 = ptsKeys[2];
925  break;
926  }
927 
928  case 2:
929  {
930  for (j = 0; j < nq1; ++j)
931  {
932  for(k = 0; k < nq2; ++k)
933  {
934  int tmp = nq0-1+nq0*j+nq01*k;
935  normals[j+k*nq1] =
936  (df[0][tmp]+df[1][tmp]+df[2][tmp])*
937  jac[tmp];
938  normals[nqtot+j+k*nq1] =
939  (df[3][tmp]+df[4][tmp]+df[5][tmp])*
940  jac[tmp];
941  normals[2*nqtot+j+k*nq1] =
942  (df[6][tmp]+df[7][tmp]+df[8][tmp])*
943  jac[tmp];
944  faceJac[j+k*nq1] = jac[tmp];
945  }
946  }
947 
948  points0 = ptsKeys[1];
949  points1 = ptsKeys[2];
950  break;
951  }
952 
953  case 3:
954  {
955  for (j = 0; j < nq1; ++j)
956  {
957  for(k = 0; k < nq2; ++k)
958  {
959  int tmp = j*nq0+nq01*k;
960  normals[j+k*nq1] =
961  -df[0][tmp]*jac[tmp];
962  normals[nqtot+j+k*nq1] =
963  -df[3][tmp]*jac[tmp];
964  normals[2*nqtot+j+k*nq1] =
965  -df[6][tmp]*jac[tmp];
966  faceJac[j+k*nq1] = jac[tmp];
967  }
968  }
969 
970  points0 = ptsKeys[1];
971  points1 = ptsKeys[2];
972  break;
973  }
974 
975  default:
976  ASSERTL0(false,"face is out of range (face < 3)");
977  }
978 
979  Array<OneD,NekDouble> work (nq_face, 0.0);
980  // Interpolate Jacobian and invert
981  LibUtilities::Interp2D(points0, points1, faceJac,
982  tobasis0.GetPointsKey(),
983  tobasis1.GetPointsKey(),
984  work);
985  Vmath::Sdiv(nq_face, 1.0, &work[0], 1, &work[0], 1);
986 
987  // Interpolate normal and multiply by inverse Jacobian.
988  for(i = 0; i < vCoordDim; ++i)
989  {
990  LibUtilities::Interp2D(points0, points1,
991  &normals[i*nqtot],
992  tobasis0.GetPointsKey(),
993  tobasis1.GetPointsKey(),
994  &normal[i][0]);
995  Vmath::Vmul(nq_face,work,1,normal[i],1,normal[i],1);
996  }
997 
998  // Normalise to obtain unit normals.
999  Vmath::Zero(nq_face,work,1);
1000  for(i = 0; i < GetCoordim(); ++i)
1001  {
1002  Vmath::Vvtvp(nq_face,normal[i],1,normal[i],1,work,1,work,1);
1003  }
1004 
1005  Vmath::Vsqrt(nq_face,work,1,work,1);
1006  Vmath::Sdiv (nq_face,1.0,work,1,work,1);
1007 
1008  Vmath::Vcopy(nqb, work, 1, length, 1);
1009 
1010  for(i = 0; i < GetCoordim(); ++i)
1011  {
1012  Vmath::Vmul(nq_face,normal[i],1,work,1,normal[i],1);
1013  }
1014  }
1015  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
std::map< int, NormalVector > m_faceNormals
Definition: Expansion3D.h:123
std::map< int, Array< OneD, NekDouble > > m_elmtBndNormDirElmtLen
the element length in each element boundary(Vertex, edge or face) normal direction calculated based o...
Definition: Expansion.h:284
SpatialDomains::GeometrySharedPtr GetGeom() const
Definition: Expansion.cpp:172
const LibUtilities::BasisKey GetTraceBasisKey(const int i, int k=-1) const
This function returns the basis key belonging to the i-th trace.
Definition: StdExpansion.h:304
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:208
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:221
void Interp2D(const BasisKey &fbasis0, const BasisKey &fbasis1, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, Array< OneD, NekDouble > &to)
this function interpolates a 2D function evaluated at the quadrature points of the 2D basis,...
Definition: Interp.cpp:115
std::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
Definition: GeomFactors.h:62
GeomType
Indicates the type of element geometry.
@ eRegular
Geometry is straight-sided with constant geometric factors.
@ eMovingRegular
Currently unused.
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
Definition: Vmath.cpp:475
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:291
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:436
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:267

References ASSERTL0, Nektar::SpatialDomains::eMovingRegular, Nektar::SpatialDomains::eRegular, Vmath::Fill(), Nektar::StdRegions::StdExpansion::GetCoordim(), Nektar::LocalRegions::Expansion::GetGeom(), Nektar::LibUtilities::BasisKey::GetNumPoints(), Nektar::StdRegions::StdExpansion::GetNumPoints(), Nektar::LibUtilities::BasisKey::GetPointsKey(), Nektar::StdRegions::StdExpansion::GetPointsKeys(), Nektar::StdRegions::StdExpansion::GetPointsType(), Nektar::StdRegions::StdExpansion::GetTraceBasisKey(), Nektar::LibUtilities::Interp2D(), Nektar::LocalRegions::Expansion::m_elmtBndNormDirElmtLen, Nektar::LocalRegions::Expansion3D::m_faceNormals, Vmath::Sdiv(), tinysimd::sqrt(), Vmath::Vcopy(), Vmath::Vmul(), Vmath::Vsqrt(), Vmath::Vvtvp(), and Vmath::Zero().

◆ v_CreateStdMatrix()

DNekMatSharedPtr Nektar::LocalRegions::TetExp::v_CreateStdMatrix ( const StdRegions::StdMatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 1506 of file TetExp.cpp.

1508  {
1509  LibUtilities::BasisKey bkey0 = m_base[0]->GetBasisKey();
1510  LibUtilities::BasisKey bkey1 = m_base[1]->GetBasisKey();
1511  LibUtilities::BasisKey bkey2 = m_base[2]->GetBasisKey();
1513 
1514  return tmp->GetStdMatrix(mkey);
1515  }
std::shared_ptr< StdTetExp > StdTetExpSharedPtr
Definition: StdTetExp.h:279

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

◆ v_DetShapeType()

LibUtilities::ShapeType Nektar::LocalRegions::TetExp::v_DetShapeType ( ) const
protectedvirtual

Return Shape of region, using ShapeType enum list.

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 561 of file TetExp.cpp.

562  {
564  }

References Nektar::LibUtilities::eTetrahedron.

◆ v_DropLocStaticCondMatrix()

void Nektar::LocalRegions::TetExp::v_DropLocStaticCondMatrix ( const MatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1527 of file TetExp.cpp.

1528  {
1529  m_staticCondMatrixManager.DeleteObject(mkey);
1530  }

References m_staticCondMatrixManager.

◆ v_ExtractDataToCoeffs()

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

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 594 of file TetExp.cpp.

600  {
601  boost::ignore_unused(fromType);
602 
603  int data_order0 = nummodes[mode_offset];
604  int fillorder0 = min(m_base[0]->GetNumModes(),data_order0);
605  int data_order1 = nummodes[mode_offset+1];
606  int order1 = m_base[1]->GetNumModes();
607  int fillorder1 = min(order1,data_order1);
608  int data_order2 = nummodes[mode_offset+2];
609  int order2 = m_base[2]->GetNumModes();
610  int fillorder2 = min(order2,data_order2);
611 
612  switch(m_base[0]->GetBasisType())
613  {
615  {
616  int i,j;
617  int cnt = 0;
618  int cnt1 = 0;
619 
620  ASSERTL1(m_base[1]->GetBasisType() ==
622  "Extraction routine not set up for this basis");
623  ASSERTL1(m_base[2]->GetBasisType() ==
625  "Extraction routine not set up for this basis");
626 
627  Vmath::Zero(m_ncoeffs,coeffs,1);
628  for(j = 0; j < fillorder0; ++j)
629  {
630  for(i = 0; i < fillorder1-j; ++i)
631  {
632  Vmath::Vcopy(fillorder2-j-i, &data[cnt], 1,
633  &coeffs[cnt1], 1);
634  cnt += data_order2-j-i;
635  cnt1 += order2-j-i;
636  }
637 
638  // count out data for j iteration
639  for(i = fillorder1-j; i < data_order1-j; ++i)
640  {
641  cnt += data_order2-j-i;
642  }
643 
644  for(i = fillorder1-j; i < order1-j; ++i)
645  {
646  cnt1 += order2-j-i;
647  }
648 
649  }
650  }
651  break;
652  default:
653  ASSERTL0(false, "basis is either not set up or not "
654  "hierarchicial");
655  }
656  }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:250
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:158
@ eModified_B
Principle Modified Functions .
Definition: BasisType.h:49
@ eModified_C
Principle Modified Functions .
Definition: BasisType.h:50
@ eModified_A
Principle Modified Functions .
Definition: BasisType.h:48

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

◆ v_FwdTrans()

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

Forward transform from physical quadrature space stored in inarray and evaluate the expansion coefficients and store in (this)->_coeffs.

@param   inarray     Array of physical quadrature points to be
                     transformed.
@param   outarray    Array of coefficients to update.

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 242 of file TetExp.cpp.

245  {
246  if((m_base[0]->Collocation())&&(m_base[1]->Collocation())&&(m_base[2]->Collocation()))
247  {
248  Vmath::Vcopy(GetNcoeffs(),&inarray[0],1,&outarray[0],1);
249  }
250  else
251  {
252  IProductWRTBase(inarray,outarray);
253 
254  // get Mass matrix inverse
255  MatrixKey masskey(StdRegions::eInvMass,
256  DetShapeType(),*this);
257  DNekScalMatSharedPtr matsys = m_matrixManager[masskey];
258 
259  // copy inarray in case inarray == outarray
260  DNekVec in (m_ncoeffs,outarray);
261  DNekVec out(m_ncoeffs,outarray,eWrapper);
262 
263  out = (*matsys)*in;
264  }
265  }
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
Definition: StdExpansion.h:124
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:537
NekVector< NekDouble > DNekVec
Definition: NekTypeDefs.hpp:48

References Nektar::StdRegions::StdTetExp::DetShapeType(), Nektar::StdRegions::eInvMass, Nektar::eWrapper, Nektar::StdRegions::StdExpansion::GetNcoeffs(), Nektar::StdRegions::StdExpansion::IProductWRTBase(), Nektar::StdRegions::StdExpansion::m_base, m_matrixManager, Nektar::StdRegions::StdExpansion::m_ncoeffs, and Vmath::Vcopy().

◆ v_GenMatrix()

DNekMatSharedPtr Nektar::LocalRegions::TetExp::v_GenMatrix ( const StdRegions::StdMatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 1081 of file TetExp.cpp.

1083  {
1084  DNekMatSharedPtr returnval;
1085 
1086  switch(mkey.GetMatrixType())
1087  {
1095  returnval = Expansion3D::v_GenMatrix(mkey);
1096  break;
1097  default:
1098  returnval = StdTetExp::v_GenMatrix(mkey);
1099  }
1100 
1101  return returnval;
1102  }
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey)

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::Expansion3D::v_GenMatrix().

◆ v_GetCoord()

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

Get the coordinates "coords" at the local coordinates "Lcoords".

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 526 of file TetExp.cpp.

529  {
530  int i;
531 
532  ASSERTL1(Lcoords[0] <= -1.0 && Lcoords[0] >= 1.0 &&
533  Lcoords[1] <= -1.0 && Lcoords[1] >= 1.0 &&
534  Lcoords[2] <= -1.0 && Lcoords[2] >= 1.0,
535  "Local coordinates are not in region [-1,1]");
536 
537  // m_geom->FillGeom(); // TODO: implement FillGeom()
538 
539  for(i = 0; i < m_geom->GetCoordim(); ++i)
540  {
541  coords[i] = m_geom->GetCoord(i,Lcoords);
542  }
543  }
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:272

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

◆ v_GetCoordim()

int Nektar::LocalRegions::TetExp::v_GetCoordim ( void  )
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion3D.

Definition at line 589 of file TetExp.cpp.

590  {
591  return m_geom->GetCoordim();
592  }

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

◆ v_GetCoords()

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

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 545 of file TetExp.cpp.

549  {
550  Expansion::v_GetCoords(coords_0, coords_1, coords_2);
551  }
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3)
Definition: Expansion.cpp:318

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

◆ v_GetLinStdExp()

StdRegions::StdExpansionSharedPtr Nektar::LocalRegions::TetExp::v_GetLinStdExp ( void  ) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 575 of file TetExp.cpp.

576  {
577  LibUtilities::BasisKey bkey0(m_base[0]->GetBasisType(),
578  2, m_base[0]->GetPointsKey());
579  LibUtilities::BasisKey bkey1(m_base[1]->GetBasisType(),
580  2, m_base[1]->GetPointsKey());
581  LibUtilities::BasisKey bkey2(m_base[2]->GetBasisType(),
582  2, m_base[2]->GetPointsKey());
583 
585  ::AllocateSharedPtr( bkey0, bkey1, bkey2);
586  }

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

◆ v_GetLocMatrix()

DNekScalMatSharedPtr Nektar::LocalRegions::TetExp::v_GetLocMatrix ( const MatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1517 of file TetExp.cpp.

1518  {
1519  return m_matrixManager[mkey];
1520  }

References m_matrixManager.

◆ v_GetLocStaticCondMatrix()

DNekScalBlkMatSharedPtr Nektar::LocalRegions::TetExp::v_GetLocStaticCondMatrix ( const MatrixKey mkey)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1522 of file TetExp.cpp.

1523  {
1524  return m_staticCondMatrixManager[mkey];
1525  }

References m_staticCondMatrixManager.

◆ v_GetStdExp()

StdRegions::StdExpansionSharedPtr Nektar::LocalRegions::TetExp::v_GetStdExp ( void  ) const
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 566 of file TetExp.cpp.

567  {
569  ::AllocateSharedPtr(m_base[0]->GetBasisKey(),
570  m_base[1]->GetBasisKey(),
571  m_base[2]->GetBasisKey());
572  }

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

◆ v_GetTracePhysMap()

void Nektar::LocalRegions::TetExp::v_GetTracePhysMap ( const int  face,
Array< OneD, int > &  outarray 
)
protectedvirtual

Returns the physical values at the quadrature points of a face.

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 661 of file TetExp.cpp.

663  {
664  int nquad0 = m_base[0]->GetNumPoints();
665  int nquad1 = m_base[1]->GetNumPoints();
666  int nquad2 = m_base[2]->GetNumPoints();
667 
668  int nq0 = 0;
669  int nq1 = 0;
670 
671  // get forward aligned faces.
672  switch(face)
673  {
674  case 0:
675  {
676  nq0 = nquad0;
677  nq1 = nquad1;
678  if(outarray.size()!=nq0*nq1)
679  {
680  outarray = Array<OneD, int>(nq0*nq1);
681  }
682 
683  for (int i = 0; i < nquad0*nquad1; ++i)
684  {
685  outarray[i] = i;
686  }
687 
688  break;
689  }
690  case 1:
691  {
692  nq0 = nquad0;
693  nq1 = nquad2;
694  if(outarray.size()!=nq0*nq1)
695  {
696  outarray = Array<OneD, int>(nq0*nq1);
697  }
698 
699  //Direction A and B positive
700  for (int k=0; k<nquad2; k++)
701  {
702  for(int i = 0; i < nquad0; ++i)
703  {
704  outarray[k*nquad0+i] = (nquad0*nquad1*k)+i;
705  }
706  }
707  break;
708  }
709  case 2:
710  {
711  nq0 = nquad1;
712  nq1 = nquad2;
713  if(outarray.size()!=nq0*nq1)
714  {
715  outarray = Array<OneD, int>(nq0*nq1);
716  }
717 
718  //Directions A and B positive
719  for(int j = 0; j < nquad1*nquad2; ++j)
720  {
721  outarray[j] = nquad0-1 + j*nquad0;
722  }
723  break;
724  }
725  case 3:
726  {
727  nq0 = nquad1;
728  nq1 = nquad2;
729  if(outarray.size() != nq0*nq1)
730  {
731  outarray = Array<OneD, int>(nq0*nq1);
732  }
733 
734  //Directions A and B positive
735  for(int j = 0; j < nquad1*nquad2; ++j)
736  {
737  outarray[j] = j*nquad0;
738  }
739  }
740  break;
741  default:
742  ASSERTL0(false,"face value (> 3) is out of range");
743  break;
744  }
745  }

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

◆ v_HelmholtzMatrixOp()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1020 of file TetExp.cpp.

1024  {
1025  TetExp::v_HelmholtzMatrixOp_MatFree(inarray,outarray,mkey);
1026  }
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)

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

◆ v_Integral()

NekDouble Nektar::LocalRegions::TetExp::v_Integral ( const Array< OneD, const NekDouble > &  inarray)
protectedvirtual

Integrate the physical point list inarray over region.

Parameters
inarrayDefinition of function to be returned at quadrature point of expansion.
Returns
\(\int^1_{-1}\int^1_{-1} \int^1_{-1} u(\eta_1, \eta_2, \eta_3) J[i,j,k] d \eta_1 d \eta_2 d \eta_3 \) where \(inarray[i,j,k] = u(\eta_{1i},\eta_{2j},\eta_{3k}) \) and \( J[i,j,k] \) is the Jacobian evaluated at the quadrature point.

Reimplemented from Nektar::StdRegions::StdExpansion3D.

Definition at line 123 of file TetExp.cpp.

125  {
126  int nquad0 = m_base[0]->GetNumPoints();
127  int nquad1 = m_base[1]->GetNumPoints();
128  int nquad2 = m_base[2]->GetNumPoints();
129  Array<OneD, const NekDouble> jac = m_metricinfo->GetJac(GetPointsKeys());
130  NekDouble retrunVal;
131  Array<OneD,NekDouble> tmp(nquad0*nquad1*nquad2);
132 
133  // multiply inarray with Jacobian
134  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
135  {
136  Vmath::Vmul(nquad0*nquad1*nquad2,&jac[0],1,
137  (NekDouble*)&inarray[0],1, &tmp[0],1);
138  }
139  else
140  {
141  Vmath::Smul(nquad0*nquad1*nquad2,(NekDouble) jac[0],
142  (NekDouble*)&inarray[0],1,&tmp[0],1);
143  }
144 
145  // call StdTetExp version;
146  retrunVal = StdTetExp::v_Integral(tmp);
147 
148  return retrunVal;
149  }

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

◆ v_IProductWRTBase()

void Nektar::LocalRegions::TetExp::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=m_base0*m_base1*m_base2 and put into outarray:

\f$ \begin{array}{rcl} I_{pqr} = (\phi_{pqr}, u)_{\delta}
  & = & \sum_{i=0}^{nq_0} \sum_{j=0}^{nq_1} \sum_{k=0}^{nq_2}
    \psi_{p}^{a} (\eta_{1i}) \psi_{pq}^{b} (\eta_{2j}) \psi_{pqr}^{c}
    (\eta_{3k}) w_i w_j w_k u(\eta_{1,i} \eta_{2,j} \eta_{3,k})
J_{i,j,k}\\ & = & \sum_{i=0}^{nq_0} \psi_p^a(\eta_{1,i})
  \sum_{j=0}^{nq_1} \psi_{pq}^b(\eta_{2,j}) \sum_{k=0}^{nq_2}
  \psi_{pqr}^c u(\eta_{1i},\eta_{2j},\eta_{3k}) J_{i,j,k}
\end{array} \f$ \n
where
\f$ \phi_{pqr} (\xi_1 , \xi_2 , \xi_3)
  = \psi_p^a (\eta_1) \psi_{pq}^b (\eta_2) \psi_{pqr}^c (\eta_3) \f$
which can be implemented as \n
\f$f_{pqr} (\xi_{3k})
  = \sum_{k=0}^{nq_3} \psi_{pqr}^c u(\eta_{1i},\eta_{2j},\eta_{3k})
J_{i,j,k} = {\bf B_3 U}   \f$ \n
\f$ g_{pq} (\xi_{3k})
  = \sum_{j=0}^{nq_1} \psi_{pq}^b (\xi_{2j}) f_{pqr} (\xi_{3k})
  = {\bf B_2 F}  \f$ \n
\f$ (\phi_{pqr}, u)_{\delta}
  = \sum_{k=0}^{nq_0} \psi_{p}^a (\xi_{3k}) g_{pq} (\xi_{3k})
  = {\bf B_1 G} \f$

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 296 of file TetExp.cpp.

299  {
300  v_IProductWRTBase_SumFac(inarray, outarray);
301  }
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
Definition: TetExp.cpp:303

References v_IProductWRTBase_SumFac().

◆ v_IProductWRTBase_SumFac()

void Nektar::LocalRegions::TetExp::v_IProductWRTBase_SumFac ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
bool  multiplybyweights = true 
)
protectedvirtual
Parameters
inarrayFunction evaluated at physical collocation points.
outarrayInner product with respect to each basis function over the element.

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 303 of file TetExp.cpp.

307  {
308  const int nquad0 = m_base[0]->GetNumPoints();
309  const int nquad1 = m_base[1]->GetNumPoints();
310  const int nquad2 = m_base[2]->GetNumPoints();
311  const int order0 = m_base[0]->GetNumModes();
312  const int order1 = m_base[1]->GetNumModes();
313  Array<OneD, NekDouble> wsp(nquad1*nquad2*order0 +
314  nquad2*order0*(order1+1)/2);
315 
316  if(multiplybyweights)
317  {
318  Array<OneD, NekDouble> tmp(nquad0*nquad1*nquad2);
319 
320  MultiplyByQuadratureMetric(inarray, tmp);
321  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
322  m_base[1]->GetBdata(),
323  m_base[2]->GetBdata(),
324  tmp,outarray,wsp,
325  true,true,true);
326  }
327  else
328  {
329  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
330  m_base[1]->GetBdata(),
331  m_base[2]->GetBdata(),
332  inarray,outarray,wsp,
333  true,true,true);
334  }
335  }
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)

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

Referenced by v_IProductWRTBase().

◆ v_IProductWRTDerivBase()

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

Calculates the inner product \( I_{pqr} = (u, \partial_{x_i} \phi_{pqr}) \).

The derivative of the basis functions is performed using the chain rule in order to incorporate the geometric factors. Assuming that the basis functions are a tensor product \(\phi_{pqr}(\eta_1,\eta_2,\eta_3) = \phi_1(\eta_1)\phi_2(\eta_2)\phi_3(\eta_3)\), this yields the result

\[ I_{pqr} = \sum_{j=1}^3 \left(u, \frac{\partial u}{\partial \eta_j} \frac{\partial \eta_j}{\partial x_i}\right) \]

In the prismatic element, we must also incorporate a second set of geometric factors which incorporate the collapsed co-ordinate system, so that

\[ \frac{\partial\eta_j}{\partial x_i} = \sum_{k=1}^3 \frac{\partial\eta_j}{\partial\xi_k}\frac{\partial\xi_k}{\partial x_i} \]

These derivatives can be found on p152 of Sherwin & Karniadakis.

Parameters
dirDirection in which to take the derivative.
inarrayThe function \( u \).
outarrayValue of the inner product.

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 367 of file TetExp.cpp.

371  {
372  const int nquad0 = m_base[0]->GetNumPoints();
373  const int nquad1 = m_base[1]->GetNumPoints();
374  const int nquad2 = m_base[2]->GetNumPoints();
375  const int order0 = m_base[0]->GetNumModes ();
376  const int order1 = m_base[1]->GetNumModes ();
377  const int nqtot = nquad0*nquad1*nquad2;
378 
379  Array<OneD, NekDouble> tmp1 (nqtot);
380  Array<OneD, NekDouble> tmp2 (nqtot);
381  Array<OneD, NekDouble> tmp3 (nqtot);
382  Array<OneD, NekDouble> tmp4 (nqtot);
383  Array<OneD, NekDouble> tmp6 (m_ncoeffs);
384  Array<OneD, NekDouble> wsp (nquad1*nquad2*order0 +
385  nquad2*order0*(order1+1)/2);
386 
387  MultiplyByQuadratureMetric(inarray,tmp1);
388 
389  Array<OneD, Array<OneD, NekDouble>> tmp2D{3};
390  tmp2D[0] = tmp2;
391  tmp2D[1] = tmp3;
392  tmp2D[2] = tmp4;
393 
394  TetExp::v_AlignVectorToCollapsedDir(dir, tmp1, tmp2D);
395 
396  IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(),
397  m_base[1]->GetBdata (),
398  m_base[2]->GetBdata (),
399  tmp2,outarray,wsp,
400  false,true,true);
401 
402  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata (),
403  m_base[1]->GetDbdata(),
404  m_base[2]->GetBdata (),
405  tmp3,tmp6,wsp,
406  true,false,true);
407 
408  Vmath::Vadd(m_ncoeffs, tmp6, 1, outarray, 1, outarray, 1);
409 
410  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata (),
411  m_base[1]->GetBdata (),
412  m_base[2]->GetDbdata(),
413  tmp4,tmp6,wsp,
414  true,true,false);
415 
416  Vmath::Vadd(m_ncoeffs, tmp6, 1, outarray, 1, outarray, 1);
417  }
virtual void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Definition: TetExp.cpp:419

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

◆ v_LaplacianMatrixOp() [1/2]

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1029 of file TetExp.cpp.

1033  {
1034  TetExp::v_LaplacianMatrixOp_MatFree(inarray,outarray,mkey);
1035  }
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)

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

◆ v_LaplacianMatrixOp() [2/2]

void Nektar::LocalRegions::TetExp::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::StdExpansion.

Definition at line 1037 of file TetExp.cpp.

1043  {
1044  StdExpansion::LaplacianMatrixOp_MatFree(k1,k2,inarray,outarray,
1045  mkey);
1046  }

◆ v_LaplacianMatrixOp_MatFree_Kernel()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1555 of file TetExp.cpp.

1559  {
1560  // This implementation is only valid when there are no
1561  // coefficients associated to the Laplacian operator
1562  if (m_metrics.count(eMetricLaplacian00) == 0)
1563  {
1565  }
1566 
1567  int nquad0 = m_base[0]->GetNumPoints();
1568  int nquad1 = m_base[1]->GetNumPoints();
1569  int nquad2 = m_base[2]->GetNumPoints();
1570  int nqtot = nquad0*nquad1*nquad2;
1571 
1572  ASSERTL1(wsp.size() >= 6*nqtot,
1573  "Insufficient workspace size.");
1574  ASSERTL1(m_ncoeffs <= nqtot,
1575  "Workspace not set up for ncoeffs > nqtot");
1576 
1577  const Array<OneD, const NekDouble>& base0 = m_base[0]->GetBdata();
1578  const Array<OneD, const NekDouble>& base1 = m_base[1]->GetBdata();
1579  const Array<OneD, const NekDouble>& base2 = m_base[2]->GetBdata();
1580  const Array<OneD, const NekDouble>& dbase0 = m_base[0]->GetDbdata();
1581  const Array<OneD, const NekDouble>& dbase1 = m_base[1]->GetDbdata();
1582  const Array<OneD, const NekDouble>& dbase2 = m_base[2]->GetDbdata();
1583  const Array<OneD, const NekDouble>& metric00 = m_metrics[eMetricLaplacian00];
1584  const Array<OneD, const NekDouble>& metric01 = m_metrics[eMetricLaplacian01];
1585  const Array<OneD, const NekDouble>& metric02 = m_metrics[eMetricLaplacian02];
1586  const Array<OneD, const NekDouble>& metric11 = m_metrics[eMetricLaplacian11];
1587  const Array<OneD, const NekDouble>& metric12 = m_metrics[eMetricLaplacian12];
1588  const Array<OneD, const NekDouble>& metric22 = m_metrics[eMetricLaplacian22];
1589 
1590  // Allocate temporary storage
1591  Array<OneD,NekDouble> wsp0 (2*nqtot, wsp);
1592  Array<OneD,NekDouble> wsp1 ( nqtot, wsp+1*nqtot);
1593  Array<OneD,NekDouble> wsp2 ( nqtot, wsp+2*nqtot);
1594  Array<OneD,NekDouble> wsp3 ( nqtot, wsp+3*nqtot);
1595  Array<OneD,NekDouble> wsp4 ( nqtot, wsp+4*nqtot);
1596  Array<OneD,NekDouble> wsp5 ( nqtot, wsp+5*nqtot);
1597 
1598  // LAPLACIAN MATRIX OPERATION
1599  // wsp1 = du_dxi1 = D_xi1 * inarray = D_xi1 * u
1600  // wsp2 = du_dxi2 = D_xi2 * inarray = D_xi2 * u
1601  // wsp2 = du_dxi3 = D_xi3 * inarray = D_xi3 * u
1602  StdExpansion3D::PhysTensorDeriv(inarray,wsp0,wsp1,wsp2);
1603 
1604  // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1605  // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1606  // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
1607  // especially for this purpose
1608  Vmath::Vvtvvtp(nqtot,&metric00[0],1,&wsp0[0],1,&metric01[0],1,&wsp1[0],1,&wsp3[0],1);
1609  Vmath::Vvtvp (nqtot,&metric02[0],1,&wsp2[0],1,&wsp3[0],1,&wsp3[0],1);
1610  Vmath::Vvtvvtp(nqtot,&metric01[0],1,&wsp0[0],1,&metric11[0],1,&wsp1[0],1,&wsp4[0],1);
1611  Vmath::Vvtvp (nqtot,&metric12[0],1,&wsp2[0],1,&wsp4[0],1,&wsp4[0],1);
1612  Vmath::Vvtvvtp(nqtot,&metric02[0],1,&wsp0[0],1,&metric12[0],1,&wsp1[0],1,&wsp5[0],1);
1613  Vmath::Vvtvp (nqtot,&metric22[0],1,&wsp2[0],1,&wsp5[0],1,&wsp5[0],1);
1614 
1615  // outarray = m = (D_xi1 * B)^T * k
1616  // wsp1 = n = (D_xi2 * B)^T * l
1617  IProductWRTBase_SumFacKernel(dbase0,base1,base2,wsp3,outarray,wsp0,false,true,true);
1618  IProductWRTBase_SumFacKernel(base0,dbase1,base2,wsp4,wsp2, wsp0,true,false,true);
1619  Vmath::Vadd(m_ncoeffs,wsp2.get(),1,outarray.get(),1,outarray.get(),1);
1620  IProductWRTBase_SumFacKernel(base0,base1,dbase2,wsp5,wsp2, wsp0,true,true,false);
1621  Vmath::Vadd(m_ncoeffs,wsp2.get(),1,outarray.get(),1,outarray.get(),1);
1622  }

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

◆ v_PhysDeriv()

void Nektar::LocalRegions::TetExp::v_PhysDeriv ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out_d0,
Array< OneD, NekDouble > &  out_d1,
Array< OneD, NekDouble > &  out_d2 
)
protectedvirtual

Differentiate inarray in the three coordinate directions.

@param   inarray     Input array of values at quadrature points to
                     be differentiated.
@param   out_d0      Derivative in first coordinate direction.
@param   out_d1      Derivative in second coordinate direction.
@param   out_d2      Derivative in third coordinate direction.

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 164 of file TetExp.cpp.

169  {
170  int TotPts = m_base[0]->GetNumPoints()*m_base[1]->GetNumPoints()*
171  m_base[2]->GetNumPoints();
172 
173  Array<TwoD, const NekDouble> df =
174  m_metricinfo->GetDerivFactors(GetPointsKeys());
175  Array<OneD,NekDouble> Diff0 = Array<OneD,NekDouble>(3*TotPts);
176  Array<OneD,NekDouble> Diff1 = Diff0 + TotPts;
177  Array<OneD,NekDouble> Diff2 = Diff1 + TotPts;
178 
179  StdTetExp::v_PhysDeriv(inarray, Diff0, Diff1, Diff2);
180 
181  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
182  {
183  if(out_d0.size())
184  {
185  Vmath::Vmul (TotPts,&df[0][0],1,&Diff0[0],1, &out_d0[0], 1);
186  Vmath::Vvtvp (TotPts,&df[1][0],1,&Diff1[0],1, &out_d0[0], 1,&out_d0[0],1);
187  Vmath::Vvtvp (TotPts,&df[2][0],1,&Diff2[0],1, &out_d0[0], 1,&out_d0[0],1);
188  }
189 
190  if(out_d1.size())
191  {
192  Vmath::Vmul (TotPts,&df[3][0],1,&Diff0[0],1, &out_d1[0], 1);
193  Vmath::Vvtvp (TotPts,&df[4][0],1,&Diff1[0],1, &out_d1[0], 1,&out_d1[0],1);
194  Vmath::Vvtvp (TotPts,&df[5][0],1,&Diff2[0],1, &out_d1[0], 1,&out_d1[0],1);
195  }
196 
197  if(out_d2.size())
198  {
199  Vmath::Vmul (TotPts,&df[6][0],1,&Diff0[0],1, &out_d2[0], 1);
200  Vmath::Vvtvp (TotPts,&df[7][0],1,&Diff1[0],1, &out_d2[0], 1, &out_d2[0],1);
201  Vmath::Vvtvp (TotPts,&df[8][0],1,&Diff2[0],1, &out_d2[0], 1, &out_d2[0],1);
202  }
203  }
204  else // regular geometry
205  {
206  if(out_d0.size())
207  {
208  Vmath::Smul (TotPts,df[0][0],&Diff0[0],1, &out_d0[0], 1);
209  Blas::Daxpy (TotPts,df[1][0],&Diff1[0],1, &out_d0[0], 1);
210  Blas::Daxpy (TotPts,df[2][0],&Diff2[0],1, &out_d0[0], 1);
211  }
212 
213  if(out_d1.size())
214  {
215  Vmath::Smul (TotPts,df[3][0],&Diff0[0],1, &out_d1[0], 1);
216  Blas::Daxpy (TotPts,df[4][0],&Diff1[0],1, &out_d1[0], 1);
217  Blas::Daxpy (TotPts,df[5][0],&Diff2[0],1, &out_d1[0], 1);
218  }
219 
220  if(out_d2.size())
221  {
222  Vmath::Smul (TotPts,df[6][0],&Diff0[0],1, &out_d2[0], 1);
223  Blas::Daxpy (TotPts,df[7][0],&Diff1[0],1, &out_d2[0], 1);
224  Blas::Daxpy (TotPts,df[8][0],&Diff2[0],1, &out_d2[0], 1);
225  }
226  }
227  }
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
Definition: Blas.hpp:167

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

◆ v_PhysEvaluate()

NekDouble Nektar::LocalRegions::TetExp::v_PhysEvaluate ( const Array< OneD, const NekDouble > &  coord,
const Array< OneD, const NekDouble > &  physvals 
)
protectedvirtual
Parameters
coordPhysical space coordinate
Returns
Evaluation of expansion at given coordinate.

Reimplemented from Nektar::StdRegions::StdExpansion3D.

Definition at line 508 of file TetExp.cpp.

511  {
512  ASSERTL0(m_geom,"m_geom not defined");
513 
514  Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(3);
515 
516  // Get the local (eta) coordinates of the point
517  m_geom->GetLocCoords(coord,Lcoord);
518 
519  // Evaluate point in local (eta) coordinates.
520  return StdTetExp::v_PhysEvaluate(Lcoord,physvals);
521  }

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

◆ v_StdPhysEvaluate()

NekDouble Nektar::LocalRegions::TetExp::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 496 of file TetExp.cpp.

499  {
500  // Evaluate point in local (eta) coordinates.
501  return StdTetExp::v_PhysEvaluate(Lcoord,physvals);
502  }

◆ v_SVVLaplacianFilter()

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

Reimplemented from Nektar::StdRegions::StdTetExp.

Definition at line 1048 of file TetExp.cpp.

1051  {
1052  int nq = GetTotPoints();
1053 
1054  // Calculate sqrt of the Jacobian
1055  Array<OneD, const NekDouble> jac =
1056  m_metricinfo->GetJac(GetPointsKeys());
1057  Array<OneD, NekDouble> sqrt_jac(nq);
1058  if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1059  {
1060  Vmath::Vsqrt(nq,jac,1,sqrt_jac,1);
1061  }
1062  else
1063  {
1064  Vmath::Fill(nq,sqrt(jac[0]),sqrt_jac,1);
1065  }
1066 
1067  // Multiply array by sqrt(Jac)
1068  Vmath::Vmul(nq,sqrt_jac,1,array,1,array,1);
1069 
1070  // Apply std region filter
1071  StdTetExp::v_SVVLaplacianFilter( array, mkey);
1072 
1073  // Divide by sqrt(Jac)
1074  Vmath::Vdiv(nq,array,1,sqrt_jac,1,array,1);
1075  }
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:257

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

Member Data Documentation

◆ m_matrixManager

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

Definition at line 215 of file TetExp.h.

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

◆ m_staticCondMatrixManager

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

Definition at line 216 of file TetExp.h.

Referenced by v_DropLocStaticCondMatrix(), and v_GetLocStaticCondMatrix().