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)
646 mode[i] = pow(
m_bdata[i],p+q-2);
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)
686 mode[q] =
Polylib::hglj(p, z[q], zp.data(), numModes, 0.0, 0.0);
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)
761 m_bdata[ 2*p *numPoints+i] = 0.;
762 m_bdata[(2*p+1)*numPoints+i] = 0.;
765 m_dbdata[(2*p+1)*numPoints+i] = 0.;
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;
std::shared_ptr< NekMatrix< NekDouble > > CalculateInterpMatrix(const BasisKey &tbasis0)
Calculate the interpolation Matrix for coefficient from one base (m_basisKey) to another (tbasis0) ...
1D Gauss-Radau-Kronrod-Legendre quadrature points, pinned at x=-1
#define ASSERTL0(condition, msg)
int GetNumPoints() const
Return the number of points from the basis specification.
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
BasisKey m_basisKey
Basis specification.
Principle Modified Functions .
const char *const BasisTypeMap[]
Principle Modified Functions .
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
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...
1D Gauss-Radau-Legendre quadrature points, pinned at x=1
int GetTotNumPoints() const
Return total number of points from the basis specification.
Array< OneD, NekDouble > m_bdata
Basis definition.
BasisType GetBasisType() const
Return type of expansion basis.
bool Collocation() const
Determine if basis has collocation properties.
Principle Modified Functions .
Lagrange Polynomials using the Gauss points .
bool operator>(const BasisKey &lhs, const BasisKey &rhs)
std::shared_ptr< Basis > BasisSharedPtr
int GetNumModes() const
Return order of basis from the basis specification.
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 A[m x n], B[n x k], C[m x k].
PointsType GetPointsType() const
Return the type of quadrature.
PointsKey GetPointsKey() const
Return distribution of points.
BasisType m_basistype
Expansion type.
1D Gauss-Kronrod-Legendre quadrature points
static bool initBasisManager[]
bool operator!=(const BasisKey &x, const BasisKey &y)
BasisType GetBasisType() const
Return the type of expansion basis.
1D Gauss-Gauss-Legendre quadrature points
bool operator==(const BasisKey &x, const BasisKey &y)
int GetTotNumModes() const
Principle Orthogonal Functions .
BasisManagerT & BasisManager(void)
std::ostream & operator<<(std::ostream &os, const BasisKey &rhs)
Array< OneD, NekDouble > m_dbdata
Derivative Basis definition.
1D Lobatto Kronrod quadrature points
bool operator()(const BasisKey &lhs, const BasisKey &rhs) const
virtual void Initialize()
int GetNumModes() const
Returns the order of the basis.
Fourier Modified expansions with just the real part of the first mode .
static std::shared_ptr< Basis > Create(const BasisKey &bkey)
Returns a new instance of a Basis with given BasisKey.
Principle Modified Functions .
void GenBasis()
Generate appropriate basis and their derivatives.
PointsSharedPtr m_points
Set of points.
int m_nummodes
Expansion order.
Principle Orthogonal Functions .
PointsManagerT & PointsManager(void)
Principle Orthogonal Functions .
Defines a specification for a set of points.
int GetTotNumPoints() const
bool ExactIprodInt() const
Determine if basis has exact integration for inner product.
bool operator<(const BasisKey &lhs, const BasisKey &rhs)
Fourier Modified expansions with just the imaginary part of the first mode .
Principle Orthogonal Functions .
Basis()
Private default constructor.
Fourier ModifiedExpansion with just the first mode .
Legendre Polynomials . Same as Ortho_A.
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 ...
bool RegisterGlobalCreator(const CreateFuncType &createFunc)
Register the Global Create Function. The return value is just to facilitate calling statically...
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs
NekManager< BasisKey, NekMatrix< NekDouble >, BasisKey::opLess > m_InterpManager
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Describes the specification for a Basis.
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, .
1D Gauss-Lobatto-Legendre quadrature points
1D Gauss-Radau-Legendre quadrature points, pinned at x=-1