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,
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
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_;