50#ifndef __INTREPID2_BASIS_HPP__
51#define __INTREPID2_BASIS_HPP__
53#include "Intrepid2_ConfigDefs.hpp"
60#include "Kokkos_Vector.hpp"
61#include "Shards_CellTopology.hpp"
62#include <Teuchos_RCPDecl.hpp>
68template<
typename DeviceType = void,
69 typename OutputType = double,
70 typename PointType =
double>
75template <
typename DeviceType =
void,
typename OutputType =
double,
typename Po
intType =
double>
76using BasisPtr = Teuchos::RCP<Basis<DeviceType,OutputType,PointType> >;
80template <
typename OutputType =
double,
typename Po
intType =
double>
119 template<
typename Device,
120 typename outputValueType,
121 typename pointValueType>
190 typedef typename ScalarTraits<pointValueType>::scalar_type
scalarType;
263 template<
typename OrdinalTypeView3D,
264 typename OrdinalTypeView2D,
265 typename OrdinalTypeView1D>
267 OrdinalTypeView2D &ordinalToTag,
268 const OrdinalTypeView1D tags,
269 const ordinal_type basisCard,
270 const ordinal_type tagSize,
271 const ordinal_type posScDim,
272 const ordinal_type posScOrd,
273 const ordinal_type posDfOrd ) {
275 ordinalToTag = OrdinalTypeView2D(
"ordinalToTag", basisCard, tagSize);
278 Kokkos::deep_copy( ordinalToTag, -1 );
281 for (ordinal_type i=0;i<basisCard;++i)
282 for (ordinal_type j=0;j<tagSize;++j)
283 ordinalToTag(i, j) = tags(i*tagSize + j);
287 for (ordinal_type i=0;i<basisCard;++i)
288 if (maxScDim < tags(i*tagSize + posScDim))
289 maxScDim = tags(i*tagSize + posScDim);
293 for (ordinal_type i=0;i<basisCard;++i)
294 if (maxScOrd < tags(i*tagSize + posScOrd))
295 maxScOrd = tags(i*tagSize + posScOrd);
299 for (ordinal_type i=0;i<basisCard;++i)
300 if (maxDfOrd < tags(i*tagSize + posDfOrd))
301 maxDfOrd = tags(i*tagSize + posDfOrd);
305 tagToOrdinal = OrdinalTypeView3D(
"tagToOrdinal", maxScDim, maxScOrd, maxDfOrd);
308 Kokkos::deep_copy( tagToOrdinal, -1 );
311 for (ordinal_type i=0;i<basisCard;++i)
312 tagToOrdinal(tags(i*tagSize), tags(i*tagSize+1), tags(i*tagSize+2)) = i;
354 virtual~Basis() =
default;
367 using OutputViewType = Kokkos::DynRankView<OutputValueType,Kokkos::LayoutStride,DeviceType>;
371 using PointViewType = Kokkos::DynRankView<PointValueType,Kokkos::LayoutStride,DeviceType>;
375 using ScalarViewType = Kokkos::DynRankView<scalarType,Kokkos::LayoutStride,DeviceType>;
381 Kokkos::DynRankView<OutputValueType,DeviceType>
allocateOutputView(
const int numPoints,
const EOperator operatorType = OPERATOR_VALUE)
const;
390 const bool operatorIsDk = (operatorType >= OPERATOR_D1) && (operatorType <= OPERATOR_D10);
391 const bool operatorSupported = (operatorType == OPERATOR_VALUE) || (operatorType == OPERATOR_GRAD) || (operatorType == OPERATOR_CURL) || (operatorType == OPERATOR_DIV) || operatorIsDk;
392 INTREPID2_TEST_FOR_EXCEPTION(!operatorSupported, std::invalid_argument,
"operator is not supported by allocateBasisValues");
401 bool useVectorData = (dataView.rank() == 3);
437 const EOperator = OPERATOR_VALUE )
const {
438 INTREPID2_TEST_FOR_EXCEPTION(
true, std::logic_error,
439 ">>> ERROR (Basis::getValues): this method (FEM) is not supported or should be overridden accordingly by derived classes.");
457 const EOperator operatorType = OPERATOR_VALUE )
const {
463 if (outputValues.numTensorDataFamilies() > 0)
465 INTREPID2_TEST_FOR_EXCEPTION(outputValues.
tensorData(0).
numTensorComponents() != 1, std::invalid_argument,
"default implementation of getValues() only supports outputValues with trivial tensor-product structure");
470 INTREPID2_TEST_FOR_EXCEPTION(outputValues.
vectorData().
numComponents() != 1, std::invalid_argument,
"default implementation of getValues() only supports outputValues with trivial tensor-product structure");
471 INTREPID2_TEST_FOR_EXCEPTION(outputValues.
vectorData().
getComponent(0).numTensorComponents() != 1, std::invalid_argument,
"default implementation of getValues() only supports outputValues with trivial tensor-product structure");
502 const EOperator = OPERATOR_VALUE )
const {
503 INTREPID2_TEST_FOR_EXCEPTION(
true, std::logic_error,
504 ">>> ERROR (Basis::getValues): this method (FVM) is not supported or should be overridden accordingly by derived classes.");
514 INTREPID2_TEST_FOR_EXCEPTION(
true, std::logic_error,
515 ">>> ERROR (Basis::getDofCoords): this method is not supported or should be overridden accordingly by derived classes.");
529 INTREPID2_TEST_FOR_EXCEPTION(
true, std::logic_error,
530 ">>> ERROR (Basis::getDofCoeffs): this method is not supported or should be overridden accordingly by derived classes.");
542 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
543 ">>> ERROR (Basis::getFieldOrdinalsForDegree): this method is not supported for non-hierarchical bases.");
545 int requestedDegreeLength = degrees.extent_int(0);
546 INTREPID2_TEST_FOR_EXCEPTION(degreeEntryLength != requestedDegreeLength, std::invalid_argument,
"length of degrees does not match the entries in fieldOrdinalPolynomialDegree_");
547 std::vector<int> fieldOrdinalsVector;
551 for (
int d=0; d<degreeEntryLength; d++)
555 if (matches) fieldOrdinalsVector.push_back(basisOrdinal);
558 for (
unsigned i=0; i<fieldOrdinalsVector.size(); i++)
560 fieldOrdinals(i) = fieldOrdinalsVector[i];
562 return fieldOrdinals;
574 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
575 ">>> ERROR (Basis::getFieldOrdinalsForDegree): this method is not supported for non-hierarchical bases.");
577 int requestedDegreeLength = degrees.extent_int(0);
578 INTREPID2_TEST_FOR_EXCEPTION(degreeEntryLength != requestedDegreeLength, std::invalid_argument,
"length of degrees does not match the entries in fieldOrdinalPolynomialDegree_");
579 std::vector<int> fieldOrdinalsVector;
583 for (
int d=0; d<degreeEntryLength; d++)
587 if (matches) fieldOrdinalsVector.push_back(basisOrdinal);
590 for (
unsigned i=0; i<fieldOrdinalsVector.size(); i++)
592 fieldOrdinals(i) = fieldOrdinalsVector[i];
594 return fieldOrdinals;
610 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
611 ">>> ERROR (Basis::getFieldOrdinalsForDegree): this method is not supported for non-hierarchical bases.");
613 for (
unsigned d=0; d<degrees.size(); d++)
615 degreesView(d) = degrees[d];
618 std::vector<int> fieldOrdinalsVector(fieldOrdinalsView.extent_int(0));
619 for (
int i=0; i<fieldOrdinalsView.extent_int(0); i++)
621 fieldOrdinalsVector[i] = fieldOrdinalsView(i);
623 return fieldOrdinalsVector;
638 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
639 ">>> ERROR (Basis::getFieldOrdinalsForDegree): this method is not supported for non-hierarchical bases.");
641 for (
unsigned d=0; d<degrees.size(); d++)
643 degreesView(d) = degrees[d];
646 std::vector<int> fieldOrdinalsVector(fieldOrdinalsView.extent_int(0));
647 for (
int i=0; i<fieldOrdinalsView.extent_int(0); i++)
649 fieldOrdinalsVector[i] = fieldOrdinalsView(i);
651 return fieldOrdinalsVector;
662 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
663 ">>> ERROR (Basis::getPolynomialDegreeOfField): this method is not supported for non-hierarchical bases.");
664 INTREPID2_TEST_FOR_EXCEPTION(fieldOrdinal < 0, std::invalid_argument,
"field ordinal must be non-negative");
665 INTREPID2_TEST_FOR_EXCEPTION(fieldOrdinal >=
fieldOrdinalPolynomialDegree_.extent_int(0), std::invalid_argument,
"field ordinal out of bounds");
669 for (
int d=0; d<polyDegreeLength; d++)
684 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
685 ">>> ERROR (Basis::getPolynomialDegreeOfField): this method is not supported for non-hierarchical bases.");
686 INTREPID2_TEST_FOR_EXCEPTION(fieldOrdinal < 0, std::invalid_argument,
"field ordinal must be non-negative");
691 for (
int d=0; d<polyDegreeLength; d++)
707 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
708 ">>> ERROR (Basis::getPolynomialDegreeOfFieldAsVector): this method is not supported for non-hierarchical bases.");
710 std::vector<int> polynomialDegree(polynomialDegreeView.extent_int(0));
712 for (
unsigned d=0; d<polynomialDegree.size(); d++)
714 polynomialDegree[d] = polynomialDegreeView(d);
716 return polynomialDegree;
728 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
729 ">>> ERROR (Basis::getPolynomialDegreeOfFieldAsVector): this method is not supported for non-hierarchical bases.");
731 std::vector<int> polynomialDegree(polynomialDegreeView.extent_int(0));
733 for (
unsigned d=0; d<polynomialDegree.size(); d++)
735 polynomialDegree[d] = polynomialDegreeView(d);
737 return polynomialDegree;
744 INTREPID2_TEST_FOR_EXCEPTION(
basisType_ != BASIS_FEM_HIERARCHICAL, std::logic_error,
745 ">>> ERROR (Basis::getPolynomialDegreeLength): this method is not supported for non-hierarchical bases.");
756 return "Intrepid2_Basis";
834 const ordinal_type subcOrd )
const {
835 if ( subcDim >= 0 && subcDim <
static_cast<ordinal_type
>(
tagToOrdinal_.extent(0)) &&
836 subcOrd >= 0 && subcOrd <
static_cast<ordinal_type
>(
tagToOrdinal_.extent(1)) )
839 if (firstDofOrdinal == -1)
return static_cast<ordinal_type
>(0);
841 return static_cast<ordinal_type
>(this->
getDofTag(firstDofOrdinal)[3]);
846 return static_cast<ordinal_type
>(0);
860 const ordinal_type subcOrd,
861 const ordinal_type subcDofOrd )
const {
863#ifdef HAVE_INTREPID2_DEBUG
864 INTREPID2_TEST_FOR_EXCEPTION( subcDim < 0 || subcDim >=
static_cast<ordinal_type
>(
tagToOrdinal_.extent(0)), std::out_of_range,
865 ">>> ERROR (Basis::getDofOrdinal): subcDim is out of range");
866 INTREPID2_TEST_FOR_EXCEPTION( subcOrd < 0 || subcOrd >=
static_cast<ordinal_type
>(
tagToOrdinal_.extent(1)), std::out_of_range,
867 ">>> ERROR (Basis::getDofOrdinal): subcOrd is out of range");
868 INTREPID2_TEST_FOR_EXCEPTION( subcDofOrd < 0 || subcDofOrd >=
static_cast<ordinal_type
>(
tagToOrdinal_.extent(2)), std::out_of_range,
869 ">>> ERROR (Basis::getDofOrdinal): subcDofOrd is out of range");
871 ordinal_type r_val = -1;
872 if ( subcDim <
static_cast<ordinal_type
>(
tagToOrdinal_.extent(0)) &&
873 subcOrd <
static_cast<ordinal_type
>(
tagToOrdinal_.extent(1)) &&
874 subcDofOrd <
static_cast<ordinal_type
>(
tagToOrdinal_.extent(2)) )
876#ifdef HAVE_INTREPID2_DEBUG
877 INTREPID2_TEST_FOR_EXCEPTION( r_val == -1, std::runtime_error,
878 ">>> ERROR (Basis::getDofOrdinal): Invalid DoF tag is found.");
909#ifdef HAVE_INTREPID2_DEBUG
910 INTREPID2_TEST_FOR_EXCEPTION( dofOrd < 0 || dofOrd >=
static_cast<ordinal_type
>(
ordinalToTag_.extent(0)), std::out_of_range,
911 ">>> ERROR (Basis::getDofTag): dofOrd is out of range");
913 return Kokkos::subview(
ordinalToTag_, dofOrd, Kokkos::ALL());
946 INTREPID2_TEST_FOR_EXCEPTION(
true, std::logic_error,
947 ">>> ERROR (Basis::getSubCellRefBasis): this method is not supported or should be overridden accordingly by derived classes.");
965 INTREPID2_TEST_FOR_EXCEPTION(
true, std::logic_error,
966 ">>> ERROR (Basis::getHostBasis): this method is not supported or should be overridden accordingly by derived classes.");
993 KOKKOS_INLINE_FUNCTION
994 ordinal_type getFieldRank(
const EFunctionSpace spaceType);
1031 KOKKOS_INLINE_FUNCTION
1032 ordinal_type getOperatorRank(
const EFunctionSpace spaceType,
1033 const EOperator operatorType,
1034 const ordinal_type spaceDim);
1041 KOKKOS_INLINE_FUNCTION
1042 ordinal_type getOperatorOrder(
const EOperator operatorType);
1044 template<EOperator operatorType>
1045 KOKKOS_INLINE_FUNCTION
1046 constexpr ordinal_type getOperatorOrder();
1071 template<ordinal_type spaceDim>
1072 KOKKOS_INLINE_FUNCTION
1073 ordinal_type getDkEnumeration(
const ordinal_type xMult,
1074 const ordinal_type yMult = -1,
1075 const ordinal_type zMult = -1);
1088 template<ordinal_type spaceDim>
1089 KOKKOS_INLINE_FUNCTION
1090 ordinal_type getPnEnumeration(
const ordinal_type p,
1091 const ordinal_type q = 0,
1092 const ordinal_type r = 0);
1114template<
typename value_type>
1115KOKKOS_INLINE_FUNCTION
1116void getJacobyRecurrenceCoeffs (
1120 const ordinal_type alpha,
1121 const ordinal_type beta ,
1122 const ordinal_type n);
1161 KOKKOS_INLINE_FUNCTION
1162 ordinal_type getDkCardinality(
const EOperator operatorType,
1163 const ordinal_type spaceDim);
1165 template<EOperator operatorType, ordinal_type spaceDim>
1166 KOKKOS_INLINE_FUNCTION
1167 constexpr ordinal_type getDkCardinality();
1180 template<ordinal_type spaceDim>
1181 KOKKOS_INLINE_FUNCTION
1182 ordinal_type getPnCardinality (ordinal_type n);
1184 template<ordinal_type spaceDim, ordinal_type n>
1185 KOKKOS_INLINE_FUNCTION
1186 constexpr ordinal_type getPnCardinality ();
1205 template<
typename outputValueViewType,
1206 typename inputPointViewType>
1207 void getValues_HGRAD_Args(
const outputValueViewType outputValues,
1208 const inputPointViewType inputPoints,
1209 const EOperator operatorType,
1210 const shards::CellTopology cellTopo,
1211 const ordinal_type basisCard );
1223 template<
typename outputValueViewType,
1224 typename inputPointViewType>
1225 void getValues_HCURL_Args(
const outputValueViewType outputValues,
1226 const inputPointViewType inputPoints,
1227 const EOperator operatorType,
1228 const shards::CellTopology cellTopo,
1229 const ordinal_type basisCard );
1241 template<
typename outputValueViewType,
1242 typename inputPointViewType>
1243 void getValues_HDIV_Args(
const outputValueViewType outputValues,
1244 const inputPointViewType inputPoints,
1245 const EOperator operatorType,
1246 const shards::CellTopology cellTopo,
1247 const ordinal_type basisCard );
1259 template<
typename outputValueViewType,
1260 typename inputPointViewType>
1261 void getValues_HVOL_Args(
const outputValueViewType outputValues,
1262 const inputPointViewType inputPoints,
1263 const EOperator operatorType,
1264 const shards::CellTopology cellTopo,
1265 const ordinal_type basisCard );
Implementation file for the abstract base class Intrepid2::Basis.
Header file for the data-wrapper class Intrepid2::BasisValues.
BasisPtr< typename Kokkos::HostSpace::device_type, OutputType, PointType > HostBasisPtr
Pointer to a Basis whose device type is on the host (Kokkos::HostSpace::device_type),...
Teuchos::RCP< Basis< DeviceType, OutputType, PointType > > BasisPtr
Basis Pointer.
View-like interface to tensor points; point components are stored separately; the appropriate coordin...
Contains definitions of custom data types in Intrepid2.
Header function for Intrepid2::Util class and other utility functions.
The data containers in Intrepid2 that support sum factorization and other reduced-data optimizations ...
const VectorDataType & vectorData() const
VectorData accessor.
TensorDataType & tensorData()
TensorData accessor for single-family scalar data.
An abstract base class that defines interface for concrete basis implementations for Finite Element (...
OrdinalTypeArray1DHost getFieldOrdinalsForDegree(OrdinalTypeArray1DHost °rees) const
For hierarchical bases, returns the field ordinals that have at most the specified degree in each dim...
ECoordinates basisCoordinates_
The coordinate system for which the basis is defined.
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
View type for input points.
OrdinalTypeArray1DHost getFieldOrdinalsForH1Degree(OrdinalTypeArray1DHost °rees) const
For hierarchical bases, returns the field ordinals that have at most the specified H^1 degree in each...
Kokkos::DynRankView< OutputValueType, Kokkos::LayoutStride, DeviceType > OutputViewType
View type for basis value output.
const OrdinalTypeArrayStride1DHost getDofTag(const ordinal_type dofOrd) const
DoF ordinal to DoF tag lookup.
outputValueType OutputValueType
Output value type for basis; default is double.
ordinal_type getDofOrdinal(const ordinal_type subcDim, const ordinal_type subcOrd, const ordinal_type subcDofOrd) const
DoF tag to ordinal lookup.
ordinal_type getDofCount(const ordinal_type subcDim, const ordinal_type subcOrd) const
DoF count for specified subcell.
Kokkos::View< ordinal_type ***, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray3DHost
View type for 3d host array.
const OrdinalTypeArray2DHost getAllDofTags() const
Retrieves all DoF tags.
std::vector< int > getFieldOrdinalsForH1Degree(std::vector< int > °rees) const
For hierarchical bases, returns the field ordinals that have at most the specified H^1 degree in each...
std::vector< int > getH1PolynomialDegreeOfFieldAsVector(int fieldOrdinal) const
For hierarchical bases, returns the polynomial degree (which may have multiple values in higher spati...
EBasis basisType_
Type of the basis.
ordinal_type basisDegree_
Degree of the largest complete polynomial space that can be represented by the basis.
Kokkos::View< ordinal_type *, Kokkos::LayoutStride, DeviceType > OrdinalTypeArrayStride1D
View type for 1d device array.
Kokkos::View< ordinal_type *, Kokkos::LayoutStride, Kokkos::HostSpace > OrdinalTypeArrayStride1DHost
View type for 1d host array.
ordinal_type getDegree() const
Returns the degree of the basis.
void setOrdinalTagData(OrdinalTypeView3D &tagToOrdinal, OrdinalTypeView2D &ordinalToTag, const OrdinalTypeView1D tags, const ordinal_type basisCard, const ordinal_type tagSize, const ordinal_type posScDim, const ordinal_type posScOrd, const ordinal_type posDfOrd)
Fills ordinalToTag_ and tagToOrdinal_ by basis-specific tag data.
virtual HostBasisPtr< OutputValueType, PointValueType > getHostBasis() const
Creates and returns a Basis object whose DeviceType template argument is Kokkos::HostSpace::device_ty...
ordinal_type getCardinality() const
Returns cardinality of the basis.
virtual BasisValues< OutputValueType, DeviceType > allocateBasisValues(TensorPoints< PointValueType, DeviceType > points, const EOperator operatorType=OPERATOR_VALUE) const
Allocate BasisValues container suitable for passing to the getValues() variant that takes a TensorPoi...
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, DeviceType > ScalarViewType
View type for scalars.
OutputValueType getDummyOutputValue()
Dummy array to receive input arguments.
ECoordinates getCoordinateSystem() const
Returns the type of coordinate system for which the basis is defined.
OrdinalTypeArray2DHost ordinalToTag_
"true" if tagToOrdinal_ and ordinalToTag_ have been initialized
PointValueType getDummyPointValue()
Dummy array to receive input arguments.
int getPolynomialDegreeLength() const
For hierarchical bases, returns the number of entries required to specify the polynomial degree of a ...
virtual bool requireOrientation() const
True if orientation is required.
Kokkos::View< ordinal_type, DeviceType > OrdinalViewType
View type for ordinal.
const OrdinalTypeArray3DHost getAllDofOrdinal() const
DoF tag to ordinal data structure.
Device DeviceType
(Kokkos) Device type on which Basis is templated. Does not necessarily return true for Kokkos::is_dev...
Kokkos::DynRankView< scalarType, DeviceType > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space.
Kokkos::View< ECoordinates, DeviceType > ECoordinatesViewType
View for coordinate system type.
ordinal_type getDomainDimension() const
Returns the spatial dimension of the domain of the basis; this is equal to getBaseCellTopology()....
OrdinalTypeArray2DHost fieldOrdinalH1PolynomialDegree_
H^1 polynomial degree for each degree of freedom. Only defined for hierarchical bases right now....
virtual void getValues(BasisValues< OutputValueType, DeviceType > outputValues, const TensorPoints< PointValueType, DeviceType > inputPoints, const EOperator operatorType=OPERATOR_VALUE) const
Evaluation of a FEM basis on a reference cell, using point and output value containers that allow pre...
pointValueType PointValueType
Point value type for basis; default is double.
Kokkos::View< ordinal_type **, DeviceType > OrdinalTypeArray2D
View type for 2d device array.
Kokkos::DynRankView< scalarType, DeviceType > dofCoeffs_
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
OrdinalTypeArray1DHost getPolynomialDegreeOfField(int fieldOrdinal) const
For hierarchical bases, returns the polynomial degree (which may have multiple values in higher spati...
Kokkos::View< ordinal_type **, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray2DHost
View type for 2d host array.
virtual void getDofCoords(ScalarViewType) const
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
ordinal_type basisCardinality_
Cardinality of the basis, i.e., the number of basis functions/degrees-of-freedom.
OrdinalTypeArray3DHost tagToOrdinal_
DoF tag to ordinal lookup table.
EFunctionSpace getFunctionSpace() const
Returns the function space for the basis.
Kokkos::DynRankView< OutputValueType, DeviceType > allocateOutputView(const int numPoints, const EOperator operatorType=OPERATOR_VALUE) const
Allocate a View container suitable for passing to the getValues() variant that accepts Kokkos DynRank...
virtual void getValues(OutputViewType, const PointViewType, const EOperator=OPERATOR_VALUE) const
Evaluation of a FEM basis on a reference cell.
virtual void getDofCoeffs(ScalarViewType) const
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
EBasis getBasisType() const
Returns the basis type.
OrdinalTypeArray1DHost getH1PolynomialDegreeOfField(int fieldOrdinal) const
For hierarchical bases, returns the polynomial degree (which may have multiple values in higher spati...
ScalarTraits< pointValueType >::scalar_type scalarType
Scalar type for point values.
Kokkos::View< ordinal_type ***, DeviceType > OrdinalTypeArray3D
View type for 3d device array.
shards::CellTopology getBaseCellTopology() const
Returns the base cell topology for which the basis is defined. See Shards documentation https://trili...
Kokkos::View< ordinal_type *, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
View type for 1d host array.
shards::CellTopology basisCellTopology_
Base topology of the cells for which the basis is defined. See the Shards package for definition of b...
Kokkos::View< ordinal_type *, DeviceType > OrdinalTypeArray1D
View type for 1d device array.
virtual void getValues(OutputViewType, const PointViewType, const PointViewType, const EOperator=OPERATOR_VALUE) const
Evaluation of an FVD basis evaluation on a physical cell.
typename DeviceType::execution_space ExecutionSpace
(Kokkos) Execution space for basis.
virtual const char * getName() const
Returns basis name.
std::vector< int > getFieldOrdinalsForDegree(std::vector< int > °rees) const
For hierarchical bases, returns the field ordinals that have at most the specified degree in each dim...
OrdinalTypeArray2DHost fieldOrdinalPolynomialDegree_
Polynomial degree for each degree of freedom. Only defined for hierarchical bases right now....
virtual BasisPtr< DeviceType, OutputValueType, PointValueType > getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const
returns the basis associated to a subCell.
virtual int getNumTensorialExtrusions() const
returns the number of tensorial extrusions relative to the cell topology returned by getBaseCellTopol...
EFunctionSpace functionSpace_
The function space in which the basis is defined.
std::vector< int > getPolynomialDegreeOfFieldAsVector(int fieldOrdinal) const
For hierarchical bases, returns the polynomial degree (which may have multiple values in higher spati...
Kokkos::View< EBasis, DeviceType > EBasisViewType
View for basis type.
Wrapper around a Kokkos::View that allows data that is constant or repeating in various logical dimen...
KOKKOS_INLINE_FUNCTION enable_if_t< rank==1, const Kokkos::View< typename RankExpander< DataScalar, rank >::value_type, DeviceType > & > getUnderlyingView() const
Returns the underlying view. Throws an exception if the underlying view is not rank 1.
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
View type for input points.
View-like interface to tensor data; tensor components are stored separately and multiplied together a...
KOKKOS_INLINE_FUNCTION const Data< Scalar, DeviceType > & getTensorComponent(const ordinal_type &r) const
Returns the requested tensor component.
KOKKOS_INLINE_FUNCTION ordinal_type numTensorComponents() const
Return the number of tensorial components.
View-like interface to tensor points; point components are stored separately; the appropriate coordin...
KOKKOS_INLINE_FUNCTION std::enable_if< std::is_integral< iType >::value, int >::type extent_int(const iType &r) const
Returns the logical extent in the requested dimension.
ScalarView< PointScalar, DeviceType > allocateAndFillExpandedRawPointView() const
This method is for compatibility with existing methods that take raw point views. Note that in genera...
Reference-space field values for a basis, designed to support typical vector-valued bases.
KOKKOS_INLINE_FUNCTION int numComponents() const
returns the number of components
KOKKOS_INLINE_FUNCTION const TensorData< Scalar, DeviceType > & getComponent(const int &componentOrdinal) const
Single-argument component accessor for the axial-component or the single-family case; in this case,...
KOKKOS_INLINE_FUNCTION constexpr bool isValid() const
returns true for containers that have data; false for those that don't (e.g., those that have been co...