Intrepid2
Intrepid2_HGRAD_LINE_Cn_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
15
16#ifndef __INTREPID2_HGRAD_LINE_CN_FEM_HPP__
17#define __INTREPID2_HGRAD_LINE_CN_FEM_HPP__
18
19#include "Intrepid2_Basis.hpp"
21
23#include "Teuchos_LAPACK.hpp"
24
25namespace Intrepid2 {
26
42
43 namespace Impl {
44
49 public:
50 typedef struct Line<2> cell_topology_type;
54 template<EOperator opType>
55 struct Serial {
56 template<typename outputValueViewType,
57 typename inputPointViewType,
58 typename workViewType,
59 typename vinvViewType>
60 KOKKOS_INLINE_FUNCTION
61 static void
62 getValues( outputValueViewType outputValues,
63 const inputPointViewType inputPoints,
64 workViewType work,
65 const vinvViewType vinv,
66 const ordinal_type operatorDn = 0 );
67 };
68
69 template<typename DeviceType, ordinal_type numPtsPerEval,
70 typename outputValueValueType, class ...outputValueProperties,
71 typename inputPointValueType, class ...inputPointProperties,
72 typename vinvValueType, class ...vinvProperties>
73 static void
74 getValues( const typename DeviceType::execution_space& space,
75 Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
76 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
77 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinv,
78 const EOperator operatorType );
79
83 template<typename outputValueViewType,
84 typename inputPointViewType,
85 typename vinvViewType,
86 typename workViewType,
87 EOperator opType,
88 ordinal_type numPtsEval>
89 struct Functor {
90 outputValueViewType _outputValues;
91 const inputPointViewType _inputPoints;
92 const vinvViewType _vinv;
93 workViewType _work;
94 const ordinal_type _opDn;
95
96 KOKKOS_INLINE_FUNCTION
97 Functor( outputValueViewType outputValues_,
98 inputPointViewType inputPoints_,
99 vinvViewType vinv_,
100 workViewType work_,
101 const ordinal_type opDn_ = 0 )
102 : _outputValues(outputValues_), _inputPoints(inputPoints_),
103 _vinv(vinv_), _work(work_), _opDn(opDn_) {}
104
105 KOKKOS_INLINE_FUNCTION
106 void operator()(const size_type iter) const {
107 const auto ptBegin = Util<ordinal_type>::min(iter*numPtsEval, _inputPoints.extent(0));
108 const auto ptEnd = Util<ordinal_type>::min(ptBegin+numPtsEval, _inputPoints.extent(0));
109
110 const auto ptRange = Kokkos::pair<ordinal_type,ordinal_type>(ptBegin, ptEnd);
111 const auto input = Kokkos::subview( _inputPoints, ptRange, Kokkos::ALL() );
112
113 typename workViewType::pointer_type ptr = _work.data() + _work.extent(0)*ptBegin*get_dimension_scalar(_work);
114
115 workViewType work = createMatchingUnmanagedView<workViewType>(_work, ptr, (ptEnd-ptBegin)*_work.extent(0));
116
117 switch (opType) {
118 case OPERATOR_VALUE : {
119 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange );
120 Serial<opType>::getValues( output, input, work, _vinv );
121 break;
122 }
123 case OPERATOR_Dn : {
124 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), ptRange, Kokkos::ALL() );
125 Serial<opType>::getValues( output, input, work, _vinv, _opDn );
126 break;
127 }
128 default: {
129 INTREPID2_TEST_FOR_ABORT( true,
130 ">>> ERROR: (Intrepid2::Basis_HGRAD_LINE_Cn_FEM::Functor) operator is not supported");
131
132 }
133 }
134 }
135 };
136 };
137 }
138
139 template<typename DeviceType = void,
140 typename outputValueType = double,
141 typename pointValueType = double>
143 : public Basis<DeviceType,outputValueType,pointValueType> {
144 public:
145 using BasisBase = Basis<DeviceType,outputValueType,pointValueType>;
146 using typename BasisBase::ExecutionSpace;
147
149
153
154 using typename BasisBase::OutputViewType;
155 using typename BasisBase::PointViewType ;
156 using typename BasisBase::ScalarViewType;
157
158 private:
159
162 Kokkos::DynRankView<typename ScalarViewType::value_type,DeviceType> vinv_;
163 EPointType pointType_;
164 public:
167 Basis_HGRAD_LINE_Cn_FEM(const ordinal_type order,
168 const EPointType pointType = POINTTYPE_EQUISPACED);
169
171
172 virtual
173 void
174 getValues( const ExecutionSpace& space,
175 OutputViewType outputValues,
176 const PointViewType inputPoints,
177 const EOperator operatorType = OPERATOR_VALUE ) const override {
178#ifdef HAVE_INTREPID2_DEBUG
180 inputPoints,
181 operatorType,
182 this->getBaseCellTopology(),
183 this->getCardinality() );
184#endif
185 constexpr ordinal_type numPtsPerEval = 1;
186 Impl::Basis_HGRAD_LINE_Cn_FEM::
187 getValues<DeviceType,numPtsPerEval>(space,
188 outputValues,
189 inputPoints,
190 this->vinv_,
191 operatorType);
192 }
193
194 virtual void
195 getScratchSpaceSize( ordinal_type& perTeamSpaceSize,
196 ordinal_type& perThreadSpaceSize,
197 const PointViewType inputPointsconst,
198 const EOperator operatorType = OPERATOR_VALUE) const override;
199
200 KOKKOS_INLINE_FUNCTION
201 virtual void
202 getValues(
203 OutputViewType outputValues,
204 const PointViewType inputPoints,
205 const EOperator operatorType,
206 const typename Kokkos::TeamPolicy<typename DeviceType::execution_space>::member_type& team_member,
207 const typename DeviceType::execution_space::scratch_memory_space & scratchStorage,
208 const ordinal_type subcellDim = -1,
209 const ordinal_type subcellOrdinal = -1) const override;
210
211 virtual
212 void
213 getDofCoords( ScalarViewType dofCoords ) const override {
214#ifdef HAVE_INTREPID2_DEBUG
215 // Verify rank of output array.
216 INTREPID2_TEST_FOR_EXCEPTION( rank(dofCoords) != 2, std::invalid_argument,
217 ">>> ERROR: (Intrepid2::Basis_HGRAD_LINE_Cn_FEM::getDofCoords) rank = 2 required for dofCoords array");
218 // Verify 0th dimension of output array.
219 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->getCardinality(), std::invalid_argument,
220 ">>> ERROR: (Intrepid2::Basis_HGRAD_LINE_Cn_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
221 // Verify 1st dimension of output array.
222 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
223 ">>> ERROR: (Intrepid2::Basis_HGRAD_LINE_Cn_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
224#endif
225 Kokkos::deep_copy(dofCoords, this->dofCoords_);
226 }
227
228 virtual
229 void
230 getDofCoeffs( ScalarViewType dofCoeffs ) const override {
231#ifdef HAVE_INTREPID2_DEBUG
232 // Verify rank of output array.
233 INTREPID2_TEST_FOR_EXCEPTION( rank(dofCoeffs) != 1, std::invalid_argument,
234 ">>> ERROR: (Intrepid2::Basis_HGRAD_LINE_Cn_FEM::getdofCoeffs) rank = 1 required for dofCoeffs array");
235 // Verify 0th dimension of output array.
236 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->getCardinality(), std::invalid_argument,
237 ">>> ERROR: (Intrepid2::Basis_HGRAD_LINE_Cn_FEM::getdofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
238#endif
239 Kokkos::deep_copy(dofCoeffs, 1.0);
240 }
241
242 virtual
243 const char*
244 getName() const override {
245 return "Intrepid2_HGRAD_LINE_Cn_FEM";
246 }
247
248 void
249 getVandermondeInverse( ScalarViewType vinv ) const {
250 // has to be same rank and dimensions
251 Kokkos::deep_copy(vinv, this->vinv_);
252 }
253
254 Kokkos::DynRankView<typename ScalarViewType::const_value_type,DeviceType>
255 getVandermondeInverse() const {
256 return vinv_;
257 }
258
259 ordinal_type
260 getWorkSizePerPoint(const EOperator operatorType) const {
261 return getPnCardinality<1>(this->basisDegree_);
262 }
263
268 virtual HostBasisPtr<outputValueType,pointValueType>
269 getHostBasis() const override {
270 auto hostBasis = Teuchos::rcp(new HostBasis(this->basisDegree_, pointType_));
271
272 return hostBasis;
273 }
274 };
275
276}// namespace Intrepid2
277
279
280#endif
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....
Header file for the Intrepid2::Basis_HGRAD_LINE_Cn_FEM_JACOBI class.
Definition file for FEM basis functions of degree n for H(grad) functions on LINE.
Header file for Intrepid2::PointTools class to provide utilities for barycentric coordinates,...
KOKKOS_INLINE_FUNCTION std::enable_if< std::is_pointer_v< CtorProp > &&!std::is_convertible_v< CtorProp, constchar * >, OutViewType >::type createMatchingUnmanagedView(const InViewType &view, const CtorProp &data, const Dims... dims)
Creates an unmanaged view that matches the value_type of the provided view The type of the output vie...
virtual const char * getName() const override
Returns basis name.
virtual HostBasisPtr< outputValueType, pointValueType > getHostBasis() const override
Creates and returns a Basis object whose DeviceType template argument is Kokkos::HostSpace::device_ty...
virtual void getDofCoords(ScalarViewType dofCoords) const override
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
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...
Kokkos::DynRankView< typename ScalarViewType::value_type, typename Kokkos::HostSpace::device_type > vinv_
Basis_HGRAD_LINE_Cn_FEM(const ordinal_type order, const EPointType pointType=POINTTYPE_EQUISPACED)
Constructor.
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
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
Kokkos::View< ordinal_type ***, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray3DHost
Kokkos::DynRankView< scalarType, Kokkos::LayoutStride, DeviceType > ScalarViewType
Kokkos::DynRankView< scalarType, DeviceType > dofCoords_
Coordinates of degrees-of-freedom for basis functions defined in physical space.
Kokkos::View< ordinal_type **, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray2DHost
shards::CellTopology getBaseCellTopology() const
Kokkos::View< ordinal_type *, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
See Intrepid2::Basis_HGRAD_LINE_Cn_FEM.