Intrepid2
Intrepid2_HDIV_HEX_In_FEM.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Intrepid2 Package
4//
5// Copyright 2007 NTESS and the Intrepid2 contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
15
16#ifndef __INTREPID2_HDIV_HEX_IN_FEM_HPP__
17#define __INTREPID2_HDIV_HEX_IN_FEM_HPP__
18
19#include "Intrepid2_Basis.hpp"
22
23namespace Intrepid2 {
24
25 namespace Impl {
26
31 public:
32 typedef struct Hexahedron<8> cell_topology_type;
36 template<EOperator opType>
37 struct Serial {
38 template<typename outputValueViewType,
39 typename inputPointViewType,
40 typename workViewType,
41 typename vinvViewType>
42 KOKKOS_INLINE_FUNCTION
43 static void
44 getValues( outputValueViewType outputValues,
45 const inputPointViewType inputPoints,
46 workViewType work,
47 const vinvViewType vinvLine,
48 const vinvViewType vinvBubble );
49
50 KOKKOS_INLINE_FUNCTION
51 static ordinal_type
52 getWorkSizePerPoint(ordinal_type order) {
53 return 2*getPnCardinality<1>(order)+2*getPnCardinality<1>(order-1);
54 }
55 };
56
57 template<typename DeviceType, ordinal_type numPtsPerEval,
58 typename outputValueValueType, class ...outputValueProperties,
59 typename inputPointValueType, class ...inputPointProperties,
60 typename vinvValueType, class ...vinvProperties>
61 static void
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 );
67
71 template<typename outputValueViewType,
72 typename inputPointViewType,
73 typename vinvViewType,
74 typename workViewType,
75 EOperator opType,
76 ordinal_type numPtsEval>
77 struct Functor {
78 outputValueViewType _outputValues;
79 const inputPointViewType _inputPoints;
80 const vinvViewType _vinvLine;
81 const vinvViewType _vinvBubble;
82 workViewType _work;
83
84 KOKKOS_INLINE_FUNCTION
85 Functor( outputValueViewType outputValues_,
86 inputPointViewType inputPoints_,
87 vinvViewType vinvLine_,
88 vinvViewType vinvBubble_,
89 workViewType work_)
90 : _outputValues(outputValues_), _inputPoints(inputPoints_),
91 _vinvLine(vinvLine_), _vinvBubble(vinvBubble_), _work(work_) {}
92
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));
97
98 const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
99 const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
100
101 typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
102
103 workViewType work = createMatchingUnmanagedView<workViewType>(_work, ptr, (ptEnd-ptBegin)*_work.extent(0));
104
105 switch (opType) {
106 case OPERATOR_VALUE : {
107 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
108 Serial<opType>::getValues( output, input, work, _vinvLine, _vinvBubble );
109 break;
110 }
111 case OPERATOR_DIV : {
112 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange );
113 Serial<opType>::getValues( output, input, work, _vinvLine, _vinvBubble );
114 break;
115 }
116 default: {
117 INTREPID2_TEST_FOR_ABORT( true,
118 ">>> ERROR: (Intrepid2::Basis_HDIV_HEX_In_FEM::Functor) operator is not supported." );
119
120 }
121 }
122 }
123 };
124 };
125 }
126
134 template<typename DeviceType = void,
135 typename outputValueType = double,
136 typename pointValueType = double>
138 : public Basis<DeviceType,outputValueType,pointValueType> {
139 public:
140 using BasisBase = Basis<DeviceType, outputValueType, pointValueType>;
141 using OrdinalTypeArray1DHost = typename BasisBase::OrdinalTypeArray1DHost;
142 using OrdinalTypeArray2DHost = typename BasisBase::OrdinalTypeArray2DHost;
143 using OrdinalTypeArray3DHost = typename BasisBase::OrdinalTypeArray3DHost;
144
147 Basis_HDIV_HEX_In_FEM(const ordinal_type order,
148 const EPointType pointType = POINTTYPE_EQUISPACED);
149
150 using OutputViewType = typename BasisBase::OutputViewType;
151 using PointViewType = typename BasisBase::PointViewType;
152 using ScalarViewType = typename BasisBase::ScalarViewType;
153
155
156 virtual
157 void
158 getValues( OutputViewType outputValues,
159 const PointViewType inputPoints,
160 const EOperator operatorType = OPERATOR_VALUE ) const override {
161#ifdef HAVE_INTREPID2_DEBUG
163 inputPoints,
164 operatorType,
165 this->getBaseCellTopology(),
166 this->getCardinality() );
167#endif
168 constexpr ordinal_type numPtsPerEval = 1;
169 Impl::Basis_HDIV_HEX_In_FEM::
170 getValues<DeviceType,numPtsPerEval>( outputValues,
171 inputPoints,
172 this->vinvLine_,
173 this->vinvBubble_,
174 operatorType );
175 }
176
177 virtual void
178 getScratchSpaceSize( ordinal_type& perTeamSpaceSize,
179 ordinal_type& perThreadSpaceSize,
180 const PointViewType inputPointsconst,
181 const EOperator operatorType = OPERATOR_VALUE) const override;
182
183 KOKKOS_INLINE_FUNCTION
184 virtual void
185 getValues(
186 OutputViewType outputValues,
187 const PointViewType inputPoints,
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;
193
194 virtual
195 void
196 getDofCoords( ScalarViewType dofCoords ) const override {
197#ifdef HAVE_INTREPID2_DEBUG
198 // Verify rank of output array.
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");
201 // Verify 0th dimension of output 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");
204 // Verify 1st dimension of output 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");
207#endif
208 Kokkos::deep_copy(dofCoords, this->dofCoords_);
209 }
210
211
212 virtual
213 void
214 getDofCoeffs( ScalarViewType dofCoeffs ) const override {
215#ifdef HAVE_INTREPID2_DEBUG
216 // Verify rank of output array.
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");
219 // Verify 0th dimension of output 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");
222 // Verify 1st dimension of output 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");
225#endif
226 Kokkos::deep_copy(dofCoeffs, this->dofCoeffs_);
227 }
228
229 virtual
230 const char*
231 getName() const override {
232 return "Intrepid2_HDIV_HEX_In_FEM";
233 }
234
235 virtual
236 bool
237 requireOrientation() const override {
238 return true;
239 }
240
251 getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override{
252
253 if(subCellDim == 2) {
254 return Teuchos::rcp(new
256 (this->basisDegree_-1,POINTTYPE_GAUSS));
257 }
258 INTREPID2_TEST_FOR_EXCEPTION(true,std::invalid_argument,"Input parameters out of bounds");
259 }
260
265 private:
266
268 Kokkos::DynRankView<typename ScalarViewType::value_type,DeviceType> vinvLine_, vinvBubble_;
269 EPointType pointType_;
270 };
271
272}// namespace Intrepid2
273
275
276#endif
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.
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.