Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <concepts>
7 : #include <cstddef>
8 :
9 : #include "DataStructures/DataBox/Tag.hpp"
10 : #include "DataStructures/Tensor/Metafunctions.hpp"
11 : #include "DataStructures/Tensor/Tensor.hpp"
12 : #include "Utilities/Kokkos/KokkosCore.hpp"
13 :
14 : /*!
15 : * \brief Get the `Tensor` at a specific grid point index.
16 : *
17 : * Works with a `Tensor` of `Kokkos::View`s. Can also be made to work with
18 : * `DataVector` if needed (use `operator[]` instead of `operator()`).
19 : */
20 : template <
21 : typename TensorType, std::integral... Is,
22 : typename ValueType = typename TensorType::type::value_type,
23 : typename ResultType = TensorMetafunctions::swap_type<ValueType, TensorType>>
24 1 : KOKKOS_FUNCTION ResultType make_at_index(const TensorType& tensor,
25 : const Is&... i) {
26 : ResultType result{};
27 : for (size_t component = 0; component < TensorType::size(); ++component) {
28 : result[component] = tensor[component](i...);
29 : }
30 : return result;
31 : }
32 :
33 : /*!
34 : * \brief Set the `Tensor` at a specific grid point index.
35 : *
36 : * Works with a `Tensor` of `Kokkos::View`s. Can also be made to work with
37 : * `DataVector` if needed (use `operator[]` instead of `operator()`).
38 : */
39 : template <typename TensorType, std::integral... Is,
40 : typename ValueType = typename TensorType::type::value_type>
41 1 : KOKKOS_FUNCTION void set_at_index(
42 : const gsl::not_null<TensorType*> tensor,
43 : const TensorMetafunctions::swap_type<ValueType, TensorType>& value,
44 : const Is&... i) {
45 : for (size_t component = 0; component < value.size(); ++component) {
46 : (*tensor)[component](i...) = value[component];
47 : }
48 : }
49 :
50 : namespace Tags {
51 :
52 : /*!
53 : * \brief Tag representing a specific grid point index of a tensor.
54 : *
55 : * This tag replaces the `Tensor` data type with `double` so that it can be
56 : * used with pointwise operations, e.g. in a `Kokkos::parallel_for` kernel.
57 : */
58 : template <typename Tag>
59 1 : struct AtIndex : db::PrefixTag {
60 : private:
61 0 : using TensorType = typename Tag::type;
62 0 : using ValueType = typename TensorType::type::value_type;
63 :
64 : public:
65 0 : using tag = Tag;
66 0 : using type = TensorMetafunctions::swap_type<ValueType, TensorType>;
67 : };
68 :
69 : } // namespace Tags
|