Intrepid2
Intrepid2_HCURL_HEX_In_FEM.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ************************************************************************
3 //
4 // Intrepid2 Package
5 // Copyright (2007) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Kyungjoo Kim (kyukim@sandia.gov), or
38 // Mauro Perego (mperego@sandia.gov)
39 //
40 // ************************************************************************
41 // @HEADER
42 
49 #ifndef __INTREPID2_HCURL_HEX_IN_FEM_HPP__
50 #define __INTREPID2_HCURL_HEX_IN_FEM_HPP__
51 
52 #include "Intrepid2_Basis.hpp"
54 
55 namespace Intrepid2 {
56 
57  namespace Impl {
58 
63  public:
64  typedef struct Hexahedron<8> cell_topology_type;
65 
69  template<EOperator opType>
70  struct Serial {
71  template<typename outputValueViewType,
72  typename inputPointViewType,
73  typename workViewType,
74  typename vinvViewType>
75  KOKKOS_INLINE_FUNCTION
76  static void
77  getValues( outputValueViewType outputValues,
78  const inputPointViewType inputPoints,
79  workViewType work,
80  const vinvViewType vinvLine,
81  const vinvViewType vinvBubble );
82 
83  KOKKOS_INLINE_FUNCTION
84  static ordinal_type
85  getWorkSizePerPoint(ordinal_type order) {
86  switch(opType) {
87  case OPERATOR_VALUE:
88  return 3*getPnCardinality<1>(order)+getPnCardinality<1>(order-1);
89  case OPERATOR_CURL:
90  return 5*getPnCardinality<1>(order)+getPnCardinality<1>(order-1);
91  default: {
92  INTREPID2_TEST_FOR_ABORT( true,
93  ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::Serial::getWorkSizePerPoint) operator is not supported" );
94  return 0;
95  }
96  }
97  }
98  };
99 
100  template<typename ExecSpaceType, ordinal_type numPtsPerEval,
101  typename outputValueValueType, class ...outputValueProperties,
102  typename inputPointValueType, class ...inputPointProperties,
103  typename vinvValueType, class ...vinvProperties>
104  static void
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 );
110 
114  template<typename outputValueViewType,
115  typename inputPointViewType,
116  typename vinvViewType,
117  typename workViewType,
118  EOperator opType,
119  ordinal_type numPtsEval>
120  struct Functor {
121  outputValueViewType _outputValues;
122  const inputPointViewType _inputPoints;
123  const vinvViewType _vinvLine;
124  const vinvViewType _vinvBubble;
125  workViewType _work;
126 
127  KOKKOS_INLINE_FUNCTION
128  Functor( outputValueViewType outputValues_,
129  inputPointViewType inputPoints_,
130  vinvViewType vinvLine_,
131  vinvViewType vinvBubble_,
132  workViewType work_)
133  : _outputValues(outputValues_), _inputPoints(inputPoints_),
134  _vinvLine(vinvLine_), _vinvBubble(vinvBubble_), _work(work_) {}
135 
136  KOKKOS_INLINE_FUNCTION
137  void operator()(const size_type iter) const {
138  const auto ptBegin = Util<ordinal_type>::min(iter*numPtsEval, _inputPoints.extent(0));
139  const auto ptEnd = Util<ordinal_type>::min(ptBegin+numPtsEval, _inputPoints.extent(0));
140 
141  const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
142  const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
143 
144  typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
145 
146  auto vcprop = Kokkos::common_view_alloc_prop(_work);
147  workViewType work(Kokkos::view_wrap(ptr,vcprop), (ptEnd-ptBegin)*_work.extent(0));
148 
149  switch (opType) {
150  case OPERATOR_VALUE : {
151  auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
152  Serial<opType>::getValues( output, input, work, _vinvLine, _vinvBubble );
153  break;
154  }
155  case OPERATOR_CURL : {
156  auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
157  Serial<opType>::getValues( output, input, work, _vinvLine, _vinvBubble );
158  break;
159  }
160  default: {
161  INTREPID2_TEST_FOR_ABORT( true,
162  ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::Functor) operator is not supported." );
163 
164  }
165  }
166  }
167  };
168  };
169  }
170 
178  template<typename ExecSpaceType = void,
179  typename outputValueType = double,
180  typename pointValueType = double>
182  : public Basis<ExecSpaceType,outputValueType,pointValueType> {
183  public:
187 
190  Basis_HCURL_HEX_In_FEM(const ordinal_type order,
191  const EPointType pointType = POINTTYPE_EQUISPACED);
192 
196 
198 
199  virtual
200  void
201  getValues( outputViewType outputValues,
202  const pointViewType inputPoints,
203  const EOperator operatorType = OPERATOR_VALUE ) const {
204 #ifdef HAVE_INTREPID2_DEBUG
205  Intrepid2::getValues_HCURL_Args(outputValues,
206  inputPoints,
207  operatorType,
208  this->getBaseCellTopology(),
209  this->getCardinality() );
210 #endif
211  constexpr ordinal_type numPtsPerEval = 1;
212  Impl::Basis_HCURL_HEX_In_FEM::
213  getValues<ExecSpaceType,numPtsPerEval>( outputValues,
214  inputPoints,
215  this->vinvLine_,
216  this->vinvBubble_,
217  operatorType );
218  }
219 
220  virtual
221  void
222  getDofCoords( scalarViewType dofCoords ) const {
223 #ifdef HAVE_INTREPID2_DEBUG
224  // Verify rank of output array.
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");
227  // Verify 0th dimension of output 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");
230  // Verify 1st dimension of output 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");
233 #endif
234  Kokkos::deep_copy(dofCoords, this->dofCoords_);
235  }
236 
237  virtual
238  void
239  getDofCoeffs( scalarViewType dofCoeffs ) const {
240 #ifdef HAVE_INTREPID2_DEBUG
241  // Verify rank of output array.
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");
244  // Verify 0th dimension of output 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");
247  // Verify 1st dimension of output 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");
250 #endif
251  Kokkos::deep_copy(dofCoeffs, this->dofCoeffs_);
252  }
253 
254  virtual
255  const char*
256  getName() const {
257  return "Intrepid2_HCURL_HEX_In_FEM";
258  }
259 
260  virtual
261  bool
263  return true;
264  }
265 
266  private:
267 
269  Kokkos::DynRankView<typename scalarViewType::value_type,ExecSpaceType> vinvLine_, vinvBubble_;
270  };
271 
272 }// namespace Intrepid2
273 
274 
275 
277 
278 #endif
Header file for the Intrepid2::Basis_HGRAD_LINE_Cn_FEM class.
small utility functions
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...
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.
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)