Intrepid2
Intrepid2_HCURL_TRI_I1_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_TRI_I1_FEM_HPP
50 #define INTREPID2_HCURL_TRI_I1_FEM_HPP
51 
52 #include "Intrepid2_Basis.hpp"
53 
54 namespace Intrepid2 {
55 
96  namespace Impl {
97 
102  public:
103  typedef struct Triangle<3> cell_topology_type;
107  template<EOperator opType>
108  struct Serial {
109  template<typename outputViewType,
110  typename inputViewType>
111  KOKKOS_INLINE_FUNCTION
112  static void
113  getValues( outputViewType output,
114  const inputViewType input );
115 
116  };
117 
118  template<typename ExecSpaceType,
119  typename outputValueValueType, class ...outputValueProperties,
120  typename inputPointValueType, class ...inputPointProperties>
121  static void
122  getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
123  const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
124  const EOperator operatorType);
125 
129  template<typename outputValueViewType,
130  typename inputPointViewType,
131  EOperator opType>
132  struct Functor {
133  outputValueViewType _outputValues;
134  const inputPointViewType _inputPoints;
135 
136  KOKKOS_INLINE_FUNCTION
137  Functor( outputValueViewType outputValues_,
138  inputPointViewType inputPoints_ )
139  : _outputValues(outputValues_), _inputPoints(inputPoints_) {}
140 
141  KOKKOS_INLINE_FUNCTION
142  void operator()(const ordinal_type pt) const {
143  switch (opType) {
144  case OPERATOR_VALUE : {
145  auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt, Kokkos::ALL() );
146  const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
147  Serial<opType>::getValues( output, input );
148  break;
149  }
150  case OPERATOR_CURL : {
151  auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt );
152  const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
153  Serial<opType>::getValues( output, input );
154  break;
155  }
156  case OPERATOR_DIV: {
157  INTREPID2_TEST_FOR_ABORT( (opType == OPERATOR_DIV),
158  ">>> ERROR (Basis_HCURL_TRI_I1_FEM): DIV is invalid operator for HCURL Basis Functions");
159  break;
160  }
161  case OPERATOR_GRAD: {
162  INTREPID2_TEST_FOR_ABORT( (opType == OPERATOR_GRAD),
163  ">>> ERROR (Basis_HCURL_TRI_I1_FEM): GRAD is invalid operator for HCURL Basis Functions");
164  break;
165  }
166  default: {
167  INTREPID2_TEST_FOR_ABORT( opType != OPERATOR_VALUE &&
168  opType != OPERATOR_CURL,
169  ">>> ERROR: (Intrepid2::Basis_HCURL_QUAD_I1_FEM::Serial::getValues) operator is not supported");
170  }
171  }
172  }
173  };
174 
175  };
176  }
177 
178  template< typename ExecSpaceType = void,
179  typename outputValueType = double,
180  typename pointValueType = double >
181  class Basis_HCURL_TRI_I1_FEM : public Basis<ExecSpaceType, outputValueType, pointValueType> {
182  public:
186 
190 
194 
196 
197  virtual
198  void
199  getValues( outputViewType outputValues,
200  const pointViewType inputPoints,
201  const EOperator operatorType = OPERATOR_VALUE ) const {
202 #ifdef HAVE_INTREPID2_DEBUG
203  // Verify arguments
204  Intrepid2::getValues_HCURL_Args(outputValues,
205  inputPoints,
206  operatorType,
207  this->getBaseCellTopology(),
208  this->getCardinality() );
209 #endif
210  Impl::Basis_HCURL_TRI_I1_FEM::
211  getValues<ExecSpaceType>( outputValues,
212  inputPoints,
213  operatorType );
214  }
215 
216  virtual
217  void
218  getDofCoords( scalarViewType dofCoords ) const {
219 #ifdef HAVE_INTREPID2_DEBUG
220  // Verify rank of output array.
221  INTREPID2_TEST_FOR_EXCEPTION( dofCoords.rank() != 2, std::invalid_argument,
222  ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoords) rank = 2 required for dofCoords array");
223  // Verify 0th dimension of output array.
224  INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->basisCardinality_, std::invalid_argument,
225  ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
226  // Verify 1st dimension of output array.
227  INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->basisCellTopology_.getDimension(), std::invalid_argument,
228  ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
229 #endif
230  Kokkos::deep_copy(dofCoords, this->dofCoords_);
231  }
232 
233  virtual
234  void
235  getDofCoeffs( scalarViewType dofCoeffs ) const {
236 #ifdef HAVE_INTREPID2_DEBUG
237  // Verify rank of output array.
238  INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.rank() != 2, std::invalid_argument,
239  ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoeffs) rank = 2 required for dofCoeffs array");
240  // Verify 0th dimension of output array.
241  INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->getCardinality(), std::invalid_argument,
242  ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
243  // Verify 1st dimension of output array.
244  INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
245  ">>> ERROR: (Intrepid2::Basis_HCURL_TRI_I1_FEM::getDofCoeffs) incorrect reference cell (1st) dimension in dofCoeffs array");
246 #endif
247  Kokkos::deep_copy(dofCoeffs, this->dofCoeffs_);
248  }
249 
250 
251  virtual
252  const char*
253  getName() const {
254  return "Intrepid2_HCURL_TRI_I1_FEM";
255  }
256 
257  virtual
258  bool
260  return true;
261  }
262 
263  };
264 
265 }// namespace Intrepid2
266 
268 
269 #endif
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, ExecSpaceType > scalarViewType
View type for scalars.
ordinal_type basisCardinality_
Cardinality of the basis, i.e., the number of basis functions/degrees-of-freedom. ...
virtual void getDofCoords(scalarViewType dofCoords) const
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
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.
Definition file for default FEM basis functions of degree 1 for H(curl) functions on Triangle cells...
See Intrepid2::Basis_HCURL_TRI_I1_FEM.
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 getValues(outputViewType outputValues, const pointViewType inputPoints, const EOperator operatorType=OPERATOR_VALUE) const
Evaluation of a FEM basis on a reference cell.
virtual void getDofCoeffs(scalarViewType dofCoeffs) const
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 > ordinal_type_array_1d_host
View type for 1d host array.
Kokkos::DynRankView< pointValueType, Kokkos::LayoutStride, ExecSpaceType > pointViewType
View type for input points.
virtual const char * getName() const
Returns basis name.
Implementation of the default H(curl)-compatible FEM basis of degree 1 on Triangle cell...
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.
shards::CellTopology basisCellTopology_
Base topology of the cells for which the basis is defined. See the Shards package for definition of b...