Nektar++
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Nektar::LibUtilities::NodalUtilQuad Class Reference

Specialisation of the NodalUtil class to support nodal quad elements. More...

#include <NodalUtil.h>

Inheritance diagram for Nektar::LibUtilities::NodalUtilQuad:
[legend]

Public Member Functions

 NodalUtilQuad (size_t degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s)
 Construct the nodal utility class for a quadrilateral. More...
 
 ~NodalUtilQuad () override
 
- Public Member Functions inherited from Nektar::LibUtilities::NodalUtil
virtual ~NodalUtil ()=default
 
NekVector< NekDoubleGetWeights ()
 Obtain the integration weights for the given nodal distribution. More...
 
SharedMatrix GetVandermonde ()
 Return the Vandermonde matrix for the nodal distribution. More...
 
SharedMatrix GetVandermondeForDeriv (size_t dir)
 Return the Vandermonde matrix of the derivative of the basis functions for the nodal distribution. More...
 
SharedMatrix GetDerivMatrix (size_t dir)
 Return the derivative matrix for the nodal distribution. More...
 
SharedMatrix GetInterpolationMatrix (Array< OneD, Array< OneD, NekDouble > > &xi)
 Construct the interpolation matrix used to evaluate the basis at the points xi inside the element. More...
 

Protected Member Functions

NekVector< NekDoublev_OrthoBasis (const size_t mode) override
 Return the value of the modal functions for the quad element at the nodal points m_xi for a given mode. More...
 
NekVector< NekDoublev_OrthoBasisDeriv (const size_t dir, const size_t mode) override
 Return the value of the derivative of the modal functions for the quadrilateral element at the nodal points m_xi for a given mode. More...
 
std::shared_ptr< NodalUtilv_CreateUtil (Array< OneD, Array< OneD, NekDouble > > &xi) override
 Construct a NodalUtil object of the appropriate element type for a given set of points. More...
 
NekDouble v_ModeZeroIntegral () override
 Return the value of the integral of the zero-th mode for this element. More...
 
size_t v_NumModes () override
 Calculate the number of degrees of freedom for this element. More...
 
- Protected Member Functions inherited from Nektar::LibUtilities::NodalUtil
 NodalUtil (size_t degree, size_t dim)
 Set up the NodalUtil object. More...
 
virtual NekVector< NekDoublev_OrthoBasis (const size_t mode)=0
 Return the values of the orthogonal basis at the nodal points for a given mode. More...
 
virtual NekVector< NekDoublev_OrthoBasisDeriv (const size_t dir, const size_t mode)=0
 Return the values of the derivative of the orthogonal basis at the nodal points for a given mode. More...
 
virtual std::shared_ptr< NodalUtilv_CreateUtil (Array< OneD, Array< OneD, NekDouble > > &xi)=0
 Construct a NodalUtil object of the appropriate element type for a given set of points. More...
 
virtual NekDouble v_ModeZeroIntegral ()=0
 Return the value of the integral of the zero-th mode for this element. More...
 
virtual size_t v_NumModes ()=0
 Calculate the number of degrees of freedom for this element. More...
 

Protected Attributes

std::vector< std::pair< int, int > > m_ordering
 Mapping from the \( (i,j) \) indexing of the basis to a continuous ordering. More...
 
- Protected Attributes inherited from Nektar::LibUtilities::NodalUtil
size_t m_dim
 Dimension of the nodal element. More...
 
size_t m_degree
 Degree of the nodal element. More...
 
size_t m_numPoints
 Total number of nodal points. More...
 
Array< OneD, Array< OneD, NekDouble > > m_xi
 Coordinates of the nodal points defining the basis. More...
 

Detailed Description

Specialisation of the NodalUtil class to support nodal quad elements.

Definition at line 306 of file NodalUtil.h.

Constructor & Destructor Documentation

◆ NodalUtilQuad()

Nektar::LibUtilities::NodalUtilQuad::NodalUtilQuad ( size_t  degree,
Array< OneD, NekDouble r,
Array< OneD, NekDouble s 
)

Construct the nodal utility class for a quadrilateral.

The constructor of this class sets up the m_ordering member variable used in the evaluation of the orthogonal basis.

Parameters
degreePolynomial order of this nodal quad.
r\( \xi_1 \)-coordinates of nodal points in the standard element.
s\( \xi_2 \)-coordinates of nodal points in the standard element.

Definition at line 823 of file NodalUtil.cpp.

825 : NodalUtil(degree, 2)
826{
827 // Set up parent variables.
828 m_numPoints = r.size();
829 m_xi[0] = r;
830 m_xi[1] = s;
831
832 // Construct a mapping (i,j) -> m from the tensor product space (i,j) to a
833 // single ordering m.
834 for (size_t j = 0; j <= m_degree; ++j)
835 {
836 for (size_t i = 0; i <= m_degree; ++i)
837 {
838 m_ordering.push_back(std::make_pair(i, j));
839 }
840 }
841}
Array< OneD, Array< OneD, NekDouble > > m_xi
Coordinates of the nodal points defining the basis.
Definition: NodalUtil.h:107
size_t m_degree
Degree of the nodal element.
Definition: NodalUtil.h:103
size_t m_numPoints
Total number of nodal points.
Definition: NodalUtil.h:105
NodalUtil(size_t degree, size_t dim)
Set up the NodalUtil object.
Definition: NodalUtil.h:95
std::vector< std::pair< int, int > > m_ordering
Mapping from the indexing of the basis to a continuous ordering.
Definition: NodalUtil.h:319

References Nektar::LibUtilities::NodalUtil::m_degree, Nektar::LibUtilities::NodalUtil::m_numPoints, m_ordering, and Nektar::LibUtilities::NodalUtil::m_xi.

◆ ~NodalUtilQuad()

Nektar::LibUtilities::NodalUtilQuad::~NodalUtilQuad ( )
inlineoverride

Definition at line 312 of file NodalUtil.h.

313 {
314 }

Member Function Documentation

◆ v_CreateUtil()

std::shared_ptr< NodalUtil > Nektar::LibUtilities::NodalUtilQuad::v_CreateUtil ( Array< OneD, Array< OneD, NekDouble > > &  xi)
inlineoverrideprotectedvirtual

Construct a NodalUtil object of the appropriate element type for a given set of points.

This function is used inside NodalUtil::GetInterpolationMatrix so that the (potentially non-square) Vandermonde matrix can be constructed to create the interpolation matrix at an arbitrary set of points in the domain.

Parameters
xiDistribution of nodal points to create utility with.

Implements Nektar::LibUtilities::NodalUtil.

Definition at line 325 of file NodalUtil.h.

327 {
329 xi[1]);
330 }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and Nektar::LibUtilities::NodalUtil::m_degree.

◆ v_ModeZeroIntegral()

NekDouble Nektar::LibUtilities::NodalUtilQuad::v_ModeZeroIntegral ( )
inlineoverrideprotectedvirtual

Return the value of the integral of the zero-th mode for this element.

Note that for the orthogonal basis under consideration, all modes integrate to zero asides from the zero-th mode. This function is used in NodalUtil::GetWeights to determine integration weights.

Implements Nektar::LibUtilities::NodalUtil.

Definition at line 332 of file NodalUtil.h.

333 {
334 return 4.0;
335 }

◆ v_NumModes()

size_t Nektar::LibUtilities::NodalUtilQuad::v_NumModes ( )
inlineoverrideprotectedvirtual

Calculate the number of degrees of freedom for this element.

Implements Nektar::LibUtilities::NodalUtil.

Definition at line 337 of file NodalUtil.h.

338 {
339 return (m_degree + 1) * (m_degree + 1);
340 }

References Nektar::LibUtilities::NodalUtil::m_degree.

◆ v_OrthoBasis()

NekVector< NekDouble > Nektar::LibUtilities::NodalUtilQuad::v_OrthoBasis ( const size_t  mode)
overrideprotectedvirtual

Return the value of the modal functions for the quad element at the nodal points m_xi for a given mode.

In a quad, we use the orthogonal basis

\[ \psi_{m(ij)} = P^{(0,0)}_i(\xi_1) P_j^{(0,0)}(\xi_2) \]

Parameters
modeThe mode of the orthogonal basis to evaluate.

Implements Nektar::LibUtilities::NodalUtil.

Definition at line 856 of file NodalUtil.cpp.

857{
858 std::vector<NekDouble> jacobi_i(m_numPoints), jacobi_j(m_numPoints);
859 std::pair<int, int> modes = m_ordering[mode];
860
861 // Calculate Jacobi polynomials
862 Polylib::jacobfd(m_numPoints, &m_xi[0][0], &jacobi_i[0], nullptr,
863 modes.first, 0.0, 0.0);
864 Polylib::jacobfd(m_numPoints, &m_xi[1][0], &jacobi_j[0], nullptr,
865 modes.second, 0.0, 0.0);
866
867 NekVector<NekDouble> ret(m_numPoints);
868
869 for (size_t i = 0; i < m_numPoints; ++i)
870 {
871 ret[i] = jacobi_i[i] * jacobi_j[i];
872 }
873
874 return ret;
875}
void jacobfd(const int np, const double *z, double *poly_in, double *polyd, const int n, const double alpha, const double beta)
Routine to calculate Jacobi polynomials, , and their first derivative, .
Definition: Polylib.cpp:1248

References Polylib::jacobfd(), Nektar::LibUtilities::NodalUtil::m_numPoints, m_ordering, Nektar::LibUtilities::NodalUtil::m_xi, and CG_Iterations::modes.

◆ v_OrthoBasisDeriv()

NekVector< NekDouble > Nektar::LibUtilities::NodalUtilQuad::v_OrthoBasisDeriv ( const size_t  dir,
const size_t  mode 
)
overrideprotectedvirtual

Return the value of the derivative of the modal functions for the quadrilateral element at the nodal points m_xi for a given mode.

Parameters
modeThe mode of the orthogonal basis to evaluate.

Implements Nektar::LibUtilities::NodalUtil.

Definition at line 883 of file NodalUtil.cpp.

885{
886 std::vector<NekDouble> jacobi_i(m_numPoints), jacobi_j(m_numPoints);
887 std::vector<NekDouble> jacobi_di(m_numPoints), jacobi_dj(m_numPoints);
888 std::pair<int, int> modes = m_ordering[mode];
889
890 // Calculate Jacobi polynomials and their derivatives. Note that we use both
891 // jacobfd and jacobd since jacobfd is only valid for derivatives in the
892 // open interval (-1,1).
893 Polylib::jacobfd(m_numPoints, &m_xi[0][0], &jacobi_i[0], nullptr,
894 modes.first, 0.0, 0.0);
895 Polylib::jacobfd(m_numPoints, &m_xi[1][0], &jacobi_j[0], nullptr,
896 modes.second, 0.0, 0.0);
897 Polylib::jacobd(m_numPoints, &m_xi[0][0], &jacobi_di[0], modes.first, 0.0,
898 0.0);
899 Polylib::jacobd(m_numPoints, &m_xi[1][0], &jacobi_dj[0], modes.second, 0.0,
900 0.0);
901
902 NekVector<NekDouble> ret(m_numPoints);
903
904 if (dir == 0)
905 {
906 for (size_t i = 0; i < m_numPoints; ++i)
907 {
908 ret[i] = jacobi_di[i] * jacobi_j[i];
909 }
910 }
911 else
912 {
913 for (size_t i = 0; i < m_numPoints; ++i)
914 {
915 ret[i] = jacobi_i[i] * jacobi_dj[i];
916 }
917 }
918
919 return ret;
920}
void jacobd(const int np, const double *z, double *polyd, const int n, const double alpha, const double beta)
Calculate the derivative of Jacobi polynomials.
Definition: Polylib.cpp:1378

References Polylib::jacobd(), Polylib::jacobfd(), Nektar::LibUtilities::NodalUtil::m_numPoints, m_ordering, Nektar::LibUtilities::NodalUtil::m_xi, and CG_Iterations::modes.

Member Data Documentation

◆ m_ordering

std::vector<std::pair<int, int> > Nektar::LibUtilities::NodalUtilQuad::m_ordering
protected

Mapping from the \( (i,j) \) indexing of the basis to a continuous ordering.

Definition at line 319 of file NodalUtil.h.

Referenced by NodalUtilQuad(), v_OrthoBasis(), and v_OrthoBasisDeriv().