105 for (
size_t j = 0; j < cols; ++j)
108 for (
size_t i = 0; i < rows; ++i)
110 (*matV)(i, j) = col[i];
138 for (
size_t j = 0; j < cols; ++j)
141 for (
size_t i = 0; i < rows; ++i)
143 (*matV)(i, j) = col[i];
170 V->GetRows(), V->GetColumns(), 0.0);
206 matT->GetRows(), matS->GetColumns(), 0.0);
210 *D = (*matT) * (*matS);
247 for (
size_t i = 0; i <=
m_degree; ++i)
249 for (
size_t j = 0; j <=
m_degree - i; ++j)
307 ret[i] = sqrt2 * jacobi_i[i] * jacobi_j[i] *
345 2.0 *
modes.first + 1.0, 0.0);
355 ret[i] = 2.0 * sqrt2 * jacobi_di[i] * jacobi_j[i];
358 ret[i] *= pow(1.0 -
m_eta[1][i],
modes.first - 1.0);
367 ret[i] = (1 +
m_eta[0][i]) * sqrt2 * jacobi_di[i] * jacobi_j[i];
370 ret[i] *= pow(1.0 -
m_eta[1][i],
modes.first - 1.0);
376 tmp -=
modes.first * jacobi_j[i] *
380 ret[i] += sqrt2 * jacobi_i[i] * tmp;
423 for (
size_t i = 0; i <=
m_degree; ++i)
425 for (
size_t j = 0; j <=
m_degree - i; ++j)
427 for (
size_t k = 0; k <=
m_degree - i - j; ++k)
463 2.0 * (1.0 +
m_xi[0][i]) / (-
m_xi[1][i] -
m_xi[2][i]) - 1.0;
465 m_eta[1][i] = 2.0 * (1.0 +
m_xi[1][i]) / (1.0 -
m_xi[2][i]) - 1.0;
500 2.0 * (I + J) + 2.0, 0.0);
507 ret[i] = sqrt8 * jacA[i] * jacB[i] * jacC[i] *
508 pow(1.0 -
m_eta[1][i], I) * pow(1.0 -
m_eta[2][i], I + J);
544 2.0 * (I + J) + 2.0, 0.0);
549 2.0 * (I + J) + 2.0, 0.0);
558 ret[i] = 4.0 * sqrt8 * jacDerivA[i] * jacB[i] * jacC[i];
562 ret[i] *= pow(1 -
m_eta[1][i], I - 1);
567 ret[i] *= pow(1 -
m_eta[2][i], I + J - 1);
578 ret[i] *= 0.5 * (
m_eta[0][i] + 1.0);
580 tmp[i] = 2.0 * sqrt8 * jacA[i] * jacC[i];
583 tmp[i] *= pow(1.0 -
m_eta[2][i], I + J - 1);
589 tmp2 -= I * jacB[i] * pow(1.0 -
m_eta[1][i], I - 1);
603 ret[i] += 0.5 * (1.0 +
m_eta[1][i]) * tmp[i];
608 tmp2 -= jacC[i] * (I + J) * pow(1.0 -
m_eta[2][i], I + J - 1);
612 sqrt8 * jacA[i] * jacB[i] * pow(1.0 -
m_eta[1][i], I) * tmp2;
654 for (
size_t i = 0; i <=
m_degree; ++i)
656 for (
size_t j = 0; j <=
m_degree; ++j)
658 for (
size_t k = 0; k <=
m_degree - i; ++k)
683 m_eta[0][i] = 2.0 * (1.0 +
m_xi[0][i]) / (1.0 -
m_xi[2][i]) - 1.0;
726 sqrt2 * jacA[i] * jacB[i] * jacC[i] * pow(1.0 -
m_eta[2][i], I);
774 ret[i] = sqrt2 * jacA[i] * jacDerivB[i] * jacC[i] *
775 pow(1.0 -
m_eta[2][i], I);
782 ret[i] = 2.0 * sqrt2 * jacDerivA[i] * jacB[i] * jacC[i];
786 ret[i] *= pow(1.0 -
m_eta[2][i], I - 1);
797 ret[i] *= 0.5 * (1.0 +
m_eta[0][i]);
803 tmp -= jacC[i] * I * pow(1.0 -
m_eta[2][i], I - 1);
806 ret[i] += sqrt2 * jacA[i] * jacB[i] * tmp;
836 for (
size_t j = 0; j <=
m_degree; ++j)
838 for (
size_t i = 0; i <=
m_degree; ++i)
873 ret[i] = jacobi_i[i] * jacobi_j[i];
910 ret[i] = jacobi_di[i] * jacobi_j[i];
917 ret[i] = jacobi_i[i] * jacobi_dj[i];
948 for (
size_t k = 0; k <=
m_degree; ++k)
950 for (
size_t j = 0; j <=
m_degree; ++j)
952 for (
size_t i = 0; i <=
m_degree; ++i)
989 ret[i] = jacobi_i[i] * jacobi_j[i] * jacobi_k[i];
1022 ret[i] = jacobi_di[i] * jacobi_j[i] * jacobi_k[i];
1029 ret[i] = jacobi_dj[i] * jacobi_i[i] * jacobi_k[i];
1036 ret[i] = jacobi_i[i] * jacobi_j[i] * jacobi_dk[i];
virtual NekVector< NekDouble > v_OrthoBasis(const size_t mode) override
Return the value of the modal functions for the hex element at the nodal points m_xi for a given mode...
NodalUtilHex(size_t degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s, Array< OneD, NekDouble > t)
Construct the nodal utility class for a hexahedron.
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const size_t dir, const size_t mode) override
Return the values of the derivative of the orthogonal basis at the nodal points for a given mode.
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...
SharedMatrix GetDerivMatrix(size_t dir)
Return the derivative matrix for the nodal distribution.
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.
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.
virtual NekVector< NekDouble > v_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.
size_t m_degree
Degree of the nodal element.
size_t m_numPoints
Total number of nodal points.
SharedMatrix GetVandermondeForDeriv(size_t dir)
Return the Vandermonde matrix of the derivative of the basis functions 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_OrthoBasis(const size_t mode)=0
Return the values of the orthogonal basis at the nodal points for a given mode.
virtual size_t v_NumModes()=0
Calculate the number of degrees of freedom for this element.
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_OrthoBasisDeriv(const size_t dir, const size_t mode) override
Return the value of the derivative of the modal functions for the prismatic element at the nodal poin...
NodalUtilPrism(size_t degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s, Array< OneD, NekDouble > t)
Construct the nodal utility class for a prism.
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.
virtual NekVector< NekDouble > v_OrthoBasis(const size_t mode) override
Return the value of the modal functions for the prismatic element at the nodal points m_xi for a give...
std::tuple< int, int, int > Mode
NodalUtilQuad(size_t 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 size_t mode) override
Return the value of the modal functions for the quad element at the nodal points m_xi for a given mod...
virtual NekVector< NekDouble > v_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 ...
std::tuple< int, int, int > Mode
virtual NekVector< NekDouble > v_OrthoBasis(const size_t mode) override
Return the value of the modal functions for the tetrahedral element at the nodal points m_xi for a gi...
Array< OneD, Array< OneD, NekDouble > > m_eta
Collapsed coordinates of the nodal points.
virtual NekVector< NekDouble > v_OrthoBasisDeriv(const size_t dir, const size_t mode) override
Return the value of the derivative of the modal functions for the tetrahedral element at the nodal po...
NodalUtilTetrahedron(size_t 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_OrthoBasisDeriv(const size_t dir, const size_t mode) override
Return the value of the derivative of the modal functions for the triangular element at the nodal poi...
std::vector< std::pair< int, int > > m_ordering
Mapping from the indexing of the basis to a continuous ordering.
NodalUtilTriangle(size_t degree, Array< OneD, NekDouble > r, Array< OneD, NekDouble > s)
Construct the nodal utility class for a triangle.
Array< OneD, Array< OneD, NekDouble > > m_eta
Collapsed coordinates of the nodal points.
virtual NekVector< NekDouble > v_OrthoBasis(const size_t mode) override
Return the value of the modal functions for the triangular element at the nodal points m_xi for a giv...
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)