Intrepid2
Intrepid2_HCURL_TET_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_TET_I1_FEM_HPP__
17 #define __INTREPID2_HCURL_TET_I1_FEM_HPP__
18 
19 #include "Intrepid2_Basis.hpp"
21 
22 namespace Intrepid2 {
23 
71  namespace Impl {
72 
77  public:
78  typedef struct Tetrahedron<4> cell_topology_type;
79 
83  template<EOperator opType>
84  struct Serial {
85  template<typename OutputViewType,
86  typename inputViewType>
87  KOKKOS_INLINE_FUNCTION
88  static void
89  getValues( OutputViewType output,
90  const inputViewType input );
91 
92  };
93 
94  template<typename DeviceType,
95  typename outputValueValueType, class ...outputValueProperties,
96  typename inputPointValueType, class ...inputPointProperties>
97  static void
98  getValues( const typename DeviceType::execution_space& space,
99  Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
100  const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
101  const EOperator operatorType);
102 
106  template<typename outputValueViewType,
107  typename inputPointViewType,
108  EOperator opType>
109  struct Functor {
110  outputValueViewType _outputValues;
111  const inputPointViewType _inputPoints;
112 
113  KOKKOS_INLINE_FUNCTION
114  Functor( outputValueViewType outputValues_,
115  inputPointViewType inputPoints_ )
116  : _outputValues(outputValues_), _inputPoints(inputPoints_) {}
117 
118  KOKKOS_INLINE_FUNCTION
119  void operator()(const ordinal_type pt) const {
120  switch (opType) {
121  case OPERATOR_VALUE : {
122  auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt, Kokkos::ALL() );
123  const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
124  Serial<opType>::getValues( output, input );
125  break;
126  }
127  case OPERATOR_CURL : {
128  auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt, Kokkos::ALL() );
129  const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
130  Serial<opType>::getValues( output, input );
131  break;
132  }
133  default: {
134  INTREPID2_TEST_FOR_ABORT( opType != OPERATOR_VALUE &&
135  opType != OPERATOR_CURL,
136  ">>> ERROR: (Intrepid2::Basis_HCURL_TET_I1_FEM::Serial::getValues) operator is not supported");
137  }
138  }
139  }
140  };
141  };
142  }
143 
144  template<typename DeviceType = void,
145  typename outputValueType = double,
146  typename pointValueType = double>
147  class Basis_HCURL_TET_I1_FEM : public Basis<DeviceType,outputValueType,pointValueType> {
148  public:
150  using typename BasisBase::ExecutionSpace;
151 
152  using typename BasisBase::OrdinalTypeArray1DHost;
153  using typename BasisBase::OrdinalTypeArray2DHost;
154  using typename BasisBase::OrdinalTypeArray3DHost;
155 
156  using typename BasisBase::OutputViewType;
157  using typename BasisBase::PointViewType ;
158  using typename BasisBase::ScalarViewType;
159 
163 
164  using BasisBase::getValues;
165 
166  virtual
167  void
168  getValues( const ExecutionSpace& space,
169  OutputViewType outputValues,
170  const PointViewType inputPoints,
171  const EOperator operatorType = OPERATOR_VALUE ) const override {
172 #ifdef HAVE_INTREPID2_DEBUG
173  // Verify arguments
174  Intrepid2::getValues_HCURL_Args(outputValues,
175  inputPoints,
176  operatorType,
177  this->getBaseCellTopology(),
178  this->getCardinality() );
179 #endif
180  Impl::Basis_HCURL_TET_I1_FEM::
181  getValues<DeviceType>(space,
182  outputValues,
183  inputPoints,
184  operatorType);
185  }
186 
187  virtual void
188  getScratchSpaceSize( ordinal_type& perTeamSpaceSize,
189  ordinal_type& perThreadSpaceSize,
190  const PointViewType inputPointsconst,
191  const EOperator operatorType = OPERATOR_VALUE) const override;
192 
193  KOKKOS_INLINE_FUNCTION
194  virtual void
195  getValues(
196  OutputViewType outputValues,
197  const PointViewType inputPoints,
198  const EOperator operatorType,
199  const typename Kokkos::TeamPolicy<typename DeviceType::execution_space>::member_type& team_member,
200  const typename DeviceType::execution_space::scratch_memory_space & scratchStorage,
201  const ordinal_type subcellDim = -1,
202  const ordinal_type subcellOrdinal = -1) const override;
203 
204  virtual
205  void
206  getDofCoords( ScalarViewType dofCoords ) const override {
207 #ifdef HAVE_INTREPID2_DEBUG
208  // Verify rank of output array.
209  INTREPID2_TEST_FOR_EXCEPTION( rank(dofCoords) != 2, std::invalid_argument,
210  ">>> ERROR: (Intrepid2::Basis_HCURL_TET_I1_FEM::getDofCoords) rank = 2 required for dofCoords array");
211  // Verify 0th dimension of output array.
212  INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->basisCardinality_, std::invalid_argument,
213  ">>> ERROR: (Intrepid2::Basis_HCURL_TET_I1_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
214  // Verify 1st dimension of output array.
215  INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
216  ">>> ERROR: (Intrepid2::Basis_HCURL_TET_I1_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
217 #endif
218  Kokkos::deep_copy(dofCoords, this->dofCoords_);
219  }
220 
221 
222  virtual
223  void
224  getDofCoeffs( ScalarViewType dofCoeffs ) const override {
225 #ifdef HAVE_INTREPID2_DEBUG
226  // Verify rank of output array.
227  INTREPID2_TEST_FOR_EXCEPTION( rank(dofCoeffs) != 2, std::invalid_argument,
228  ">>> ERROR: (Intrepid2::Basis_HCURL_TET_I1_FEM::getDofCoeffs) rank = 2 required for dofCoeffs array");
229  // Verify 0th dimension of output array.
230  INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->getCardinality(), std::invalid_argument,
231  ">>> ERROR: (Intrepid2::Basis_HCURL_TET_I1_FEM::getDofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
232  // Verify 1st dimension of output array.
233  INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
234  ">>> ERROR: (Intrepid2::Basis_HCURL_TET_I1_FEM::getDofCoeffs) incorrect reference cell (1st) dimension in dofCoeffs array");
235 #endif
236  Kokkos::deep_copy(dofCoeffs, this->dofCoeffs_);
237  }
238 
239  virtual
240  const char*
241  getName() const override {
242  return "Intrepid2_HCURL_TET_I1_FEM";
243  }
244 
245  virtual
246  bool
247  requireOrientation() const override {
248  return true;
249  }
250 
260  BasisPtr<DeviceType,outputValueType,pointValueType>
261  getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override{
262 
263  if(subCellDim == 1)
264  return Teuchos::rcp( new
265  Basis_HVOL_C0_FEM<DeviceType,outputValueType,pointValueType>(shards::getCellTopologyData<shards::Line<2> >()));
266  else if(subCellDim == 2) {
267  return Teuchos::rcp(new
269  }
270 
271  INTREPID2_TEST_FOR_EXCEPTION(true,std::invalid_argument,"Input parameters out of bounds");
272  }
273 
274  BasisPtr<typename Kokkos::HostSpace::device_type,outputValueType,pointValueType>
275  getHostBasis() const override{
277  }
278 
279 
280  };
281 }// namespace Intrepid2
282 
284 
285 #endif
Kokkos::View< ordinal_type *, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
View type for 1d host array.
ordinal_type getCardinality() const
Returns cardinality of the basis.
See Intrepid2::Basis_HCURL_TET_I1_FEM.
Kokkos::DynRankView< OutputValueType, Kokkos::LayoutStride, DeviceType > OutputViewType
View type for basis value output.
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 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 bool requireOrientation() const override
True if orientation is required.
An abstract base class that defines interface for concrete basis implementations for Finite Element (...
shards::CellTopology getBaseCellTopology() const
Returns the base cell topology for which the basis is defined. See Shards documentation https://trili...
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, DeviceType > ScalarViewType
View type for scalars.
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::View< ordinal_type **, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray2DHost
View type for 2d host array.
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, DeviceType > ScalarViewType
View type for scalars.
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...
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.
Kokkos::DynRankView< OutputValueType, Kokkos::LayoutStride, DeviceType > OutputViewType
View type for basis value output.
Definition file for FEM basis functions of degree 1 for H(curl) functions on TET cells.
Implementation of the default HVOL-compatible FEM contstant basis on triangle, quadrilateral, hexahedron and tetrahedron cells.
Implementation of the default H(curl)-compatible FEM basis of degree 1 on Triangle cell...
ordinal_type basisCardinality_
Cardinality of the basis, i.e., the number of basis functions/degrees-of-freedom. ...
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
View type for input points.
typename DeviceType::execution_space ExecutionSpace
(Kokkos) Execution space for basis.
BasisPtr< DeviceType, outputValueType, pointValueType > getSubCellRefBasis(const ordinal_type subCellDim, const ordinal_type subCellOrd) const override
returns the basis associated to a subCell.
Kokkos::View< ordinal_type ***, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray3DHost
View type for 3d host array.
Kokkos::DynRankView< scalarType, DeviceType > dofCoeffs_
Coefficients for computing degrees of freedom for Lagrangian basis If P is an element of the space sp...
Implementation of the default H(curl)-compatible FEM basis of degree 1 on Tetrahedron cell...
Header file for the Intrepid2::Basis_HCURL_TRI_I1_FEM class.
Kokkos::DynRankView< scalarType, DeviceType > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space.
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
View type for input points.
virtual const char * getName() const override
Returns basis name.
virtual void getDofCoords(ScalarViewType dofCoords) const override
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
Header file for the abstract base class Intrepid2::Basis.
typename DeviceType::execution_space ExecutionSpace
(Kokkos) Execution space for basis.