49 #ifndef __INTREPID2_HGRAD_TRI_CN_FEM_HPP__
50 #define __INTREPID2_HGRAD_TRI_CN_FEM_HPP__
56 #include "Teuchos_LAPACK.hpp"
88 typedef struct Triangle<3> cell_topology_type;
94 template<EOperator opType>
96 template<
typename outputValueViewType,
97 typename inputPointViewType,
98 typename workViewType,
99 typename vinvViewType>
100 KOKKOS_INLINE_FUNCTION
102 getValues( outputValueViewType outputValues,
103 const inputPointViewType inputPoints,
105 const vinvViewType vinv );
108 template<
typename ExecSpaceType, ordinal_type numPtsPerEval,
109 typename outputValueValueType,
class ...outputValueProperties,
110 typename inputPointValueType,
class ...inputPointProperties,
111 typename vinvValueType,
class ...vinvProperties>
113 getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
114 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
115 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinv,
116 const EOperator operatorType);
121 template<
typename outputValueViewType,
122 typename inputPointViewType,
123 typename vinvViewType,
124 typename workViewType,
126 ordinal_type numPtsEval>
128 outputValueViewType _outputValues;
129 const inputPointViewType _inputPoints;
130 const vinvViewType _vinv;
133 KOKKOS_INLINE_FUNCTION
134 Functor( outputValueViewType outputValues_,
135 inputPointViewType inputPoints_,
138 : _outputValues(outputValues_), _inputPoints(inputPoints_),
139 _vinv(vinv_), _work(work_) {}
141 KOKKOS_INLINE_FUNCTION
142 void operator()(
const size_type iter)
const {
146 const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
147 const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
149 typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
151 auto vcprop = Kokkos::common_view_alloc_prop(_work);
152 workViewType work(Kokkos::view_wrap(ptr,vcprop), (ptEnd-ptBegin)*_work.extent(0));
155 case OPERATOR_VALUE : {
156 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange );
163 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
168 INTREPID2_TEST_FOR_ABORT(
true,
169 ">>> ERROR: (Intrepid2::Basis_HGRAD_TRI_Cn_FEM::Functor) operator is not supported");
178 template<
typename ExecSpaceType = void,
179 typename outputValueType = double,
180 typename pointValueType =
double>
182 :
public Basis<ExecSpaceType,outputValueType,pointValueType> {
197 Kokkos::DynRankView<scalarType,ExecSpaceType>
vinv_;
203 const EPointType pointType = POINTTYPE_EQUISPACED);
211 const EOperator operatorType = OPERATOR_VALUE)
const {
212 #ifdef HAVE_INTREPID2_DEBUG
213 Intrepid2::getValues_HGRAD_Args(outputValues,
220 Impl::Basis_HGRAD_TRI_Cn_FEM::
221 getValues<ExecSpaceType,numPtsPerEval>( outputValues,
230 #ifdef HAVE_INTREPID2_DEBUG
232 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.rank() != 2, std::invalid_argument,
233 ">>> ERROR: (Intrepid2::Basis_HGRAD_TRI_Cn_FEM::getDofCoords) rank = 2 required for dofCoords array");
235 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->
getCardinality(), std::invalid_argument,
236 ">>> ERROR: (Intrepid2::Basis_HGRAD_TRI_Cn_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
238 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->
getBaseCellTopology().getDimension(), std::invalid_argument,
239 ">>> ERROR: (Intrepid2::Basis_HGRAD_TRI_Cn_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
241 Kokkos::deep_copy(dofCoords, this->
dofCoords_);
247 #ifdef HAVE_INTREPID2_DEBUG
249 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.rank() != 1, std::invalid_argument,
250 ">>> ERROR: (Intrepid2::Basis_HGRAD_TRI_Cn_FEM::getdofCoeffs) rank = 1 required for dofCoeffs array");
252 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->
getCardinality(), std::invalid_argument,
253 ">>> ERROR: (Intrepid2::Basis_HGRAD_TRI_Cn_FEM::getdofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
255 Kokkos::deep_copy(dofCoeffs, 1.0);
262 return "Intrepid2_HGRAD_TRI_Cn_FEM";
272 getVandermondeInverse( scalarViewType vinv )
const {
274 Kokkos::deep_copy(vinv, this->
vinv_);
277 Kokkos::DynRankView<typename scalarViewType::const_value_type,ExecSpaceType>
278 getVandermondeInverse()
const {
283 getWorkSizePerPoint(
const EOperator operatorType)
const {
284 auto cardinality = getPnCardinality<2>(this->
basisDegree_);
285 switch (operatorType) {
289 return 5*cardinality;
291 return getDkCardinality(operatorType, 2)*cardinality;
virtual void getValues(outputViewType outputValues, const pointViewType inputPoints, const EOperator operatorType=OPERATOR_VALUE) const
Evaluation of a FEM basis on a reference cell.
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, ExecSpaceType > scalarViewType
View type for scalars.
Header file for the Intrepid2::Basis_HGRAD_TRI_Cn_FEM_ORTH class.
An abstract base class that defines interface for concrete basis implementations for Finite Element (...
Kokkos::DynRankView< outputValueType, Kokkos::LayoutStride, ExecSpaceType > outputViewType
View type for basis value output.
shards::CellTopology getBaseCellTopology() const
Returns the base cell topology for which the basis is defined. See Shards documentation https://trili...
Kokkos::DynRankView< scalarType, ExecSpaceType > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space.
See Intrepid2::Basis_HGRAD_TRI_Cn_FEM.
ordinal_type getCardinality() const
Returns cardinality of the basis.
Kokkos::View< ordinal_type ***, typename ExecSpaceType::array_layout, Kokkos::HostSpace > ordinal_type_array_3d_host
View type for 3d host array.
ordinal_type basisDegree_
Degree of the largest complete polynomial space that can be represented by the basis.
See Intrepid2::Basis_HGRAD_TRI_Cn_FEM.
static constexpr ordinal_type MaxNumPtsPerBasisEval
The maximum number of points to eval in serial mode.
Kokkos::View< ordinal_type *,typename ExecSpaceType::array_layout, Kokkos::HostSpace > ordinal_type_array_1d_host
View type for 1d host array.
virtual const char * getName() const
Returns basis name.
Basis_HGRAD_TRI_Cn_FEM(const ordinal_type order, const EPointType pointType=POINTTYPE_EQUISPACED)
Constructor.
Kokkos::DynRankView< pointValueType, Kokkos::LayoutStride, ExecSpaceType > pointViewType
View type for input points.
Kokkos::DynRankView< scalarType, ExecSpaceType > vinv_
inverse of Generalized Vandermonde matrix, whose columns store the expansion coefficients of the noda...
See Intrepid2::Basis_HGRAD_TRI_Cn_FEM work is a rank 1 view having the same value_type of inputPoints...
virtual bool requireOrientation() const
True if orientation is required.
virtual void getDofCoords(scalarViewType dofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
Implementation of the default H(grad)-compatible Lagrange basis of arbitrary degree on Triangle cell...
Definition file for FEM basis functions of degree n for H(grad) functions on TRI cells.
ScalarTraits< pointValueType >::scalar_type scalarType
Scalar type for point values.
Header file for the abstract base class Intrepid2::Basis.
Kokkos::View< ordinal_type **,typename ExecSpaceType::array_layout, Kokkos::HostSpace > ordinal_type_array_2d_host
View type for 2d host array.
virtual void getDofCoeffs(scalarViewType dofCoeffs) const
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...