49 namespace LibUtilities
107 for (
int j = 0; j < cols; ++j)
110 for (
int i = 0; i < rows; ++i)
112 (*matV)(i, j) = col[i];
140 for (
int j = 0; j < cols; ++j)
143 for (
int i = 0; i < rows; ++i)
145 (*matV)(i, j) = col[i];
172 V->GetRows(), V->GetColumns(), 0.0);
208 matT->GetRows(), matS->GetColumns(), 0.0);
212 *D = (*matT) * (*matS);
251 for (
int j = 0; j <=
m_degree - i; ++j)
309 ret[i] = sqrt2 * jacobi_i[i] * jacobi_j[i] *
347 2.0 *
modes.first + 1.0, 0.0);
357 ret[i] = 2.0 * sqrt2 * jacobi_di[i] * jacobi_j[i];
360 ret[i] *= pow(1.0 -
m_eta[1][i],
modes.first - 1.0);
369 ret[i] = (1 +
m_eta[0][i]) * sqrt2 * jacobi_di[i] * jacobi_j[i];
372 ret[i] *= pow(1.0 -
m_eta[1][i],
modes.first - 1.0);
378 tmp -=
modes.first * jacobi_j[i] *
382 ret[i] += sqrt2 * jacobi_i[i] * tmp;
426 for (
int j = 0; j <=
m_degree - i; ++j)
428 for (
int k = 0; k <=
m_degree - i - j; ++k)
464 2.0 * (1.0 +
m_xi[0][i]) / (-
m_xi[1][i] -
m_xi[2][i]) - 1.0;
466 m_eta[1][i] = 2.0 * (1.0 +
m_xi[1][i]) / (1.0 -
m_xi[2][i]) - 1.0;
501 2.0 * (I + J) + 2.0, 0.0);
508 ret[i] = sqrt8 * jacA[i] * jacB[i] * jacC[i] *
509 pow(1.0 -
m_eta[1][i], I) * pow(1.0 -
m_eta[2][i], I + J);
545 2.0 * (I + J) + 2.0, 0.0);
550 2.0 * (I + J) + 2.0, 0.0);
559 ret[i] = 4.0 * sqrt8 * jacDerivA[i] * jacB[i] * jacC[i];
563 ret[i] *= pow(1 -
m_eta[1][i], I - 1);
568 ret[i] *= pow(1 -
m_eta[2][i], I + J - 1);
579 ret[i] *= 0.5 * (
m_eta[0][i] + 1.0);
581 tmp[i] = 2.0 * sqrt8 * jacA[i] * jacC[i];
584 tmp[i] *= pow(1.0 -
m_eta[2][i], I + J - 1);
590 tmp2 -= I * jacB[i] * pow(1.0 -
m_eta[1][i], I - 1);
604 ret[i] += 0.5 * (1.0 +
m_eta[1][i]) * tmp[i];
609 tmp2 -= jacC[i] * (I + J) * pow(1.0 -
m_eta[2][i], I + J - 1);
613 sqrt8 * jacA[i] * jacB[i] * pow(1.0 -
m_eta[1][i], I) * tmp2;
659 for (
int k = 0; k <=
m_degree - i; ++k)
684 m_eta[0][i] = 2.0 * (1.0 +
m_xi[0][i]) / (1.0 -
m_xi[2][i]) - 1.0;
727 sqrt2 * jacA[i] * jacB[i] * jacC[i] * pow(1.0 -
m_eta[2][i], I);
775 ret[i] = sqrt2 * jacA[i] * jacDerivB[i] * jacC[i] *
776 pow(1.0 -
m_eta[2][i], I);
783 ret[i] = 2.0 * sqrt2 * jacDerivA[i] * jacB[i] * jacC[i];
787 ret[i] *= pow(1.0 -
m_eta[2][i], I - 1);
798 ret[i] *= 0.5 * (1.0 +
m_eta[0][i]);
804 tmp -= jacC[i] * I * pow(1.0 -
m_eta[2][i], I - 1);
807 ret[i] += sqrt2 * jacA[i] * jacB[i] * tmp;
874 ret[i] = jacobi_i[i] * jacobi_j[i];
911 ret[i] = jacobi_di[i] * jacobi_j[i];
918 ret[i] = jacobi_i[i] * jacobi_dj[i];
990 ret[i] = jacobi_i[i] * jacobi_j[i] * jacobi_k[i];
1023 ret[i] = jacobi_di[i] * jacobi_j[i] * jacobi_k[i];
1030 ret[i] = jacobi_dj[i] * jacobi_i[i] * jacobi_k[i];
1037 ret[i] = jacobi_i[i] * jacobi_j[i] * jacobi_dk[i];
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const int dir, const int mode) override
Return the values of the derivative of the orthogonal basis at the nodal points for a given mode.
virtual NekVector< NekDouble > v_OrthoBasis(const int mode) override
Return the value of the modal functions for the hex element at the nodal points m_xi for a given mode...
NodalUtilHex(int degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s, Array< OneD, NekDouble > t)
Construct the nodal utility class for a hexahedron.
std::vector< Mode > m_ordering
Mapping from the indexing of the basis to a continuous ordering.
std::tuple< int, int, int > Mode
A class to assist in the construction of nodal simplex and hybrid elements in two and three dimension...
int m_degree
Degree of the nodal element.
virtual std::shared_ptr< NodalUtil > v_CreateUtil(Array< OneD, Array< OneD, NekDouble >> &xi)=0
Construct a NodalUtil object of the appropriate element type for a given set of points.
int m_numPoints
Total number of nodal points.
Array< OneD, Array< OneD, NekDouble > > m_xi
Coordinates of the nodal points defining the basis.
NekVector< NekDouble > GetWeights()
Obtain the integration weights for the given nodal distribution.
SharedMatrix GetVandermonde()
Return the Vandermonde matrix for the nodal distribution.
SharedMatrix GetVandermondeForDeriv(int dir)
Return the Vandermonde matrix of the derivative of the basis functions for the nodal distribution.
virtual int v_NumModes()=0
Calculate the number of degrees of freedom for this element.
SharedMatrix GetDerivMatrix(int dir)
Return the derivative matrix for the nodal distribution.
virtual NekDouble v_ModeZeroIntegral()=0
Return the value of the integral of the zero-th mode for this element.
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const int dir, const int mode)=0
Return the values of the derivative of the orthogonal basis at the nodal points for a given mode.
SharedMatrix GetInterpolationMatrix(Array< OneD, Array< OneD, NekDouble >> &xi)
Construct the interpolation matrix used to evaluate the basis at the points xi inside the element.
virtual NekVector< NekDouble > v_OrthoBasis(const int mode)=0
Return the values of the orthogonal basis at the nodal points for a given mode.
NodalUtilPrism(int degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s, Array< OneD, NekDouble > t)
Construct the nodal utility class for a prism.
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const int dir, const int mode) override
Return the value of the derivative of the modal functions for the prismatic element at the nodal poin...
virtual NekVector< NekDouble > v_OrthoBasis(const int mode) override
Return the value of the modal functions for the prismatic element at the nodal points m_xi for a give...
Array< OneD, Array< OneD, NekDouble > > m_eta
Collapsed coordinates of the nodal points.
std::vector< Mode > m_ordering
Mapping from the indexing of the basis to a continuous ordering.
std::tuple< int, int, int > Mode
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const int dir, const int mode) override
Return the value of the derivative of the modal functions for the quadrilateral element at the nodal ...
NodalUtilQuad(int degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s)
Construct the nodal utility class for a quadrilateral.
std::vector< std::pair< int, int > > m_ordering
Mapping from the indexing of the basis to a continuous ordering.
virtual NekVector< NekDouble > v_OrthoBasis(const int mode) override
Return the value of the modal functions for the quad element at the nodal points m_xi for a given mod...
std::tuple< int, int, int > Mode
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const int dir, const int mode) override
Return the value of the derivative of the modal functions for the tetrahedral element at the nodal po...
Array< OneD, Array< OneD, NekDouble > > m_eta
Collapsed coordinates of the nodal points.
NodalUtilTetrahedron(int degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s, Array< OneD, NekDouble > t)
Construct the nodal utility class for a tetrahedron.
std::vector< Mode > m_ordering
Mapping from the indexing of the basis to a continuous ordering.
virtual NekVector< NekDouble > v_OrthoBasis(const int mode) override
Return the value of the modal functions for the tetrahedral element at the nodal points m_xi for a gi...
NodalUtilTriangle(int degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s)
Construct the nodal utility class for a triangle.
std::vector< std::pair< int, int > > m_ordering
Mapping from the indexing of the basis to a continuous ordering.
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const int dir, const int mode) override
Return the value of the derivative of the modal functions for the triangular element at the nodal poi...
virtual NekVector< NekDouble > v_OrthoBasis(const int mode) override
Return the value of the modal functions for the triangular element at the nodal points m_xi for a giv...
Array< OneD, Array< OneD, NekDouble > > m_eta
Collapsed coordinates of the nodal points.
RawType_t< VectorType > SolveTranspose(const VectorType &b)
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
std::shared_ptr< NekMatrix< NekDouble > > SharedMatrix
static const NekDouble kNekZeroTol
The above copyright notice and this permission notice shall be included.
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.
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, .
scalarT< T > sqrt(scalarT< T > in)