v0.14.0
Loading...
Searching...
No Matches
Ddg_times_Tensor2.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Ddg*Tensor2 and Tensor2*Ddg, yielding a
3 Tensor2_symmetric. */
4
5#pragma once
6
7namespace FTensor
8{
9 /* A(i,j,k,l)*B(k,l) */
10
11 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
12 char j, char k, char l>
14 {
17
18 template <int Current_Dim0, int Current_Dim1>
19 typename promote<T, U>::V
20 eval(const int N1, const int N2, const Number<Current_Dim0> &,
21 const Number<Current_Dim1> &) const
22 {
23 return iterA(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1)
24 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
27 }
28 template <int Current_Dim1>
29 typename promote<T, U>::V
30 eval(const int N1, const int N2, const Number<1> &,
31 const Number<Current_Dim1> &) const
32 {
33 return iterA(N1, N2, 0, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
35 }
36 typename promote<T, U>::V eval(const int N1, const int N2,
37 const Number<1> &, const Number<1> &) const
38 {
39 return iterA(N1, N2, 0, 0) * iterB(0, 0);
40 }
41
42 public:
45 : iterA(a), iterB(b)
46 {}
47 typename promote<T, U>::V operator()(const int N1, const int N2) const
48 {
49 return eval(N1, N2, Number<Dim23>(), Number<Dim23>());
50 }
51 };
52
53 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
54 char j, char k, char l>
55 Tensor2_symmetric_Expr<
56 Ddg_times_Tensor2_23<A, B, T, U, Dim01, Dim23, i, j, k, l>,
57 typename promote<T, U>::V, Dim01, i, j>
60 {
61 using TensorExpr
64 i, j>(TensorExpr(a, b));
65 }
66
67 /* B(k,l)*A(i,j,k,l) */
68
69 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
70 char j, char k, char l>
71 Tensor2_symmetric_Expr<
72 Ddg_times_Tensor2_23<A, B, T, U, Dim01, Dim23, i, j, k, l>,
73 typename promote<T, U>::V, Dim01, i, j>
76 {
77 using TensorExpr
80 i, j>(TensorExpr(a, b));
81 }
82
83 /* A(i,j,k,l)*B(l,k) */
84
85 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
86 char j, char k, char l>
88 {
91
92 template <int Current_Dim0, int Current_Dim1>
93 typename promote<T, U>::V
94 eval(const int N1, const int N2, const Number<Current_Dim0> &,
95 const Number<Current_Dim1> &) const
96 {
97 return iterA(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1)
98 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
101 }
102 template <int Current_Dim1>
103 typename promote<T, U>::V
104 eval(const int N1, const int N2, const Number<1> &,
105 const Number<Current_Dim1> &) const
106 {
107 return iterA(N1, N2, 0, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
109 }
110 typename promote<T, U>::V eval(const int N1, const int N2,
111 const Number<1> &, const Number<1> &) const
112 {
113 return iterA(N1, N2, 0, 0) * iterB(0, 0);
114 }
115
116 public:
119 : iterA(a), iterB(b)
120 {}
121 typename promote<T, U>::V operator()(const int N1, const int N2) const
122 {
123 return eval(N1, N2, Number<Dim23>(), Number<Dim23>());
124 }
125 };
126
127 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
128 char j, char k, char l>
129 Tensor2_symmetric_Expr<
130 Ddg_times_Tensor2_32<A, B, T, U, Dim01, Dim23, i, j, k, l>,
131 typename promote<T, U>::V, Dim01, i, j>
134 {
135 using TensorExpr
138 i, j>(TensorExpr(a, b));
139 }
140
141 /* B(l,k)*A(i,j,k,l) */
142
143 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
144 char j, char k, char l>
145 Tensor2_symmetric_Expr<
146 Ddg_times_Tensor2_32<A, B, T, U, Dim01, Dim23, i, j, k, l>,
147 typename promote<T, U>::V, Dim01, i, j>
150 {
151 using TensorExpr
154 i, j>(TensorExpr(a, b));
155 }
156
157 /* A(i,j,k,l)*B(i,j) */
158
159 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
160 char j, char k, char l>
164
165 template <int Current_Dim0, int Current_Dim1>
166 typename promote<T, U>::V eval(const int N1, const int N2,
167 const Number<Current_Dim0> &,
168 const Number<Current_Dim1> &) const {
169 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N1, N2) *
170 iterB(Current_Dim0 - 1, Current_Dim1 - 1) +
172 }
173 template <int Current_Dim1>
174 typename promote<T, U>::V eval(const int N1, const int N2,
175 const Number<1> &,
176 const Number<Current_Dim1> &) const {
177 return iterA(0, Current_Dim1 - 1, N1, N2) * iterB(0, Current_Dim1 - 1) +
179 }
180 typename promote<T, U>::V eval(const int N1, const int N2,
181 const Number<1> &, const Number<1> &) const {
182 return iterA(0, 0, N1, N2) * iterB(0, 0);
183 }
184
185 public:
188 : iterA(a), iterB(b) {}
189 typename promote<T, U>::V operator()(const int N1, const int N2) const {
190 return eval(N1, N2, Number<Dim01>(), Number<Dim01>());
191 }
192 };
193
194 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
195 char j, char k, char l>
196 Tensor2_symmetric_Expr<
197 Ddg_times_Tensor2_01<A, B, T, U, Dim01, Dim23, i, j, k, l>,
198 typename promote<T, U>::V, Dim23, k, l>
201 using TensorExpr =
204 k, l>(TensorExpr(a, b));
205 }
206
207 /* B(i,j)*A(i,j,k,l) */
208
209 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
210 char j, char k, char l>
211 Tensor2_symmetric_Expr<
212 Ddg_times_Tensor2_01<A, B, T, U, Dim01, Dim23, i, j, k, l>,
213 typename promote<T, U>::V, Dim23, k, l>
216 using TensorExpr =
219 k, l>(TensorExpr(a, b));
220 }
221
222 /* A(j,i,k,l)*B(i,j) */
223
224 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
225 char j, char k, char l>
226 Tensor2_symmetric_Expr<
227 Ddg_times_Tensor2_01<A, B, T, U, Dim01, Dim23, i, j, k, l>,
228 typename promote<T, U>::V, Dim23, k, l>
231 using TensorExpr =
234 k, l>(TensorExpr(a, b));
235 }
236
237 /* B(i,j)*A(j,i,k,l) */
238
239 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
240 char j, char k, char l>
241 Tensor2_symmetric_Expr<
242 Ddg_times_Tensor2_01<A, B, T, U, Dim01, Dim23, i, j, k, l>,
243 typename promote<T, U>::V, Dim23, k, l>
246 using TensorExpr =
249 k, l>(TensorExpr(a, b));
250 }
251
252 /* This operatores will yield tensor 2 */
253
254 /* A(i,j,k,l)*B(j,l) */
255
256 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
257 char j, char k, char l>
259 {
262
263 template <int Current_Dim0, int Current_Dim1>
264 typename promote<T, U>::V
265 eval(const int N1, const int N2, const Number<Current_Dim0> &,
266 const Number<Current_Dim1> &) const
267 {
268 return iterA(N1, Current_Dim0 - 1, N2, Current_Dim1 - 1) *
269 iterB(Current_Dim0 - 1, Current_Dim1 - 1) +
271 }
272 template <int Current_Dim1>
273 typename promote<T, U>::V
274 eval(const int N1, const int N2, const Number<1> &,
275 const Number<Current_Dim1> &) const
276 {
277 return iterA(N1, 0, N2, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1) +
279 }
280 typename promote<T, U>::V eval(const int N1, const int N2,
281 const Number<1> &, const Number<1> &) const
282 {
283 return iterA(N1, 0, N2, 0) * iterB(0, 0);
284 }
285
286 public:
289 : iterA(a), iterB(b)
290 {}
291 typename promote<T, U>::V operator()(const int N1, const int N2) const
292 {
293 return eval(N1, N2, Number<Dim01>(), Number<Dim23>());
294 }
295 };
296
297 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
298 char j, char k, char l>
299 Tensor2_Expr<
300 Ddg_times_Tensor2_13<A, B, T, U, Dim01, Dim23, i, j, k, l>,
301 typename promote<T, U>::V, Dim01, Dim23, i, k>
304 {
305 using TensorExpr
308 k>(TensorExpr(a, b));
309 }
310
311 /* B(j,l)*A(i,j,k,l) */
312
313 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
314 char j, char k, char l>
315 Tensor2_Expr<Ddg_times_Tensor2_13<A, B, T, U, Dim01, Dim23, i, j, k, l>,
316 typename promote<T, U>::V, Dim01, Dim23, i, k>
319 using TensorExpr
322 k>(TensorExpr(a, b));
323 }
324
325 /* This file has all of the declarations for expressions like
326 Ddg*Tensor2 and Tensor2*Ddg, yielding a
327 Tensor4. */
328
329 // FIXME: That should create T4 with first two indices symmetric two other
330 // not. At this point will not create ideal code.
331 // TODO: Not all possible permutations are included.
332 // TODO: Check dimensions could be errors
333
334 /* A(i,j,k,l)*B(l,m) */
335
336 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
337 char i, char j, char k, char l, char m>
339 {
342
343 template <int Current_Dim0>
344 typename promote<T, U>::V
345 eval(const int N1, const int N2, const int N3, const int N4,
346 const Number<Current_Dim0> &) const
347 {
348 return iterA(N1, N2, N3, Current_Dim0 - 1) * iterB(Current_Dim0 - 1, N4)
349 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
350 }
351 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
352 const int N4, const Number<1> &) const
353 {
354 return iterA(N1, N2, N3, 0) * iterB(0, N4);
355 }
356
357 public:
360 : iterA(a), iterB(b)
361 {}
362 typename promote<T, U>::V
363 operator()(const int N1, const int N2, const int N3, const int N4) const
364 {
365 return eval(N1, N2, N3, N4, Number<Dim23>());
366 }
367 };
368
369 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
370 char i, char j, char k, char l, char m>
371 inline const Tensor4_Expr<
372 const Ddg_times_Tensor2_3_1<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
373 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, k, m>
376 {
377 typedef const Ddg_times_Tensor2_3_1<A, B, T, U, Dim01, Dim23, Dim4, i, j,
378 k, l, m>
379 TensorExpr;
381 Dim23, Dim4, i, j, k, m>(TensorExpr(a, b));
382 }
383
384 /* B(l,m)*A(i,j,k,l) */
385
386 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
387 char i, char j, char k, char l, char m>
388 inline const Tensor4_Expr<
389 const Ddg_times_Tensor2_3_1<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
390 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, k, m>
393 {
394 typedef const Ddg_times_Tensor2_3_1<A, B, T, U, Dim01, Dim23, Dim4, i, j,
395 k, l, m>
396 TensorExpr;
398 Dim23, Dim4, i, j, k, m>(TensorExpr(a, b));
399 }
400
401 /* A(i,j,k,l)*B(m,l) */
402
403 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
404 char i, char j, char k, char l, char m>
406 {
409
410 template <int Current_Dim0>
411 typename promote<T, U>::V
412 eval(const int N1, const int N2, const int N3, const int N4,
413 const Number<Current_Dim0> &) const
414 {
415 return iterA(N1, N2, N3, Current_Dim0 - 1) * iterB(N4, Current_Dim0 - 1)
416 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
417 }
418 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
419 const int N4, const Number<1> &) const
420 {
421 return iterA(N1, N2, N3, 0) * iterB(N4, 0);
422 }
423
424 public:
427 : iterA(a), iterB(b)
428 {}
429 typename promote<T, U>::V
430 operator()(const int N1, const int N2, const int N3, const int N4) const
431 {
432 return eval(N1, N2, N3, N4, Number<Dim23>());
433 }
434 };
435
436 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
437 char i, char j, char k, char l, char m>
438 inline const Tensor4_Expr<
439 const Ddg_times_Tensor2_3_0<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
440 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, k, m>
443 {
444 typedef const Ddg_times_Tensor2_3_0<A, B, T, U, Dim01, Dim23, Dim4, i, j,
445 k, l, m>
446 TensorExpr;
448 Dim23, Dim4, i, j, k, m>(TensorExpr(a, b));
449 }
450
451 /* B(m,l)*A(i,j,k,l) */
452
453 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
454 char i, char j, char k, char l, char m>
455 inline const Tensor4_Expr<
456 const Ddg_times_Tensor2_3_0<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
457 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, k, m>
460 {
461 typedef const Ddg_times_Tensor2_3_0<A, B, T, U, Dim01, Dim23, Dim4, i, j,
462 k, l, m>
463 TensorExpr;
465 Dim23, Dim4, i, j, k, m>(TensorExpr(a, b));
466 }
467
468 /* A(i,j,k,l)*B(m,k) */
469
470 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
471 char i, char j, char k, char l, char m>
473 {
476
477 template <int Current_Dim0>
478 typename promote<T, U>::V
479 eval(const int N1, const int N2, const int N3, const int N4,
480 const Number<Current_Dim0> &) const
481 {
482 return iterA(N1, N2, Current_Dim0 - 1, N4) * iterB(N3, Current_Dim0 - 1)
483 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
484 }
485 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
486 const int N4, const Number<1> &) const
487 {
488 return iterA(N1, N2, 0, N4) * iterB(N3, 0);
489 }
490
491 public:
494 : iterA(a), iterB(b)
495 {}
496 typename promote<T, U>::V
497 operator()(const int N1, const int N2, const int N3, const int N4) const
498 {
499 return eval(N1, N2, N3, N4, Number<Dim23>());
500 }
501 };
502
503 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
504 char i, char j, char k, char l, char m>
505 inline const Tensor4_Expr<
506 const Ddg_times_Tensor2_2_0<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
507 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, m, l>
510 {
511 typedef const Ddg_times_Tensor2_2_0<A, B, T, U, Dim01, Dim23, Dim4, i, j,
512 k, l, m>
513 TensorExpr;
515 Dim23, Dim4, i, j, m, l>(TensorExpr(a, b));
516 }
517
518 /* B(m,k)*A(i,j,k,l) */
519
520 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
521 char i, char j, char k, char l, char m>
522 inline const Tensor4_Expr<
523 const Ddg_times_Tensor2_2_0<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
524 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, m, l>
527 {
528 typedef const Ddg_times_Tensor2_2_0<A, B, T, U, Dim01, Dim23, Dim4, i, j,
529 k, l, m>
530 TensorExpr;
532 Dim23, Dim4, i, j, m, l>(TensorExpr(a, b));
533 }
534
535 /* A(i,j,k,l)*B(k,m) */
536
537 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
538 char i, char j, char k, char l, char m>
540 {
543
544 template <int Current_Dim0>
545 typename promote<T, U>::V
546 eval(const int N1, const int N2, const int N3, const int N4,
547 const Number<Current_Dim0> &) const
548 {
549 return iterA(N1, N2, Current_Dim0 - 1, N4) * iterB(Current_Dim0 - 1, N3)
550 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
551 }
552 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
553 const int N4, const Number<1> &) const
554 {
555 return iterA(N1, N2, 0, N4) * iterB(0, N3);
556 }
557
558 public:
561 : iterA(a), iterB(b)
562 {}
563 typename promote<T, U>::V
564 operator()(const int N1, const int N2, const int N3, const int N4) const
565 {
566 return eval(N1, N2, N3, N4, Number<Dim23>());
567 }
568 };
569
570 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
571 char i, char j, char k, char l, char m>
572 inline const Tensor4_Expr<
573 const Ddg_times_Tensor2_2_1<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
574 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, m, l>
577 {
578 typedef const Ddg_times_Tensor2_2_1<A, B, T, U, Dim01, Dim23, Dim4, i, j,
579 k, l, m>
580 TensorExpr;
582 Dim23, Dim4, i, j, m, l>(TensorExpr(a, b));
583 }
584
585 /* B(k,m)*A(i,j,k,l) */
586
587 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim4,
588 char i, char j, char k, char l, char m>
589 inline const Tensor4_Expr<
590 const Ddg_times_Tensor2_2_1<A, B, T, U, Dim01, Dim23, Dim4, i, j, k, l, m>,
591 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim4, i, j, m, l>
594 {
595 typedef const Ddg_times_Tensor2_2_1<A, B, T, U, Dim01, Dim23, Dim4, i, j,
596 k, l, m>
597 TensorExpr;
599 Dim23, Dim4, i, j, m, l>(TensorExpr(a, b));
600 }
601
602 /* A(i,j,k,l)*B(j,m) */
603
604 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
605 char i, char j, char k, char l, char m>
607 {
610
611 template <int Current_Dim0>
612 typename promote<T, U>::V
613 eval(const int N1, const int N2, const int N3, const int N4,
614 const Number<Current_Dim0> &) const
615 {
616 return iterA(N1, Current_Dim0 - 1, N3, N4) * iterB(Current_Dim0 - 1, N2)
617 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
618 }
619 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
620 const int N4, const Number<1> &) const
621 {
622 return iterA(N1, 0, N3, N4) * iterB(0, N2);
623 }
624
625 public:
628 : iterA(a), iterB(b)
629 {}
630 typename promote<T, U>::V
631 operator()(const int N1, const int N2, const int N3, const int N4) const
632 {
633 return eval(N1, N2, N3, N4, Number<Dim01>());
634 }
635 };
636
637 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
638 char i, char j, char k, char l, char m>
639 inline const Tensor4_Expr<
640 const Ddg_times_Tensor2_1_0<A, B, T, U, Dim01, Dim23, Dim2, i, j, k, l, m>,
641 typename promote<T, U>::V, Dim01, Dim2, Dim23, Dim23, i, m, k, l>
644 {
645 typedef const Ddg_times_Tensor2_1_0<A, B, T, U, Dim01, Dim23, Dim2, i, j,
646 k, l, m>
647 TensorExpr;
649 Dim23, Dim2, i, m, k, l>(TensorExpr(a, b));
650 }
651
652 /* B(j,m)*A(i,j,k,l) */
653
654 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
655 char i, char j, char k, char l, char m>
656 inline const Tensor4_Expr<
657 const Ddg_times_Tensor2_1_0<A, B, T, U, Dim01, Dim23, Dim2, i, j, k, l, m>,
658 typename promote<T, U>::V, Dim01, Dim2, Dim23, Dim23, i, m, k, l>
661 {
662 typedef const Ddg_times_Tensor2_1_0<A, B, T, U, Dim01, Dim23, Dim2, i, j,
663 k, l, m>
664 TensorExpr;
666 Dim23, Dim2, i, m, k, l>(TensorExpr(a, b));
667 }
668
669 /* A(i,j,k,l)*B(m,j) */
670
671 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
672 char i, char j, char k, char l, char m>
674 {
677
678 template <int Current_Dim0>
679 typename promote<T, U>::V
680 eval(const int N1, const int N2, const int N3, const int N4,
681 const Number<Current_Dim0> &) const
682 {
683 return iterA(N1, Current_Dim0 - 1, N3, N4) * iterB(N2, Current_Dim0 - 1)
684 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
685 }
686 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
687 const int N4, const Number<1> &) const
688 {
689 return iterA(N1, 0, N3, N4) * iterB(N2, 0);
690 }
691
692 public:
695 : iterA(a), iterB(b)
696 {}
697 typename promote<T, U>::V
698 operator()(const int N1, const int N2, const int N3, const int N4) const
699 {
700 return eval(N1, N2, N3, N4, Number<Dim01>());
701 }
702 };
703
704 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
705 char i, char j, char k, char l, char m>
706 inline const Tensor4_Expr<
707 const Ddg_times_Tensor2_1_1<A, B, T, U, Dim01, Dim23, Dim2, i, j, k, l, m>,
708 typename promote<T, U>::V, Dim01, Dim2, Dim23, Dim23, i, m, k, l>
711 {
712 typedef const Ddg_times_Tensor2_1_1<A, B, T, U, Dim01, Dim23, Dim2, i, j,
713 k, l, m>
714 TensorExpr;
716 Dim23, Dim23, i, m, k, l>(TensorExpr(a, b));
717 }
718
719 /* B(m,j)*A(i,j,k,l) */
720
721 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
722 char i, char j, char k, char l, char m>
723 inline const Tensor4_Expr<
724 const Ddg_times_Tensor2_1_1<A, B, T, U, Dim01, Dim23, Dim2, i, j, k, l, m>,
725 typename promote<T, U>::V, Dim01, Dim2, Dim23, Dim23, i, m, k, l>
728 {
729 typedef const Ddg_times_Tensor2_1_1<A, B, T, U, Dim01, Dim23, Dim2, i, j,
730 k, l, m>
731 TensorExpr;
733 Dim23, Dim2, i, m, k, l>(TensorExpr(a, b));
734 }
735
736 /* A(i,j,k,l)*B(i,m) */
737
738 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim1,
739 char i, char j, char k, char l, char m>
741 {
744
745 template <int Current_Dim0>
746 typename promote<T, U>::V
747 eval(const int N1, const int N2, const int N3, const int N4,
748 const Number<Current_Dim0> &) const
749 {
750 return iterA(Current_Dim0 - 1, N2, N3, N4) * iterB(Current_Dim0 - 1, N1)
751 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
752 }
753 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
754 const int N4, const Number<1> &) const
755 {
756 return iterA(0, N2, N3, N4) * iterB(0, N1);
757 }
758
759 public:
762 : iterA(a), iterB(b)
763 {}
764 typename promote<T, U>::V
765 operator()(const int N1, const int N2, const int N3, const int N4) const
766 {
767 return eval(N1, N2, N3, N4, Number<Dim01>());
768 }
769 };
770
771 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim1,
772 char i, char j, char k, char l, char m>
773 inline const Tensor4_Expr<
774 const Ddg_times_Tensor2_0_0<A, B, T, U, Dim01, Dim23, Dim1, i, j, k, l, m>,
775 typename promote<T, U>::V, Dim1, Dim01, Dim23, Dim23, m, j, k, l>
778 {
779 typedef const Ddg_times_Tensor2_0_0<A, B, T, U, Dim01, Dim23, Dim1, i, j,
780 k, l, m>
781 TensorExpr;
783 Dim23, Dim23, m, j, k, l>(TensorExpr(a, b));
784 }
785
786 /* B(i,m)*A(i,j,k,l) */
787
788 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim1,
789 char i, char j, char k, char l, char m>
790 inline const Tensor4_Expr<
791 const Ddg_times_Tensor2_0_0<A, B, T, U, Dim01, Dim23, Dim1, i, j, k, l, m>,
792 typename promote<T, U>::V, Dim01, Dim01, Dim23, Dim1, m, j, k, l>
795 {
796 typedef const Ddg_times_Tensor2_0_0<A, B, T, U, Dim01, Dim23, Dim1, i, j,
797 k, l, m>
798 TensorExpr;
800 Dim23, Dim23, m, j, k, l>(TensorExpr(a, b));
801 }
802
803 /* A(i,j,k,l)*B(m,i) */
804
805 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim1,
806 char i, char j, char k, char l, char m>
808 {
811
812 template <int Current_Dim0>
813 typename promote<T, U>::V
814 eval(const int N1, const int N2, const int N3, const int N4,
815 const Number<Current_Dim0> &) const
816 {
817 return iterA(Current_Dim0 - 1, N2, N3, N4) * iterB(N1, Current_Dim0 - 1)
818 + eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>());
819 }
820 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
821 const int N4, const Number<1> &) const
822 {
823 return iterA(0, N2, N3, N4) * iterB(N1, 0);
824 }
825
826 public:
829 : iterA(a), iterB(b)
830 {}
831 typename promote<T, U>::V
832 operator()(const int N1, const int N2, const int N3, const int N4) const
833 {
834 return eval(N1, N2, N3, N4, Number<Dim01>());
835 }
836 };
837
838 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim1,
839 char i, char j, char k, char l, char m>
840 inline const Tensor4_Expr<
841 const Ddg_times_Tensor2_0_1<A, B, T, U, Dim01, Dim23, Dim1, i, j, k, l, m>,
842 typename promote<T, U>::V, Dim1, Dim01, Dim23, Dim23, m, j, k, l>
845 {
846 typedef const Ddg_times_Tensor2_0_1<A, B, T, U, Dim01, Dim23, Dim1, i, j,
847 k, l, m>
848 TensorExpr;
850 Dim23, Dim1, m, j, k, l>(TensorExpr(a, b));
851 }
852
853 /* B(i,m)*A(i,j,k,l) */
854
855 template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim1,
856 char i, char j, char k, char l, char m>
857 inline const Tensor4_Expr<
858 const Ddg_times_Tensor2_0_1<A, B, T, U, Dim01, Dim23, Dim1, i, j, k, l, m>,
859 typename promote<T, U>::V, Dim1, Dim01, Dim23, Dim23, m, j, k, l>
862 {
863 typedef const Ddg_times_Tensor2_0_1<A, B, T, U, Dim01, Dim23, Dim1, i, j,
864 k, l, m>
865 TensorExpr;
867 Dim23, Dim23, m, j, k, l>(TensorExpr(a, b));
868 }
869}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
Tensor2_Expr< B, U, Dim01, Dim01, i, j > iterB
Ddg_times_Tensor2_01(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim01, Dim01, i, j > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1, const int N2) const
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
Ddg_times_Tensor2_0_0(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim01, Dim1, i, m > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
const Tensor2_Expr< B, U, Dim01, Dim1, i, m > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
Ddg_times_Tensor2_0_1(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim01, Dim1, m, i > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
const Tensor2_Expr< B, U, Dim01, Dim1, m, i > iterB
Tensor2_Expr< B, U, Dim01, Dim23, j, l > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Ddg_times_Tensor2_13(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim01, Dim23, j, l > &b)
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V operator()(const int N1, const int N2) const
const Tensor2_Expr< B, U, Dim01, Dim2, j, m > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
Ddg_times_Tensor2_1_0(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim01, Dim2, j, m > &b)
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
Ddg_times_Tensor2_1_1(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim01, Dim2, m, j > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
const Tensor2_Expr< B, U, Dim01, Dim2, m, j > iterB
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1, const int N2) const
Ddg_times_Tensor2_23(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim23, Dim23, k, l > &b)
Tensor2_Expr< B, U, Dim23, Dim23, k, l > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
Ddg_times_Tensor2_2_0(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim4, Dim23, m, k > &b)
const Tensor2_Expr< B, U, Dim4, Dim23, m, k > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
const Tensor2_Expr< B, U, Dim4, Dim23, k, m > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
Ddg_times_Tensor2_2_1(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim4, Dim23, k, m > &b)
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V operator()(const int N1, const int N2) const
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
Tensor2_Expr< B, U, Dim23, Dim23, l, k > iterB
Ddg_times_Tensor2_32(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim23, Dim23, l, k > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
Ddg_times_Tensor2_3_0(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim4, Dim23, m, l > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
const Tensor2_Expr< B, U, Dim4, Dim23, m, l > iterB
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
const Tensor2_Expr< B, U, Dim23, Dim4, l, m > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &) const
const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
Ddg_times_Tensor2_3_1(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_Expr< B, U, Dim23, Dim4, l, m > &b)
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
FTensor::Index< 'm', SPACE_DIM > m
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
promote< T, U >::V operator*(const Ddg_Expr< A, T, Dim, Dim, i, j, k, l > &a, const Ddg_Expr< B, U, Dim, Dim, i, k, j, l > &b)
constexpr AssemblyType A