v0.16.0
Loading...
Searching...
No Matches
Tensor3_Expr.hpp
Go to the documentation of this file.
1/* Declare a wrapper class for generic rank 3 Tensor expressions.
2 There isn't a Tensor3 class yet. I only use Tensor3_Expr as an
3 intermediate expression which immediately get contracted with
4 something to make a Tensor2 or Tensor1. */
5
6#pragma once
7
11#include "Tensor3_times_Dg.hpp"
17
18#include "../Tensor4/Tensor4_number.hpp"
19
20namespace FTensor
21{
22 template <class A, class T, int Dim0, int Dim1, int Dim2, char i, char j,
23 char k>
25 {
27
28 public:
29 Tensor3_Expr(const A &a) : iter(a) {}
30 Tensor3_Expr(const Tensor3_Expr &) = default;
31 T operator()(const int N1, const int N2, const int N3) const
32 {
33 return iter(N1, N2, N3);
34 }
35 };
36
37 template <class A, class T, int Tensor_Dim0, int Tensor_Dim1, int Tensor_Dim2,
38 int Dim0, int Dim1, int Dim2, char i, char j, char k>
39 class Tensor3_Expr<Tensor3<A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2>, T,
40 Dim0, Dim1, Dim2, i, j, k>
41 {
43
44 public:
48 Tensor3_Expr(const Tensor3_Expr &) = default;
49 T &operator()(const int N1, const int N2, const int N3)
50 {
51 return iter(N1, N2, N3);
52 }
53 T operator()(const int N1, const int N2, const int N3) const
54 {
55 return iter(N1, N2, N3);
56 }
57
58 /* Various assignment operators. I have to explicitly declare the
59 second operator= because otherwise the compiler will generate its
60 own and not use the template code. */
61
62 template <class B, class U, int Dim1_0, int Dim1_1, int Dim1_2, char i_1,
63 char j_1, char k_1>
64 auto &
66 {
67 for(int ii = 0; ii < Dim0; ++ii)
68 for(int jj = 0; jj < Dim1; ++jj)
69 for(int kk = 0; kk < Dim2; ++kk)
70 {
71 iter(ii, jj, kk) = permute(*this, rhs, ii, jj, kk);
72 }
73 return *this;
74 }
75
76 template <class B, class U, int Dim1_0, int Dim1_1, int Dim1_2, char i_1,
77 char j_1, char k_1>
78 auto &operator=(
80 {
81 return equals(rhs);
82 }
83
84 auto &operator=(
86 Dim0, Dim1, Dim2, i, j, k> &rhs)
87 {
88 return equals(rhs);
89 }
90
91 template <class U>
93 Dim1, Dim2, i, j, k> &
94 operator=(const U &u)
95 {
96 for(int ii = 0; ii < Dim0; ++ii)
97 for(int jj = 0; jj < Dim1; ++jj)
98 for(int kk = 0; kk < Dim2; ++kk)
99 {
100 iter(ii, jj, kk) = u;
101 }
102 return *this;
103 }
104
105 template <class U>
107 Dim1, Dim2, i, j, k> &
108 operator*=(const U &u)
109 {
110 for(int ii = 0; ii < Dim0; ++ii)
111 for(int jj = 0; jj < Dim1; ++jj)
112 for(int kk = 0; kk < Dim2; ++kk)
113 {
114 iter(ii, jj, kk) *= u;
115 }
116 return *this;
117 }
118
119 template <class U>
121 Dim1, Dim2, i, j, k> &
122 operator/=(const U &u)
123 {
124 for(int ii = 0; ii < Dim0; ++ii)
125 for(int jj = 0; jj < Dim1; ++jj)
126 for(int kk = 0; kk < Dim2; ++kk)
127 {
128 iter(ii, jj, kk) /= u;
129 }
130 return *this;
131 }
132
133 template <class B, class U, int Dim1_0, int Dim1_1, int Dim1_2, char i_1,
134 char j_1, char k_1>
137 for (int ii = 0; ii < Dim0; ++ii)
138 for (int jj = 0; jj < Dim1; ++jj)
139 for (int kk = 0; kk < Dim2; ++kk) {
140 iter(ii, jj, kk) += permute(*this, rhs, ii, jj, kk);
141 }
142 return *this;
143 }
144
147 Dim0, Dim1, Dim2, i, j, k> &rhs) {
148 for (int ii = 0; ii < Dim0; ++ii)
149 for (int jj = 0; jj < Dim1; ++jj)
150 for (int kk = 0; kk < Dim2; ++kk) {
151 iter(ii, jj, kk) += permute(*this, rhs, ii, jj, kk);
152 }
153 return *this;
154 }
155
156 template <class B, class U, int Dim1_0, int Dim1_1, int Dim1_2, char i_1,
157 char j_1, char k_1>
160
161 for (int ii = 0; ii < Dim0; ++ii)
162 for (int jj = 0; jj < Dim1; ++jj)
163 for (int kk = 0; kk < Dim2; ++kk) {
164 iter(ii, jj, kk) -= permute(*this, rhs, ii, jj, kk);
165 }
166 return *this;
167 }
168
171 Dim0, Dim1, Dim2, i, j, k> &rhs) {
172 for (int ii = 0; ii < Dim0; ++ii)
173 for (int jj = 0; jj < Dim1; ++jj)
174 for (int kk = 0; kk < Dim2; ++kk) {
175 iter(ii, jj, kk) -= permute(*this, rhs, ii, jj, kk);
176 }
177 return *this;
178 }
179
180 template <class B, class U, int Dim1_01, int Dim1_2, char i_1, char j_1,
181 char k_1>
183
184 for (int ii = 0; ii < Dim0; ++ii)
185 for (int jj = 0; jj < Dim1; ++jj)
186 for (int kk = 0; kk < Dim2; ++kk) {
187 iter(ii, jj, kk) = permute(*this, rhs, ii, jj, kk);
188 }
189 return *this;
190 }
191
192 template <class B, class U, int Dim1_01, int Dim1_2, char i_1, char j_1,
193 char k_1>
195
196 for (int ii = 0; ii < Dim0; ++ii)
197 for (int jj = 0; jj < Dim1; ++jj)
198 for (int kk = 0; kk < Dim2; ++kk) {
199 iter(ii, jj, kk) += permute(*this, rhs, ii, jj, kk);
200 }
201 return *this;
202 }
203
204 template <class B, class U, int Dim1_01, int Dim1_2, char i_1, char j_1,
205 char k_1>
207
208 for (int ii = 0; ii < Dim0; ++ii)
209 for (int jj = 0; jj < Dim1; ++jj)
210 for (int kk = 0; kk < Dim2; ++kk) {
211 iter(ii, jj, kk) -= permute(*this, rhs, ii, jj, kk);
212 }
213 return *this;
214 }
215 };
216
217 /* Specialized for Tensor4_number_rhs_2 */
218
219 template <class A, class T, int Dim0, int Dim1, int Dim2, char i, char j,
220 char k, int N>
221 class Tensor3_Expr<Tensor4_number_rhs_2<A, T, N>, T, Dim0, Dim1, Dim2, i, j,
222 k> {
224
225 public:
227 T &operator()(const int N0, const int N1, const int N2) {
228 return iter(N0, N1, N2, N);
229 }
230 T operator()(const int N0, const int N1, const int N2) const {
231 return iter(N0, N1, N2, N);
232 }
233
234 /* Various assignment operators. I have to explicitly declare the
235 second operator= because otherwise the compiler will generate its
236 own and not use the template code. */
237
238 template <class B, class U, int Dim1_0, int Dim1_1, int Dim1_2, char i_1,
239 char j_1, char k_1>
242 for (int ii = 0; ii < Dim0; ++ii)
243 for (int jj = 0; jj < Dim1; ++jj)
244 for (int kk = 0; kk < Dim2; ++kk) {
245 iter(ii, jj, N, kk) = permute(*this, rhs, ii, jj, kk);
246 }
247 return *this;
248 }
249
251 Dim1, Dim2, i, j, k> &result) {
252 return operator=<Tensor4_number_rhs_2<A, T, N>, T>(result);
253 }
254
255 };
256
257 /* Specialized for Tensor4_number_rhs_3 */
258
259 template <class A, class T, int Dim0, int Dim1, int Dim2, char i, char j,
260 char k, int N>
261 class Tensor3_Expr<Tensor4_number_rhs_3<A, T, N>, T, Dim0, Dim1, Dim2, i, j,
262 k> {
264
265 public:
267 T &operator()(const int N0, const int N1, const int N2) {
268 return iter(N0, N1, N2, N);
269 }
270 T operator()(const int N0, const int N1, const int N2) const {
271 return iter(N0, N1, N2, N);
272 }
273
274 /* Various assignment operators. I have to explicitly declare the
275 second operator= because otherwise the compiler will generate its
276 own and not use the template code. */
277
278 template <class B, class U, int Dim1_0, int Dim1_1, int Dim1_2, char i_1,
279 char j_1, char k_1>
282
283 for (int ii = 0; ii < Dim0; ++ii)
284 for (int jj = 0; jj < Dim1; ++jj)
285 for (int kk = 0; kk < Dim2; ++kk) {
286 iter(ii, jj, kk, N) = permute(*this, rhs, ii, jj, kk);
287 }
288 return *this;
289 }
290
292 Dim1, Dim2, i, j, k> &result) {
293 return operator=<Tensor4_number_rhs_3<A, T, N>, T>(result);
294 }
295
296 };
297
298 template <class A, class T, int Dim0, int Dim1, int Dim2, char i, char j,
299 char k>
302
303 public:
304 T operator()(const int N1, const int N2, const int N3) const
305 {
306 return -iterA(N1, N2, N3);
307 }
308
311 };
312
313 template <class A, class T, int Dim0, int Dim1, int Dim2, char i, char j,
314 char k>
315 Tensor3_Expr<minus_Tensor3<A, T, Dim0, Dim1, Dim2, i, j, k>, T, Dim0, Dim1,
316 Dim2, i, j, k>
322}
constexpr double a
auto & operator-=(const Tensor3_Expr< B, U, Dim1_0, Dim1_1, Dim1_2, i_1, j_1, k_1 > &rhs)
auto & operator-=(const Tensor3_Expr< Tensor3< A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2 >, T, Dim0, Dim1, Dim2, i, j, k > &rhs)
auto & operator=(const Tensor3_Expr< B, U, Dim1_0, Dim1_1, Dim1_2, i_1, j_1, k_1 > &rhs)
auto & operator=(const Tensor3_Expr< Tensor3< A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2 >, T, Dim0, Dim1, Dim2, i, j, k > &rhs)
auto & operator+=(const Tensor3_Expr< B, U, Dim1_0, Dim1_1, Dim1_2, i_1, j_1, k_1 > &rhs)
Tensor3_Expr< Tensor3< A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2 >, T, Dim0, Dim1, Dim2, i, j, k > & operator/=(const U &u)
Tensor3_Expr< Tensor3< A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2 >, T, Dim0, Dim1, Dim2, i, j, k > & operator=(const U &u)
auto & operator+=(const Tensor3_Expr< Tensor3< A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2 >, T, Dim0, Dim1, Dim2, i, j, k > &rhs)
auto & equals(const Tensor3_Expr< B, U, Dim1_0, Dim1_1, Dim1_2, i_1, j_1, k_1 > &rhs)
Tensor3_Expr< Tensor3< A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2 >, T, Dim0, Dim1, Dim2, i, j, k > & operator*=(const U &u)
auto & operator=(const Tensor3_Expr< Tensor4_number_rhs_2< A, T, N >, T, Dim0, Dim1, Dim2, i, j, k > &result)
auto & operator=(const Tensor3_Expr< B, U, Dim1_0, Dim1_1, Dim1_2, i_1, j_1, k_1 > &rhs)
auto & operator=(const Tensor3_Expr< B, U, Dim1_0, Dim1_1, Dim1_2, i_1, j_1, k_1 > &rhs)
auto & operator=(const Tensor3_Expr< Tensor4_number_rhs_3< A, T, N >, T, Dim0, Dim1, Dim2, i, j, k > &result)
Tensor3_Expr(const Tensor3_Expr &)=default
T operator()(const int N1, const int N2, const int N3) const
minus_Tensor3(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a)
T operator()(const int N1, const int N2, const int N3) const
Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > iterA
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
Tensors class implemented by Walter Landry.
Definition FTensor.hpp:51
Ddg_Expr< Ddg_minus_Ddg< A, B, T, U, Dim01, Dim23, i, j, k, l >, typename promote< T, U >::V, Dim01, Dim23, i, j, k, l > operator-(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Ddg_Expr< B, U, Dim01, Dim23, i, j, k, l > &b)
U permute(const Tensor2_Expr< A, T, Dim0_0, Dim0_1, i0, j0 > &, const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i1, j1 > &rhs, const int N0, const int N1)
Definition permute.hpp:11
constexpr AssemblyType A
const int N
Definition speed_test.cpp:3