49 #ifndef __INTREPID2_HDIV_TET_IN_FEM_HPP__ 
   50 #define __INTREPID2_HDIV_TET_IN_FEM_HPP__ 
   56 #include "Teuchos_LAPACK.hpp" 
   86 #define CardinalityHDivTet(order) (order*(order+1)*(order+3)/2) 
   99   template<EOperator opType>
 
  101     template<
typename outputValueViewType,
 
  102     typename inputPointViewType,
 
  103     typename workViewType,
 
  104     typename vinvViewType>
 
  105     KOKKOS_INLINE_FUNCTION
 
  107     getValues(       outputValueViewType outputValues,
 
  108         const inputPointViewType  inputPoints,
 
  110         const vinvViewType        vinv );
 
  113     KOKKOS_INLINE_FUNCTION
 
  115     getWorkSizePerPoint(ordinal_type order) {
 
  116       auto cardinality = CardinalityHDivTet(order);
 
  120         return 7*cardinality;
 
  122         return getDkCardinality<opType,3>()*cardinality;
 
  127   template<
typename ExecSpaceType, ordinal_type numPtsPerEval,
 
  128   typename outputValueValueType, 
class ...outputValueProperties,
 
  129   typename inputPointValueType,  
class ...inputPointProperties,
 
  130   typename vinvValueType,        
class ...vinvProperties>
 
  132   getValues(       Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
 
  133       const Kokkos::DynRankView<inputPointValueType, inputPointProperties...>  inputPoints,
 
  134       const Kokkos::DynRankView<vinvValueType,       vinvProperties...>        vinv,
 
  135       const EOperator operatorType);
 
  140   template<
typename outputValueViewType,
 
  141   typename inputPointViewType,
 
  142   typename vinvViewType,
 
  143   typename workViewType,
 
  145   ordinal_type numPtsEval>
 
  147     outputValueViewType _outputValues;
 
  148     const inputPointViewType  _inputPoints;
 
  149     const vinvViewType        _coeffs;
 
  152     KOKKOS_INLINE_FUNCTION
 
  153     Functor( outputValueViewType outputValues_,
 
  154         inputPointViewType  inputPoints_,
 
  155         vinvViewType        coeffs_,
 
  157     : _outputValues(outputValues_), _inputPoints(inputPoints_),
 
  158       _coeffs(coeffs_), _work(work_) {}
 
  160     KOKKOS_INLINE_FUNCTION
 
  161     void operator()(
const size_type iter)
 const {
 
  165       const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
 
  166       const auto input   = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
 
  168       typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
 
  170       auto vcprop = Kokkos::common_view_alloc_prop(_work);
 
  171       workViewType  work(Kokkos::view_wrap(ptr,vcprop), (ptEnd-ptBegin)*_work.extent(0));
 
  174       case OPERATOR_VALUE : {
 
  175         auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
 
  180         auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange);
 
  185         INTREPID2_TEST_FOR_ABORT( 
true,
 
  186             ">>> ERROR: (Intrepid2::Basis_HDIV_TET_In_FEM::Functor) operator is not supported");
 
  195 template<
typename ExecSpaceType = void,
 
  196     typename outputValueType = double,
 
  197     typename pointValueType = 
double>
 
  199     : 
public Basis<ExecSpaceType,outputValueType,pointValueType> {
 
  208       const EPointType   pointType = POINTTYPE_EQUISPACED);
 
  222       const EOperator operatorType = OPERATOR_VALUE)
 const {
 
  223 #ifdef HAVE_INTREPID2_DEBUG 
  224     Intrepid2::getValues_HDIV_Args(outputValues,
 
  231 Impl::Basis_HDIV_TET_In_FEM::
 
  232 getValues<ExecSpaceType,numPtsPerEval>( outputValues,
 
  241 #ifdef HAVE_INTREPID2_DEBUG 
  243     INTREPID2_TEST_FOR_EXCEPTION( dofCoords.rank() != 2, std::invalid_argument,
 
  244         ">>> ERROR: (Intrepid2::Basis_HDIV_TET_In_FEM::getDofCoords) rank = 2 required for dofCoords array");
 
  246     INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->
getCardinality(), std::invalid_argument,
 
  247         ">>> ERROR: (Intrepid2::Basis_HDIV_TET_In_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
 
  249     INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->
getBaseCellTopology().getDimension(), std::invalid_argument,
 
  250         ">>> ERROR: (Intrepid2::Basis_HDIV_TET_In_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
 
  252     Kokkos::deep_copy(dofCoords, this->
dofCoords_);
 
  258 #ifdef HAVE_INTREPID2_DEBUG 
  260     INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.rank() != 2, std::invalid_argument,
 
  261         ">>> ERROR: (Intrepid2::Basis_HDIV_TET_In_FEM::getDofCoeffs) rank = 2 required for dofCoeffs array");
 
  263     INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->
getCardinality(), std::invalid_argument,
 
  264         ">>> ERROR: (Intrepid2::Basis_HDIV_TET_In_FEM::getDofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
 
  266     INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.extent(1) != this->
getBaseCellTopology().getDimension(), std::invalid_argument,
 
  267         ">>> ERROR: (Intrepid2::Basis_HDIV_TET_In_FEM::getDofCoeffs) incorrect reference cell (1st) dimension in dofCoeffs array");
 
  269     Kokkos::deep_copy(dofCoeffs, this->
dofCoeffs_);
 
  273   getExpansionCoeffs( scalarViewType coeffs )
 const {
 
  275     Kokkos::deep_copy(coeffs, this->
coeffs_);
 
  281     return "Intrepid2_HDIV_TET_In_FEM";
 
  294   Kokkos::DynRankView<scalarType,ExecSpaceType> 
coeffs_;
 
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, ExecSpaceType > scalarViewType
View type for scalars. 
Definition file for FEM basis functions of degree n for H(grad) functions on TET cells. 
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 > coeffs_
expansion coefficients of the nodal basis in terms of the orthgonal one 
Kokkos::DynRankView< scalarType, ExecSpaceType > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space. 
ordinal_type getCardinality() const 
Returns cardinality of the basis. 
virtual void getValues(outputViewType outputValues, const pointViewType inputPoints, const EOperator operatorType=OPERATOR_VALUE) const 
Evaluation of a FEM basis on a reference cell. 
Kokkos::View< ordinal_type ***, typename ExecSpaceType::array_layout, Kokkos::HostSpace > ordinal_type_array_3d_host
View type for 3d host array. 
virtual const char * getName() const 
Returns basis name. 
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. 
Implementation of the default H(div)-compatible Raviart-Thomas basis of arbitrary degree on Tetrahedr...
Kokkos::DynRankView< pointValueType, Kokkos::LayoutStride, ExecSpaceType > pointViewType
View type for input points. 
Basis_HDIV_TET_In_FEM(const ordinal_type order, const EPointType pointType=POINTTYPE_EQUISPACED)
Constructor. 
Kokkos::DynRankView< scalarType, ExecSpaceType > dofCoeffs_
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
See Intrepid2::Basis_HDIV_TET_In_FEM. 
virtual bool requireOrientation() const 
True if orientation is required. 
ScalarTraits< pointValueType >::scalar_type scalarType
Scalar type for point values. 
Header file for the Intrepid2::Basis_HGRAD_TET_Cn_FEM_ORTH class. 
See Intrepid2::Basis_HDIV_TET_In_FEM. 
virtual void getDofCoords(scalarViewType dofCoords) const 
Returns spatial locations (coordinates) of degrees of freedom on the reference cell. 
virtual void getDofCoeffs(scalarViewType dofCoeffs) const 
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
See Intrepid2::Basis_HDIV_TET_In_FEM. 
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.