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

#include <HexExp.h>

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

Public Member Functions

 HexExp (const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::BasisKey &Bc, const SpatialDomains::HexGeomSharedPtr &geom)
 Constructor using BasisKey class for quadrature points and order definition. More...
 
 HexExp (const HexExp &T)
 Copy Constructor. More...
 
 ~HexExp ()
 Destructor. More...
 
- Public Member Functions inherited from Nektar::StdRegions::StdHexExp
 StdHexExp ()
 
 StdHexExp (const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::BasisKey &Bc)
 
 StdHexExp (const StdHexExp &T)
 
 ~StdHexExp ()
 
- 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)
 
- Public Member Functions inherited from Nektar::StdRegions::StdExpansion
 StdExpansion ()
 Default Constructor. More...
 
 StdExpansion (const int numcoeffs, const int numbases, const LibUtilities::BasisKey &Ba=LibUtilities::NullBasisKey, const LibUtilities::BasisKey &Bb=LibUtilities::NullBasisKey, const LibUtilities::BasisKey &Bc=LibUtilities::NullBasisKey)
 Constructor. More...
 
 StdExpansion (const StdExpansion &T)
 Copy Constructor. More...
 
virtual ~StdExpansion ()
 Destructor. More...
 
int GetNumBases () const
 This function returns the number of 1D bases used in the expansion. More...
 
const Array< OneD, const LibUtilities::BasisSharedPtr > & GetBase () const
 This function gets the shared point to basis. More...
 
const LibUtilities::BasisSharedPtrGetBasis (int dir) const
 This function gets the shared point to basis in the dir direction. More...
 
int GetNcoeffs (void) const
 This function returns the total number of coefficients used in the expansion. More...
 
int GetTotPoints () const
 This function returns the total number of quadrature points used in the element. More...
 
LibUtilities::BasisType GetBasisType (const int dir) const
 This function returns the type of basis used in the dir direction. More...
 
int GetBasisNumModes (const int dir) const
 This function returns the number of expansion modes in the dir direction. More...
 
int EvalBasisNumModesMax (void) const
 This function returns the maximum number of expansion modes over all local directions. More...
 
LibUtilities::PointsType GetPointsType (const int dir) const
 This function returns the type of quadrature points used in the dir direction. More...
 
int GetNumPoints (const int dir) const
 This function returns the number of quadrature points in the dir direction. More...
 
const Array< OneD, const NekDouble > & GetPoints (const int dir) const
 This function returns a pointer to the array containing the quadrature points in dir direction. More...
 
int GetNverts () const
 This function returns the number of vertices of the expansion domain. More...
 
int GetNedges () const
 This function returns the number of edges of the expansion domain. More...
 
int GetEdgeNcoeffs (const int i) const
 This function returns the number of expansion coefficients belonging to the i-th edge. More...
 
int GetTotalEdgeIntNcoeffs () const
 
int GetEdgeNumPoints (const int i) const
 This function returns the number of quadrature points belonging to the i-th edge. More...
 
int DetCartesianDirOfEdge (const int edge)
 
const LibUtilities::BasisKey DetEdgeBasisKey (const int i) const
 
const LibUtilities::BasisKey DetFaceBasisKey (const int i, const int k) const
 
int GetFaceNumPoints (const int i) const
 This function returns the number of quadrature points belonging to the i-th face. More...
 
int GetFaceNcoeffs (const int i) const
 This function returns the number of expansion coefficients belonging to the i-th face. More...
 
int GetFaceIntNcoeffs (const int i) const
 
int GetTotalFaceIntNcoeffs () const
 
int GetTraceNcoeffs (const int i) const
 This function returns the number of expansion coefficients belonging to the i-th edge/face. More...
 
LibUtilities::PointsKey GetFacePointsKey (const int i, const int j) const
 
int NumBndryCoeffs (void) const
 
int NumDGBndryCoeffs (void) const
 
LibUtilities::BasisType GetEdgeBasisType (const int i) const
 This function returns the type of expansion basis on the i-th edge. More...
 
const LibUtilities::PointsKey GetNodalPointsKey () const
 This function returns the type of expansion Nodal point type if defined. More...
 
int GetNfaces () const
 This function returns the number of faces of the expansion domain. More...
 
int GetNtrace () const
 Returns the number of trace elements connected to this element. More...
 
LibUtilities::ShapeType DetShapeType () const
 This function returns the shape of the expansion domain. More...
 
std::shared_ptr< StdExpansionGetStdExp (void) const
 
std::shared_ptr< StdExpansionGetLinStdExp (void) const
 
int GetShapeDimension () const
 
bool IsBoundaryInteriorExpansion ()
 
bool IsNodalNonTensorialExp ()
 
void BwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function performs the Backward transformation from coefficient space to physical space. More...
 
void FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function performs the Forward transformation from physical space to coefficient space. More...
 
void FwdTrans_BndConstrained (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
NekDouble Integral (const Array< OneD, const NekDouble > &inarray)
 This function integrates the specified function over the domain. More...
 
void FillMode (const int mode, Array< OneD, NekDouble > &outarray)
 This function fills the array outarray with the mode-th mode of the expansion. More...
 
void IProductWRTBase (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 this function calculates the inner product of a given function f with the different modes of the expansion More...
 
void IProductWRTBase (const Array< OneD, const NekDouble > &base, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, int coll_check)
 
void IProductWRTDerivBase (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDirectionalDerivBase (const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
int GetElmtId ()
 Get the element id of this expansion when used in a list by returning value of m_elmt_id. More...
 
void SetElmtId (const int id)
 Set the element id of this expansion when used in a list by returning value of m_elmt_id. More...
 
void GetCoords (Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2=NullNekDouble1DArray, Array< OneD, NekDouble > &coords_3=NullNekDouble1DArray)
 this function returns the physical coordinates of the quadrature points of the expansion More...
 
void GetCoord (const Array< OneD, const NekDouble > &Lcoord, Array< OneD, NekDouble > &coord)
 given the coordinates of a point of the element in the local collapsed coordinate system, this function calculates the physical coordinates of the point More...
 
DNekMatSharedPtr GetStdMatrix (const StdMatrixKey &mkey)
 
DNekBlkMatSharedPtr GetStdStaticCondMatrix (const StdMatrixKey &mkey)
 
IndexMapValuesSharedPtr GetIndexMap (const IndexMapKey &ikey)
 
const Array< OneD, const NekDouble > & GetPhysNormals (void)
 
void SetPhysNormals (Array< OneD, const NekDouble > &normal)
 
virtual void SetUpPhysNormals (const int edge)
 
void NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
 
void NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
void NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, const Array< OneD, const NekDouble > &Fz, Array< OneD, NekDouble > &outarray)
 
void NormVectorIProductWRTBase (const Array< OneD, const Array< OneD, NekDouble > > &Fvec, Array< OneD, NekDouble > &outarray)
 
DNekScalBlkMatSharedPtr GetLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
void DropLocStaticCondMatrix (const LocalRegions::MatrixKey &mkey)
 
StdRegions::Orientation GetForient (int face)
 
StdRegions::Orientation GetEorient (int edge)
 
void SetCoeffsToOrientation (Array< OneD, NekDouble > &coeffs, StdRegions::Orientation dir)
 
void SetCoeffsToOrientation (StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
int CalcNumberOfCoefficients (const std::vector< unsigned int > &nummodes, int &modes_offset)
 
NekDouble StdPhysEvaluate (const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals)
 
int GetCoordim ()
 
void GetBoundaryMap (Array< OneD, unsigned int > &outarray)
 
void GetInteriorMap (Array< OneD, unsigned int > &outarray)
 
int GetVertexMap (const int localVertexId, bool useCoeffPacking=false)
 
void GetEdgeInteriorMap (const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
 
void GetFaceNumModes (const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
 
void GetFaceInteriorMap (const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
 
void GetEdgeToElementMap (const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P=-1)
 
void GetFaceToElementMap (const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int nummodesA=-1, int nummodesB=-1)
 
void GetEdgePhysVals (const int edge, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Extract the physical values along edge edge from inarray into outarray following the local edge orientation and point distribution defined by defined in EdgeExp. More...
 
void GetEdgePhysVals (const int edge, const std::shared_ptr< StdExpansion > &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GetTracePhysVals (const int edge, const std::shared_ptr< StdExpansion > &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GetVertexPhysVals (const int vertex, const Array< OneD, const NekDouble > &inarray, NekDouble &outarray)
 
void GetEdgeInterpVals (const int edge, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GetEdgeQFactors (const int edge, Array< OneD, NekDouble > &outarray)
 Extract the metric factors to compute the contravariant fluxes along edge edge and stores them into outarray following the local edge orientation (i.e. anticlockwise convention). More...
 
void GetFacePhysVals (const int face, const std::shared_ptr< StdExpansion > &FaceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient=eNoOrientation)
 
void GetEdgePhysMap (const int edge, Array< OneD, int > &outarray)
 
void GetFacePhysMap (const int face, Array< OneD, int > &outarray)
 
void MultiplyByQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void MultiplyByStdQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
DNekMatSharedPtr CreateGeneralMatrix (const StdMatrixKey &mkey)
 this function generates the mass matrix \(\mathbf{M}[i][j] = \int \phi_i(\mathbf{x}) \phi_j(\mathbf{x}) d\mathbf{x}\) More...
 
void GeneralMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void ReduceOrderCoeffs (int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
 
void ExponentialFilter (Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff)
 
void LaplacianMatrixOp (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDerivMatrixOp (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDirectionalDerivMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassLevelCurvatureMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LinearAdvectionDiffusionReactionMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey, bool addDiffusionTerm=true)
 
void HelmholtzMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
DNekMatSharedPtr GenMatrix (const StdMatrixKey &mkey)
 
void PhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
 
void PhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void PhysDeriv_s (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_ds)
 
void PhysDeriv_n (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_dn)
 
void PhysDirectionalDeriv (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &direction, Array< OneD, NekDouble > &outarray)
 
void StdPhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
 
void StdPhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void AddRobinMassMatrix (const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, DNekMatSharedPtr &inoutmat)
 
void AddRobinEdgeContribution (const int edgeid, const Array< OneD, const NekDouble > &primCoeffs, Array< OneD, NekDouble > &coeffs)
 
NekDouble PhysEvaluate (const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals)
 This function evaluates the expansion at a single (arbitrary) point of the domain. More...
 
NekDouble PhysEvaluate (const Array< OneD, DNekMatSharedPtr > &I, const Array< OneD, const NekDouble > &physvals)
 This function evaluates the expansion at a single (arbitrary) point of the domain. More...
 
void LocCoordToLocCollapsed (const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
 Convert local cartesian coordinate xi into local collapsed coordinates eta. More...
 
virtual int v_GetElmtId ()
 Get the element id of this expansion when used in a list by returning value of m_elmt_id. More...
 
virtual const Array< OneD, const NekDouble > & v_GetPhysNormals (void)
 
virtual void v_SetPhysNormals (Array< OneD, const NekDouble > &normal)
 
virtual void v_SetUpPhysNormals (const int edge)
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual void v_NormVectorIProductWRTBase (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, const Array< OneD, const NekDouble > &Fz, Array< OneD, NekDouble > &outarray)
 
virtual StdRegions::Orientation v_GetEorient (int edge)
 
NekDouble Linf (const Array< OneD, const NekDouble > &phys, const Array< OneD, const NekDouble > &sol=NullNekDouble1DArray)
 Function to evaluate the discrete \( L_\infty\) error \( |\epsilon|_\infty = \max |u - u_{exact}|\) where \( u_{exact}\) is given by the array sol. More...
 
NekDouble L2 (const Array< OneD, const NekDouble > &phys, const Array< OneD, const NekDouble > &sol=NullNekDouble1DArray)
 Function to evaluate the discrete \( L_2\) error, \( | \epsilon |_{2} = \left [ \int^1_{-1} [u - u_{exact}]^2 dx \right]^{1/2} d\xi_1 \) where \( u_{exact}\) is given by the array sol. More...
 
NekDouble H1 (const Array< OneD, const NekDouble > &phys, const Array< OneD, const NekDouble > &sol=NullNekDouble1DArray)
 Function to evaluate the discrete \( H^1\) error, \( | \epsilon |^1_{2} = \left [ \int^1_{-1} [u - u_{exact}]^2 + \nabla(u - u_{exact})\cdot\nabla(u - u_{exact})\cdot dx \right]^{1/2} d\xi_1 \) where \( u_{exact}\) is given by the array sol. More...
 
const NormalVectorGetEdgeNormal (const int edge) const
 
void ComputeEdgeNormal (const int edge)
 
void NegateEdgeNormal (const int edge)
 
bool EdgeNormalNegated (const int edge)
 
void ComputeFaceNormal (const int face)
 
void NegateFaceNormal (const int face)
 
bool FaceNormalNegated (const int face)
 
void ComputeVertexNormal (const int vertex)
 
void NegateVertexNormal (const int vertex)
 
bool VertexNormalNegated (const int vertex)
 
const NormalVectorGetFaceNormal (const int face) const
 
const NormalVectorGetVertexNormal (const int vertex) const
 
const NormalVectorGetSurfaceNormal (const int id) const
 
const LibUtilities::PointsKeyVector GetPointsKeys () const
 
Array< OneD, unsigned int > GetEdgeInverseBoundaryMap (int eid)
 
Array< OneD, unsigned int > GetFaceInverseBoundaryMap (int fid, StdRegions::Orientation faceOrient=eNoOrientation, int P1=-1, int P2=-1)
 
void GetInverseBoundaryMaps (Array< OneD, unsigned int > &vmap, Array< OneD, Array< OneD, unsigned int > > &emap, Array< OneD, Array< OneD, unsigned int > > &fmap)
 
DNekMatSharedPtr BuildInverseTransformationMatrix (const DNekScalMatSharedPtr &m_transformationmatrix)
 
void PhysInterpToSimplexEquiSpaced (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, int npset=-1)
 This function performs an interpolation from the physical space points provided at input into an array of equispaced points which are not the collapsed coordinate. So for a tetrahedron you will only get a tetrahedral number of values. More...
 
void GetSimplexEquiSpacedConnectivity (Array< OneD, int > &conn, bool standard=true)
 This function provides the connectivity of local simplices (triangles or tets) to connect the equispaced data points provided by PhysInterpToSimplexEquiSpaced. More...
 
void EquiSpacedToCoeffs (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function performs a projection/interpolation from the equispaced points sometimes used in post-processing onto the coefficient space. More...
 
template<class T >
std::shared_ptr< T > as ()
 
void IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
 
- Public Member Functions inherited from Nektar::LocalRegions::Expansion3D
 Expansion3D (SpatialDomains::Geometry3DSharedPtr pGeom)
 
virtual ~Expansion3D ()
 
void SetFaceExp (const int face, Expansion2DSharedPtr &f)
 
Expansion2DSharedPtr GetFaceExp (const int face)
 
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 ReOrientFacePhysMap (const int nvert, const StdRegions::Orientation orient, const int nq0, const int nq1, Array< OneD, int > &idmap)
 
void v_NormVectorIProductWRTBase (const Array< OneD, const Array< OneD, NekDouble > > &Fvec, Array< OneD, NekDouble > &outarray)
 
- Public Member Functions inherited from Nektar::LocalRegions::Expansion
 Expansion (SpatialDomains::GeometrySharedPtr pGeom)
 
 Expansion (const Expansion &pSrc)
 
virtual ~Expansion ()
 
DNekScalMatSharedPtr GetLocMatrix (const LocalRegions::MatrixKey &mkey)
 
DNekScalMatSharedPtr GetLocMatrix (const StdRegions::MatrixType mtype, const StdRegions::ConstFactorMap &factors=StdRegions::NullConstFactorMap, const StdRegions::VarCoeffMap &varcoeffs=StdRegions::NullVarCoeffMap)
 
SpatialDomains::GeometrySharedPtr GetGeom () const
 
void Reset ()
 
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)
 

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)
 Calculate the derivative of the physical points. More...
 
virtual void v_PhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 Calculate the derivative of the physical points in a single direction. More...
 
void v_PhysDirectionalDeriv (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &direction, Array< OneD, NekDouble > &out)
 Physical derivative along a direction vector. More...
 
virtual void v_FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 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 elements basis. More...
 
virtual void v_IProductWRTBase_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
 Calculate the inner product of inarray with respect to the given basis B = base0 * base1 * base2. More...
 
virtual void v_IProductWRTDerivBase (const int dir, 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)
 Calculates the inner product \( I_{pqr} = (u, \partial_{x_i} \phi_{pqr}) \). More...
 
void IProductWRTDerivBase_MatOp (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void v_IProductWRTDirectionalDerivBase (const Array< OneD, const NekDouble > &direction, 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)
 
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)
 This function evaluates the expansion at a single (arbitrary) point of the domain. More...
 
virtual void v_GetCoord (const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords)
 Retrieves the physical coordinates of a given set of reference coordinates. 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 the region shape using the enum-list of ShapeType. More...
 
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp (void) const
 
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp (void) const
 
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 bool v_GetFaceDGForwards (const int i) const
 
virtual void v_GetFacePhysMap (const int face, Array< OneD, int > &outarray)
 
void v_ComputeFaceNormal (const int face)
 
virtual void v_MassMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_LaplacianMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_LaplacianMatrixOp (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_WeakDerivMatrixOp (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_WeakDirectionalDerivMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_MassLevelCurvatureMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_HelmholtzMatrixOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
void v_GeneralMatrixOp_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
 
virtual void v_ReduceOrderCoeffs (int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_SVVLaplacianFilter (Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey)
 
virtual DNekMatSharedPtr v_GenMatrix (const StdRegions::StdMatrixKey &mkey)
 
virtual DNekMatSharedPtr v_CreateStdMatrix (const StdRegions::StdMatrixKey &mkey)
 
DNekScalMatSharedPtr CreateMatrix (const MatrixKey &mkey)
 
DNekScalBlkMatSharedPtr CreateStaticCondMatrix (const MatrixKey &mkey)
 
virtual DNekScalMatSharedPtr v_GetLocMatrix (const MatrixKey &mkey)
 
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix (const MatrixKey &mkey)
 
void v_DropLocStaticCondMatrix (const MatrixKey &mkey)
 
virtual void v_ComputeLaplacianMetric ()
 
- Protected Member Functions inherited from Nektar::StdRegions::StdHexExp
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_FillMode (const int mode, Array< OneD, NekDouble > &outarray)
 
virtual int v_GetNverts () const
 
virtual int v_GetNedges () const
 
virtual int v_GetNfaces () const
 
virtual int v_NumBndryCoeffs () const
 
virtual int v_NumDGBndryCoeffs () const
 
virtual int v_GetEdgeNcoeffs (const int i) const
 
virtual int v_GetTotalEdgeIntNcoeffs () const
 
virtual int v_GetFaceNcoeffs (const int i) const
 
virtual int v_GetFaceIntNcoeffs (const int i) const
 
virtual int v_GetTotalFaceIntNcoeffs () const
 
virtual int v_GetFaceNumPoints (const int i) const
 
virtual LibUtilities::PointsKey v_GetFacePointsKey (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_DetFaceBasisKey (const int i, const int k) const
 
virtual LibUtilities::BasisType v_GetEdgeBasisType (const int i) const
 
virtual bool v_IsBoundaryInteriorExpansion ()
 
virtual void v_GetFaceNumModes (const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
 
virtual void v_GetFaceToElementMap (const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int nummodesA=-1, int nummodesB=-1)
 
virtual int v_GetVertexMap (int localVertexId, bool useCoeffPacking=false)
 
virtual void v_GetEdgeInteriorMap (const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
 
virtual void v_GetFaceInteriorMap (const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
 
virtual void v_GetInteriorMap (Array< OneD, unsigned int > &outarray)
 
virtual void v_GetBoundaryMap (Array< OneD, unsigned int > &outarray)
 
virtual void v_MultiplyByStdQuadratureMetric (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_ExponentialFilter (Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff)
 
- 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_NegateFaceNormal (const int face)
 
virtual bool v_FaceNormalNegated (const int face)
 
virtual int v_GetTraceNcoeffs (const int i) const
 
- Protected Member Functions inherited from Nektar::StdRegions::StdExpansion
DNekMatSharedPtr CreateStdMatrix (const StdMatrixKey &mkey)
 
DNekBlkMatSharedPtr CreateStdStaticCondMatrix (const StdMatrixKey &mkey)
 Create the static condensation of a matrix when using a boundary interior decomposition. More...
 
IndexMapValuesSharedPtr CreateIndexMap (const IndexMapKey &ikey)
 Create an IndexMap which contains mapping information linking any specific element shape with either its boundaries, edges, faces, verteces, etc. More...
 
void BwdTrans_MatOp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void BwdTrans_SumFac (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDerivBase_SumFac (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void IProductWRTDirectionalDerivBase_SumFac (const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void GeneralMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree_Kernel (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp)
 
void LaplacianMatrixOp_MatFree_GenericImpl (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LaplacianMatrixOp_MatFree (const int k1, const int k2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDerivMatrixOp_MatFree (const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void WeakDirectionalDerivMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void MassLevelCurvatureMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void LinearAdvectionDiffusionReactionMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey, bool addDiffusionTerm=true)
 
void HelmholtzMatrixOp_MatFree (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
void HelmholtzMatrixOp_MatFree_GenericImpl (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
 
virtual void v_SetCoeffsToOrientation (StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_SetCoeffsToOrientation (Array< OneD, NekDouble > &coeffs, StdRegions::Orientation dir)
 
- 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_GetForient (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)
 Returns the physical values at the quadrature points of a face Wrapper function to v_GetFacePhysVals. More...
 
virtual void v_GetFacePhysVals (const int face, const StdRegions::StdExpansionSharedPtr &FaceExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient)
 
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 Array< OneD, unsigned int > v_GetEdgeInverseBoundaryMap (int eid)
 
virtual Array< OneD, unsigned int > v_GetFaceInverseBoundaryMap (int fid, StdRegions::Orientation faceOrient=StdRegions::eNoOrientation, int P1=-1, int P2=-1)
 
void v_GetInverseBoundaryMaps (Array< OneD, unsigned int > &vmap, Array< OneD, Array< OneD, unsigned int > > &emap, Array< OneD, Array< OneD, unsigned int > > &fmap)
 
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)
 
void ReOrientTriFacePhysMap (const StdRegions::Orientation orient, const int nq0, const int nq1, Array< OneD, int > &idmap)
 
void ReOrientQuadFacePhysMap (const StdRegions::Orientation orient, const int nq0, const int nq1, Array< OneD, int > &idmap)
 
- 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)
 
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)
 

Private Member Functions

 HexExp ()
 
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::StdExpansion3D
std::map< int, NormalVectorm_faceNormals
 
std::map< int, bool > m_negatedNormals
 
- Protected Attributes inherited from Nektar::StdRegions::StdExpansion
Array< OneD, LibUtilities::BasisSharedPtrm_base
 
int m_elmt_id
 
int m_ncoeffs
 
LibUtilities::NekManager< StdMatrixKey, DNekMat, StdMatrixKey::opLessm_stdMatrixManager
 
LibUtilities::NekManager< StdMatrixKey, DNekBlkMat, StdMatrixKey::opLessm_stdStaticCondMatrixManager
 
LibUtilities::NekManager< IndexMapKey, IndexMapValues, IndexMapKey::opLessm_IndexMapManager
 
- Protected Attributes inherited from Nektar::LocalRegions::Expansion
SpatialDomains::GeometrySharedPtr m_geom
 
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
 
MetricMap m_metrics
 

Detailed Description

Defines a hexahedral local expansion.

Definition at line 61 of file HexExp.h.

Constructor & Destructor Documentation

◆ HexExp() [1/3]

Nektar::LocalRegions::HexExp::HexExp ( const LibUtilities::BasisKey Ba,
const LibUtilities::BasisKey Bb,
const LibUtilities::BasisKey Bc,
const SpatialDomains::HexGeomSharedPtr 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 60 of file HexExp.cpp.

63  :
64  StdExpansion (Ba.GetNumModes()*Bb.GetNumModes()*Bc.GetNumModes(),3,Ba,Bb,Bc),
65  StdExpansion3D(Ba.GetNumModes()*Bb.GetNumModes()*Bc.GetNumModes(),Ba,Bb,Bc),
66  StdHexExp(Ba,Bb,Bc),
67  Expansion (geom),
68  Expansion3D (geom),
70  std::bind(&HexExp::CreateMatrix, this, std::placeholders::_1),
71  std::string("HexExpMatrix")),
73  std::bind(&HexExp::CreateStaticCondMatrix, this, std::placeholders::_1),
74  std::string("HexExpStaticCondMatrix"))
75  {
76  }
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: HexExp.h:284
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
Definition: HexExp.cpp:1485
Expansion(SpatialDomains::GeometrySharedPtr pGeom)
Definition: Expansion.cpp:47
DNekScalBlkMatSharedPtr CreateStaticCondMatrix(const MatrixKey &mkey)
Definition: HexExp.cpp:1784
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: HexExp.h:283
StdExpansion()
Default Constructor.
Expansion3D(SpatialDomains::Geometry3DSharedPtr pGeom)
Definition: Expansion3D.h:61

◆ HexExp() [2/3]

Nektar::LocalRegions::HexExp::HexExp ( const HexExp T)

Copy Constructor.

Parameters
THexExp to copy.

Definition at line 84 of file HexExp.cpp.

84  :
85  StdExpansion(T),
86  StdExpansion3D(T),
87  StdHexExp(T),
88  Expansion(T),
89  Expansion3D(T),
90  m_matrixManager(T.m_matrixManager),
91  m_staticCondMatrixManager(T.m_staticCondMatrixManager)
92  {
93  }
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: HexExp.h:284
Expansion(SpatialDomains::GeometrySharedPtr pGeom)
Definition: Expansion.cpp:47
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: HexExp.h:283
StdExpansion()
Default Constructor.
Expansion3D(SpatialDomains::Geometry3DSharedPtr pGeom)
Definition: Expansion3D.h:61

◆ ~HexExp()

Nektar::LocalRegions::HexExp::~HexExp ( )

Destructor.

Definition at line 98 of file HexExp.cpp.

99  {
100  }

◆ HexExp() [3/3]

Nektar::LocalRegions::HexExp::HexExp ( )
private

Member Function Documentation

◆ CreateMatrix()

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

Definition at line 1485 of file HexExp.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL2, Nektar::LocalRegions::Expansion::BuildTransformationMatrix(), Nektar::LocalRegions::Expansion::BuildVertexMatrix(), Nektar::StdRegions::StdMatrixKey::ConstFactorExists(), Nektar::StdRegions::StdExpansion::DetShapeType(), Nektar::SpatialDomains::eDeformed, Nektar::StdRegions::eFactorLambda, Nektar::StdRegions::eFactorSVVCutoffRatio, Nektar::StdRegions::eHelmholtz, Nektar::StdRegions::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().

1486  {
1487  DNekScalMatSharedPtr returnval;
1489 
1491  "Geometric information is not set up");
1492 
1493  switch(mkey.GetMatrixType())
1494  {
1495  case StdRegions::eMass:
1496  {
1497  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1498  mkey.GetNVarCoeff())
1499  {
1500  NekDouble one = 1.0;
1501  DNekMatSharedPtr mat = GenMatrix(mkey);
1502  returnval = MemoryManager<DNekScalMat>
1503  ::AllocateSharedPtr(one,mat);
1504  }
1505  else
1506  {
1507  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1508  DNekMatSharedPtr mat
1509  = GetStdMatrix(mkey);
1510  returnval = MemoryManager<DNekScalMat>
1511  ::AllocateSharedPtr(jac,mat);
1512  }
1513  }
1514  break;
1515  case StdRegions::eInvMass:
1516  {
1517  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1518  {
1519  NekDouble one = 1.0;
1520  StdRegions::StdMatrixKey masskey(StdRegions::eMass,
1521  DetShapeType(), *this);
1522  DNekMatSharedPtr mat = GenMatrix(masskey);
1523  mat->Invert();
1524 
1525  returnval = MemoryManager<DNekScalMat>
1526  ::AllocateSharedPtr(one,mat);
1527  }
1528  else
1529  {
1530  NekDouble fac = 1.0/(m_metricinfo->GetJac(ptsKeys))[0];
1531  DNekMatSharedPtr mat
1532  = GetStdMatrix(mkey);
1533  returnval = MemoryManager<DNekScalMat>
1534  ::AllocateSharedPtr(fac,mat);
1535  }
1536  }
1537  break;
1541  {
1542  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1543  mkey.GetNVarCoeff())
1544  {
1545  NekDouble one = 1.0;
1546  DNekMatSharedPtr mat = GenMatrix(mkey);
1547 
1548  returnval = MemoryManager<DNekScalMat>
1549  ::AllocateSharedPtr(one,mat);
1550  }
1551  else
1552  {
1553  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1554  Array<TwoD, const NekDouble> df
1555  = m_metricinfo->GetDerivFactors(ptsKeys);
1556  int dir = 0;
1557 
1558  switch(mkey.GetMatrixType())
1559  {
1561  dir = 0;
1562  break;
1564  dir = 1;
1565  break;
1567  dir = 2;
1568  break;
1569  default:
1570  break;
1571  }
1572 
1573  MatrixKey deriv0key(StdRegions::eWeakDeriv0,
1574  mkey.GetShapeType(), *this);
1575  MatrixKey deriv1key(StdRegions::eWeakDeriv1,
1576  mkey.GetShapeType(), *this);
1577  MatrixKey deriv2key(StdRegions::eWeakDeriv2,
1578  mkey.GetShapeType(), *this);
1579 
1580  DNekMat &deriv0 = *GetStdMatrix(deriv0key);
1581  DNekMat &deriv1 = *GetStdMatrix(deriv1key);
1582  DNekMat &deriv2 = *GetStdMatrix(deriv2key);
1583 
1584  int rows = deriv0.GetRows();
1585  int cols = deriv1.GetColumns();
1586 
1588  ::AllocateSharedPtr(rows,cols);
1589 
1590  (*WeakDeriv) = df[3*dir ][0]*deriv0
1591  + df[3*dir+1][0]*deriv1
1592  + df[3*dir+2][0]*deriv2;
1593 
1594  returnval = MemoryManager<DNekScalMat>
1595  ::AllocateSharedPtr(jac,WeakDeriv);
1596  }
1597  }
1598  break;
1600  {
1601  if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1602  mkey.GetNVarCoeff()||
1603  mkey.ConstFactorExists(
1605  {
1606  NekDouble one = 1.0;
1607  DNekMatSharedPtr mat = GenMatrix(mkey);
1608 
1609  returnval = MemoryManager<DNekScalMat>
1610  ::AllocateSharedPtr(one,mat);
1611  }
1612  else
1613  {
1614  MatrixKey lap00key(StdRegions::eLaplacian00,
1615  mkey.GetShapeType(), *this);
1616  MatrixKey lap01key(StdRegions::eLaplacian01,
1617  mkey.GetShapeType(), *this);
1618  MatrixKey lap02key(StdRegions::eLaplacian02,
1619  mkey.GetShapeType(), *this);
1620  MatrixKey lap11key(StdRegions::eLaplacian11,
1621  mkey.GetShapeType(), *this);
1622  MatrixKey lap12key(StdRegions::eLaplacian12,
1623  mkey.GetShapeType(), *this);
1624  MatrixKey lap22key(StdRegions::eLaplacian22,
1625  mkey.GetShapeType(), *this);
1626 
1627  DNekMat &lap00 = *GetStdMatrix(lap00key);
1628  DNekMat &lap01 = *GetStdMatrix(lap01key);
1629  DNekMat &lap02 = *GetStdMatrix(lap02key);
1630  DNekMat &lap11 = *GetStdMatrix(lap11key);
1631  DNekMat &lap12 = *GetStdMatrix(lap12key);
1632  DNekMat &lap22 = *GetStdMatrix(lap22key);
1633 
1634  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1635  Array<TwoD, const NekDouble> gmat
1636  = m_metricinfo->GetGmat(ptsKeys);
1637 
1638  int rows = lap00.GetRows();
1639  int cols = lap00.GetColumns();
1640 
1642  ::AllocateSharedPtr(rows,cols);
1643 
1644  (*lap) = gmat[0][0]*lap00
1645  + gmat[4][0]*lap11
1646  + gmat[8][0]*lap22
1647  + gmat[3][0]*(lap01 + Transpose(lap01))
1648  + gmat[6][0]*(lap02 + Transpose(lap02))
1649  + gmat[7][0]*(lap12 + Transpose(lap12));
1650 
1651  returnval = MemoryManager<DNekScalMat>
1652  ::AllocateSharedPtr(jac,lap);
1653  }
1654  }
1655  break;
1657  {
1658  NekDouble lambda = mkey.GetConstFactor(StdRegions::eFactorLambda);
1659  MatrixKey masskey(StdRegions::eMass,
1660  mkey.GetShapeType(), *this);
1661  DNekScalMat &MassMat = *(this->m_matrixManager[masskey]);
1662  MatrixKey lapkey(StdRegions::eLaplacian,
1663  mkey.GetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1664  DNekScalMat &LapMat = *(this->m_matrixManager[lapkey]);
1665 
1666  int rows = LapMat.GetRows();
1667  int cols = LapMat.GetColumns();
1668 
1670 
1671  NekDouble one = 1.0;
1672  (*helm) = LapMat + lambda*MassMat;
1673 
1674  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,helm);
1675  }
1676  break;
1678  {
1679  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1680  {
1681  NekDouble one = 1.0;
1682  DNekMatSharedPtr mat = GenMatrix(mkey);
1683  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1684  }
1685  else
1686  {
1687  NekDouble jac = (m_metricinfo->GetJac(ptsKeys))[0];
1688  DNekMatSharedPtr mat = GetStdMatrix(mkey);
1689  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(jac,mat);
1690  }
1691  }
1692  break;
1700  {
1701  NekDouble one = 1.0;
1702 
1703  DNekMatSharedPtr mat = GenMatrix(mkey);
1704  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1705  }
1706  break;
1708  {
1709  NekDouble one = 1.0;
1710 
1711 // StdRegions::StdMatrixKey hkey(StdRegions::eHybridDGHelmholtz,
1712 // DetShapeType(),*this,
1713 // mkey.GetConstant(0),
1714 // mkey.GetConstant(1));
1715  MatrixKey hkey(StdRegions::eHybridDGHelmholtz, DetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1716  DNekMatSharedPtr mat = GenMatrix(hkey);
1717 
1718  mat->Invert();
1719  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1720  }
1721  break;
1723  {
1724  NekDouble one = 1.0;
1725  MatrixKey helmkey(StdRegions::eHelmholtz, mkey.GetShapeType(), *this, mkey.GetConstFactors(), mkey.GetVarCoeffs());
1726  DNekScalBlkMatSharedPtr helmStatCond = GetLocStaticCondMatrix(helmkey);
1727  DNekScalMatSharedPtr A =helmStatCond->GetBlock(0,0);
1729 
1731  }
1732  break;
1734  {
1735  NekDouble one = 1.0;
1736  MatrixKey masskey(StdRegions::eMass, mkey.GetShapeType(), *this);
1737  DNekScalBlkMatSharedPtr massStatCond = GetLocStaticCondMatrix(masskey);
1738  DNekScalMatSharedPtr A =massStatCond->GetBlock(0,0);
1740 
1742  }
1743  break;
1744  case StdRegions::ePreconR:
1745  {
1746  NekDouble one = 1.0;
1747  MatrixKey helmkey(StdRegions::eHelmholtz, mkey.GetShapeType(), *this,mkey.GetConstFactors(), mkey.GetVarCoeffs());
1748  DNekScalBlkMatSharedPtr helmStatCond = GetLocStaticCondMatrix(helmkey);
1749  DNekScalMatSharedPtr A =helmStatCond->GetBlock(0,0);
1750 
1751  DNekScalMatSharedPtr Atmp;
1752  DNekMatSharedPtr R=BuildTransformationMatrix(A,mkey.GetMatrixType());
1753 
1755  }
1756  break;
1758  {
1759  NekDouble one = 1.0;
1760  MatrixKey masskey(StdRegions::eMass, mkey.GetShapeType(), *this);
1761  DNekScalBlkMatSharedPtr massStatCond = GetLocStaticCondMatrix(masskey);
1762  DNekScalMatSharedPtr A =massStatCond->GetBlock(0,0);
1763 
1764  DNekScalMatSharedPtr Atmp;
1765  DNekMatSharedPtr R=BuildTransformationMatrix(A,mkey.GetMatrixType());
1766 
1768  }
1769  break;
1770  default:
1771  {
1772  NekDouble one = 1.0;
1773  DNekMatSharedPtr mat = GenMatrix(mkey);
1774 
1775  returnval = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,mat);
1776  }
1777  break;
1778  }
1779 
1780  return returnval;
1781  }
DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey)
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:246
DNekMatSharedPtr BuildTransformationMatrix(const DNekScalMatSharedPtr &r_bnd, const StdRegions::MatrixType matrixType)
Definition: Expansion.cpp:90
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:469
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:73
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
DNekMatSharedPtr BuildVertexMatrix(const DNekScalMatSharedPtr &r_bnd)
Definition: Expansion.cpp:98
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
DNekScalBlkMatSharedPtr GetLocStaticCondMatrix(const LocalRegions::MatrixKey &mkey)
Definition: StdExpansion.h:761
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:714
const LibUtilities::PointsKeyVector GetPointsKeys() const
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)
NekMatrix< NekDouble, StandardMatrixTag > DNekMat
Definition: NekTypeDefs.hpp:51
double NekDouble
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: HexExp.h:283
Geometry is curved or has non-constant factors.
NekMatrix< NekMatrix< NekDouble, StandardMatrixTag >, ScaledMatrixTag > DNekScalMat

◆ CreateStaticCondMatrix()

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

Definition at line 1784 of file HexExp.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL2, Nektar::SpatialDomains::eDeformed, 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().

1785  {
1786  DNekScalBlkMatSharedPtr returnval;
1787 
1788  ASSERTL2(m_metricinfo->GetGtype() != SpatialDomains::eNoGeomType,"Geometric information is not set up");
1789 
1790  // set up block matrix system
1791  unsigned int nbdry = NumBndryCoeffs();
1792  unsigned int nint = (unsigned int)(m_ncoeffs - nbdry);
1793  unsigned int exp_size[] = {nbdry,nint};
1794  unsigned int nblks = 2;
1795  returnval = MemoryManager<DNekScalBlkMat>::AllocateSharedPtr(nblks,nblks,exp_size,exp_size); //Really need a constructor which takes Arrays
1796  NekDouble factor = 1.0;
1797 
1798  switch(mkey.GetMatrixType())
1799  {
1801  case StdRegions::eHelmholtz: // special case since Helmholtz not defined in StdRegions
1802 
1803  // use Deformed case for both regular and deformed geometries
1804  factor = 1.0;
1805  goto UseLocRegionsMatrix;
1806  break;
1807  default:
1808  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed ||
1809  mkey.GetNVarCoeff())
1810  {
1811  factor = 1.0;
1812  goto UseLocRegionsMatrix;
1813  }
1814  else
1815  {
1816  DNekScalMatSharedPtr mat = GetLocMatrix(mkey);
1817  factor = mat->Scale();
1818  goto UseStdRegionsMatrix;
1819  }
1820  break;
1821  UseStdRegionsMatrix:
1822  {
1823  NekDouble invfactor = 1.0/factor;
1824  NekDouble one = 1.0;
1826  DNekScalMatSharedPtr Atmp;
1827  DNekMatSharedPtr Asubmat;
1828 
1829  returnval->SetBlock(0,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,Asubmat = mat->GetBlock(0,0)));
1830  returnval->SetBlock(0,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,Asubmat = mat->GetBlock(0,1)));
1831  returnval->SetBlock(1,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,Asubmat = mat->GetBlock(1,0)));
1832  returnval->SetBlock(1,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(invfactor,Asubmat = mat->GetBlock(1,1)));
1833  }
1834  break;
1835  UseLocRegionsMatrix:
1836  {
1837  int i,j;
1838  NekDouble invfactor = 1.0/factor;
1839  NekDouble one = 1.0;
1840  DNekScalMat &mat = *GetLocMatrix(mkey);
1845 
1846  Array<OneD,unsigned int> bmap(nbdry);
1847  Array<OneD,unsigned int> imap(nint);
1848  GetBoundaryMap(bmap);
1849  GetInteriorMap(imap);
1850 
1851  for(i = 0; i < nbdry; ++i)
1852  {
1853  for(j = 0; j < nbdry; ++j)
1854  {
1855  (*A)(i,j) = mat(bmap[i],bmap[j]);
1856  }
1857 
1858  for(j = 0; j < nint; ++j)
1859  {
1860  (*B)(i,j) = mat(bmap[i],imap[j]);
1861  }
1862  }
1863 
1864  for(i = 0; i < nint; ++i)
1865  {
1866  for(j = 0; j < nbdry; ++j)
1867  {
1868  (*C)(i,j) = mat(imap[i],bmap[j]);
1869  }
1870 
1871  for(j = 0; j < nint; ++j)
1872  {
1873  (*D)(i,j) = mat(imap[i],imap[j]);
1874  }
1875  }
1876 
1877  // Calculate static condensed system
1878  if(nint)
1879  {
1880  D->Invert();
1881  (*B) = (*B)*(*D);
1882  (*A) = (*A) - (*B)*(*C);
1883  }
1884 
1885  DNekScalMatSharedPtr Atmp;
1886 
1887  returnval->SetBlock(0,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,A));
1888  returnval->SetBlock(0,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(one,B));
1889  returnval->SetBlock(1,0,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(factor,C));
1890  returnval->SetBlock(1,1,Atmp = MemoryManager<DNekScalMat>::AllocateSharedPtr(invfactor,D));
1891 
1892  }
1893  }
1894  return returnval;
1895  }
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:73
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
std::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
Definition: NekTypeDefs.hpp:71
DNekBlkMatSharedPtr GetStdStaticCondMatrix(const StdMatrixKey &mkey)
Definition: StdExpansion.h:719
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void GetInteriorMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:817
double NekDouble
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
Definition: Expansion.cpp:85
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:274
Geometry is curved or has non-constant factors.
NekMatrix< NekMatrix< NekDouble, StandardMatrixTag >, ScaledMatrixTag > DNekScalMat
void GetBoundaryMap(Array< OneD, unsigned int > &outarray)
Definition: StdExpansion.h:812

◆ IProductWRTDerivBase_MatOp()

void Nektar::LocalRegions::HexExp::IProductWRTDerivBase_MatOp ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protected

Definition at line 529 of file HexExp.cpp.

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

533  {
534  int nq = GetTotPoints();
536 
537  switch(dir)
538  {
539  case 0:
540  {
542  }
543  break;
544  case 1:
545  {
547  }
548  break;
549  case 2:
550  {
552  }
553  break;
554  default:
555  {
556  ASSERTL1(false,"input dir is out of range");
557  }
558  break;
559  }
560 
561  MatrixKey iprodmatkey(mtype,DetShapeType(),*this);
562  DNekScalMatSharedPtr iprodmat = m_matrixManager[iprodmatkey];
563 
564  Blas::Dgemv('N',m_ncoeffs,nq,iprodmat->Scale(),(iprodmat->GetOwnedMatrix())->GetPtr().get(),
565  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
566  }
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:469
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
Definition: Blas.hpp:168
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: HexExp.h:283
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:140
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ IProductWRTDerivBase_SumFac()

void Nektar::LocalRegions::HexExp::IProductWRTDerivBase_SumFac ( const int  dir,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protected

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}(\xi_1,\xi_2,\xi_3) = \phi_1(\xi_1)\phi_2(\xi_2)\phi_3(\xi_3)\), in the hexahedral element, this is straightforward and yields the result

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

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

Definition at line 467 of file HexExp.cpp.

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

Referenced by v_IProductWRTDerivBase().

471  {
472  ASSERTL1((dir==0)||(dir==1)||(dir==2),"Invalid direction.");
473 
474  const int nq0 = m_base[0]->GetNumPoints();
475  const int nq1 = m_base[1]->GetNumPoints();
476  const int nq2 = m_base[2]->GetNumPoints();
477  const int nq = nq0*nq1*nq2;
478  const int nm0 = m_base[0]->GetNumModes();
479  const int nm1 = m_base[1]->GetNumModes();
480 
481  const Array<TwoD, const NekDouble>& df =
482  m_metricinfo->GetDerivFactors(GetPointsKeys());
483 
484  Array<OneD, NekDouble> alloc(4*nq + m_ncoeffs + nm0*nq2*(nq1+nm1));
485  Array<OneD, NekDouble> tmp1 (alloc); // Quad metric
486  Array<OneD, NekDouble> tmp2 (alloc + nq); // Dir1 metric
487  Array<OneD, NekDouble> tmp3 (alloc + 2*nq); // Dir2 metric
488  Array<OneD, NekDouble> tmp4 (alloc + 3*nq); // Dir3 metric
489  Array<OneD, NekDouble> tmp5 (alloc + 4*nq); // iprod tmp
490  Array<OneD, NekDouble> wsp (tmp5 + m_ncoeffs); // Wsp
491 
492  MultiplyByQuadratureMetric(inarray, tmp1);
493 
494  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
495  {
496  Vmath::Vmul(nq,&df[3*dir][0], 1,tmp1.get(),1,tmp2.get(),1);
497  Vmath::Vmul(nq,&df[3*dir+1][0],1,tmp1.get(),1,tmp3.get(),1);
498  Vmath::Vmul(nq,&df[3*dir+2][0],1,tmp1.get(),1,tmp4.get(),1);
499  }
500  else
501  {
502  Vmath::Smul(nq, df[3*dir][0], tmp1.get(),1,tmp2.get(), 1);
503  Vmath::Smul(nq, df[3*dir+1][0],tmp1.get(),1,tmp3.get(), 1);
504  Vmath::Smul(nq, df[3*dir+2][0],tmp1.get(),1,tmp4.get(), 1);
505  }
506 
507  IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(),
508  m_base[1]->GetBdata(),
509  m_base[2]->GetBdata(),
510  tmp2,outarray,wsp,
511  false,true,true);
512 
513  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
514  m_base[1]->GetDbdata(),
515  m_base[2]->GetBdata(),
516  tmp3,tmp5,wsp,
517  true,false,true);
518  Vmath::Vadd(m_ncoeffs, tmp5, 1, outarray, 1, outarray, 1);
519 
520  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
521  m_base[1]->GetBdata(),
522  m_base[2]->GetDbdata(),
523  tmp4,tmp5,wsp,
524  true,true,false);
525  Vmath::Vadd(m_ncoeffs, tmp5, 1, outarray, 1, outarray, 1);
526  }
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:945
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
const LibUtilities::PointsKeyVector GetPointsKeys() const
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)
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.cpp:302
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:186

◆ IProductWRTDirectionalDerivBase_SumFac()

void Nektar::LocalRegions::HexExp::IProductWRTDirectionalDerivBase_SumFac ( const Array< OneD, const NekDouble > &  direction,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protected
Parameters
dirVector direction in which to take the derivative.
inarrayThe function \( u \).
outarrayValue of the inner product.

Definition at line 575 of file HexExp.cpp.

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

579  {
580  int shapedim = 3;
581  const int nq0 = m_base[0]->GetNumPoints();
582  const int nq1 = m_base[1]->GetNumPoints();
583  const int nq2 = m_base[2]->GetNumPoints();
584  const int nq = nq0*nq1*nq2;
585  const int nm0 = m_base[0]->GetNumModes();
586  const int nm1 = m_base[1]->GetNumModes();
587 
588  const Array<TwoD, const NekDouble>& df =
589  m_metricinfo->GetDerivFactors(GetPointsKeys());
590 
591  Array<OneD, NekDouble> alloc(4*nq + m_ncoeffs + nm0*nq2*(nq1+nm1));
592  Array<OneD, NekDouble> tmp1 (alloc); // Quad metric
593  Array<OneD, NekDouble> tmp2 (alloc + nq); // Dir1 metric
594  Array<OneD, NekDouble> tmp3 (alloc + 2*nq); // Dir2 metric
595  Array<OneD, NekDouble> tmp4 (alloc + 3*nq); // Dir3 metric
596  Array<OneD, NekDouble> tmp5 (alloc + 4*nq); // iprod tmp
597  Array<OneD, NekDouble> wsp (tmp5 + m_ncoeffs); // Wsp
598 
599  MultiplyByQuadratureMetric(inarray, tmp1);
600 
601  Array<OneD, Array<OneD, NekDouble> > dfdir(shapedim);
602  Expansion::ComputeGmatcdotMF(df,direction,dfdir);
603 
604  Vmath::Vmul(nq,&dfdir[0][0],1,tmp1.get(),1,tmp2.get(),1);
605  Vmath::Vmul(nq,&dfdir[1][0],1,tmp1.get(),1,tmp3.get(),1);
606  Vmath::Vmul(nq,&dfdir[2][0],1,tmp1.get(),1,tmp4.get(),1);
607 
608  IProductWRTBase_SumFacKernel(m_base[0]->GetDbdata(),
609  m_base[1]->GetBdata(),
610  m_base[2]->GetBdata(),
611  tmp2,outarray,wsp,
612  false,true,true);
613 
614  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
615  m_base[1]->GetDbdata(),
616  m_base[2]->GetBdata(),
617  tmp3,tmp5,wsp,
618  true,false,true);
619 
620  Vmath::Vadd(m_ncoeffs, tmp5, 1, outarray, 1, outarray, 1);
621 
622  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
623  m_base[1]->GetBdata(),
624  m_base[2]->GetDbdata(),
625  tmp4,tmp5,wsp,
626  true,true,false);
627 
628  Vmath::Vadd(m_ncoeffs, tmp5, 1, outarray, 1, outarray, 1);
629  }
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:945
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
const LibUtilities::PointsKeyVector GetPointsKeys() const
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)
void ComputeGmatcdotMF(const Array< TwoD, const NekDouble > &df, const Array< OneD, const NekDouble > &direction, Array< OneD, Array< OneD, NekDouble > > &dfdir)
Definition: Expansion.cpp:312
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.cpp:302
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:186

◆ v_ComputeFaceNormal()

void Nektar::LocalRegions::HexExp::v_ComputeFaceNormal ( const int  face)
protectedvirtual

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 965 of file HexExp.cpp.

References ASSERTL0, Nektar::StdRegions::StdExpansion::DetFaceBasisKey(), 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::LibUtilities::Interp2D(), Nektar::StdRegions::StdExpansion3D::m_faceNormals, Vmath::Sdiv(), Vmath::Vmul(), Vmath::Vsqrt(), Vmath::Vvtvp(), and Vmath::Zero().

966  {
967  int i;
968  const SpatialDomains::GeomFactorsSharedPtr & geomFactors =
969  GetGeom()->GetMetricInfo();
970  SpatialDomains::GeomType type = geomFactors->GetGtype();
971 
973  for(i = 0; i < ptsKeys.size(); ++i)
974  {
975  // Need at least 2 points for computing normals
976  if (ptsKeys[i].GetNumPoints() == 1)
977  {
978  LibUtilities::PointsKey pKey(2, ptsKeys[i].GetPointsType());
979  ptsKeys[i] = pKey;
980  }
981  }
982 
983  const Array<TwoD, const NekDouble> & df = geomFactors->GetDerivFactors(ptsKeys);
984  const Array<OneD, const NekDouble> & jac = geomFactors->GetJac(ptsKeys);
985 
986  LibUtilities::BasisKey tobasis0 = DetFaceBasisKey(face,0);
987  LibUtilities::BasisKey tobasis1 = DetFaceBasisKey(face,1);
988 
989  // Number of quadrature points in face expansion.
990  int nq_face = tobasis0.GetNumPoints()*tobasis1.GetNumPoints();
991 
992  int vCoordDim = GetCoordim();
993 
994  m_faceNormals[face] = Array<OneD, Array<OneD, NekDouble> >(vCoordDim);
995  Array<OneD, Array<OneD, NekDouble> > &normal = m_faceNormals[face];
996  for (i = 0; i < vCoordDim; ++i)
997  {
998  normal[i] = Array<OneD, NekDouble>(nq_face);
999  }
1000  // Regular geometry case
1002  {
1003  NekDouble fac;
1004  // Set up normals
1005  switch(face)
1006  {
1007  case 0:
1008  for(i = 0; i < vCoordDim; ++i)
1009  {
1010  normal[i][0] = -df[3*i+2][0];
1011  }
1012  break;
1013  case 1:
1014  for(i = 0; i < vCoordDim; ++i)
1015  {
1016  normal[i][0] = -df[3*i+1][0];
1017  }
1018  break;
1019  case 2:
1020  for(i = 0; i < vCoordDim; ++i)
1021  {
1022  normal[i][0] = df[3*i][0];
1023  }
1024  break;
1025  case 3:
1026  for(i = 0; i < vCoordDim; ++i)
1027  {
1028  normal[i][0] = df[3*i+1][0];
1029  }
1030  break;
1031  case 4:
1032  for(i = 0; i < vCoordDim; ++i)
1033  {
1034  normal[i][0] = -df[3*i][0];
1035  }
1036  break;
1037  case 5:
1038  for(i = 0; i < vCoordDim; ++i)
1039  {
1040  normal[i][0] = df[3*i+2][0];
1041  }
1042  break;
1043  default:
1044  ASSERTL0(false,"face is out of range (edge < 5)");
1045  }
1046 
1047  // normalise
1048  fac = 0.0;
1049  for(i =0 ; i < vCoordDim; ++i)
1050  {
1051  fac += normal[i][0]*normal[i][0];
1052  }
1053  fac = 1.0/sqrt(fac);
1054  for (i = 0; i < vCoordDim; ++i)
1055  {
1056  Vmath::Fill(nq_face,fac*normal[i][0],normal[i],1);
1057  }
1058 
1059  }
1060  else // Set up deformed normals
1061  {
1062  int j, k;
1063 
1064  int nqe0 = ptsKeys[0].GetNumPoints();
1065  int nqe1 = ptsKeys[0].GetNumPoints();
1066  int nqe2 = ptsKeys[0].GetNumPoints();
1067  int nqe01 = nqe0*nqe1;
1068  int nqe02 = nqe0*nqe2;
1069  int nqe12 = nqe1*nqe2;
1070 
1071  int nqe;
1072  if (face == 0 || face == 5)
1073  {
1074  nqe = nqe01;
1075  }
1076  else if (face == 1 || face == 3)
1077  {
1078  nqe = nqe02;
1079  }
1080  else
1081  {
1082  nqe = nqe12;
1083  }
1084 
1085  LibUtilities::PointsKey points0;
1086  LibUtilities::PointsKey points1;
1087 
1088  Array<OneD, NekDouble> faceJac(nqe);
1089  Array<OneD, NekDouble> normals(vCoordDim*nqe,0.0);
1090 
1091  // Extract Jacobian along face and recover local
1092  // derivates (dx/dr) for polynomial interpolation by
1093  // multiplying m_gmat by jacobian
1094  switch(face)
1095  {
1096  case 0:
1097  for(j = 0; j < nqe; ++j)
1098  {
1099  normals[j] = -df[2][j]*jac[j];
1100  normals[nqe+j] = -df[5][j]*jac[j];
1101  normals[2*nqe+j] = -df[8][j]*jac[j];
1102  faceJac[j] = jac[j];
1103  }
1104 
1105  points0 = ptsKeys[0];
1106  points1 = ptsKeys[1];
1107  break;
1108  case 1:
1109  for (j = 0; j < nqe0; ++j)
1110  {
1111  for(k = 0; k < nqe2; ++k)
1112  {
1113  int idx = j + nqe01*k;
1114  normals[j+k*nqe0] = -df[1][idx]*jac[idx];
1115  normals[nqe+j+k*nqe0] = -df[4][idx]*jac[idx];
1116  normals[2*nqe+j+k*nqe0] = -df[7][idx]*jac[idx];
1117  faceJac[j+k*nqe0] = jac[idx];
1118  }
1119  }
1120  points0 = ptsKeys[0];
1121  points1 = ptsKeys[2];
1122  break;
1123  case 2:
1124  for (j = 0; j < nqe1; ++j)
1125  {
1126  for(k = 0; k < nqe2; ++k)
1127  {
1128  int idx = nqe0-1+nqe0*j+nqe01*k;
1129  normals[j+k*nqe1] = df[0][idx]*jac[idx];
1130  normals[nqe+j+k*nqe1] = df[3][idx]*jac[idx];
1131  normals[2*nqe+j+k*nqe1] = df[6][idx]*jac[idx];
1132  faceJac[j+k*nqe1] = jac[idx];
1133  }
1134  }
1135  points0 = ptsKeys[1];
1136  points1 = ptsKeys[2];
1137  break;
1138  case 3:
1139  for (j = 0; j < nqe0; ++j)
1140  {
1141  for(k = 0; k < nqe2; ++k)
1142  {
1143  int idx = nqe0*(nqe1-1)+j+nqe01*k;
1144  normals[j+k*nqe0] = df[1][idx]*jac[idx];
1145  normals[nqe+j+k*nqe0] = df[4][idx]*jac[idx];
1146  normals[2*nqe+j+k*nqe0] = df[7][idx]*jac[idx];
1147  faceJac[j+k*nqe0] = jac[idx];
1148  }
1149  }
1150  points0 = ptsKeys[0];
1151  points1 = ptsKeys[2];
1152  break;
1153  case 4:
1154  for (j = 0; j < nqe1; ++j)
1155  {
1156  for(k = 0; k < nqe2; ++k)
1157  {
1158  int idx = j*nqe0+nqe01*k;
1159  normals[j+k*nqe1] = -df[0][idx]*jac[idx];
1160  normals[nqe+j+k*nqe1] = -df[3][idx]*jac[idx];
1161  normals[2*nqe+j+k*nqe1] = -df[6][idx]*jac[idx];
1162  faceJac[j+k*nqe1] = jac[idx];
1163  }
1164  }
1165  points0 = ptsKeys[1];
1166  points1 = ptsKeys[2];
1167  break;
1168  case 5:
1169  for (j = 0; j < nqe01; ++j)
1170  {
1171  int idx = j+nqe01*(nqe2-1);
1172  normals[j] = df[2][idx]*jac[idx];
1173  normals[nqe+j] = df[5][idx]*jac[idx];
1174  normals[2*nqe+j] = df[8][idx]*jac[idx];
1175  faceJac[j] = jac[idx];
1176  }
1177  points0 = ptsKeys[0];
1178  points1 = ptsKeys[1];
1179  break;
1180  default:
1181  ASSERTL0(false,"face is out of range (face < 5)");
1182  }
1183 
1184  Array<OneD, NekDouble> work (nq_face, 0.0);
1185  // Interpolate Jacobian and invert
1186  LibUtilities::Interp2D(points0, points1, faceJac,
1187  tobasis0.GetPointsKey(),
1188  tobasis1.GetPointsKey(),
1189  work);
1190 
1191  Vmath::Sdiv(nq_face,1.0,&work[0],1,&work[0],1);
1192 
1193  // interpolate
1194  for(i = 0; i < GetCoordim(); ++i)
1195  {
1196  LibUtilities::Interp2D(points0, points1,
1197  &normals[i*nqe],
1198  tobasis0.GetPointsKey(),
1199  tobasis1.GetPointsKey(),
1200  &normal[i][0]);
1201  Vmath::Vmul(nq_face,work,1,normal[i],1,normal[i],1);
1202  }
1203 
1204  //normalise normal vectors
1205  Vmath::Zero(nq_face,work,1);
1206  for(i = 0; i < GetCoordim(); ++i)
1207  {
1208  Vmath::Vvtvp(nq_face,normal[i],1, normal[i],1,work,1,work,1);
1209  }
1210 
1211  Vmath::Vsqrt(nq_face,work,1,work,1);
1212  Vmath::Sdiv(nq_face,1.0,work,1,work,1);
1213 
1214  for(i = 0; i < GetCoordim(); ++i)
1215  {
1216  Vmath::Vmul(nq_face,normal[i],1,work,1,normal[i],1);
1217  }
1218  }
1219  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
std::vector< PointsKey > PointsKeyVector
Definition: Points.h:246
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
Definition: StdExpansion.h:228
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
Definition: Vmath.cpp:411
SpatialDomains::GeometrySharedPtr GetGeom() const
Definition: Expansion.cpp:167
std::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
Definition: GeomFactors.h:62
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Definition: Vmath.cpp:445
void Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/y.
Definition: Vmath.cpp:274
const LibUtilities::PointsKeyVector GetPointsKeys() const
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
double NekDouble
std::map< int, NormalVector > m_faceNormals
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
Definition: StdExpansion.h:215
Geometry is straight-sided with constant geometric factors.
const LibUtilities::BasisKey DetFaceBasisKey(const int i, const int k) const
Definition: StdExpansion.h:323
GeomType
Indicates the type of element geometry.
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:376
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:186

◆ v_ComputeLaplacianMetric()

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

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1979 of file HexExp.cpp.

References Nektar::LocalRegions::Expansion::ComputeQuadratureMetric(), 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::LocalRegions::Expansion::m_metricinfo, Nektar::LocalRegions::Expansion::m_metrics, Nektar::StdRegions::StdExpansion::MultiplyByQuadratureMetric(), and Vmath::Vcopy().

1980  {
1981  if (m_metrics.count(eMetricQuadrature) == 0)
1982  {
1984  }
1985 
1986  const SpatialDomains::GeomType type = m_metricinfo->GetGtype();
1987  const unsigned int nqtot = GetTotPoints();
1988  const unsigned int dim = 3;
1992  };
1993 
1994  for (unsigned int i = 0; i < dim; ++i)
1995  {
1996  for (unsigned int j = i; j < dim; ++j)
1997  {
1998  m_metrics[m[i][j]] = Array<OneD, NekDouble>(nqtot);
1999  const Array<TwoD, const NekDouble> &gmat =
2000  m_metricinfo->GetGmat(GetPointsKeys());
2001  if (type == SpatialDomains::eDeformed)
2002  {
2003  Vmath::Vcopy(nqtot, &gmat[i*dim+j][0], 1,
2004  &m_metrics[m[i][j]][0], 1);
2005  }
2006  else
2007  {
2008  Vmath::Fill(nqtot, gmat[i*dim+j][0],
2009  &m_metrics[m[i][j]][0], 1);
2010  }
2012  m_metrics[m[i][j]]);
2013 
2014  }
2015  }
2016  }
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:945
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
const LibUtilities::PointsKeyVector GetPointsKeys() const
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:140
GeomType
Indicates the type of element geometry.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064
Geometry is curved or has non-constant factors.

◆ v_CreateStdMatrix()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1471 of file HexExp.cpp.

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

1473  {
1474  LibUtilities::BasisKey bkey0 = m_base[0]->GetBasisKey();
1475  LibUtilities::BasisKey bkey1 = m_base[1]->GetBasisKey();
1476  LibUtilities::BasisKey bkey2 = m_base[2]->GetBasisKey();
1477 
1479  ::AllocateSharedPtr(bkey0,bkey1,bkey2);
1480 
1481  return tmp->GetStdMatrix(mkey);
1482  }
std::shared_ptr< StdHexExp > StdHexExpSharedPtr
Definition: StdHexExp.h:288
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_DetShapeType()

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

Return the region shape using the enum-list of ShapeType.

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 722 of file HexExp.cpp.

References Nektar::LibUtilities::eHexahedron.

◆ v_DropLocStaticCondMatrix()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1910 of file HexExp.cpp.

References m_staticCondMatrixManager.

1911  {
1912  m_staticCondMatrixManager.DeleteObject(mkey);
1913  }
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: HexExp.h:284

◆ v_ExtractDataToCoeffs()

void Nektar::LocalRegions::HexExp::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 728 of file HexExp.cpp.

References ASSERTL0, ASSERTL1, Nektar::StdRegions::StdExpansion::BwdTrans(), Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::LibUtilities::eGLL_Lagrange, Nektar::LibUtilities::eModified_A, Nektar::StdRegions::StdExpansion::FwdTrans(), Nektar::StdRegions::StdExpansion::GetBasisType(), Nektar::StdRegions::StdExpansion::GetNcoeffs(), Nektar::StdRegions::StdExpansion::GetTotPoints(), Nektar::LibUtilities::Interp3D(), Nektar::StdRegions::StdExpansion::m_base, Nektar::StdRegions::StdExpansion::m_ncoeffs, Vmath::Vcopy(), and Vmath::Zero().

734  {
735  int data_order0 = nummodes[mode_offset];
736  int fillorder0 = min(m_base[0]->GetNumModes(),data_order0);
737  int data_order1 = nummodes[mode_offset+1];
738  int order1 = m_base[1]->GetNumModes();
739  int fillorder1 = min(order1,data_order1);
740  int data_order2 = nummodes[mode_offset+2];
741  int order2 = m_base[2]->GetNumModes();
742  int fillorder2 = min(order2,data_order2);
743 
744  // Check if same basis
745  if (fromType[0] != m_base[0]->GetBasisType() ||
746  fromType[1] != m_base[1]->GetBasisType() ||
747  fromType[2] != m_base[2]->GetBasisType())
748  {
749  // Construct a hex with the appropriate basis type at our
750  // quadrature points, and one more to do a forwards
751  // transform. We can then copy the output to coeffs.
752  StdRegions::StdHexExp tmpHex(
753  LibUtilities::BasisKey(
754  fromType[0], data_order0, m_base[0]->GetPointsKey()),
755  LibUtilities::BasisKey(
756  fromType[1], data_order1, m_base[1]->GetPointsKey()),
757  LibUtilities::BasisKey(
758  fromType[2], data_order2, m_base[2]->GetPointsKey()));
759  StdRegions::StdHexExp tmpHex2(m_base[0]->GetBasisKey(),
760  m_base[1]->GetBasisKey(),
761  m_base[2]->GetBasisKey());
762 
763  Array<OneD, const NekDouble> tmpData(tmpHex.GetNcoeffs(), data);
764  Array<OneD, NekDouble> tmpBwd(tmpHex2.GetTotPoints());
765  Array<OneD, NekDouble> tmpOut(tmpHex2.GetNcoeffs());
766 
767  tmpHex.BwdTrans(tmpData, tmpBwd);
768  tmpHex2.FwdTrans(tmpBwd, tmpOut);
769  Vmath::Vcopy(tmpOut.num_elements(), &tmpOut[0], 1, coeffs, 1);
770 
771  return;
772  }
773 
774  switch(m_base[0]->GetBasisType())
775  {
777  {
778  int i,j;
779  int cnt = 0;
780  int cnt1 = 0;
781 
782  ASSERTL1(m_base[1]->GetBasisType() ==
784  "Extraction routine not set up for this basis");
785  ASSERTL1(m_base[2]->GetBasisType() ==
787  "Extraction routine not set up for this basis");
788 
789  Vmath::Zero(m_ncoeffs,coeffs,1);
790  for(j = 0; j < fillorder0; ++j)
791  {
792  for(i = 0; i < fillorder1; ++i)
793  {
794  Vmath::Vcopy(fillorder2, &data[cnt], 1,
795  &coeffs[cnt1], 1);
796  cnt += data_order2;
797  cnt1 += order2;
798  }
799 
800  // count out data for j iteration
801  for(i = fillorder1; i < data_order1; ++i)
802  {
803  cnt += data_order2;
804  }
805 
806  for(i = fillorder1; i < order1; ++i)
807  {
808  cnt1 += order2;
809  }
810  }
811  break;
812  }
814  {
815  LibUtilities::PointsKey
816  p0(nummodes[0], LibUtilities::eGaussLobattoLegendre);
817  LibUtilities::PointsKey
818  p1(nummodes[1], LibUtilities::eGaussLobattoLegendre);
819  LibUtilities::PointsKey
820  p2(nummodes[2], LibUtilities::eGaussLobattoLegendre);
821  LibUtilities::PointsKey t0(
822  m_base[0]->GetNumModes(),
824  LibUtilities::PointsKey t1(
825  m_base[1]->GetNumModes(),
827  LibUtilities::PointsKey t2(
828  m_base[2]->GetNumModes(),
830  LibUtilities::Interp3D(p0, p1, p2, data, t0, t1, t2, coeffs);
831  }
832  break;
833  default:
834  ASSERTL0(false, "basis is either not set up or not "
835  "hierarchicial");
836  }
837  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
Principle Modified Functions .
Definition: BasisType.h:48
void Interp3D(const BasisKey &fbasis0, const BasisKey &fbasis1, const BasisKey &fbasis2, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, const BasisKey &tbasis2, Array< OneD, NekDouble > &to)
this function interpolates a 3D function evaluated at the quadrature points of the 3D basis...
Definition: Interp.cpp:185
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
Lagrange for SEM basis .
Definition: BasisType.h:54
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:376
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:51

◆ v_FwdTrans()

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

Parameters
inarrayInput array
outarrayOutput array

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 325 of file HexExp.cpp.

References Nektar::StdRegions::StdExpansion::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().

328  {
329  if( m_base[0]->Collocation() && m_base[1]->Collocation()
330  && m_base[2]->Collocation())
331  {
332  Vmath::Vcopy(GetNcoeffs(),&inarray[0],1,&outarray[0],1);
333  }
334  else
335  {
336  IProductWRTBase(inarray,outarray);
337 
338  // get Mass matrix inverse
339  MatrixKey masskey(StdRegions::eInvMass,
340  DetShapeType(),*this);
341  DNekScalMatSharedPtr matsys = m_matrixManager[masskey];
342 
343  // copy inarray in case inarray == outarray
344  DNekVec in (m_ncoeffs,outarray);
345  DNekVec out(m_ncoeffs,outarray,eWrapper);
346 
347  out = (*matsys)*in;
348  }
349  }
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Definition: StdExpansion.h:469
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
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:634
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
Definition: StdExpansion.h:130
NekVector< NekDouble > DNekVec
Definition: NekTypeDefs.hpp:48
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: HexExp.h:283
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064

◆ v_GeneralMatrixOp_MatOp()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1287 of file HexExp.cpp.

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

1291  {
1292  //int nConsts = mkey.GetNconstants();
1293  DNekScalMatSharedPtr mat = GetLocMatrix(mkey);
1294 
1295 // switch(nConsts)
1296 // {
1297 // case 0:
1298 // {
1299 // mat = GetLocMatrix(mkey.GetMatrixType());
1300 // }
1301 // break;
1302 // case 1:
1303 // {
1304 // mat = GetLocMatrix(mkey.GetMatrixType(),mkey.GetConstant(0));
1305 // }
1306 // break;
1307 // case 2:
1308 // {
1309 // mat = GetLocMatrix(mkey.GetMatrixType(),mkey.GetConstant(0),mkey.GetConstant(1));
1310 // }
1311 // break;
1312 //
1313 // default:
1314 // {
1315 // NEKERROR(ErrorUtil::efatal, "Unknown number of constants");
1316 // }
1317 // break;
1318 // }
1319 
1320  if(inarray.get() == outarray.get())
1321  {
1322  Array<OneD,NekDouble> tmp(m_ncoeffs);
1323  Vmath::Vcopy(m_ncoeffs,inarray.get(),1,tmp.get(),1);
1324 
1325  Blas::Dgemv('N',m_ncoeffs,m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1326  m_ncoeffs, tmp.get(), 1, 0.0, outarray.get(), 1);
1327  }
1328  else
1329  {
1330  Blas::Dgemv('N',m_ncoeffs,m_ncoeffs,mat->Scale(),(mat->GetOwnedMatrix())->GetPtr().get(),
1331  m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
1332  }
1333  }
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
Definition: Blas.hpp:168
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
Definition: Expansion.cpp:85
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064

◆ v_GenMatrix()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1447 of file HexExp.cpp.

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

1449  {
1450  DNekMatSharedPtr returnval;
1451 
1452  switch(mkey.GetMatrixType())
1453  {
1461  returnval = Expansion3D::v_GenMatrix(mkey);
1462  break;
1463  default:
1464  returnval = StdHexExp::v_GenMatrix(mkey);
1465  }
1466 
1467  return returnval;
1468  }
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey)

◆ v_GetCoord()

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

Retrieves the physical coordinates of a given set of reference coordinates.

Parameters
LcoordsLocal coordinates in reference space.
coordsCorresponding coordinates in physical space.

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 690 of file HexExp.cpp.

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

693  {
694  int i;
695 
696  ASSERTL1(Lcoords[0] >= -1.0 && Lcoords[0] <= 1.0 &&
697  Lcoords[1] >= -1.0 && Lcoords[1] <= 1.0 &&
698  Lcoords[2] >= -1.0 && Lcoords[2] <= 1.0,
699  "Local coordinates are not in region [-1,1]");
700 
701  m_geom->FillGeom();
702 
703  for(i = 0; i < m_geom->GetCoordim(); ++i)
704  {
705  coords[i] = m_geom->GetCoord(i,Lcoords);
706  }
707  }
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:127
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ v_GetCoords()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 709 of file HexExp.cpp.

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

713  {
714  Expansion::v_GetCoords(coords_0, coords_1, coords_2);
715  }
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3)
Definition: Expansion.cpp:231

◆ v_GetFaceDGForwards()

bool Nektar::LocalRegions::HexExp::v_GetFaceDGForwards ( const int  i) const
protectedvirtual

◆ v_GetFacePhysMap()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 849 of file HexExp.cpp.

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

851  {
852  int nquad0 = m_base[0]->GetNumPoints();
853  int nquad1 = m_base[1]->GetNumPoints();
854  int nquad2 = m_base[2]->GetNumPoints();
855 
856  int nq0 = 0;
857  int nq1 = 0;
858 
859  switch(face)
860  {
861  case 0:
862  nq0 = nquad0;
863  nq1 = nquad1;
864 
865  //Directions A and B positive
866  if(outarray.num_elements()!=nq0*nq1)
867  {
868  outarray = Array<OneD, int>(nq0*nq1);
869  }
870 
871  for (int i = 0; i < nquad0*nquad1; ++i)
872  {
873  outarray[i] = i;
874  }
875 
876  break;
877  case 1:
878  nq0 = nquad0;
879  nq1 = nquad2;
880  //Direction A and B positive
881  if(outarray.num_elements()!=nq0*nq1)
882  {
883  outarray = Array<OneD, int>(nq0*nq1);
884  }
885 
886  //Direction A and B positive
887  for (int k = 0; k < nquad2; k++)
888  {
889  for(int i = 0; i < nquad0; ++i)
890  {
891  outarray[k*nquad0 + i] = nquad0*nquad1*k + i;
892  }
893  }
894  break;
895  case 2:
896  nq0 = nquad1;
897  nq1 = nquad2;
898 
899  //Direction A and B positive
900  if(outarray.num_elements()!=nq0*nq1)
901  {
902  outarray = Array<OneD, int>(nq0*nq1);
903  }
904 
905  for (int i = 0; i < nquad1*nquad2; i++)
906  {
907  outarray[i] = nquad0-1 + i*nquad0;
908  }
909  break;
910  case 3:
911  nq0 = nquad0;
912  nq1 = nquad2;
913 
914  //Direction A and B positive
915  if(outarray.num_elements()!=nq0*nq1)
916  {
917  outarray = Array<OneD, int>(nq0*nq1);
918  }
919 
920  for (int k = 0; k < nquad2; k++)
921  {
922  for (int i = 0; i < nquad0; i++)
923  {
924  outarray[k*nquad0 + i] = (nquad0*(nquad1-1))+(k*nquad0*nquad1) + i;
925  }
926  }
927  break;
928  case 4:
929  nq0 = nquad1;
930  nq1 = nquad2;
931 
932  //Direction A and B positive
933  if(outarray.num_elements()!=nq0*nq1)
934  {
935  outarray = Array<OneD, int>(nq0*nq1);
936  }
937 
938  for (int i = 0; i < nquad1*nquad2; i++)
939  {
940  outarray[i] = i*nquad0;
941  }
942  break;
943  case 5:
944  nq0 = nquad0;
945  nq1 = nquad1;
946  //Directions A and B positive
947  if(outarray.num_elements()!=nq0*nq1)
948  {
949  outarray = Array<OneD, int>(nq0*nq1);
950  }
951 
952  for (int i = 0; i < nquad0*nquad1; i++)
953  {
954  outarray[i] = nquad0*nquad1*(nquad2-1) + i;
955  }
956 
957  break;
958  default:
959  ASSERTL0(false,"face value (> 5) is out of range");
960  break;
961  }
962 
963  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_GetLinStdExp()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 670 of file HexExp.cpp.

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

671  {
672  LibUtilities::BasisKey bkey0(m_base[0]->GetBasisType(),
673  2, m_base[0]->GetPointsKey());
674  LibUtilities::BasisKey bkey1(m_base[1]->GetBasisType(),
675  2, m_base[1]->GetPointsKey());
676  LibUtilities::BasisKey bkey2(m_base[2]->GetBasisType(),
677  2, m_base[2]->GetPointsKey());
678 
680  ::AllocateSharedPtr( bkey0, bkey1, bkey2);
681  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_GetLocMatrix()

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

Reimplemented from Nektar::LocalRegions::Expansion.

Definition at line 1898 of file HexExp.cpp.

References m_matrixManager.

1899  {
1900  return m_matrixManager[mkey];
1901  }
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
Definition: HexExp.h:283

◆ v_GetLocStaticCondMatrix()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1904 of file HexExp.cpp.

References m_staticCondMatrixManager.

1906  {
1907  return m_staticCondMatrixManager[mkey];
1908  }
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
Definition: HexExp.h:284

◆ v_GetStdExp()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 661 of file HexExp.cpp.

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

662  {
664  ::AllocateSharedPtr(m_base[0]->GetBasisKey(),
665  m_base[1]->GetBasisKey(),
666  m_base[2]->GetBasisKey());
667  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_HelmholtzMatrixOp()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1278 of file HexExp.cpp.

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

1282  {
1283  HexExp::v_HelmholtzMatrixOp_MatFree(inarray,outarray,mkey);
1284  }
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)

◆ v_Integral()

NekDouble Nektar::LocalRegions::HexExp::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 points 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 117 of file HexExp.cpp.

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

119  {
120  int nquad0 = m_base[0]->GetNumPoints();
121  int nquad1 = m_base[1]->GetNumPoints();
122  int nquad2 = m_base[2]->GetNumPoints();
123  Array<OneD, const NekDouble> jac = m_metricinfo->GetJac(GetPointsKeys());
124  NekDouble returnVal;
125  Array<OneD,NekDouble> tmp(nquad0*nquad1*nquad2);
126 
127  // multiply inarray with Jacobian
128 
129  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
130  {
131  Vmath::Vmul(nquad0*nquad1*nquad2,&jac[0],1,
132  (NekDouble*)&inarray[0],1,&tmp[0],1);
133  }
134  else
135  {
136  Vmath::Smul(nquad0*nquad1*nquad2,(NekDouble) jac[0],
137  (NekDouble*)&inarray[0],1,&tmp[0],1);
138  }
139 
140  // call StdHexExp version;
141  returnVal = StdHexExp::v_Integral(tmp);
142 
143  return returnVal;
144  }
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
const LibUtilities::PointsKeyVector GetPointsKeys() const
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
double NekDouble
Array< OneD, LibUtilities::BasisSharedPtr > m_base
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:186

◆ v_IProductWRTBase()

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

Calculate the inner product of inarray with respect to the elements basis.

Parameters
inarrayInput array of physical space data.
outarrayOutput array of data.

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 363 of file HexExp.cpp.

References v_IProductWRTBase_SumFac().

366  {
367  HexExp::v_IProductWRTBase_SumFac(inarray, outarray);
368  }
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
Calculate the inner product of inarray with respect to the given basis B = base0 * base1 * base2...
Definition: HexExp.cpp:402

◆ v_IProductWRTBase_SumFac()

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

Calculate the inner product of inarray with respect to the given basis B = base0 * base1 * base2.

\( \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} (\xi_{1i}) \psi_{q}^{a} (\xi_{2j}) \psi_{r}^{a} (\xi_{3k}) w_i w_j w_k u(\xi_{1,i} \xi_{2,j} \xi_{3,k}) J_{i,j,k}\\ & = & \sum_{i=0}^{nq_0} \psi_p^a(\xi_{1,i}) \sum_{j=0}^{nq_1} \psi_{q}^a(\xi_{2,j}) \sum_{k=0}^{nq_2} \psi_{r}^a u(\xi_{1i},\xi_{2j},\xi_{3k}) J_{i,j,k} \end{array} \)
where \( \phi_{pqr} (\xi_1 , \xi_2 , \xi_3) = \psi_p^a ( \xi_1) \psi_{q}^a (\xi_2) \psi_{r}^a (\xi_3) \)
which can be implemented as
\(f_{r} (\xi_{3k}) = \sum_{k=0}^{nq_3} \psi_{r}^a u(\xi_{1i},\xi_{2j},\xi_{3k}) J_{i,j,k} = {\bf B_3 U} \)
\( g_{q} (\xi_{3k}) = \sum_{j=0}^{nq_1} \psi_{q}^a (\xi_{2j}) f_{r} (\xi_{3k}) = {\bf B_2 F} \)
\( (\phi_{pqr}, u)_{\delta} = \sum_{k=0}^{nq_0} \psi_{p}^a (\xi_{3k}) g_{q} (\xi_{3k}) = {\bf B_1 G} \)

Parameters
base0Basis to integrate wrt in first dimension.
base1Basis to integrate wrt in second dimension.
base2Basis to integrate wrt in third dimension.
inarrayInput array.
outarrayOutput array.
coll_check(not used)

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 402 of file HexExp.cpp.

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

Referenced by v_IProductWRTBase().

406  {
407  int nquad0 = m_base[0]->GetNumPoints();
408  int nquad1 = m_base[1]->GetNumPoints();
409  int nquad2 = m_base[2]->GetNumPoints();
410  int order0 = m_base[0]->GetNumModes();
411  int order1 = m_base[1]->GetNumModes();
412 
413  Array<OneD, NekDouble> wsp(nquad0*nquad1*(nquad2+order0) +
414  order0*order1*nquad2);
415 
416  if(multiplybyweights)
417  {
418  Array<OneD, NekDouble> tmp(inarray.num_elements());
419 
420  MultiplyByQuadratureMetric(inarray, tmp);
421  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
422  m_base[1]->GetBdata(),
423  m_base[2]->GetBdata(),
424  tmp,outarray,wsp,
425  true,true,true);
426  }
427  else
428  {
429  IProductWRTBase_SumFacKernel(m_base[0]->GetBdata(),
430  m_base[1]->GetBdata(),
431  m_base[2]->GetBdata(),
432  inarray,outarray,wsp,
433  true,true,true);
434 
435  }
436  }
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: StdExpansion.h:945
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
Array< OneD, LibUtilities::BasisSharedPtr > m_base

◆ v_IProductWRTDerivBase()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 438 of file HexExp.cpp.

References IProductWRTDerivBase_SumFac().

442  {
443  HexExp::IProductWRTDerivBase_SumFac(dir,inarray,outarray);
444  }
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Calculates the inner product .
Definition: HexExp.cpp:467

◆ v_IProductWRTDirectionalDerivBase()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 136 of file HexExp.h.

References LOCAL_REGIONS_EXPORT.

140  {
141  IProductWRTDirectionalDerivBase_SumFac(direction, inarray,
142  outarray);
143  }
void IProductWRTDirectionalDerivBase_SumFac(const Array< OneD, const NekDouble > &direction, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Definition: HexExp.cpp:575

◆ v_LaplacianMatrixOp() [1/2]

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1232 of file HexExp.cpp.

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

1236  {
1237  HexExp::v_LaplacianMatrixOp_MatFree(inarray,outarray,mkey);
1238  }
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)

◆ v_LaplacianMatrixOp() [2/2]

void Nektar::LocalRegions::HexExp::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::StdHexExp.

Definition at line 1240 of file HexExp.cpp.

1246  {
1247  StdExpansion::LaplacianMatrixOp_MatFree(k1,k2,inarray,outarray,
1248  mkey);
1249  }

◆ v_LaplacianMatrixOp_MatFree_Kernel()

void Nektar::LocalRegions::HexExp::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 1915 of file HexExp.cpp.

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().

1919  {
1920  // This implementation is only valid when there are no
1921  // coefficients associated to the Laplacian operator
1922  if (m_metrics.count(eMetricLaplacian00) == 0)
1923  {
1925  }
1926 
1927  int nquad0 = m_base[0]->GetNumPoints();
1928  int nquad1 = m_base[1]->GetNumPoints();
1929  int nquad2 = m_base[2]->GetNumPoints();
1930  int nqtot = nquad0*nquad1*nquad2;
1931 
1932  ASSERTL1(wsp.num_elements() >= 6*nqtot,
1933  "Insufficient workspace size.");
1934 
1935  const Array<OneD, const NekDouble>& base0 = m_base[0]->GetBdata();
1936  const Array<OneD, const NekDouble>& base1 = m_base[1]->GetBdata();
1937  const Array<OneD, const NekDouble>& base2 = m_base[2]->GetBdata();
1938  const Array<OneD, const NekDouble>& dbase0 = m_base[0]->GetDbdata();
1939  const Array<OneD, const NekDouble>& dbase1 = m_base[1]->GetDbdata();
1940  const Array<OneD, const NekDouble>& dbase2 = m_base[2]->GetDbdata();
1941  const Array<OneD, const NekDouble>& metric00 = m_metrics[eMetricLaplacian00];
1942  const Array<OneD, const NekDouble>& metric01 = m_metrics[eMetricLaplacian01];
1943  const Array<OneD, const NekDouble>& metric02 = m_metrics[eMetricLaplacian02];
1944  const Array<OneD, const NekDouble>& metric11 = m_metrics[eMetricLaplacian11];
1945  const Array<OneD, const NekDouble>& metric12 = m_metrics[eMetricLaplacian12];
1946  const Array<OneD, const NekDouble>& metric22 = m_metrics[eMetricLaplacian22];
1947 
1948  // Allocate temporary storage
1949  Array<OneD,NekDouble> wsp0(wsp);
1950  Array<OneD,NekDouble> wsp1(wsp+1*nqtot);
1951  Array<OneD,NekDouble> wsp2(wsp+2*nqtot);
1952  Array<OneD,NekDouble> wsp3(wsp+3*nqtot);
1953  Array<OneD,NekDouble> wsp4(wsp+4*nqtot);
1954  Array<OneD,NekDouble> wsp5(wsp+5*nqtot);
1955 
1956  StdExpansion3D::PhysTensorDeriv(inarray,wsp0,wsp1,wsp2);
1957 
1958  // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1959  // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1960  // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
1961  // especially for this purpose
1962  Vmath::Vvtvvtp(nqtot,&metric00[0],1,&wsp0[0],1,&metric01[0],1,&wsp1[0],1,&wsp3[0],1);
1963  Vmath::Vvtvp (nqtot,&metric02[0],1,&wsp2[0],1,&wsp3[0],1,&wsp3[0],1);
1964  Vmath::Vvtvvtp(nqtot,&metric01[0],1,&wsp0[0],1,&metric11[0],1,&wsp1[0],1,&wsp4[0],1);
1965  Vmath::Vvtvp (nqtot,&metric12[0],1,&wsp2[0],1,&wsp4[0],1,&wsp4[0],1);
1966  Vmath::Vvtvvtp(nqtot,&metric02[0],1,&wsp0[0],1,&metric12[0],1,&wsp1[0],1,&wsp5[0],1);
1967  Vmath::Vvtvp (nqtot,&metric22[0],1,&wsp2[0],1,&wsp5[0],1,&wsp5[0],1);
1968 
1969  // outarray = m = (D_xi1 * B)^T * k
1970  // wsp1 = n = (D_xi2 * B)^T * l
1971  IProductWRTBase_SumFacKernel(dbase0,base1,base2,wsp3,outarray,wsp0,false,true,true);
1972  IProductWRTBase_SumFacKernel(base0,dbase1,base2,wsp4,wsp2, wsp0,true,false,true);
1973  Vmath::Vadd(m_ncoeffs,wsp2.get(),1,outarray.get(),1,outarray.get(),1);
1974  IProductWRTBase_SumFacKernel(base0,base1,dbase2,wsp5,wsp2, wsp0,true,true,false);
1975  Vmath::Vadd(m_ncoeffs,wsp2.get(),1,outarray.get(),1,outarray.get(),1);
1976  }
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Definition: Vmath.cpp:445
void 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)
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:540
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.cpp:302

◆ v_MassLevelCurvatureMatrixOp()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1269 of file HexExp.cpp.

1273  {
1274  StdExpansion::MassLevelCurvatureMatrixOp_MatFree(inarray,
1275  outarray,mkey);
1276  }

◆ v_MassMatrixOp()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1224 of file HexExp.cpp.

1228  {
1229  StdExpansion::MassMatrixOp_MatFree(inarray,outarray,mkey);
1230  }

◆ v_PhysDeriv() [1/2]

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

Calculate the derivative of the physical points.

For Hexahedral region can use the Tensor_Deriv function defined under StdExpansion.

Parameters
inarrayInput array
out_d0Derivative of inarray in first direction.
out_d1Derivative of inarray in second direction.
out_d2Derivative of inarray in third direction.

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 160 of file HexExp.cpp.

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().

165  {
166  int nquad0 = m_base[0]->GetNumPoints();
167  int nquad1 = m_base[1]->GetNumPoints();
168  int nquad2 = m_base[2]->GetNumPoints();
169  int ntot = nquad0 * nquad1 * nquad2;
170 
171  Array<TwoD, const NekDouble> df =
172  m_metricinfo->GetDerivFactors(GetPointsKeys());
173  Array<OneD,NekDouble> Diff0 = Array<OneD,NekDouble>(ntot);
174  Array<OneD,NekDouble> Diff1 = Array<OneD,NekDouble>(ntot);
175  Array<OneD,NekDouble> Diff2 = Array<OneD,NekDouble>(ntot);
176 
177  StdHexExp::v_PhysDeriv(inarray, Diff0, Diff1, Diff2);
178 
179  if(m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
180  {
181  if(out_d0.num_elements())
182  {
183  Vmath::Vmul (ntot,&df[0][0],1,&Diff0[0],1, &out_d0[0], 1);
184  Vmath::Vvtvp(ntot,&df[1][0],1,&Diff1[0],1, &out_d0[0], 1,
185  &out_d0[0],1);
186  Vmath::Vvtvp(ntot,&df[2][0],1,&Diff2[0],1, &out_d0[0], 1,
187  &out_d0[0],1);
188  }
189 
190  if(out_d1.num_elements())
191  {
192  Vmath::Vmul (ntot,&df[3][0],1,&Diff0[0],1, &out_d1[0], 1);
193  Vmath::Vvtvp(ntot,&df[4][0],1,&Diff1[0],1, &out_d1[0], 1,
194  &out_d1[0],1);
195  Vmath::Vvtvp(ntot,&df[5][0],1,&Diff2[0],1, &out_d1[0], 1,
196  &out_d1[0],1);
197  }
198 
199  if(out_d2.num_elements())
200  {
201  Vmath::Vmul (ntot,&df[6][0],1,&Diff0[0],1, &out_d2[0], 1);
202  Vmath::Vvtvp(ntot,&df[7][0],1,&Diff1[0],1, &out_d2[0], 1,
203  &out_d2[0],1);
204  Vmath::Vvtvp(ntot,&df[8][0],1,&Diff2[0],1, &out_d2[0], 1,
205  &out_d2[0],1);
206  }
207  }
208  else // regular geometry
209  {
210  if(out_d0.num_elements())
211  {
212  Vmath::Smul (ntot,df[0][0],&Diff0[0],1, &out_d0[0], 1);
213  Blas::Daxpy (ntot,df[1][0],&Diff1[0],1, &out_d0[0], 1);
214  Blas::Daxpy (ntot,df[2][0],&Diff2[0],1, &out_d0[0], 1);
215  }
216 
217  if(out_d1.num_elements())
218  {
219  Vmath::Smul (ntot,df[3][0],&Diff0[0],1, &out_d1[0], 1);
220  Blas::Daxpy (ntot,df[4][0],&Diff1[0],1, &out_d1[0], 1);
221  Blas::Daxpy (ntot,df[5][0],&Diff2[0],1, &out_d1[0], 1);
222  }
223 
224  if(out_d2.num_elements())
225  {
226  Vmath::Smul (ntot,df[6][0],&Diff0[0],1, &out_d2[0], 1);
227  Blas::Daxpy (ntot,df[7][0],&Diff1[0],1, &out_d2[0], 1);
228  Blas::Daxpy (ntot,df[8][0],&Diff2[0],1, &out_d2[0], 1);
229  }
230  }
231  }
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Definition: Vmath.cpp:445
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
const LibUtilities::PointsKeyVector GetPointsKeys() const
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
Array< OneD, LibUtilities::BasisSharedPtr > m_base
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
Definition: Blas.hpp:110
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:186

◆ v_PhysDeriv() [2/2]

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

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

Parameters
dirDirection in which to compute derivative. Valid values are 0, 1, 2.
inarrayInput array.
outarrayOutput array.

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 243 of file HexExp.cpp.

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

247  {
248  switch(dir)
249  {
250  case 0:
251  {
252  PhysDeriv(inarray, outarray, NullNekDouble1DArray,
254  }
255  break;
256  case 1:
257  {
258  PhysDeriv(inarray, NullNekDouble1DArray, outarray,
260  }
261  break;
262  case 2:
263  {
265  NullNekDouble1DArray, outarray);
266  }
267  break;
268  default:
269  {
270  ASSERTL1(false,"input dir is out of range");
271  }
272  break;
273  }
274  }
static Array< OneD, NekDouble > NullNekDouble1DArray
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250

◆ v_PhysDirectionalDeriv()

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

Physical derivative along a direction vector.

See also
StdRegions::StdExpansion::PhysDirectionalDeriv

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 277 of file HexExp.cpp.

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

281  {
282 
283  int shapedim = 3;
284  int nquad0 = m_base[0]->GetNumPoints();
285  int nquad1 = m_base[1]->GetNumPoints();
286  int nquad2 = m_base[2]->GetNumPoints();
287  int ntot = nquad0 * nquad1 * nquad2;
288 
289  Array<TwoD, const NekDouble> df =
290  m_metricinfo->GetDerivFactors(GetPointsKeys());
291  Array<OneD,NekDouble> Diff0 = Array<OneD,NekDouble>(ntot);
292  Array<OneD,NekDouble> Diff1 = Array<OneD,NekDouble>(ntot);
293  Array<OneD,NekDouble> Diff2 = Array<OneD,NekDouble>(ntot);
294 
295  StdHexExp::v_PhysDeriv(inarray, Diff0, Diff1, Diff2);
296 
297  Array<OneD, Array<OneD, NekDouble> > dfdir(shapedim);
298  Expansion::ComputeGmatcdotMF(df,direction,dfdir);
299 
300  Vmath::Vmul (ntot, &dfdir[0][0], 1,
301  &Diff0[0], 1,
302  &outarray[0], 1 );
303  Vmath::Vvtvp(ntot, &dfdir[1][0], 1,
304  &Diff1[0], 1,
305  &outarray[0], 1,
306  &outarray[0], 1 );
307  Vmath::Vvtvp(ntot, &dfdir[2][0], 1,
308  &Diff2[0], 1,
309  &outarray[0], 1,
310  &outarray[0], 1 );
311  }
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Definition: Vmath.cpp:445
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
const LibUtilities::PointsKeyVector GetPointsKeys() const
void ComputeGmatcdotMF(const Array< TwoD, const NekDouble > &df, const Array< OneD, const NekDouble > &direction, Array< OneD, Array< OneD, NekDouble > > &dfdir)
Definition: Expansion.cpp:312
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:186

◆ v_PhysEvaluate()

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

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

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

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

is evaluated using Lagrangian interpolants through the quadrature points:

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

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

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

Reimplemented from Nektar::StdRegions::StdExpansion3D.

Definition at line 650 of file HexExp.cpp.

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

653  {
654  Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(3);
655 
656  ASSERTL0(m_geom,"m_geom not defined");
657  m_geom->GetLocCoords(coord,Lcoord);
658  return StdHexExp::v_PhysEvaluate(Lcoord, physvals);
659  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
SpatialDomains::GeometrySharedPtr m_geom
Definition: Expansion.h:127

◆ v_ReduceOrderCoeffs()

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

This function is used to compute exactly the advective numerical flux on the interface of two elements with different expansions, hence an appropriate number of Gauss points has to be used. The number of Gauss points has to be equal to the number used by the highest polynomial degree of the two adjacent elements

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1346 of file HexExp.cpp.

References Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::LibUtilities::eOrtho_A, Nektar::StdRegions::StdExpansion::GetBasisType(), Nektar::LibUtilities::InterpCoeff3D(), Nektar::StdRegions::StdExpansion::m_base, Vmath::Vcopy(), and Vmath::Zero().

1350  {
1351  int n_coeffs = inarray.num_elements();
1352  int nmodes0 = m_base[0]->GetNumModes();
1353  int nmodes1 = m_base[1]->GetNumModes();
1354  int nmodes2 = m_base[2]->GetNumModes();
1355  int numMax = nmodes0;
1356 
1357  Array<OneD, NekDouble> coeff (n_coeffs);
1358  Array<OneD, NekDouble> coeff_tmp1(nmodes0*nmodes1, 0.0);
1359  Array<OneD, NekDouble> coeff_tmp2(n_coeffs, 0.0);
1360  Array<OneD, NekDouble> tmp, tmp2, tmp3, tmp4;
1361 
1362  Vmath::Vcopy(n_coeffs,inarray,1,coeff_tmp2,1);
1363 
1364  const LibUtilities::PointsKey Pkey0(
1366  const LibUtilities::PointsKey Pkey1(
1368  const LibUtilities::PointsKey Pkey2(
1370 
1371  LibUtilities::BasisKey b0(
1372  m_base[0]->GetBasisType(), nmodes0, Pkey0);
1373  LibUtilities::BasisKey b1(
1374  m_base[1]->GetBasisType(), nmodes1, Pkey1);
1375  LibUtilities::BasisKey b2(
1376  m_base[2]->GetBasisType(), nmodes2, Pkey2);
1377  LibUtilities::BasisKey bortho0(
1378  LibUtilities::eOrtho_A, nmodes0, Pkey0);
1379  LibUtilities::BasisKey bortho1(
1380  LibUtilities::eOrtho_A, nmodes1, Pkey1);
1381  LibUtilities::BasisKey bortho2(
1382  LibUtilities::eOrtho_A, nmodes2, Pkey2);
1383 
1385  b0, b1, b2, coeff_tmp2,
1386  bortho0, bortho1, bortho2, coeff);
1387 
1388  Vmath::Zero(n_coeffs, coeff_tmp2, 1);
1389 
1390  int cnt = 0, cnt2 = 0;
1391 
1392  for (int u = 0; u < numMin+1; ++u)
1393  {
1394  for (int i = 0; i < numMin; ++i)
1395  {
1396  Vmath::Vcopy(numMin,
1397  tmp = coeff+cnt+cnt2,1,
1398  tmp2 = coeff_tmp1+cnt,1);
1399 
1400  cnt = i*numMax;
1401  }
1402 
1403  Vmath::Vcopy(nmodes0*nmodes1,
1404  tmp3 = coeff_tmp1,1,
1405  tmp4 = coeff_tmp2+cnt2,1);
1406 
1407  cnt2 = u*nmodes0*nmodes1;
1408  }
1409 
1411  bortho0, bortho1, bortho2, coeff_tmp2,
1412  b0, b1, b2, outarray);
1413  }
Principle Orthogonal Functions .
Definition: BasisType.h:45
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Definition: StdExpansion.h:164
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:376
void InterpCoeff3D(const BasisKey &fbasis0, const BasisKey &fbasis1, const BasisKey &fbasis2, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, const BasisKey &tbasis2, Array< OneD, NekDouble > &to)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:51

◆ v_StdPhysEvaluate()

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

645  {
646  // Evaluate point in local coordinates.
647  return StdHexExp::v_PhysEvaluate(Lcoord,physvals);
648  }

◆ v_SVVLaplacianFilter()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1415 of file HexExp.cpp.

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

1418  {
1419  int nq = GetTotPoints();
1420 
1421  // Calculate sqrt of the Jacobian
1422  Array<OneD, const NekDouble> jac =
1423  m_metricinfo->GetJac(GetPointsKeys());
1424  Array<OneD, NekDouble> sqrt_jac(nq);
1425  if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1426  {
1427  Vmath::Vsqrt(nq,jac,1,sqrt_jac,1);
1428  }
1429  else
1430  {
1431  Vmath::Fill(nq,sqrt(jac[0]),sqrt_jac,1);
1432  }
1433 
1434  // Multiply array by sqrt(Jac)
1435  Vmath::Vmul(nq,sqrt_jac,1,array,1,array,1);
1436 
1437  // Apply std region filter
1438  StdHexExp::v_SVVLaplacianFilter( array, mkey);
1439 
1440  // Divide by sqrt(Jac)
1441  Vmath::Vdiv(nq,array,1,sqrt_jac,1,array,1);
1442  }
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
Definition: Vmath.cpp:411
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Definition: Expansion.h:128
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:244
const LibUtilities::PointsKeyVector GetPointsKeys() const
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
Definition: StdExpansion.h:140
Geometry is curved or has non-constant factors.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:186

◆ v_WeakDerivMatrixOp()

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

Reimplemented from Nektar::StdRegions::StdHexExp.

Definition at line 1251 of file HexExp.cpp.

1256  {
1257  StdExpansion::WeakDerivMatrixOp_MatFree(i,inarray,outarray,mkey);
1258  }

◆ v_WeakDirectionalDerivMatrixOp()

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

Reimplemented from Nektar::StdRegions::StdExpansion.

Definition at line 1260 of file HexExp.cpp.

1264  {
1265  StdExpansion::WeakDirectionalDerivMatrixOp_MatFree(inarray,
1266  outarray,mkey);
1267  }

Member Data Documentation

◆ m_matrixManager

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

Definition at line 283 of file HexExp.h.

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

◆ m_staticCondMatrixManager

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

Definition at line 284 of file HexExp.h.

Referenced by v_DropLocStaticCondMatrix(), and v_GetLocStaticCondMatrix().