v0.14.0
Loading...
Searching...
No Matches
Dg_Expr_equals.hpp
Go to the documentation of this file.
1/* Various assignment operators, including specializations to
2 Christof. I have to explicitly declare the second
3 operator= because otherwise the compiler will generate its own and
4 not use the template code. */
5
6#pragma once
7
8namespace FTensor
9{
10 /* T3dg=T3dg */
11
12 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
13 char k, int Current_Dim0, int Current_Dim1, int Current_Dim2>
14 void
18 {
19 iter(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
20 = result(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1);
23 }
24
25 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
26 char k, int Current_Dim1, int Current_Dim2>
27 void
29 const Number<1> &, const Number<Current_Dim1> &,
31 {
32 iter(0, Current_Dim1 - 1, Current_Dim2 - 1)
33 = result(0, Current_Dim1 - 1, Current_Dim2 - 1);
36 }
37
38 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
39 char k, int Current_Dim2>
40 void
42 const Number<1> &, const Number<1> &,
44 {
45 iter(0, 0, Current_Dim2 - 1) = result(0, 0, Current_Dim2 - 1);
48 }
49
50 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
51 char k>
52 void
54 const Number<1> &, const Number<1> &, const Number<1> &)
55 {
56 iter(0, 0, 0) = result(0, 0, 0);
57 }
58
59 template <class A, class T, int Tensor_Dim01, int Tensor_Dim2, int Dim01,
60 int Dim2, char i, char j, char k>
61 template <class B, class U>
62 Dg_Expr<Dg<A, Tensor_Dim01, Tensor_Dim2>, T, Dim01, Dim2, i, j, k> &
64 operator=(const Dg_Expr<B, U, Dim01, Dim2, i, j, k> &result)
65 {
67 Number<Dim2>());
68 return *this;
69 }
70
71 /* T3dg=T3dg_Expr(T3dg) */
72
73 template <class A, class T, int Tensor_Dim01, int Tensor_Dim2, int Dim01,
74 int Dim2, char i, char j, char k>
77 operator=(const Dg_Expr<Dg<A, Tensor_Dim01, Tensor_Dim2>, T, Dim01, Dim2, i,
78 j, k> &result)
79 {
80 return operator=<Dg<A, Tensor_Dim01, Tensor_Dim2>, T>(result);
81 }
82
83 /* T3dg+=T3dg */
84
85 template <bool S> struct Sign_of_T3dg_plus_equals_T3dg {};
86
87 template <> struct Sign_of_T3dg_plus_equals_T3dg<true> {
88 template <typename L, typename R> static inline void op(L &l, R &&r) {
89 l += r;
90 }
91 };
92
93 template <> struct Sign_of_T3dg_plus_equals_T3dg<false> {
94 template <typename L, typename R> static inline void op(L &l, R &&r) {
95 l -= r;
96 }
97 };
98
99 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
100 char k, int Current_Dim0, int Current_Dim1, int Current_Dim2,
101 class Op>
104 const Number<Current_Dim0> &,
105 const Number<Current_Dim1> &,
106 const Number<Current_Dim2> &, const Op &) {
107 Op::op(iter(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1),
108 result(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1));
111 }
112
113 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
114 char k, int Current_Dim1, int Current_Dim2, class Op>
117 const Number<1> &, const Number<Current_Dim1> &,
118 const Number<Current_Dim2> &, const Op &) {
119 Op::op(iter(0, Current_Dim1 - 1, Current_Dim2 - 1),
120 result(0, Current_Dim1 - 1, Current_Dim2 - 1));
123 Op());
124 }
125
126 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
127 char k, int Current_Dim2, class Op>
130 const Number<1> &, const Number<1> &,
131 const Number<Current_Dim2> &, const Op &) {
132 Op::op(iter(0, 0, Current_Dim2 - 1), result(0, 0, Current_Dim2 - 1));
135 }
136
137 template <class A, class B, class U, int Dim01, int Dim2, char i, char j,
138 char k, class Op>
141 const Number<1> &, const Number<1> &,
142 const Number<1> &, const Op &) {
143 Op::op(iter(0, 0, 0), result(0, 0, 0));
144 }
145
146 template <class A, class T, int Tensor_Dim01, int Tensor_Dim2, int Dim01,
147 int Dim2, char i, char j, char k>
148 template <class B, class U>
149 Dg_Expr<Dg<A, Tensor_Dim01, Tensor_Dim2>, T, Dim01, Dim2, i, j, k> &
151 operator+=(const Dg_Expr<B, U, Dim01, Dim2, i, j, k> &result)
152 {
154 Number<Dim2>(),
156 return *this;
157 }
158
159 template <class A, class T, int Tensor_Dim01, int Tensor_Dim2, int Dim01,
160 int Dim2, char i, char j, char k>
161 template <class B, class U>
164 operator-=(const Dg_Expr<B, U, Dim01, Dim2, i, j, k> &result) {
166 Number<Dim2>(),
168 return *this;
169 }
170
171 /* T3dg+=T3dg_Expr(T3dg) */
172
173 template <class A, class T, int Tensor_Dim01, int Tensor_Dim2, int Dim01,
174 int Dim2, char i, char j, char k>
177 operator+=(const Dg_Expr<Dg<A, Tensor_Dim01, Tensor_Dim2>, T, Dim01, Dim2, i,
178 j, k> &result)
179 {
180 return operator+=<Dg<A, Tensor_Dim01, Tensor_Dim2>, T>(result);
181 }
182
183 template <class A, class T, int Tensor_Dim01, int Tensor_Dim2, int Dim01,
184 int Dim2, char i, char j, char k>
187 operator-=(const Dg_Expr<Dg<A, Tensor_Dim01, Tensor_Dim2>, T, Dim01, Dim2, i,
188 j, k> &result)
189 {
190 return operator-=<Dg<A, Tensor_Dim01, Tensor_Dim2>, T>(result);
191 }
192
193 /* T3dg=U */
194
195 template <class A, class U, int Dim01, int Dim2, int Current_Dim0,
196 int Current_Dim1, int Current_Dim2>
197 void T3dg_equals_generic(A &iter, const U &u, const Number<Current_Dim0> &,
198 const Number<Current_Dim1> &,
199 const Number<Current_Dim2> &, const Number<Dim01> &,
200 const Number<Dim2> &)
201 {
202 iter(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1) = u;
206 }
207
208 template <class A, class U, int Dim01, int Dim2, int Current_Dim1,
209 int Current_Dim2>
210 void T3dg_equals_generic(A &iter, const U &u, const Number<1> &,
211 const Number<Current_Dim1> &,
212 const Number<Current_Dim2> &, const Number<Dim01> &,
213 const Number<Dim2> &)
214 {
215 iter(0, Current_Dim1 - 1, Current_Dim2 - 1) = u;
219 }
220
221 template <class A, class U, int Dim01, int Dim2, int Current_Dim2>
222 void T3dg_equals_generic(A &iter, const U &u, const Number<1> &,
223 const Number<1> &, const Number<Current_Dim2> &,
224 const Number<Dim01> &, const Number<Dim2> &)
225 {
226 iter(0, 0, Current_Dim2 - 1) = u;
229 Number<Dim2>());
230 }
231
232 template <class A, class U, int Dim01, int Dim2>
233 void T3dg_equals_generic(A &iter, const U &u, const Number<1> &,
234 const Number<1> &, const Number<1> &,
235 const Number<Dim01> &, const Number<Dim2> &)
236 {
237 iter(0, 0, 0) = u;
238 }
239
240 template <class A, class T, int Tensor_Dim01, int Tensor_Dim2, int Dim01,
241 int Dim2, char i, char j, char k>
242 template <class U>
243 Dg_Expr<Dg<A, Tensor_Dim01, Tensor_Dim2>, T, Dim01, Dim2, i, j, k> &
245 operator=(const U &u)
246 {
249 return *this;
250 }
251
252 /* Assignment operators for the specializations to Christof. */
253
254 /* T3ch=T3dg */
255
256 /* Set operator type
257 * 0 - equal
258 * 1 - add
259 * 2 - subtract
260 */
261 template <int I> struct T3ch_equals_T3dg_Op {};
262
263 template <> struct T3ch_equals_T3dg_Op<0> {
264 template <typename L, typename R> static inline void op(L &l, R &&r) {
265 l = r;
266 }
267 };
268
269 template <> struct T3ch_equals_T3dg_Op<1> {
270 template <typename L, typename R> static inline void op(L &l, R &&r) {
271 l += r;
272 }
273 };
274
275 template <> struct T3ch_equals_T3dg_Op<2> {
276 template <typename L, typename R> static inline void op(L &l, R &&r) {
277 l -= r;
278 }
279 };
280
281 template <class A, class B, class U, int Dim12, int Dim0, char i, char j,
282 char k, int Current_Dim0, int Current_Dim1, int Current_Dim2,
283 class Op>
284 void
287 const Number<Current_Dim2> &, const Op &) {
288 Op::op(iter(Current_Dim2 - 1, Current_Dim0 - 1, Current_Dim1 - 1),
289 result(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1));
292 }
293
294 template <class A, class B, class U, int Dim12, int Dim0, char i, char j,
295 char k, int Current_Dim1, int Current_Dim2, class Op>
296 void T3ch_equals_T3dg(A &iter,
298 const Number<1> &, const Number<Current_Dim1> &,
299 const Number<Current_Dim2> &, const Op &) {
300 Op::op(iter(Current_Dim2 - 1, 0, Current_Dim1 - 1),
301 result(0, Current_Dim1 - 1, Current_Dim2 - 1));
304 }
305
306 template <class A, class B, class U, int Dim12, int Dim0, char i, char j,
307 char k, int Current_Dim2, class Op>
308 void T3ch_equals_T3dg(A &iter,
310 const Number<1> &, const Number<1> &,
311 const Number<Current_Dim2> &, const Op &) {
312 Op::op(iter(Current_Dim2 - 1, 0, 0), result(0, 0, Current_Dim2 - 1));
315 }
316
317 template <class A, class B, class U, int Dim12, int Dim0, char i, char j,
318 char k, class Op>
319 void T3ch_equals_T3dg(A &iter,
321 const Number<1> &, const Number<1> &, const Number<1> &,
322 const Op &) {
323 Op::op(iter(0, 0, 0), result(0, 0, 0));
324 }
325
326 template <class Tp, class T, int Tensor_Dim0, int Tensor_Dim12, int Dim12,
327 int Dim0, char i, char j, char k>
328 template <class B, class U>
329 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k> &
330 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k>::
331 operator=(const Dg_Expr<B, U, Dim12, Dim0, i, j, k> &result)
332 {
333 T3ch_equals_T3dg(iter, result, Number<Dim12>(), Number<Dim12>(),
334 Number<Dim0>(), T3ch_equals_T3dg_Op<0>());
335 return *this;
336 }
337
338 template <class Tp, class T, int Tensor_Dim0, int Tensor_Dim12, int Dim12,
339 int Dim0, char i, char j, char k>
340 template <class B, class U>
341 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k> &
342 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k>::
343 operator+=(const Dg_Expr<B, U, Dim12, Dim0, i, j, k> &result)
344 {
345 T3ch_equals_T3dg(iter, result, Number<Dim12>(), Number<Dim12>(),
346 Number<Dim0>(), T3ch_equals_T3dg_Op<1>());
347 return *this;
348 }
349
350 template <class Tp, class T, int Tensor_Dim0, int Tensor_Dim12, int Dim12,
351 int Dim0, char i, char j, char k>
352 template <class B, class U>
353 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k> &
354 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k>::
355 operator-=(const Dg_Expr<B, U, Dim12, Dim0, i, j, k> &result)
356 {
357 T3ch_equals_T3dg(iter, result, Number<Dim12>(), Number<Dim12>(),
358 Number<Dim0>(), T3ch_equals_T3dg_Op<2>());
359 return *this;
360 }
361
362 /* T3ch=T3ch_Expr(T3ch) */
363
364 template <class Tp, class T, int Tensor_Dim0, int Tensor_Dim12, int Dim12,
365 int Dim0, char i, char j, char k>
366 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k> &
367 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k>::
368 operator=(const Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12,
369 Dim0, i, j, k> &result)
370 {
371 return operator=<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T>(result);
372 }
373
374 template <class Tp, class T, int Tensor_Dim0, int Tensor_Dim12, int Dim12,
375 int Dim0, char i, char j, char k>
376 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k> &
377 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k>::
378 operator+=(const Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12,
379 Dim0, i, j, k> &result)
380 {
381 return operator+=<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T>(result);
382 }
383
384 template <class Tp, class T, int Tensor_Dim0, int Tensor_Dim12, int Dim12,
385 int Dim0, char i, char j, char k>
386 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k> &
387 Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k>::
388 operator-=(const Dg_Expr<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T, Dim12,
389 Dim0, i, j, k> &result)
390 {
391 return operator-=<Christof<Tp, Tensor_Dim0, Tensor_Dim12>, T>(result);
392 }
393
394 /* T3ch=U */
395
396 template <class A, class U, int Dim12, int Dim0, int Current_Dim0,
397 int Current_Dim1, int Current_Dim2>
398 void T3ch_equals_generic(A &iter, const U &u, const Number<Current_Dim0> &,
399 const Number<Current_Dim1> &,
400 const Number<Current_Dim2> &, const Number<Dim12> &,
401 const Number<Dim0> &)
402 {
403 iter(Current_Dim2 - 1, Current_Dim0 - 1, Current_Dim1 - 1) = u;
407 }
408
409 template <class A, class U, int Dim12, int Dim0, int Current_Dim1,
410 int Current_Dim2>
411 void T3ch_equals_generic(A &iter, const U &u, const Number<1> &,
412 const Number<Current_Dim1> &,
413 const Number<Current_Dim2> &, const Number<Dim12> &,
414 const Number<Dim0> &)
415 {
416 iter(Current_Dim2 - 1, 0, Current_Dim1 - 1) = u;
420 }
421
422 template <class A, class U, int Dim12, int Dim0, int Current_Dim2>
423 void T3ch_equals_generic(A &iter, const U &u, const Number<1> &,
424 const Number<1> &, const Number<Current_Dim2> &,
425 const Number<Dim12> &, const Number<Dim0> &)
426 {
427 iter(Current_Dim2 - 1, 0, 0) = u;
430 Number<Dim0>());
431 }
432
433 template <class A, class U, int Dim12, int Dim0>
434 void T3ch_equals_generic(A &iter, const U &u, const Number<1> &,
435 const Number<1> &, const Number<1> &,
436 const Number<Dim12> &, const Number<Dim0> &)
437 {
438 iter(0, 0, 0) = u;
439 }
440
441 template <class A, class T, int Tensor_Dim0, int Tensor_Dim12, int Dim12,
442 int Dim0, char i, char j, char k>
443 template <class U>
444 Dg_Expr<Christof<A, Tensor_Dim0, Tensor_Dim12>, T, Dim12, Dim0, i, j, k> &
446 operator=(const U &u)
447 {
450 return *this;
451 }
452
453 /* Assignment operators for the specializations to Ddg_number_rhs_0. */
454
455 /* T4ddgrhs0=T3dg */
456
457 template <class A, class B, class U, int Dim23, int Dim1, char i, char j,
458 char k, int Current_Dim0, int Current_Dim1, int Current_Dim2, int N>
461 const Number<Current_Dim0> &,
462 const Number<Current_Dim1> &,
463 const Number<Current_Dim2> &, const Number<N> &)
464 {
465 iter(N, Current_Dim2 - 1, Current_Dim0 - 1, Current_Dim1 - 1)
466 = result(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1);
469 Number<N>());
470 }
471
472 template <class A, class B, class U, int Dim23, int Dim1, char i, char j,
473 char k, int Current_Dim1, int Current_Dim2, int N>
476 const Number<1> &, const Number<Current_Dim1> &,
477 const Number<Current_Dim2> &, const Number<N> &)
478 {
479 iter(N, Current_Dim2 - 1, 0, Current_Dim1 - 1)
480 = result(0, Current_Dim1 - 1, Current_Dim2 - 1);
483 Number<N>());
484 }
485
486 template <class A, class B, class U, int Dim23, int Dim1, char i, char j,
487 char k, int Current_Dim2, int N>
490 const Number<1> &, const Number<1> &,
491 const Number<Current_Dim2> &, const Number<N> &)
492 {
493 iter(N, Current_Dim2 - 1, 0, 0) = result(0, 0, Current_Dim2 - 1);
496 }
497
498 template <class A, class B, class U, int Dim23, int Dim1, char i, char j,
499 char k, int N>
502 const Number<1> &, const Number<1> &,
503 const Number<1> &, const Number<N> &)
504 {
505 iter(N, 0, 0, 0) = result(0, 0, 0);
506 }
507
508 template <class A, class T, int Dim23, int Dim1, char i, char j, char k,
509 int N>
510 template <class B, class U>
511 Dg_Expr<Ddg_number_rhs_0<A, T, N>, T, Dim23, Dim1, i, j, k> &
512 Dg_Expr<Ddg_number_rhs_0<A, T, N>, T, Dim23, Dim1, i, j, k>::
513 operator=(const Dg_Expr<B, U, Dim23, Dim1, i, j, k> &result)
514 {
515 T4ddgrhs0_equals_T3dg(iter, result, Number<Dim23>(), Number<Dim23>(),
516 Number<Dim1>(), Number<N>());
517 return *this;
518 }
519
520 /* T4ddgrhs0=T4ddgrhs0 */
521
522 template <class A, class T, int Dim23, int Dim1, char i, char j, char k,
523 int N>
524 Dg_Expr<Ddg_number_rhs_0<A, T, N>, T, Dim23, Dim1, i, j, k> &
525 Dg_Expr<Ddg_number_rhs_0<A, T, N>, T, Dim23, Dim1, i, j, k>::operator=(
526 const Dg_Expr<Ddg_number_rhs_0<A, T, N>, T, Dim23, Dim1, i, j, k> &result)
527 {
528 return operator=<Ddg_number_rhs_0<A, T, N>, T>(result);
529 }
530}
static Index< 'L', 3 > L
@ R
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
const double T
Tensors class implemented by Walter Landry.
Definition: FTensor.hpp:51
void T3dg_equals_generic(A &iter, const U &u, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &, const Number< Dim01 > &, const Number< Dim2 > &)
void T3dg_plus_equals_T3dg(A &iter, const Dg_Expr< B, U, Dim01, Dim2, i, j, k > &result, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &, const Op &)
void T3ch_equals_generic(A &iter, const U &u, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &, const Number< Dim12 > &, const Number< Dim0 > &)
void T4ddgrhs0_equals_T3dg(A &iter, const Dg_Expr< B, U, Dim23, Dim1, i, j, k > &result, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &, const Number< N > &)
void T3dg_equals_T3dg(A &iter, const Dg_Expr< B, U, Dim01, Dim2, i, j, k > &result, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &)
void T3ch_equals_T3dg(A &iter, const Dg_Expr< B, U, Dim12, Dim0, i, j, k > &result, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &, const Op &)
constexpr AssemblyType A
const int N
Definition: speed_test.cpp:3