18 #ifndef Intrepid2_TransformedBasisValues_h
19 #define Intrepid2_TransformedBasisValues_h
23 #include "Intrepid2_ScalarView.hpp"
32 template<
class Scalar,
typename DeviceType>
36 using value_type = Scalar;
38 ordinal_type numCells_;
52 transform_(transform),
53 basisValues_(basisValues)
67 basisValues_(basisValues)
71 template<typename OtherDeviceType, class = typename std::enable_if<!std::is_same<DeviceType, OtherDeviceType>::value>::type>
74 numCells_(transformedVectorData.
numCells()),
75 transform_(transformedVectorData.
transform()),
76 basisValues_(transformedVectorData.basisValues())
119 template<
class ViewType>
122 ordinal_type weightRank = getFunctorRank(weights);
130 transform_ = weightData;
135 if ((transform_.
rank() == 4) || (transform_.
rank() == 3))
143 result.storeInPlaceProduct(weightData,transform_);
158 return basisValues_.extent_int(0);
164 return basisValues_.extent_int(1);
170 if ((transform_.
rank() == 3) && (basisValues_.rank() == 3))
174 else if ((transform_.
rank() == 3) && (basisValues_.rank() == 2))
184 return basisValues_.extent_int(2);
189 KOKKOS_INLINE_FUNCTION Scalar
operator()(
const int &cellOrdinal,
const int &fieldOrdinal,
const int &pointOrdinal)
const
194 return basisValues_(fieldOrdinal,pointOrdinal);
196 else if (transform_.
rank() == 2)
198 return transform_(cellOrdinal,pointOrdinal) * basisValues_(fieldOrdinal,pointOrdinal);
200 else if (transform_.
rank() == 3)
203 for (
int d=0; d<transform_.
extent_int(2); d++)
205 value += transform_(cellOrdinal,pointOrdinal,d) * basisValues_(fieldOrdinal,pointOrdinal,d);
213 KOKKOS_INLINE_FUNCTION Scalar
operator()(
const int &cellOrdinal,
const int &fieldOrdinal,
const int &pointOrdinal,
const int &dim)
const
218 return basisValues_(fieldOrdinal,pointOrdinal,dim);
222 return transform_(cellOrdinal,pointOrdinal,dim,dim) * basisValues_(fieldOrdinal,pointOrdinal,dim);
224 else if (transform_.
rank() == 4)
227 for (
int d2=0; d2<transform_.
extent_int(2); d2++)
229 value += transform_(cellOrdinal,pointOrdinal,dim,d2) * basisValues_(fieldOrdinal,pointOrdinal,d2);
233 else if (transform_.
rank() == 3)
235 Scalar value = transform_(cellOrdinal,pointOrdinal,dim) * basisValues_(fieldOrdinal,pointOrdinal);
240 Scalar value = transform_(cellOrdinal,pointOrdinal) * basisValues_(fieldOrdinal,pointOrdinal,dim);
246 KOKKOS_INLINE_FUNCTION Scalar
transformWeight(
const int &cellOrdinal,
const int &pointOrdinal)
const
255 return transform_(cellOrdinal,pointOrdinal);
260 KOKKOS_INLINE_FUNCTION Scalar
transformWeight(
const int &cellOrdinal,
const int &pointOrdinal,
const int &d)
const
264 INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE(
true, std::invalid_argument,
"three-argument transformWeight() is not supported for invalid transform_ object -- no meaningful interpretation for vector-valued identity");
268 return transform_(cellOrdinal,pointOrdinal,d);
273 KOKKOS_INLINE_FUNCTION Scalar
transformWeight(
const int &cellOrdinal,
const int &pointOrdinal,
const int &dim1,
const int &dim2)
const
278 return (dim1 == dim2) ? 1.0 : 0.0;
282 return transform_(cellOrdinal,pointOrdinal,dim1,dim2);
295 return basisValues_.vectorData();
299 KOKKOS_INLINE_FUNCTION
302 if ((transform_.
rank() == 4) && (basisValues_.rank() == 3))
306 else if (transform_.
rank() == 2)
308 return basisValues_.rank() + 1;
310 else if (transform_.
rank() == 3)
312 if (basisValues_.rank() == 3)
317 else if (basisValues_.rank() == 2)
326 KOKKOS_INLINE_FUNCTION
333 else if (r > 3)
return 1;
static Data< DataScalar, DeviceType > allocateInPlaceCombinationResult(const Data< DataScalar, DeviceType > &A, const Data< DataScalar, DeviceType > &B)
#define INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE(test, x, msg)
KOKKOS_INLINE_FUNCTION const Kokkos::Array< DataVariationType, 7 > & getVariationTypes() const
Returns an array with the variation types in each logical dimension.
Header function for Intrepid2::Util class and other utility functions.
KOKKOS_INLINE_FUNCTION bool isDiagonal() const
returns true for containers that have two dimensions marked as BLOCK_PLUS_DIAGONAL for which the non-...
The data containers in Intrepid2 that support sum factorization and other reduced-data optimizations ...
KOKKOS_INLINE_FUNCTION constexpr bool isValid() const
returns true for containers that have data; false for those that don't (namely, those that have been ...
KOKKOS_INLINE_FUNCTION unsigned rank() const
Returns the logical rank of the Data container.
KOKKOS_INLINE_FUNCTION int extent_int(const int &r) const
Returns the logical extent in the specified dimension.
KOKKOS_INLINE_FUNCTION int getDataExtent(const ordinal_type &d) const
returns the true extent of the data corresponding to the logical dimension provided; if the data does...
Header file for the data-wrapper class Intrepid2::BasisValues.
Reference-space field values for a basis, designed to support typical vector-valued bases...