41 #include <boost/math/special_functions/gamma.hpp>
45 namespace LibUtilities
56 if (lhsPointsKey < rhsPointsKey)
60 if (lhsPointsKey != rhsPointsKey)
106 std::shared_ptr<Basis> returnval(
new Basis(bkey));
107 returnval->Initialize();
229 D = &(
m_points->GetD()->GetPtr())[0];
245 for (
p=0;
p<numModes; ++
p, mode += numPoints)
249 scal =
sqrt(0.5*(2.0*
p+1.0));
250 for(i = 0; i < numPoints; ++i)
256 Blas::Dgemm(
'n',
'n',numPoints,numModes,numPoints,1.0,D,numPoints,
274 for(
int p = 0;
p < numModes; ++
p )
276 for(
int q = 0; q < numModes -
p; ++q, mode += numPoints )
279 for(
int j = 0; j < numPoints; ++j )
281 mode[j] *=
sqrt(
p+q+1.0)*pow(0.5*(1.0 - z[j]),
p);
287 Blas::Dgemm(
'n',
'n',numPoints,numModes*(numModes+1)/2,numPoints,1.0,D,numPoints,
304 int P = numModes - 1, Q = numModes - 1, R = numModes - 1;
307 for(
int p = 0;
p <=
P; ++
p )
309 for(
int q = 0; q <= Q -
p; ++q )
311 for(
int r = 0; r <= R -
p - q; ++r, mode += numPoints )
314 for(
int k = 0; k < numPoints; ++k )
317 mode[k] *= pow(0.5*(1.0 - z[k]),
p+q);
320 mode[k] *=
sqrt(r+
p+q+1.5);
327 Blas::Dgemm(
'n',
'n',numPoints,numModes*(numModes+1)*
328 (numModes+2)/6,numPoints,1.0, D, numPoints,
354 int P = numModes - 1, Q = numModes - 1, R = numModes - 1;
357 for(
int p = 0;
p <=
P; ++
p )
359 for(
int q = 0; q <= Q; ++q )
361 for(
int r = 0; r <= R - std::max(
p,q); ++r, mode += numPoints )
370 int pq = std::max(
p + q,0);
373 for(
int k = 0; k < numPoints; ++k )
376 mode[k] *= pow(0.5*(1.0 - z[k]), pq);
379 mode[k] *=
sqrt(r+pq+1.5);
386 Blas::Dgemm(
'n',
'n',numPoints,numModes*(numModes+1)*
387 (numModes+2)/6,numPoints,1.0, D, numPoints,
399 for(i = 0; i < numPoints; ++i)
402 m_bdata[numPoints + i] = 0.5*(1+z[i]);
405 mode =
m_bdata.data() + 2*numPoints;
407 for(
p = 2;
p < numModes; ++
p, mode += numPoints)
411 for(i = 0; i < numPoints; ++i)
418 Blas::Dgemm(
'n',
'n',numPoints,numModes,numPoints,1.0,D,
445 for(i = 0; i < numPoints; ++i)
447 m_bdata[0*numPoints + i] = 0.5*(1-z[i]);
448 m_bdata[1*numPoints + i] = 0.5*(1+z[i]);
451 mode =
m_bdata.data() + 2*numPoints;
453 for(q = 2; q < numModes; ++q, mode+=numPoints)
457 for(i = 0; i < numPoints; ++i)
464 for(i = 0; i < numPoints; ++i)
466 mode[i] = 0.5*(1-z[i]);
471 for(q = 2; q < numModes; ++q, mode+=numPoints)
475 for(i = 0; i < numPoints; ++i)
483 one_p_z =
m_bdata.data()+numPoints;
485 for(
p = 2;
p < numModes; ++
p)
487 for(i = 0; i < numPoints; ++i)
489 mode[i] =
m_bdata[i]*one_m_z_pow[i];
495 for(q = 1; q < numModes-
p; ++q, mode+=numPoints)
499 for(i = 0; i < numPoints; ++i)
501 mode[i] *= one_m_z_pow[i]*one_p_z[i];
506 Blas::Dgemm(
'n',
'n',numPoints,numModes*(numModes+1)/2,
507 numPoints,1.0,D,numPoints,
552 for(
p = 0;
p < numModes; ++
p)
554 N = numPoints*(numModes-
p)*(numModes-
p+1)/2;
556 B_offset += numPoints*(numModes-
p);
562 numModes*(numModes+1)*(numModes+2)/6,
563 numPoints,1.0,D,numPoints,
603 N = numPoints*(numModes)*(numModes+1)/2;
607 B_offset += numPoints*(numModes);
609 N = numPoints*(numModes-1);
614 N = numPoints*(numModes-1)*(numModes)/2;
618 B_offset += numPoints*(numModes-1);
623 mode =
m_bdata.data() + offset;
625 for(
p = 2;
p < numModes; ++
p)
628 N = numPoints*(numModes-
p);
635 one_p_z =
m_bdata.data()+numPoints;
637 for(q = 2; q < numModes; ++q)
640 for(i = 0; i < numPoints; ++i)
653 for(
int r = 1; r < numModes-std::max(
p,q); ++r)
657 for(i = 0; i < numPoints; ++i)
659 mode[i] *= one_m_z_pow[i]*one_p_z[i];
669 numModes*(numModes+1)*(2*numModes+1)/6,
670 numPoints,1.0,D,numPoints,
682 for (
p=0;
p<numModes; ++
p, mode += numPoints)
684 for(q = 0; q < numPoints; ++q)
691 Blas::Dgemm(
'n',
'n', numPoints, numModes, numPoints, 1.0,
692 D, numPoints,
m_bdata.data(), numPoints, 0.0,
703 for (
p=0;
p<numModes; ++
p,mode += numPoints)
705 for(q = 0; q < numPoints; ++q)
707 mode[q] =
Polylib::hgj(
p, z[q], zp.data(), numModes, 0.0, 0.0);
712 Blas::Dgemm(
'n',
'n', numPoints, numModes, numPoints, 1.0,
713 D, numPoints,
m_bdata.data(), numPoints, 0.0,
720 ASSERTL0(numModes%2==0,
"Fourier modes should be a factor of 2");
722 for(i = 0; i < numPoints; ++i)
730 for (
p=1;
p < numModes/2; ++
p)
732 for(i = 0; i < numPoints; ++i)
734 m_bdata[ 2*
p *numPoints+i] = cos(
p*M_PI* (z[i]+1) );
735 m_bdata[(2*
p+1)*numPoints+i] = -sin(
p*M_PI* (z[i]+1) );
737 m_dbdata[ 2*
p *numPoints+i] = -
p*M_PI*sin(
p*M_PI* (z[i]+1) );
738 m_dbdata[(2*
p+1)*numPoints+i] = -
p*M_PI*cos(
p*M_PI* (z[i]+1) );
748 for(i = 0; i < numPoints; ++i)
750 m_bdata[i] = cos(M_PI* (z[i]+1) );
751 m_bdata[numPoints+i] = -sin(M_PI* (z[i]+1) );
753 m_dbdata[i] = -M_PI*sin(M_PI* (z[i]+1) );
754 m_dbdata[numPoints+i] = -M_PI*cos(M_PI* (z[i]+1) );
757 for (
p=1;
p < numModes/2; ++
p)
759 for(i = 0; i < numPoints; ++i)
786 for (
p=0,scal = 1;
p<numModes; ++
p,mode += numPoints)
790 for(i = 0; i < numPoints; ++i)
795 scal *= 4*(
p+1)*(
p+1)/(2*
p+2)/(2*
p+1);
799 Blas::Dgemm(
'n',
'n', numPoints, numModes, numPoints, 1.0,
800 D, numPoints,
m_bdata.data(), numPoints, 0.0,
807 int P = numModes - 1;
810 for(
int p = 0;
p <=
P; ++
p, mode += numPoints )
812 for(
int i = 0; i < numPoints; ++i )
814 mode[i] = pow(z[i],
p);
819 Blas::Dgemm(
'n',
'n', numPoints, numModes, numPoints, 1.0,
820 D, numPoints,
m_bdata.data(), numPoints, 0.0,
826 "not implemented at this time.");
835 bool returnval =
false;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
int GetNumModes() const
Return order of basis from the basis specification.
Array< OneD, NekDouble > m_dbdata
Derivative Basis definition.
static std::shared_ptr< Basis > Create(const BasisKey &bkey)
Returns a new instance of a Basis with given BasisKey.
PointsSharedPtr m_points
Set of points.
int GetTotNumPoints() const
Return total number of points from the basis specification.
BasisKey m_basisKey
Basis specification.
static bool initBasisManager[]
Basis()
Private default constructor.
BasisType GetBasisType() const
Return the type of expansion basis.
int GetNumPoints() const
Return the number of points from the basis specification.
std::shared_ptr< NekMatrix< NekDouble > > CalculateInterpMatrix(const BasisKey &tbasis0)
Calculate the interpolation Matrix for coefficient from one base (m_basisKey) to another (tbasis0)
NekManager< BasisKey, NekMatrix< NekDouble >, BasisKey::opLess > m_InterpManager
virtual void Initialize()
void GenBasis()
Generate appropriate basis and their derivatives.
Array< OneD, NekDouble > m_bdata
Basis definition.
Describes the specification for a Basis.
unsigned int m_nummodes
Expansion order.
int GetNumPoints() const
Return points order at which basis is defined.
BasisType GetBasisType() const
Return type of expansion basis.
PointsKey GetPointsKey() const
Return distribution of points.
int GetTotNumPoints() const
int GetTotNumModes() const
int GetNumModes() const
Returns the order of the basis.
PointsType GetPointsType() const
Return type of quadrature.
BasisType m_basistype
Expansion type.
bool Collocation() const
Determine if basis has collocation properties.
bool ExactIprodInt() const
Determine if basis has exact integration for inner product.
bool RegisterGlobalCreator(const CreateFuncType &createFunc)
Register the Global Create Function. The return value is just to facilitate calling statically.
Defines a specification for a set of points.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
BasisManagerT & BasisManager(void)
bool operator==(const BasisKey &x, const BasisKey &y)
std::shared_ptr< Basis > BasisSharedPtr
const char *const BasisTypeMap[]
PointsManagerT & PointsManager(void)
bool operator<(const BasisKey &lhs, const BasisKey &rhs)
bool operator>(const BasisKey &lhs, const BasisKey &rhs)
bool operator!=(const BasisKey &x, const BasisKey &y)
std::ostream & operator<<(std::ostream &os, const BasisKey &rhs)
@ eGaussRadauMLegendre
1D Gauss-Radau-Legendre quadrature points, pinned at x=-1
@ eGaussKronrodLegendre
1D Gauss-Kronrod-Legendre quadrature points
@ eGaussRadauKronrodMLegendre
1D Gauss-Radau-Kronrod-Legendre quadrature points, pinned at x=-1
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussLobattoKronrodLegendre
1D Lobatto Kronrod quadrature points
@ eGaussGaussLegendre
1D Gauss-Gauss-Legendre quadrature points
@ eGaussRadauPLegendre
1D Gauss-Radau-Legendre quadrature points, pinned at x=1
@ eModified_B
Principle Modified Functions .
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points .
@ eOrtho_A
Principle Orthogonal Functions .
@ eModified_C
Principle Modified Functions .
@ eMonomial
Monomial polynomials .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eFourierSingleMode
Fourier ModifiedExpansion with just the first mode .
@ eChebyshev
Chebyshev Polynomials .
@ eLegendre
Legendre Polynomials . Same as Ortho_A.
@ eOrtho_C
Principle Orthogonal Functions .
@ eModifiedPyr_C
Principle Modified Functions .
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
@ eFourierHalfModeIm
Fourier Modified expansions with just the imaginary part of the first mode
@ eFourierHalfModeRe
Fourier Modified expansions with just the real part of the first mode
@ eOrthoPyr_C
Principle Orthogonal Functions .
@ eFourier
Fourier Expansion .
The above copyright notice and this permission notice shall be included.
double hgj(const int i, const double z, const double *zgj, const int np, const double alpha, const double beta)
Compute the value of the i th Lagrangian interpolant through the np Gauss-Jacobi points zgj at the ar...
double hglj(const int i, const double z, const double *zglj, const int np, const double alpha, const double beta)
Compute the value of the i th Lagrangian interpolant through the np Gauss-Lobatto-Jacobi points zgrj ...
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, .
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)
bool operator()(const BasisKey &lhs, const BasisKey &rhs) const