Intrepid2
Intrepid2_HCURL_TRI_I1_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
16#ifndef INTREPID2_HCURL_TRI_I1_FEM_HPP
17#define INTREPID2_HCURL_TRI_I1_FEM_HPP
18
19#include "Intrepid2_Basis.hpp"
21
22namespace Intrepid2 {
23
64 namespace Impl {
65
70 public:
71 typedef struct Triangle<3> cell_topology_type;
75 template<EOperator opType>
76 struct Serial {
77 template<typename OutputViewType,
78 typename inputViewType>
79 KOKKOS_INLINE_FUNCTION
80 static void
81 getValues( OutputViewType output,
82 const inputViewType input );
83
84 };
85
86 template<typename DeviceType,
87 typename outputValueValueType, class ...outputValueProperties,
88 typename inputPointValueType, class ...inputPointProperties>
89 static void
90 getValues( const typename DeviceType::execution_space& space,
91 Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
92 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
93 const EOperator operatorType);
94
98 template<typename outputValueViewType,
99 typename inputPointViewType,
100 EOperator opType>
101 struct Functor {
102 outputValueViewType _outputValues;
103 const inputPointViewType _inputPoints;
104
105 KOKKOS_INLINE_FUNCTION
106 Functor( outputValueViewType outputValues_,
107 inputPointViewType inputPoints_ )
108 : _outputValues(outputValues_), _inputPoints(inputPoints_) {}
109
110 KOKKOS_INLINE_FUNCTION
111 void operator()(const ordinal_type pt) const {
112 switch (opType) {
113 case OPERATOR_VALUE : {
114 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt, Kokkos::ALL() );
115 const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
116 Serial<opType>::getValues( output, input );
117 break;
118 }
119 case OPERATOR_CURL : {
120 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt );
121 const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
122 Serial<opType>::getValues( output, input );
123 break;
124 }
125 case OPERATOR_DIV: {
126 INTREPID2_TEST_FOR_ABORT( (opType == OPERATOR_DIV),
127 ">>> ERROR (Basis_HCURL_TRI_I1_FEM): DIV is invalid operator for HCURL Basis Functions");
128 break;
129 }
130 case OPERATOR_GRAD: {
131 INTREPID2_TEST_FOR_ABORT( (opType == OPERATOR_GRAD),
132 ">>> ERROR (Basis_HCURL_TRI_I1_FEM): GRAD is invalid operator for HCURL Basis Functions");
133 break;
134 }
135 default: {
136 INTREPID2_TEST_FOR_ABORT( opType != OPERATOR_VALUE &&
137 opType != OPERATOR_CURL,
138 ">>> ERROR: (Intrepid2::Basis_HCURL_QUAD_I1_FEM::Serial::getValues) operator is not supported");
139 }
140 }
141 }
142 };
143
144 };
145 }
146
147 template< typename DeviceType = void,
148 typename outputValueType = double,
149 typename pointValueType = double >
150 class Basis_HCURL_TRI_I1_FEM : public Basis<DeviceType, outputValueType, pointValueType> {
151 public:
153 using typename BasisBase::ExecutionSpace;
154
158
159 using typename BasisBase::OutputViewType;
160 using typename BasisBase::PointViewType ;
161 using typename BasisBase::ScalarViewType;
162
166
168
169 virtual
170 void
172 OutputViewType outputValues,
173 const PointViewType inputPoints,
174 const EOperator operatorType = OPERATOR_VALUE ) const override {
175#ifdef HAVE_INTREPID2_DEBUG
176 // Verify arguments
178 inputPoints,
179 operatorType,
180 this->getBaseCellTopology(),
181 this->getCardinality() );
182#endif
183 Impl::Basis_HCURL_TRI_I1_FEM::
184 getValues<DeviceType>(space,
185 outputValues,
186 inputPoints,
187 operatorType);
188 }
189
190 virtual void
191 getScratchSpaceSize( ordinal_type& perTeamSpaceSize,
192 ordinal_type& perThreadSpaceSize,
193 const PointViewType inputPointsconst,
194 const EOperator operatorType = OPERATOR_VALUE) const override;
195
196 KOKKOS_INLINE_FUNCTION
197 virtual void
198 getValues(
199 OutputViewType outputValues,
200 const PointViewType inputPoints,
201 const EOperator operatorType,
202 const typename Kokkos::TeamPolicy<typename DeviceType::execution_space>::member_type& team_member,
203 const typename DeviceType::execution_space::scratch_memory_space & scratchStorage,
204 const ordinal_type subcellDim = -1,
205 const ordinal_type subcellOrdinal = -1) const override;
206
207 virtual
208 void
209 getDofCoords( ScalarViewType dofCoords ) const override {
210#ifdef HAVE_INTREPID2_DEBUG
211 // Verify rank of output array.
212 INTREPID2_TEST_FOR_EXCEPTION( rank(dofCoords) != 2, std::invalid_argument,
213 ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoords) rank = 2 required for dofCoords array");
214 // Verify 0th dimension of output array.
215 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->basisCardinality_, std::invalid_argument,
216 ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
217 // Verify 1st dimension of output array.
218 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
219 ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
220#endif
221 Kokkos::deep_copy(dofCoords, this->dofCoords_);
222 }
223
224 virtual
225 void
226 getDofCoeffs( ScalarViewType dofCoeffs ) const override {
227#ifdef HAVE_INTREPID2_DEBUG
228 // Verify rank of output array.
229 INTREPID2_TEST_FOR_EXCEPTION( rank(dofCoeffs) != 2, std::invalid_argument,
230 ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoeffs) rank = 2 required for dofCoeffs array");
231 // Verify 0th dimension of output array.
232 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->getCardinality(), std::invalid_argument,
233 ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
234 // Verify 1st dimension of output array.
235 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
236 ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoeffs) incorrect reference cell (1st) dimension in dofCoeffs array");
237#endif
238 Kokkos::deep_copy(dofCoeffs, this->dofCoeffs_);
239 }
240
241
242 virtual
243 const char*
244 getName() const override {
245 return "Intrepid2_HCURL_TRI_I1_FEM";
246 }
247
248 virtual
249 bool
250 requireOrientation() const override {
251 return true;
252 }
253
264 getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override{
265 if(subCellDim == 1)
266 return Teuchos::rcp( new
267 Basis_HVOL_C0_FEM<DeviceType,outputValueType,pointValueType>(shards::getCellTopologyData<shards::Line<2> >()));
268
269 INTREPID2_TEST_FOR_EXCEPTION(true,std::invalid_argument,"Input parameters out of bounds");
270 }
271
276 };
277
278}// namespace Intrepid2
279
281
282#endif
Header file for the abstract base class Intrepid2::Basis.
Teuchos::RCP< Basis< DeviceType, OutputType, PointType > > BasisPtr
Basis Pointer.
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 default FEM basis functions of degree 1 for H(curl) functions on Triangle cells.
Header file for the Intrepid2::Basis_HVOL_C0_FEM class.
Implementation of the default H(curl)-compatible FEM basis of degree 1 on Triangle cell.
virtual bool requireOrientation() const override
True if orientation is required.
virtual void getDofCoords(ScalarViewType dofCoords) const override
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
virtual void getValues(const ExecutionSpace &space, OutputViewType outputValues, const PointViewType inputPoints, const EOperator operatorType=OPERATOR_VALUE) const override
Evaluation of a FEM basis on a reference cell.
virtual void getScratchSpaceSize(ordinal_type &perTeamSpaceSize, ordinal_type &perThreadSpaceSize, const PointViewType inputPointsconst, const EOperator operatorType=OPERATOR_VALUE) const override
Return the size of the scratch space, in bytes, needed for using the team-level implementation of get...
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.
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.
Implementation of the default HVOL-compatible FEM contstant basis on triangle, quadrilateral,...
An abstract base class that defines interface for concrete basis implementations for Finite Element (...
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
View type for 3d host array.
ordinal_type getCardinality() const
Returns cardinality of 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
View type for 2d host array.
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 ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
View type for 1d host array.
typename DeviceType::execution_space ExecutionSpace
(Kokkos) Execution space for basis.
See Intrepid2::Basis_HCURL_TRI_I1_FEM.