49 #ifndef __INTREPID2_HCURL_TET_IN_FEM_HPP__
50 #define __INTREPID2_HCURL_TET_IN_FEM_HPP__
56 #include "Teuchos_LAPACK.hpp"
92 #define CardinalityHCurlTet(order) (order*(order+2)*(order+3)/2)
105 template<EOperator opType>
107 template<
typename outputValueViewType,
108 typename inputPointViewType,
109 typename workViewType,
110 typename vinvViewType>
111 KOKKOS_INLINE_FUNCTION
113 getValues( outputValueViewType outputValues,
114 const inputPointViewType inputPoints,
116 const vinvViewType vinv );
119 KOKKOS_INLINE_FUNCTION
121 getWorkSizePerPoint(ordinal_type order) {
122 auto cardinality = CardinalityHCurlTet(order);
126 return 7*cardinality;
128 return getDkCardinality<opType,3>()*cardinality;
133 template<
typename ExecSpaceType, ordinal_type numPtsPerEval,
134 typename outputValueValueType,
class ...outputValueProperties,
135 typename inputPointValueType,
class ...inputPointProperties,
136 typename vinvValueType,
class ...vinvProperties>
138 getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
139 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
140 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinv,
141 const EOperator operatorType);
146 template<
typename outputValueViewType,
147 typename inputPointViewType,
148 typename vinvViewType,
149 typename workViewType,
151 ordinal_type numPtsEval>
153 outputValueViewType _outputValues;
154 const inputPointViewType _inputPoints;
155 const vinvViewType _coeffs;
158 KOKKOS_INLINE_FUNCTION
159 Functor( outputValueViewType outputValues_,
160 inputPointViewType inputPoints_,
161 vinvViewType coeffs_,
163 : _outputValues(outputValues_), _inputPoints(inputPoints_),
164 _coeffs(coeffs_), _work(work_) {}
166 KOKKOS_INLINE_FUNCTION
167 void operator()(
const size_type iter)
const {
171 const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
172 const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
174 typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
176 auto vcprop = Kokkos::common_view_alloc_prop(_work);
177 workViewType work(Kokkos::view_wrap(ptr,vcprop), (ptEnd-ptBegin)*_work.extent(0));
180 case OPERATOR_VALUE : {
181 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
185 case OPERATOR_CURL: {
186 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
191 INTREPID2_TEST_FOR_ABORT(
true,
192 ">>> ERROR: (Intrepid2::Basis_HCURL_TET_In_FEM::Functor) operator is not supported");
201 template<
typename ExecSpaceType = void,
202 typename outputValueType = double,
203 typename pointValueType =
double>
205 :
public Basis<ExecSpaceType,outputValueType,pointValueType> {
214 const EPointType pointType = POINTTYPE_EQUISPACED);
221 using outputViewType INTREPID2_DEPRECATED_TYPENAME_REPLACEMENT(
"use OutputViewType instead",
"OutputViewType") = OutputViewType INTREPID2_DEPRECATED_TYPENAME_TRAILING_ATTRIBUTE(
"use OutputViewType instead");
222 using pointViewType INTREPID2_DEPRECATED_TYPENAME_REPLACEMENT(
"use PointViewType instead",
"PointViewType") = PointViewType INTREPID2_DEPRECATED_TYPENAME_TRAILING_ATTRIBUTE(
"use PointViewType instead");
223 using scalarViewType INTREPID2_DEPRECATED_TYPENAME_REPLACEMENT(
"use ScalarViewType instead",
"ScalarViewType") = ScalarViewType INTREPID2_DEPRECATED_TYPENAME_TRAILING_ATTRIBUTE(
"use ScalarViewType instead");
231 getValues( OutputViewType outputValues,
232 const PointViewType inputPoints,
233 const EOperator operatorType = OPERATOR_VALUE)
const {
234 #ifdef HAVE_INTREPID2_DEBUG
242 Impl::Basis_HCURL_TET_In_FEM::
243 getValues<ExecSpaceType,numPtsPerEval>( outputValues,
251 getDofCoords( ScalarViewType dofCoords )
const {
252 #ifdef HAVE_INTREPID2_DEBUG
254 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.rank() != 2, std::invalid_argument,
255 ">>> ERROR: (Intrepid2::Basis_HCURL_TET_In_FEM::getDofCoords) rank = 2 required for dofCoords array");
257 INTREPID2_TEST_FOR_EXCEPTION(
static_cast<ordinal_type
>(dofCoords.extent(0)) != this->getCardinality(), std::invalid_argument,
258 ">>> ERROR: (Intrepid2::Basis_HCURL_TET_In_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
260 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
261 ">>> ERROR: (Intrepid2::Basis_HCURL_TET_In_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
263 Kokkos::deep_copy(dofCoords, this->
dofCoords_);
268 getDofCoeffs( ScalarViewType dofCoeffs )
const {
269 #ifdef HAVE_INTREPID2_DEBUG
271 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.rank() != 2, std::invalid_argument,
272 ">>> ERROR: (Intrepid2::Basis_HCURL_TET_In_FEM::getDofCoeffs) rank = 2 required for dofCoeffs array");
274 INTREPID2_TEST_FOR_EXCEPTION(
static_cast<ordinal_type
>(dofCoeffs.extent(0)) != this->getCardinality(), std::invalid_argument,
275 ">>> ERROR: (Intrepid2::Basis_HCURL_TET_In_FEM::getDofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
277 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
278 ">>> ERROR: (Intrepid2::Basis_HCURL_TET_In_FEM::getDofCoeffs) incorrect reference cell (1st) dimension in dofCoeffs array");
280 Kokkos::deep_copy(dofCoeffs, this->
dofCoeffs_);
284 getExpansionCoeffs( ScalarViewType coeffs )
const {
286 Kokkos::deep_copy(coeffs, this->
coeffs_);
292 return "Intrepid2_HCURL_TET_In_FEM";
305 Kokkos::DynRankView<scalarType,ExecSpaceType>
coeffs_;
Header file for the abstract base class Intrepid2::Basis.
void getValues_HCURL_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 HCURL-conforming FEM basis....
Definition file for FEM basis functions of degree n for H(curl) functions on TET.
Header file for the Intrepid2::Basis_HGRAD_TET_Cn_FEM_ORTH class.
Implementation of the default H(curl)-compatible Nedelec (first kind) basis of arbitrary degree on Te...
Basis_HCURL_TET_In_FEM(const ordinal_type order, const EPointType pointType=POINTTYPE_EQUISPACED)
Constructor.
virtual const char * getName() const
Returns basis name.
Kokkos::DynRankView< scalarType, ExecSpaceType > coeffs_
expansion coefficients of the nodal basis in terms of the orthgonal one
virtual bool requireOrientation() const
True if orientation is required.
An abstract base class that defines interface for concrete basis implementations for Finite Element (...
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, ExecSpaceType > PointViewType
View type for input points.
Kokkos::DynRankView< scalarType, void > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space.
shards::CellTopology getBaseCellTopology() const
Returns the base cell topology for which the basis is defined. See Shards documentation https://trili...
Kokkos::View< ordinal_type *, typename ExecSpaceType::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
View type for 1d host array.
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, ExecSpaceType > ScalarViewType
View type for scalars.
Kokkos::DynRankView< scalarType, void > dofCoeffs_
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
Kokkos::View< ordinal_type ***, typename ExecSpaceType::array_layout, Kokkos::HostSpace > OrdinalTypeArray3DHost
View type for 3d host array.
Kokkos::View< ordinal_type **, typename ExecSpaceType::array_layout, Kokkos::HostSpace > OrdinalTypeArray2DHost
View type for 2d host array.
Kokkos::DynRankView< OutputValueType, Kokkos::LayoutStride, ExecSpaceType > OutputViewType
View type for basis value output.
ordinal_type getCardinality() const
Returns cardinality of the basis.
ScalarTraits< pointValueType >::scalar_type scalarType
Scalar type for point values.
See Intrepid2::Basis_HCURL_TET_In_FEM.
static constexpr ordinal_type MaxNumPtsPerBasisEval
The maximum number of points to eval in serial mode.
See Intrepid2::Basis_HCURL_TET_In_FEM.
See Intrepid2::Basis_HCURL_TET_In_FEM.
Tetrahedron topology, 4 nodes.