Intrepid2
Intrepid2_HGRAD_TRI_Cn_FEM_ORTH.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_HGRAD_TRI_CN_FEM_ORTH_HPP__
50#define __INTREPID2_HGRAD_TRI_CN_FEM_ORTH_HPP__
51
52#include "Intrepid2_Basis.hpp"
53
54namespace Intrepid2 {
55
65namespace Impl {
66
70template<typename OutputViewType,
71typename inputViewType,
72typename workViewType,
73bool hasDeriv, ordinal_type n>
76 static void
77 generate( OutputViewType output,
78 const inputViewType input,
80 const ordinal_type p );
81};
82
86template<typename OutputViewType,
87typename inputViewType,
88typename workViewType,
89bool hasDeriv>
92 static void
93 generate( OutputViewType output,
94 const inputViewType input,
96 const ordinal_type p );
97};
98
102template<typename OutputViewType,
103typename inputViewType,
104typename workViewType,
105bool hasDeriv>
108 static void
109 generate( OutputViewType output,
110 const inputViewType input,
112 const ordinal_type p );
113};
114
119public:
120
124 template<EOperator opType>
125 struct Serial {
126 template<typename OutputViewType,
127 typename inputViewType,
128 typename workViewType>
130 static void
131 getValues( OutputViewType output,
132 const inputViewType input,
134 const ordinal_type order);
135 };
136
137 template<typename DeviceType, ordinal_type numPtsPerEval,
138 typename outputValueValueType, class ...outputValueProperties,
139 typename inputPointValueType, class ...inputPointProperties>
140 static void
141 getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
142 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
143 const ordinal_type order,
144 const EOperator operatorType );
145
149 template<typename outputValueViewType,
150 typename inputPointViewType,
151 typename workViewType,
152 EOperator opType,
153 ordinal_type numPtsEval>
154 struct Functor {
155 outputValueViewType _outputValues;
156 const inputPointViewType _inputPoints;
157 workViewType _work;
158 const ordinal_type _order;
159
162 inputPointViewType inputPoints_,
164 const ordinal_type order_ )
165 : _outputValues(outputValues_), _inputPoints(inputPoints_), _work(work_),_order(order_){}
166
168 void operator()(const size_type iter) const {
169 const auto ptBegin = Util<ordinal_type>::min(iter*numPtsEval, _inputPoints.extent(0));
170 const auto ptEnd = Util<ordinal_type>::min(ptBegin+numPtsEval, _inputPoints.extent(0));
171
172 const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
173 const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
174
175 switch (opType) {
176 case OPERATOR_VALUE : {
177 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange );
178 Serial<opType>::getValues( output, input, _work, _order ); //here work is not used
179 break;
180 }
181 case OPERATOR_GRAD :
182 case OPERATOR_D1 :
183 {
184 const auto work = Kokkos::subview( _work, Kokkos::ALL(), ptRange, Kokkos::ALL() );
185 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
186 Serial<opType>::getValues( output, input, work, _order);
187 break;
188 }
189 case OPERATOR_D2 :
190 case OPERATOR_D3 :
191 case OPERATOR_D4 :
192 case OPERATOR_D5 :
193 case OPERATOR_D6 :
194 case OPERATOR_D7 :
195 case OPERATOR_D8 :
196 case OPERATOR_D9 :
197 case OPERATOR_D10 :
198 {
199 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
200 Serial<opType>::getValues( output, input, _work, _order); //here work is not used
201 break;
202 }
203 default: {
204 INTREPID2_TEST_FOR_ABORT( true,
205 ">>> ERROR: (Intrepid2::Basis_HGRAD_TRI_Cn_FEM_ORTH::Functor) operator is not supported");
206
207 }
208 }
209 }
210 };
211
212};
213
214}
215
216template<typename DeviceType = void,
217 typename outputValueType = double,
218 typename pointValueType = double>
220 : public Basis<DeviceType,outputValueType,pointValueType> {
221 public:
222 typedef double value_type;
226
229 Basis_HGRAD_TRI_Cn_FEM_ORTH( const ordinal_type order );
230
234
235 using Basis<DeviceType,outputValueType,pointValueType>::getValues;
236
237 virtual
238 void
239 getValues( OutputViewType outputValues,
240 const PointViewType inputPoints,
241 const EOperator operatorType = OPERATOR_VALUE ) const override {
242 #ifdef HAVE_INTREPID2_DEBUG
244 inputPoints,
245 operatorType,
246 this->getBaseCellTopology(),
247 this->getCardinality() );
248 #endif
249 constexpr ordinal_type numPtsPerEval = Parameters::MaxNumPtsPerBasisEval;
250 Impl::Basis_HGRAD_TRI_Cn_FEM_ORTH::
251 getValues<DeviceType,numPtsPerEval>( outputValues,
252 inputPoints,
253 this->getDegree(),
254 operatorType );
255 }
256};
257
258}// namespace Intrepid2
259
261
262#endif
263
Header file for the abstract base class Intrepid2::Basis.
void getValues_HGRAD_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 HGRAD-conforming FEM basis....
Definition file for FEM orthogonal basis functions of arbitrary degree for H(grad) functions on TRI.
Implementation of the default H(grad)-compatible orthogonal basis (Dubiner) of arbitrary degree on tr...
Basis_HGRAD_TRI_Cn_FEM_ORTH(const ordinal_type order)
Constructor.
virtual void getValues(OutputViewType outputValues, const PointViewType inputPoints, const EOperator operatorType=OPERATOR_VALUE) const override
Evaluation of a FEM basis on a reference cell.
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.
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 getDegree() const
Returns the degree of the basis.
ordinal_type getCardinality() const
Returns cardinality of the basis.
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, DeviceType > ScalarViewType
View type for scalars.
Device DeviceType
(Kokkos) Device type on which Basis is templated. Does not necessarily return true for Kokkos::is_dev...
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.
static constexpr ordinal_type MaxNumPtsPerBasisEval
The maximum number of points to eval in serial mode.
small utility functions
See Intrepid2::Basis_HGRAD_TRI_Cn_FEM_ORTH.