Intrepid2
Intrepid2_HVOL_C0_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#ifndef __INTREPID2_HVOL_C0_FEM_HPP__
16#define __INTREPID2_HVOL_C0_FEM_HPP__
17
19#include "Intrepid2_Basis.hpp"
20
21namespace Intrepid2 {
22
23 namespace Impl {
24
29 public:
33 template<EOperator opType>
34 struct Serial {
35 template<typename OutputViewType,
36 typename inputViewType>
37 KOKKOS_INLINE_FUNCTION
38 static void
39 getValues( OutputViewType output,
40 const inputViewType input );
41
42 };
43
44 template<typename DeviceType,
45 typename outputValueValueType, class ...outputValueProperties,
46 typename inputPointValueType, class ...inputPointProperties>
47 static void
48 getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
49 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
50 const EOperator operatorType);
51
55 template<typename outputValueViewType,
56 typename inputPointViewType,
57 EOperator opType>
58 struct Functor {
59 outputValueViewType _outputValues;
60 const inputPointViewType _inputPoints;
61
62 KOKKOS_INLINE_FUNCTION
63 Functor( outputValueViewType outputValues_,
64 inputPointViewType inputPoints_ )
65 : _outputValues(outputValues_), _inputPoints(inputPoints_) {}
66
67 KOKKOS_INLINE_FUNCTION
68 void operator()(const ordinal_type pt) const {
69 if constexpr (opType == OPERATOR_VALUE) {
70 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt );
71 const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
72 Serial<opType>::getValues( output, input );
73 }
74 else if constexpr (opType == OPERATOR_MAX) {
75 auto output = Kokkos::subview( _outputValues, Kokkos::ALL(), pt, Kokkos::ALL() );
76 const auto input = Kokkos::subview( _inputPoints, pt, Kokkos::ALL() );
77 Serial<opType>::getValues( output, input );
78 }
79 else {
80 INTREPID2_TEST_FOR_ABORT( opType != OPERATOR_VALUE &&
81 opType != OPERATOR_MAX,
82 ">>> ERROR: (Intrepid2::Basis_HVOL_C0_FEM::Serial::getValues) operator is not supported");
83 }
84 }
85 };
86 };
87 }
88
92 template<typename DeviceType = void,
93 typename outputValueType = double,
94 typename pointValueType = double>
95 class Basis_HVOL_C0_FEM : public Basis<DeviceType,outputValueType,pointValueType> {
96
97 std::string basisName_;
98
99 public:
103
107
110 Basis_HVOL_C0_FEM(const shards::CellTopology& cellTopo);
111
115
116 using Basis<DeviceType,outputValueType,pointValueType>::getValues;
117
118 virtual
119 void
120 getValues( OutputViewType outputValues,
121 const PointViewType inputPoints,
122 const EOperator operatorType = OPERATOR_VALUE ) const override {
123#ifdef HAVE_INTREPID2_DEBUG
124 // Verify arguments
126 inputPoints,
127 operatorType,
128 this->getBaseCellTopology(),
129 this->getCardinality() );
130#endif
131 Impl::Basis_HVOL_C0_FEM::
132 getValues<DeviceType>( outputValues,
133 inputPoints,
134 operatorType );
135 }
136
137 virtual
138 void
139 getDofCoords( ScalarViewType dofCoords ) const override {
140#ifdef HAVE_INTREPID2_DEBUG
141 // Verify rank of output array.
142 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.rank() != 2, std::invalid_argument,
143 ">>> ERROR: (Intrepid2::Basis_HVOL_C0_FEM::getDofCoords) rank = 2 required for dofCoords array");
144 // Verify 0th dimension of output array.
145 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoords.extent(0)) != this->getCardinality(), std::invalid_argument,
146 ">>> ERROR: (Intrepid2::Basis_HVOL_C0_FEM::getDofCoords) mismatch in number of dof and 0th dimension of dofCoords array");
147 // Verify 1st dimension of output array.
148 INTREPID2_TEST_FOR_EXCEPTION( dofCoords.extent(1) != this->getBaseCellTopology().getDimension(), std::invalid_argument,
149 ">>> ERROR: (Intrepid2::Basis_HVOL_C0_FEM::getDofCoords) incorrect reference cell (1st) dimension in dofCoords array");
150#endif
151 Kokkos::deep_copy(dofCoords, this->dofCoords_);
152 }
153
154 virtual
155 void
156 getDofCoeffs( ScalarViewType dofCoeffs ) const override {
157#ifdef HAVE_INTREPID2_DEBUG
158 // Verify rank of output array.
159 INTREPID2_TEST_FOR_EXCEPTION( dofCoeffs.rank() != 1, std::invalid_argument,
160 ">>> ERROR: (Intrepid2::Basis_HVOL_C0_FEM::getdofCoeffs) rank = 1 required for dofCoeffs array");
161 // Verify 0th dimension of output array.
162 INTREPID2_TEST_FOR_EXCEPTION( static_cast<ordinal_type>(dofCoeffs.extent(0)) != this->getCardinality(), std::invalid_argument,
163 ">>> ERROR: (Intrepid2::Basis_HVOL_C0_FEM::getdofCoeffs) mismatch in number of dof and 0th dimension of dofCoeffs array");
164#endif
165 Kokkos::deep_copy(dofCoeffs, 1.0);
166 }
167
168 virtual
169 const char* getName() const override {
170 return basisName_.c_str();
171 }
172
177 };
178}
179
181
182#endif
Header file for the abstract base class Intrepid2::Basis.
BasisPtr< typename Kokkos::HostSpace::device_type, OutputType, PointType > HostBasisPtr
Pointer to a Basis whose device type is on the host (Kokkos::HostSpace::device_type),...
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::CellTools class.
Definition file FEM basis functions of degree 0 for H(vol) functions on all supported topologies.
Implementation of the default HVOL-compatible FEM contstant basis on triangle, quadrilateral,...
Basis_HVOL_C0_FEM()=delete
Constructor.
virtual HostBasisPtr< outputValueType, pointValueType > getHostBasis() const override
Creates and returns a Basis object whose DeviceType template argument is Kokkos::HostSpace::device_ty...
virtual const char * getName() const override
Returns basis name.
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 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::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
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.
See Intrepid2::Basis_HVOL_C0_FEM.