Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 : #include <string>
8 :
9 : #include "DataStructures/DataBox/Tag.hpp"
10 : #include "DataStructures/Tensor/TypeAliases.hpp"
11 :
12 : /// \cond
13 : class DataVector;
14 : namespace Frame {
15 : struct Inertial;
16 : } // namespace Frame
17 : /// \endcond
18 :
19 : /*!
20 : * \brief Contains objects related to Tags
21 : */
22 : namespace Tags {
23 : template <size_t N, typename T>
24 0 : struct TempTensor : db::SimpleTag {
25 0 : using type = T;
26 0 : static std::string name() {
27 : return std::string("TempTensor") + std::to_string(N);
28 : }
29 : };
30 :
31 : /*!
32 : * \brief A struct that constructs a `TempTensor` given a label \p N and type
33 : * \p TensorType. Call with `make_temp_tensor<N>::apply<Type>`
34 : *
35 : * \see convert_to_temp_tensors
36 : */
37 : template <size_t N>
38 1 : struct make_temp_tensor {
39 : template <typename TensorType>
40 0 : struct apply {
41 0 : using type = ::Tags::TempTensor<N, TensorType>;
42 : };
43 : };
44 :
45 : /*!
46 : * \brief Takes a `tmpl::list` of `Tensor` types and a label \p N which is
47 : * applied to all `TempTensor`s in the resulting list.
48 : *
49 : * \see make_temp_tensor
50 : */
51 : template <typename List, size_t N>
52 1 : using convert_to_temp_tensors =
53 : tmpl::transform<List,
54 : typename make_temp_tensor<N>::template apply<tmpl::_1>>;
55 :
56 : /// @{
57 : /// \ingroup PeoGroup
58 : /// Variables Tags for temporary tensors inside a function.
59 : template <size_t N, typename DataType = DataVector>
60 1 : using TempScalar = TempTensor<N, Scalar<DataType>>;
61 :
62 : // Rank 1
63 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
64 : typename DataType = DataVector>
65 1 : using Tempa = TempTensor<N, tnsr::a<DataType, SpatialDim, Fr>>;
66 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
67 : typename DataType = DataVector>
68 1 : using TempA = TempTensor<N, tnsr::A<DataType, SpatialDim, Fr>>;
69 :
70 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
71 : typename DataType = DataVector>
72 1 : using Tempi = TempTensor<N, tnsr::i<DataType, SpatialDim, Fr>>;
73 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
74 : typename DataType = DataVector>
75 1 : using TempI = TempTensor<N, tnsr::I<DataType, SpatialDim, Fr>>;
76 :
77 : // Rank 2
78 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
79 : typename DataType = DataVector>
80 1 : using Tempab = TempTensor<N, tnsr::ab<DataType, SpatialDim, Fr>>;
81 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
82 : typename DataType = DataVector>
83 1 : using TempaB = TempTensor<N, tnsr::aB<DataType, SpatialDim, Fr>>;
84 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
85 : typename DataType = DataVector>
86 1 : using TempAb = TempTensor<N, tnsr::Ab<DataType, SpatialDim, Fr>>;
87 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
88 : typename DataType = DataVector>
89 1 : using TempAB = TempTensor<N, tnsr::AB<DataType, SpatialDim, Fr>>;
90 :
91 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
92 : typename DataType = DataVector>
93 1 : using Tempij = TempTensor<N, tnsr::ij<DataType, SpatialDim, Fr>>;
94 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
95 : typename DataType = DataVector>
96 1 : using TempiJ = TempTensor<N, tnsr::iJ<DataType, SpatialDim, Fr>>;
97 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
98 : typename DataType = DataVector>
99 1 : using TempIj = TempTensor<N, tnsr::Ij<DataType, SpatialDim, Fr>>;
100 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
101 : typename DataType = DataVector>
102 1 : using TempIJ = TempTensor<N, tnsr::IJ<DataType, SpatialDim, Fr>>;
103 :
104 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
105 : typename DataType = DataVector>
106 1 : using Tempia = TempTensor<N, tnsr::ia<DataType, SpatialDim, Fr>>;
107 :
108 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
109 : typename DataType = DataVector>
110 1 : using Tempaa = TempTensor<N, tnsr::aa<DataType, SpatialDim, Fr>>;
111 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
112 : typename DataType = DataVector>
113 1 : using TempAA = TempTensor<N, tnsr::AA<DataType, SpatialDim, Fr>>;
114 :
115 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
116 : typename DataType = DataVector>
117 1 : using Tempii = TempTensor<N, tnsr::ii<DataType, SpatialDim, Fr>>;
118 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
119 : typename DataType = DataVector>
120 1 : using TempII = TempTensor<N, tnsr::II<DataType, SpatialDim, Fr>>;
121 :
122 : // Rank 3
123 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
124 : typename DataType = DataVector>
125 1 : using Tempijj = TempTensor<N, tnsr::ijj<DataType, SpatialDim, Fr>>;
126 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
127 : typename DataType = DataVector>
128 1 : using TempIjj = TempTensor<N, tnsr::Ijj<DataType, SpatialDim, Fr>>;
129 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
130 : typename DataType = DataVector>
131 1 : using Tempijk = TempTensor<N, tnsr::ijk<DataType, SpatialDim, Fr>>;
132 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
133 : typename DataType = DataVector>
134 1 : using TempiJk = TempTensor<N, tnsr::iJk<DataType, SpatialDim, Fr>>;
135 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
136 : typename DataType = DataVector>
137 1 : using TempijK = TempTensor<N, tnsr::ijK<DataType, SpatialDim, Fr>>;
138 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
139 : typename DataType = DataVector>
140 1 : using Tempiii = TempTensor<N, tnsr::iii<DataType, SpatialDim, Fr>>;
141 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
142 : typename DataType = DataVector>
143 1 : using Tempiaa = TempTensor<N, tnsr::iaa<DataType, SpatialDim, Fr>>;
144 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
145 : typename DataType = DataVector>
146 1 : using TempIaa = TempTensor<N, tnsr::Iaa<DataType, SpatialDim, Fr>>;
147 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
148 : typename DataType = DataVector>
149 1 : using TempiaB = TempTensor<N, tnsr::iaB<DataType, SpatialDim, Fr>>;
150 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
151 : typename DataType = DataVector>
152 1 : using Tempabb = TempTensor<N, tnsr::abb<DataType, SpatialDim, Fr>>;
153 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
154 : typename DataType = DataVector>
155 1 : using TempabC = TempTensor<N, tnsr::abC<DataType, SpatialDim, Fr>>;
156 :
157 : // Rank 4
158 : template <size_t N, size_t SpatialDim, typename Fr = Frame::Inertial,
159 : typename DataType = DataVector>
160 1 : using Tempijaa = TempTensor<N, tnsr::ijaa<DataType, SpatialDim, Fr>>;
161 : /// @}
162 : } // namespace Tags
|