Intrepid2
Classes | Functions
Intrepid2_Basis.hpp File Reference

Header file for the abstract base class Intrepid2::Basis. More...

#include "Intrepid2_ConfigDefs.hpp"
#include "Intrepid2_Types.hpp"
#include "Intrepid2_Utils.hpp"
#include "Intrepid2_CellTopologyTags.hpp"
#include "Shards_CellTopology.hpp"
#include <Intrepid2_BasisDef.hpp>

Go to the source code of this file.

Classes

class  Intrepid2::Basis< ExecSpaceType, outputValueType, pointValueType >
 An abstract base class that defines interface for concrete basis implementations for Finite Element (FEM) and Finite Volume/Finite Difference (FVD) discrete spaces. More...
 

Functions

KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getFieldRank (const EFunctionSpace spaceType)
 Returns the rank of fields in a function space of the specified type. More...
 
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getOperatorRank (const EFunctionSpace spaceType, const EOperator operatorType, const ordinal_type spaceDim)
 Returns rank of an operator. More...
 
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getOperatorOrder (const EOperator operatorType)
 Returns order of an operator. More...
 
template<EOperator operatorType>
KOKKOS_INLINE_FUNCTION constexpr ordinal_type Intrepid2::getOperatorOrder ()
 
template<ordinal_type spaceDim>
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getDkEnumeration (const ordinal_type xMult, const ordinal_type yMult=-1, const ordinal_type zMult=-1)
 Returns the ordinal of a partial derivative of order k based on the multiplicities of the partials dx, dy, and dz. More...
 
template<ordinal_type spaceDim>
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getPnEnumeration (const ordinal_type p, const ordinal_type q=0, const ordinal_type r=0)
 Returns the index of the term x^p y^q z^r of a polynomial of degree n (p+q+r <= n). In 2D, the terms of a polynomial of degree 2 are ordered as 1, x, y, x^2, xy, y^2. So if p=q=1, the term x^p y^q has index 4 (counting from 0), while p=2, q=0 has index 3. Enumeration goes from 0 to ( (n+spaceDim) choose (spaceDim) )-1. More...
 
template<typename value_type >
KOKKOS_INLINE_FUNCTION void Intrepid2::getJacobyRecurrenceCoeffs (value_type &an, value_type &bn, value_type &cn, const ordinal_type alpha, const ordinal_type beta, const ordinal_type n)
 function for computing the Jacobi recurrence coefficients so that More...
 
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getDkCardinality (const EOperator operatorType, const ordinal_type spaceDim)
 Returns multiplicities of dx, dy, and dz based on the enumeration of the partial derivative, its order and the space dimension. Inverse of the getDkEnumeration() method. More...
 
template<EOperator operatorType, ordinal_type spaceDim>
KOKKOS_INLINE_FUNCTION constexpr ordinal_type Intrepid2::getDkCardinality ()
 
template<ordinal_type spaceDim>
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getPnCardinality (ordinal_type n)
 Returns cardinality of Polynomials of order n (P^n). More...
 
template<ordinal_type spaceDim, ordinal_type n>
KOKKOS_INLINE_FUNCTION constexpr ordinal_type Intrepid2::getPnCardinality ()
 
template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HGRAD_Args (const outputValueViewType outputValues, const inputPointViewType inputPoints, const EOperator operatorType, const shards::CellTopology cellTopo, const ordinal_type basisCard)
 Runtime check of the arguments for the getValues method in an HGRAD-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType. More...
 
template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HCURL_Args (const outputValueViewType outputValues, const inputPointViewType inputPoints, const EOperator operatorType, const shards::CellTopology cellTopo, const ordinal_type basisCard)
 Runtime check of the arguments for the getValues method in an HCURL-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType. More...
 
template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HDIV_Args (const outputValueViewType outputValues, const inputPointViewType inputPoints, const EOperator operatorType, const shards::CellTopology cellTopo, const ordinal_type basisCard)
 Runtime check of the arguments for the getValues method in an HDIV-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType. More...
 
template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HVOL_Args (const outputValueViewType outputValues, const inputPointViewType inputPoints, const EOperator operatorType, const shards::CellTopology cellTopo, const ordinal_type basisCard)
 Runtime check of the arguments for the getValues method in an HVOL-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType. More...
 

Detailed Description

Header file for the abstract base class Intrepid2::Basis.

Author
Created by P. Bochev and D. Ridzal. Kokkorized by Kyungjoo Kim

Definition in file Intrepid2_Basis.hpp.

Function Documentation

◆ getDkCardinality()

KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getDkCardinality ( const EOperator  operatorType,
const ordinal_type  spaceDim 
)

Returns multiplicities of dx, dy, and dz based on the enumeration of the partial derivative, its order and the space dimension. Inverse of the getDkEnumeration() method.

Parameters
partialMult[out] - array with the multiplicities f dx, dy and dz
derivativeEnum[in] - enumeration of the partial derivative
operatorType[in] - k-th partial derivative Dk
spaceDim[in] - space dimensionReturns cardinality of Dk, i.e., the number of all derivatives of order k.

The set of all partial derivatives of order k is isomorphic to the set of all multisets of cardinality k with elements taken from the sets {x}, {x,y}, and {x,y,z} in 1D, 2D, and 3D respectively. For example, the partial derivative $\displaystyle D\{1,2,1\}f = \frac{d^4 f}{dx dy^2 dz}$ maps to the multiset $\{x, y, z\}$ with multiplicities $\{1,2,1\}$. The number of all such multisets is given by the binomial coefficient

\[ \begin{pmatrix} spaceDim + k - 1 \\ spaceDim - 1 \end{pmatrix} \]

Therefore:

  • in 1D: cardinality = 1
  • in 2D: cardinality = k + 1
  • in 3D: cardinality = (k + 1)*(k + 2)/2
Parameters
operatorType[in] - k-th derivative operator Dk
spaceDim[in] - space dimension
Returns
the number of all partial derivatives of order k

Definition at line 410 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getDkCardinality().

Referenced by Intrepid2::getDkCardinality().

◆ getDkEnumeration()

template<ordinal_type spaceDim>
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getDkEnumeration ( const ordinal_type  xMult,
const ordinal_type  yMult = -1,
const ordinal_type  zMult = -1 
)

Returns the ordinal of a partial derivative of order k based on the multiplicities of the partials dx, dy, and dz.

By default, any implementation of Intrepid2::Basis method returns partials of order k (specified by OPERATOR_Dk) as a multiset ordered by the lexicographical order of the partial derivatives multiplicities. For example, the 10 derivatives of order 3 in 3D are enumerated as:

D3={(3,0,0),(2,1,0),(2,0,1),(1,2,0),(1,1,1),(1,0,2),(0,3,0),(0,2,1),(0,1,2),(0,0,3)}

The enumeration formula for this lexicographical order is

$i() = 0$ in 1D (only 1 derivative)
$i(yMult) =yMult$ in 2D
$i(yMult,zMult)=zMult+\sum_{r = 0}^{k-xMult} r$ in 3D

where the order k of Dk is defined by xMult + yMult + zMult. However, xMult is not really needed needed. Enumeration goes from 0 to ( (k+spaceDim-1) choose (spaceDim-1) )-1.

Parameters
yMult[in] - multiplicity of dy (default = -1)
zMult[in] - multiplicity of dz (default = -1)
Returns
the ordinal of partial derivative of order k as function of dx, dy, dz multiplicities

Definition at line 240 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getDkEnumeration().

Referenced by Intrepid2::getDkEnumeration().

◆ getFieldRank()

KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getFieldRank ( const EFunctionSpace  spaceType)

Returns the rank of fields in a function space of the specified type.

Field rank is defined as the number of indices needed to specify function value and equals 0, 1,or 2 for scalars, vectors and tensors, respectively. The scalar field spaces in Intrepid are FUNCTION_SPACE_HGRAD and FUNCTION_SPACE_HVOL. The vector field spaces are FUNCTION_SPACE_HCURL, FUNCTION_SPACE_HDIV and FUNCTION_SPACE_VECTOR_HGRAD. FUNCTION_SPACE_TENSOR_HGRAD contains rank-2 tensors.

Parameters
spaceType[in] - function space type
Returns
rank of the fields in the specified function space

Definition at line 67 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getFieldRank().

Referenced by Intrepid2::getFieldRank(), and Intrepid2::getOperatorRank().

◆ getJacobyRecurrenceCoeffs()

template<typename value_type >
KOKKOS_INLINE_FUNCTION void Intrepid2::getJacobyRecurrenceCoeffs ( value_type &  an,
value_type &  bn,
value_type &  cn,
const ordinal_type  alpha,
const ordinal_type  beta,
const ordinal_type  n 
)

function for computing the Jacobi recurrence coefficients so that

Parameters
an[out] - the a weight for recurrence
bn[out] - the b weight for recurrence
cn[out] - the c weight for recurrence
alpha[in] - the first Jacobi weight
beta[in] - the second Jacobi weight
n[n] - the polynomial degree

The recurrence is

\[ P^{\alpha,\beta}_{n+1} = \left( a_n + b_n x\right) P^{\alpha,\beta}_n - c_n P^{\alpha,\beta}_{n-1} \]

, where

\[ P^{\alpha,\beta}_0 = 1 \]

Definition at line 284 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getJacobyRecurrenceCoeffs().

Referenced by Intrepid2::getJacobyRecurrenceCoeffs().

◆ getOperatorOrder()

KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getOperatorOrder ( const EOperator  operatorType)

Returns order of an operator.

Parameters
operatorType[in] - type of the operator whose order we want to know
Returns
result ranges from 0 (for OPERATOR_VALUE) to 10 (OPERATOR_D10)

Definition at line 194 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getOperatorOrder().

Referenced by Intrepid2::getOperatorOrder().

◆ getOperatorRank()

KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getOperatorRank ( const EFunctionSpace  spaceType,
const EOperator  operatorType,
const ordinal_type  spaceDim 
)

Returns rank of an operator.

When an operator acts on a field of a certain rank, the result can be a field with the same or a different rank. Operator rank is defined the difference between the ranks of the output field and the input field:

Rank(OPERATOR) = Rank(OPERATOR(FIELD)) - Rank(FIELD)

Therefore, operator rank allows us to figure out the rank of the result:

Rank(OPERATOR(FIELD)) = Rank(FIELD) + Rank(OPERATOR)

and provides means to size properly arrays for output results. The following table summarizes operator ranks (~ denotes undefined, below slash means 3D). By default, in 1D any operator other than VALUE has rank 1, i.e., GRAD, CURL and DIV reduce to d/dx and Dk are the higher-order derivatives d^k/dx^k. Only scalar functions are allowed in 1D.

|========|======|============================|=========|==========|==========|==========|
| field  | rank |  FUNCTION_SPACE_[type]     |  VALUE  | GRAD, Dk |   CURL   |    DIV   |
|--------|------|----------------------------|---------|----------|----------|----------|
| scalar |   0  |  HGRAD, HVOL               |    0    |     1    | 3-dim/~  |     ~    |
| vector |   1  |  HCURL, HDIV, VECTOR_HGRAD |    0    |     1    | dim - 3  |    -1    |
| tensor |   2  |  TENSOR_HGRAD              |    0    |     1    | dim - 3  |    -1    |
|--------|------|----------------------------|---------|----------|----------|----------|
|   1D   |   0  |  HGRAD, HVOL only          |    0    |     1    |     1    |     1    |
|=======================================================================================|
Parameters
spaceType[in] - function space type
operatorType[in] - the operator acting on the specified function space
spaceDim[in] - spatial dimension
Returns
rank of the operator as defined in the table

Definition at line 96 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getFieldRank(), and Intrepid2::getOperatorRank().

Referenced by Intrepid2::getOperatorRank().

◆ getPnCardinality()

template<ordinal_type spaceDim>
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getPnCardinality ( ordinal_type  n)

Returns cardinality of Polynomials of order n (P^n).

  • in 1D: cardinality = n+1
  • in 2D: cardinality = (n+1)*(n+2)/2
  • in 3D: cardinality = (n+1)*(n+2)*(n+3)/6
Parameters
n[in] - polynomial order
Returns
dimension of polynomial space

Definition at line 449 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getPnCardinality().

Referenced by Intrepid2::getPnCardinality().

◆ getPnEnumeration()

template<ordinal_type spaceDim>
KOKKOS_INLINE_FUNCTION ordinal_type Intrepid2::getPnEnumeration ( const ordinal_type  p,
const ordinal_type  q = 0,
const ordinal_type  r = 0 
)

Returns the index of the term x^p y^q z^r of a polynomial of degree n (p+q+r <= n). In 2D, the terms of a polynomial of degree 2 are ordered as 1, x, y, x^2, xy, y^2. So if p=q=1, the term x^p y^q has index 4 (counting from 0), while p=2, q=0 has index 3. Enumeration goes from 0 to ( (n+spaceDim) choose (spaceDim) )-1.

Parameters
p[in] - exponent of x in the polynomial term x^p y^q z^r
q[in] - exponent of y in the polynomial term x^p y^q z^r (default = 0)
r[in] - exponent of z in the polynomial term x^p y^q z^r (default = 0)
Returns
the index of the term x^p y^q z^r of a polynomial of degree k (p+q+r <= n)

Definition at line 273 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getPnEnumeration().

Referenced by Intrepid2::getPnEnumeration().

◆ getValues_HCURL_Args()

template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HCURL_Args ( const outputValueViewType  outputValues,
const inputPointViewType  inputPoints,
const EOperator  operatorType,
const shards::CellTopology  cellTopo,
const ordinal_type  basisCard 
)

Runtime check of the arguments for the getValues method in an HCURL-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType.

Parameters
outputValues[in] - array of variable rank for the output basis values
inputPoints[in] - rank-2 array with dimensions (P,D) containing the points
operatorType[in] - operator applied to basis functions
cellTopo[in] - base cell topology on which the basis is defined
basisCard[in] - cardinality of the basis

Definition at line 603 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getValues_HCURL_Args().

Referenced by Intrepid2::getValues_HCURL_Args().

◆ getValues_HDIV_Args()

template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HDIV_Args ( const outputValueViewType  outputValues,
const inputPointViewType  inputPoints,
const EOperator  operatorType,
const shards::CellTopology  cellTopo,
const ordinal_type  basisCard 
)

Runtime check of the arguments for the getValues method in an HDIV-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType.

Parameters
outputValues[in] - array of variable rank for the output basis values
inputPoints[in] - rank-2 array with dimensions (P,D) containing the points
operatorType[in] - operator applied to basis functions
cellTopo[in] - base cell topology on which the basis is defined
basisCard[in] - cardinality of the basis

Definition at line 688 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getValues_HDIV_Args().

Referenced by Intrepid2::getValues_HDIV_Args().

◆ getValues_HGRAD_Args()

template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HGRAD_Args ( const outputValueViewType  outputValues,
const inputPointViewType  inputPoints,
const EOperator  operatorType,
const shards::CellTopology  cellTopo,
const ordinal_type  basisCard 
)

Runtime check of the arguments for the getValues method in an HGRAD-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType.

Parameters
outputValues[in] - array of variable rank for the output basis values
inputPoints[in] - rank-2 array with dimensions (P,D) containing the points
operatorType[in] - operator applied to basis functions
cellTopo[in] - base cell topology on which the basis is defined
basisCard[in] - cardinality of the basis

Definition at line 484 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getValues_HGRAD_Args().

Referenced by Intrepid2::getValues_HGRAD_Args().

◆ getValues_HVOL_Args()

template<typename outputValueViewType , typename inputPointViewType >
void Intrepid2::getValues_HVOL_Args ( const outputValueViewType  outputValues,
const inputPointViewType  inputPoints,
const EOperator  operatorType,
const shards::CellTopology  cellTopo,
const ordinal_type  basisCard 
)

Runtime check of the arguments for the getValues method in an HVOL-conforming FEM basis. Verifies that ranks and dimensions of ViewType input and output arrays are consistent with the specified operatorType.

Parameters
outputValues[in] - array of variable rank for the output basis values
inputPoints[in] - rank-2 array with dimensions (P,D) containing the points
operatorType[in] - operator applied to basis functions
cellTopo[in] - base cell topology on which the basis is defined
basisCard[in] - cardinality of the basis

Definition at line 749 of file Intrepid2_BasisDef.hpp.

References Intrepid2::getValues_HVOL_Args().

Referenced by Intrepid2::getValues_HVOL_Args().