49 #ifndef __INTREPID2_HCURL_HEX_IN_FEM_HPP__
50 #define __INTREPID2_HCURL_HEX_IN_FEM_HPP__
64 typedef struct Hexahedron<8> cell_topology_type;
69 template<EOperator opType>
71 template<
typename outputValueViewType,
72 typename inputPointViewType,
73 typename workViewType,
74 typename vinvViewType>
75 KOKKOS_INLINE_FUNCTION
77 getValues( outputValueViewType outputValues,
78 const inputPointViewType inputPoints,
80 const vinvViewType vinvLine,
81 const vinvViewType vinvBubble );
83 KOKKOS_INLINE_FUNCTION
85 getWorkSizePerPoint(ordinal_type order) {
88 return 3*getPnCardinality<1>(order)+getPnCardinality<1>(order-1);
90 return 5*getPnCardinality<1>(order)+getPnCardinality<1>(order-1);
92 INTREPID2_TEST_FOR_ABORT(
true,
93 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::Serial::getWorkSizePerPoint) operator is not supported" );
100 template<
typename ExecSpaceType, ordinal_type numPtsPerEval,
101 typename outputValueValueType,
class ...outputValueProperties,
102 typename inputPointValueType,
class ...inputPointProperties,
103 typename vinvValueType,
class ...vinvProperties>
105 getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
106 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
107 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinvLine,
108 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinvBubble,
109 const EOperator operatorType );
114 template<
typename outputValueViewType,
115 typename inputPointViewType,
116 typename vinvViewType,
117 typename workViewType,
119 ordinal_type numPtsEval>
121 outputValueViewType _outputValues;
122 const inputPointViewType _inputPoints;
123 const vinvViewType _vinvLine;
124 const vinvViewType _vinvBubble;
127 KOKKOS_INLINE_FUNCTION
128 Functor( outputValueViewType outputValues_,
129 inputPointViewType inputPoints_,
130 vinvViewType vinvLine_,
131 vinvViewType vinvBubble_,
133 : _outputValues(outputValues_), _inputPoints(inputPoints_),
134 _vinvLine(vinvLine_), _vinvBubble(vinvBubble_), _work(work_) {}
136 KOKKOS_INLINE_FUNCTION
137 void operator()(
const size_type iter)
const {
141 const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
142 const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
144 typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
146 auto vcprop = Kokkos::common_view_alloc_prop(_work);
147 workViewType work(Kokkos::view_wrap(ptr,vcprop), (ptEnd-ptBegin)*_work.extent(0));
150 case OPERATOR_VALUE : {
151 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
155 case OPERATOR_CURL : {
156 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
161 INTREPID2_TEST_FOR_ABORT(
true,
162 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_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> {
191 const EPointType pointType = POINTTYPE_EQUISPACED);
203 const EOperator operatorType = OPERATOR_VALUE )
const {
204 #ifdef HAVE_INTREPID2_DEBUG
205 Intrepid2::getValues_HCURL_Args(outputValues,
211 constexpr ordinal_type numPtsPerEval = 1;
212 Impl::Basis_HCURL_HEX_In_FEM::
213 getValues<ExecSpaceType,numPtsPerEval>( outputValues,
223 #ifdef HAVE_INTREPID2_DEBUG
225 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.rank() != 2, std::invalid_argument,
226 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::getDofCoords) rank = 2 required for dofCoords array");
228 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->
getCardinality(), std::invalid_argument,
229 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
231 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->
getBaseCellTopology().getDimension(), std::invalid_argument,
232 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
234 Kokkos::deep_copy(dofCoords, this->
dofCoords_);
240 #ifdef HAVE_INTREPID2_DEBUG
242 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.rank() != 2, std::invalid_argument,
243 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::getDofCoeffs) rank = 2 required for dofCoeffs array");
245 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->
getCardinality(), std::invalid_argument,
246 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::getDofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
248 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.extent(1) != this->
getBaseCellTopology().getDimension(), std::invalid_argument,
249 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::getDofCoeffs) incorrect reference cell (1st) dimension in dofCoeffs array");
251 Kokkos::deep_copy(dofCoeffs, this->
dofCoeffs_);
257 return "Intrepid2_HCURL_HEX_In_FEM";
269 Kokkos::DynRankView<typename scalarViewType::value_type,ExecSpaceType>
vinvLine_, vinvBubble_;
Header file for the Intrepid2::Basis_HGRAD_LINE_Cn_FEM class.
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, ExecSpaceType > scalarViewType
View type for scalars.
virtual void getDofCoeffs(scalarViewType dofCoeffs) const
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
Definition file for FEM basis functions of degree n for H(curl) functions on HEX 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...
See Intrepid2::Basis_HCURL_HEX_In_FEM.
Kokkos::DynRankView< scalarType, ExecSpaceType > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space.
virtual bool requireOrientation() const
True if orientation is required.
See Intrepid2::Basis_HCURL_HEX_In_FEM.
Implementation of the default H(curl)-compatible FEM basis on Hexahedral cell.
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.
virtual void getDofCoords(scalarViewType dofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
virtual void getValues(outputViewType outputValues, const pointViewType inputPoints, const EOperator operatorType=OPERATOR_VALUE) const
Evaluation of a FEM basis on a reference cell.
See Intrepid2::Basis_HCURL_HEX_In_FEM.
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.
Kokkos::DynRankView< pointValueType, Kokkos::LayoutStride, ExecSpaceType > pointViewType
View type for input points.
Basis_HCURL_HEX_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...
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.
Kokkos::DynRankView< typename scalarViewType::value_type, ExecSpaceType > vinvLine_
inverse of Generalized Vandermonde matrix (isotropic order)