16#ifndef __INTREPID2_HDIV_HEX_IN_FEM_HPP__
17#define __INTREPID2_HDIV_HEX_IN_FEM_HPP__
32 typedef struct Hexahedron<8> cell_topology_type;
36 template<EOperator opType>
38 template<
typename outputValueViewType,
39 typename inputPointViewType,
40 typename workViewType,
41 typename vinvViewType>
42 KOKKOS_INLINE_FUNCTION
44 getValues( outputValueViewType outputValues,
45 const inputPointViewType inputPoints,
47 const vinvViewType vinvLine,
48 const vinvViewType vinvBubble );
50 KOKKOS_INLINE_FUNCTION
52 getWorkSizePerPoint(ordinal_type order) {
57 template<
typename DeviceType, ordinal_type numPtsPerEval,
58 typename outputValueValueType,
class ...outputValueProperties,
59 typename inputPointValueType,
class ...inputPointProperties,
60 typename vinvValueType,
class ...vinvProperties>
62 getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
63 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
64 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinvLine,
65 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinvBubble,
66 const EOperator operatorType );
71 template<
typename outputValueViewType,
72 typename inputPointViewType,
73 typename vinvViewType,
74 typename workViewType,
76 ordinal_type numPtsEval>
78 outputValueViewType _outputValues;
79 const inputPointViewType _inputPoints;
80 const vinvViewType _vinvLine;
81 const vinvViewType _vinvBubble;
84 KOKKOS_INLINE_FUNCTION
85 Functor( outputValueViewType outputValues_,
86 inputPointViewType inputPoints_,
87 vinvViewType vinvLine_,
88 vinvViewType vinvBubble_,
90 : _outputValues(outputValues_), _inputPoints(inputPoints_),
91 _vinvLine(vinvLine_), _vinvBubble(vinvBubble_), _work(work_) {}
93 KOKKOS_INLINE_FUNCTION
94 void operator()(
const size_type iter)
const {
95 const auto ptBegin = Util<ordinal_type>::min(iter*numPtsEval, _inputPoints.extent(0));
96 const auto ptEnd = Util<ordinal_type>::min(ptBegin+numPtsEval, _inputPoints.extent(0));
98 const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
99 const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
101 typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
106 case OPERATOR_VALUE : {
107 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
108 Serial<opType>::getValues( output, input, work, _vinvLine, _vinvBubble );
111 case OPERATOR_DIV : {
112 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange );
113 Serial<opType>::getValues( output, input, work, _vinvLine, _vinvBubble );
117 INTREPID2_TEST_FOR_ABORT(
true,
118 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::Functor) operator is not supported." );
134 template<
typename DeviceType = void,
135 typename outputValueType = double,
136 typename pointValueType =
double>
138 :
public Basis<DeviceType,outputValueType,pointValueType> {
140 using BasisBase = Basis<DeviceType, outputValueType, pointValueType>;
148 const EPointType pointType = POINTTYPE_EQUISPACED);
158 getValues( OutputViewType outputValues,
159 const PointViewType inputPoints,
160 const EOperator operatorType = OPERATOR_VALUE )
const override {
161#ifdef HAVE_INTREPID2_DEBUG
168 constexpr ordinal_type numPtsPerEval = 1;
169 Impl::Basis_HDIV_HEX_In_FEM::
170 getValues<DeviceType,numPtsPerEval>( outputValues,
178 getScratchSpaceSize( ordinal_type& perTeamSpaceSize,
179 ordinal_type& perThreadSpaceSize,
181 const EOperator operatorType = OPERATOR_VALUE)
const override;
183 KOKKOS_INLINE_FUNCTION
188 const EOperator operatorType,
189 const typename Kokkos::TeamPolicy<typename DeviceType::execution_space>::member_type& team_member,
190 const typename DeviceType::execution_space::scratch_memory_space & scratchStorage,
191 const ordinal_type subcellDim = -1,
192 const ordinal_type subcellOrdinal = -1)
const override;
197#ifdef HAVE_INTREPID2_DEBUG
199 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.rank() != 2, std::invalid_argument,
200 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::getDofCoords) rank = 2 required for dofCoords array");
202 INTREPID2_TEST_FOR_EXCEPTION(
static_cast<ordinal_type
>(dofCoords.extent(0)) != this->getCardinality(), std::invalid_argument,
203 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
205 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
206 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
208 Kokkos::deep_copy(dofCoords, this->
dofCoords_);
215#ifdef HAVE_INTREPID2_DEBUG
217 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.rank() != 2, std::invalid_argument,
218 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::getDofCoeffs) rank = 2 required for dofCoeffs array");
220 INTREPID2_TEST_FOR_EXCEPTION(
static_cast<ordinal_type
>(dofCoeffs.extent(0)) != this->getCardinality(), std::invalid_argument,
221 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::getDofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
223 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
224 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::getDofCoeffs) incorrect reference cell (1st) dimension in dofCoeffs array");
226 Kokkos::deep_copy(dofCoeffs, this->
dofCoeffs_);
232 return "Intrepid2_HDIV_HEX_In_FEM";
253 if(subCellDim == 2) {
254 return Teuchos::rcp(
new
258 INTREPID2_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
"Input parameters out of bounds");
268 Kokkos::DynRankView<typename ScalarViewType::value_type,DeviceType>
vinvLine_, vinvBubble_;
269 EPointType pointType_;
Header file for the abstract base class Intrepid2::Basis.
KOKKOS_INLINE_FUNCTION ordinal_type getPnCardinality(ordinal_type n)
Returns cardinality of Polynomials of order n (P^n).
void 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....
Teuchos::RCP< Basis< DeviceType, OutputType, PointType > > BasisPtr
Basis Pointer.
Definition file for FEM basis functions of degree n for H(div) functions on HEX cells.
Header file for the Intrepid2::Basis_HGRAD_QUAD_Cn_FEM class.
Header file for the Intrepid2::Basis_HVOL_QUAD_Cn_FEM class.
KOKKOS_INLINE_FUNCTION std::enable_if< std::is_pointer_v< CtorProp > &&!std::is_convertible_v< CtorProp, constchar * >, OutViewType >::type createMatchingUnmanagedView(const InViewType &view, const CtorProp &data, const Dims... dims)
Creates an unmanaged view that matches the value_type of the provided view The type of the output vie...
virtual bool requireOrientation() const override
True if orientation is required.
virtual void getDofCoeffs(ScalarViewType dofCoeffs) const override
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
virtual const char * getName() const override
Returns basis name.
Basis_HDIV_HEX_In_FEM(const ordinal_type order, const EPointType pointType=POINTTYPE_EQUISPACED)
Constructor.
Kokkos::DynRankView< typename ScalarViewType::value_type, ExecutionSpace > vinvLine_
BasisPtr< typename Kokkos::HostSpace::device_type, outputValueType, pointValueType > getHostBasis() const override
Creates and returns a Basis object whose DeviceType template argument is Kokkos::HostSpace::device_ty...
BasisPtr< DeviceType, outputValueType, pointValueType > getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override
returns the basis associated to a subCell.
virtual void getDofCoords(ScalarViewType dofCoords) const override
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
Implementation of the default HVOL-compatible FEM basis of degree n on Quadrilateral cell Implements ...
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
View type for input points.
virtual KOKKOS_INLINE_FUNCTION void getValues(OutputViewType, const PointViewType, const EOperator, const typename Kokkos::TeamPolicy< ExecutionSpace >::member_type &teamMember, const typename ExecutionSpace::scratch_memory_space &scratchStorage, const ordinal_type subcellDim=-1, const ordinal_type subcellOrdinal=-1) const
Team-level evaluation of basis functions on a reference cell.
Kokkos::DynRankView< OutputValueType, Kokkos::LayoutStride, DeviceType > OutputViewType
View type for basis value output.
Kokkos::View< ordinal_type ***, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray3DHost
ordinal_type basisDegree_
Degree of the largest complete polynomial space that can be represented by the basis.
ordinal_type getCardinality() const
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, DeviceType > ScalarViewType
View type for scalars.
Kokkos::DynRankView< scalarType, DeviceType > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space.
Kokkos::DynRankView< scalarType, DeviceType > dofCoeffs_
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
Kokkos::View< ordinal_type **, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray2DHost
shards::CellTopology getBaseCellTopology() const
Kokkos::View< ordinal_type *, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
See Intrepid2::Basis_HDIV_HEX_In_FEM.
See Intrepid2::Basis_HDIV_HEX_In_FEM.