v0.15.0
Loading...
Searching...
No Matches
Tensor3_times_Tensor3.hpp
Go to the documentation of this file.
1/* Fully contracts a Tensor3 with a Tensor3, yielding a typename
2 promote<T,U>::V. */
3
4#pragma once
5
6namespace FTensor
7{
8 /* A(i,j,k)*B(i,j,k) -> scalar */
9
10 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
11 char i, char j, char k, int Current_Dim0, int Current_Dim1,
12 int Current_Dim2>
13 typename promote<T, U>::V
18 {
19 return a(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
20 * b(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
24 }
25
26 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
27 char i, char j, char k, int Current_Dim0, int Current_Dim2>
28 typename promote<T, U>::V
31 const Number<Current_Dim0> &, const Number<1> &,
33 {
34 return a(Current_Dim0 - 1, 0, Current_Dim2 - 1)
35 * b(Current_Dim0 - 1, 0, Current_Dim2 - 1)
38 }
39
40 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
41 char i, char j, char k, int Current_Dim0>
42 typename promote<T, U>::V
45 const Number<Current_Dim0> &, const Number<1> &,
46 const Number<1> &)
47 {
48 return a(Current_Dim0 - 1, 0, 0) * b(Current_Dim0 - 1, 0, 0)
50 Number<Dim2>());
51 }
52
53 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
54 char i, char j, char k>
55 typename promote<T, U>::V
58 const Number<1> &, const Number<1> &, const Number<1> &)
59 {
60 return a(0, 0, 0) * b(0, 0, 0);
61 }
62
63 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
64 char i, char j, char k>
65 typename promote<T, U>::V
72
73 /* A(i,j,k)*B(k,i,j) -> scalar */
74
75 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
76 char i, char j, char k, int Current_Dim0, int Current_Dim1,
77 int Current_Dim2>
78 typename promote<T, U>::V
83 {
84 return a(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
85 * b(Current_Dim2 - 1, Current_Dim0 - 1, Current_Dim1 - 1)
89 }
90
91 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
92 char i, char j, char k, int Current_Dim0, int Current_Dim2>
93 typename promote<T, U>::V
96 const Number<Current_Dim0> &, const Number<1> &,
98 {
99 return a(Current_Dim0 - 1, 0, Current_Dim2 - 1)
100 * b(Current_Dim2 - 1, Current_Dim0 - 1, 0)
103 }
104
105 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
106 char i, char j, char k, int Current_Dim0>
107 typename promote<T, U>::V
110 const Number<Current_Dim0> &, const Number<1> &,
111 const Number<1> &)
112 {
113 return a(Current_Dim0 - 1, 0, 0) * b(0, Current_Dim0 - 1, 0)
115 Number<Dim2>());
116 }
117
118 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
119 char i, char j, char k>
120 typename promote<T, U>::V
123 const Number<1> &, const Number<1> &, const Number<1> &)
124 {
125 return a(0, 0, 0) * b(0, 0, 0);
126 }
127
128 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
129 char i, char j, char k>
130 typename promote<T, U>::V
137
138 /* A(i,j,k)*B(j,k,i) -> scalar */
139
140 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
141 char i, char j, char k, int Current_Dim0, int Current_Dim1,
142 int Current_Dim2>
143 typename promote<T, U>::V
147 const Number<Current_Dim2> &)
148 {
149 return a(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
150 * b(Current_Dim1 - 1, Current_Dim2 - 1, Current_Dim0 - 1)
154 }
155
156 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
157 char i, char j, char k, int Current_Dim0, int Current_Dim2>
158 typename promote<T, U>::V
161 const Number<Current_Dim0> &, const Number<1> &,
162 const Number<Current_Dim2> &)
163 {
164 return a(Current_Dim0 - 1, 0, Current_Dim2 - 1)
165 * b(0, Current_Dim2 - 1, Current_Dim0 - 1)
168 }
169
170 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
171 char i, char j, char k, int Current_Dim0>
172 typename promote<T, U>::V
175 const Number<Current_Dim0> &, const Number<1> &,
176 const Number<1> &)
177 {
178 return a(Current_Dim0 - 1, 0, 0) * b(0, 0, Current_Dim0 - 1)
180 Number<Dim2>());
181 }
182
183 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
184 char i, char j, char k>
185 typename promote<T, U>::V
188 const Number<1> &, const Number<1> &, const Number<1> &)
189 {
190 return a(0, 0, 0) * b(0, 0, 0);
191 }
192
193 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
194 char i, char j, char k>
195 typename promote<T, U>::V
202
203 /* A(i,j,k)*B(j,i,k) -> scalar */
204
205 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
206 char i, char j, char k, int Current_Dim0, int Current_Dim1,
207 int Current_Dim2>
208 typename promote<T, U>::V
212 const Number<Current_Dim2> &)
213 {
214 return a(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
215 * b(Current_Dim1 - 1, Current_Dim0 - 1, Current_Dim2 - 1)
219 }
220
221 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
222 char i, char j, char k, int Current_Dim0, int Current_Dim2>
223 typename promote<T, U>::V
226 const Number<Current_Dim0> &, const Number<1> &,
227 const Number<Current_Dim2> &)
228 {
229 return a(Current_Dim0 - 1, 0, Current_Dim2 - 1)
230 * b(0, Current_Dim0 - 1, Current_Dim2 - 1)
233 }
234
235 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
236 char i, char j, char k, int Current_Dim0>
237 typename promote<T, U>::V
240 const Number<Current_Dim0> &, const Number<1> &,
241 const Number<1> &)
242 {
243 return a(Current_Dim0 - 1, 0, 0) * b(0, Current_Dim0 - 1, 0)
245 Number<Dim2>());
246 }
247
248 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
249 char i, char j, char k>
250 typename promote<T, U>::V
253 const Number<1> &, const Number<1> &, const Number<1> &)
254 {
255 return a(0, 0, 0) * b(0, 0, 0);
256 }
257
258 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
259 char i, char j, char k>
260 typename promote<T, U>::V
267
268 /* A(i,j,k)*B(k,j,i) -> scalar */
269
270 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
271 char i, char j, char k, int Current_Dim0, int Current_Dim1,
272 int Current_Dim2>
273 typename promote<T, U>::V
277 const Number<Current_Dim2> &)
278 {
279 return a(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
280 * b(Current_Dim2 - 1, Current_Dim1 - 1, Current_Dim0 - 1)
284 }
285
286 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
287 char i, char j, char k, int Current_Dim0, int Current_Dim2>
288 typename promote<T, U>::V
291 const Number<Current_Dim0> &, const Number<1> &,
292 const Number<Current_Dim2> &)
293 {
294 return a(Current_Dim0 - 1, 0, Current_Dim2 - 1)
295 * b(Current_Dim2 - 1, 0, Current_Dim0 - 1)
298 }
299
300 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
301 char i, char j, char k, int Current_Dim0>
302 typename promote<T, U>::V
305 const Number<Current_Dim0> &, const Number<1> &,
306 const Number<1> &)
307 {
308 return a(Current_Dim0 - 1, 0, 0) * b(0, 0, Current_Dim0 - 1)
310 Number<Dim2>());
311 }
312
313 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
314 char i, char j, char k>
315 typename promote<T, U>::V
318 const Number<1> &, const Number<1> &, const Number<1> &)
319 {
320 return a(0, 0, 0) * b(0, 0, 0);
321 }
322
323 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
324 char i, char j, char k>
325 typename promote<T, U>::V
332
333 /* A(i,j,k)*B(i,k,j) -> scalar */
334
335 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
336 char i, char j, char k, int Current_Dim0, int Current_Dim1,
337 int Current_Dim2>
338 typename promote<T, U>::V
342 const Number<Current_Dim2> &)
343 {
344 return a(Current_Dim0 - 1, Current_Dim1 - 1, Current_Dim2 - 1)
345 * b(Current_Dim0 - 1, Current_Dim2 - 1, Current_Dim1 - 1)
349 }
350
351 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
352 char i, char j, char k, int Current_Dim0, int Current_Dim2>
353 typename promote<T, U>::V
356 const Number<Current_Dim0> &, const Number<1> &,
357 const Number<Current_Dim2> &)
358 {
359 return a(Current_Dim0 - 1, 0, Current_Dim2 - 1)
360 * b(Current_Dim0 - 1, Current_Dim2 - 1, 0)
363 }
364
365 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
366 char i, char j, char k, int Current_Dim0>
367 typename promote<T, U>::V
370 const Number<Current_Dim0> &, const Number<1> &,
371 const Number<1> &)
372 {
373 return a(Current_Dim0 - 1, 0, 0) * b(Current_Dim0 - 1, 0, 0)
375 Number<Dim2>());
376 }
377
378 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
379 char i, char j, char k>
380 typename promote<T, U>::V
383 const Number<1> &, const Number<1> &, const Number<1> &)
384 {
385 return a(0, 0, 0) * b(0, 0, 0);
386 }
387
388 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
389 char i, char j, char k>
390 typename promote<T, U>::V
397
398 /* A(i,j,k)*B(j,i,l) -> Tensor2 */
399
400 template <class A, class B, class T, class U, int Dim04, int Dim13, int Dim2,
401 int Dim5, char i, char j, char k, char l>
403 {
406
407 template <int CurrentDim0, int CurrentDim1>
408 typename promote<T, U>::V eval(const int N1, const int N2,
409 const Number<CurrentDim0> &,
410 const Number<CurrentDim1> &) const {
411 return iterA(CurrentDim0 - 1, CurrentDim1 - 1, N1) *
412 iterB(CurrentDim1 - 1, CurrentDim0 - 1, N2) +
414 }
415 template <int CurrentDim0>
416 typename promote<T, U>::V eval(const int N1, const int N2,
417 const Number<CurrentDim0> &,
418 const Number<1> &) const {
419 return iterA(CurrentDim0 - 1, 0, N1) * iterB(0, CurrentDim0 - 1, N2) +
421 }
422 typename promote<T, U>::V eval(const int N1, const int N2,
423 const Number<1> &, const Number<1> &) const {
424 return iterA(0, 0, N1) * iterB(0, 0, N2);
425 }
426
427 public:
433 typename promote<T, U>::V operator()(const int &N1, const int &N2) const
434 {
435 return eval(N1, N2, Number<Dim04>(), Number<Dim13>());
436 }
437 };
438
439 template <class A, class B, class T, class U, int Dim04, int Dim13, int Dim2,
440 int Dim5, char i, char j, char k, char l>
441 Tensor2_Expr<Tensor3_times_Tensor3_12_21<A, B, T, U, Dim04, Dim13, Dim2, Dim5,
442 i, j, k, l>,
443 typename promote<T, U>::V, Dim2, Dim5, k, l>
446 using TensorExpr = Tensor3_times_Tensor3_12_21<A, B, T, U, Dim04, Dim13,
447 Dim2, Dim5, i, j, k, l>;
449 l>(TensorExpr(a, b));
450 };
451
452 /* A(j,l,k)*B(i,k,l) -> Tensor2 */
453
454 template <class A, class B, class T, class U, int Dim15, int Dim24, int Dim0,
455 int Dim3, char i, char j, char k, char l>
459
460 template <int CurrentDim0, int CurrentDim1>
461 typename promote<T, U>::V eval(const int N1, const int N2,
462 const Number<CurrentDim0> &,
463 const Number<CurrentDim1> &) const {
464 return iterA(N1, CurrentDim0 - 1, CurrentDim1 - 1) *
465 iterB(N2, CurrentDim1 - 1, CurrentDim0 - 1) +
467 }
468 template <int CurrentDim0>
469 typename promote<T, U>::V eval(const int N1, const int N2,
470 const Number<CurrentDim0> &,
471 const Number<1> &) const {
472 return iterA(N1, CurrentDim0 - 1, 0) * iterB(N2, 0, CurrentDim0 - 1) +
474 }
475 typename promote<T, U>::V eval(const int N1, const int N2,
476 const Number<1> &, const Number<1> &) const {
477 return iterA(N1, 0, 0) * iterB(N2, 0, 0);
478 }
479
480 public:
486 typename promote<T, U>::V operator()(const int &N1, const int &N2) const
487 {
488 return eval(N1, N2, Number<Dim15>(), Number<Dim24>());
489 }
490 };
491
492 template <class A, class B, class T, class U, int Dim15, int Dim24, int Dim0,
493 int Dim3, char i, char j, char k, char l>
494 Tensor2_Expr<Tensor3_times_Tensor3_23_32<A, B, T, U, Dim15, Dim24, Dim0, Dim3,
495 i, j, k, l>,
496 typename promote<T, U>::V, Dim0, Dim3, i, j>
499 using TensorExpr = Tensor3_times_Tensor3_23_32<A, B, T, U, Dim15, Dim24,
500 Dim0, Dim3, i, j, k, l>;
502 j>(TensorExpr(a, b));
503 };
504
505 /* A(l,i,j)*B(k,i,j) -> Tensor2 */
506
507 template <class A, class B, class T, class U, int Dim14, int Dim25, int Dim0,
508 int Dim3, char i, char j, char k, char l>
512
513 template <int CurrentDim0, int CurrentDim1>
514 typename promote<T, U>::V eval(const int N1, const int N2,
515 const Number<CurrentDim0> &,
516 const Number<CurrentDim1> &) const {
517 return iterA(N1, CurrentDim0 - 1, CurrentDim1 - 1) *
518 iterB(N2, CurrentDim0 - 1, CurrentDim1 - 1) +
520 }
521 template <int CurrentDim0>
522 typename promote<T, U>::V eval(const int N1, const int N2,
523 const Number<CurrentDim0> &,
524 const Number<1> &) const {
525 return iterA(N1, CurrentDim0 - 1, 0) * iterB(N2, CurrentDim0 - 1, 0) +
527 }
528 typename promote<T, U>::V eval(const int N1, const int N2,
529 const Number<1> &, const Number<1> &) const {
530 return iterA(N1, 0, 0) * iterB(N2, 0, 0);
531 }
532
533 public:
539 typename promote<T, U>::V operator()(const int &N1, const int &N2) const
540 {
541 return eval(N1, N2, Number<Dim14>(), Number<Dim25>());
542 }
543 };
544
545 template <class A, class B, class T, class U, int Dim14, int Dim25, int Dim0,
546 int Dim3, char i, char j, char k, char l>
547 Tensor2_Expr<Tensor3_times_Tensor3_23_23<A, B, T, U, Dim14, Dim25, Dim0, Dim3,
548 i, j, k, l>,
549 typename promote<T, U>::V, Dim0, Dim3, k, l>
552 using TensorExpr = Tensor3_times_Tensor3_23_23<A, B, T, U, Dim14, Dim25,
553 Dim0, Dim3, i, j, k, l>;
555 l>(TensorExpr(a, b));
556 };
557
558 /* A(i,j,k)*B(i,j,l) -> Tensor2 */
559
560 template <class A, class B, class T, class U, int Dim03, int Dim14, int Dim2,
561 int Dim5, char i, char j, char k, char l>
565
566 template <int CurrentDim0, int CurrentDim1>
567 typename promote<T, U>::V eval(const int N1, const int N2,
568 const Number<CurrentDim0> &,
569 const Number<CurrentDim1> &) const {
570 return iterA(CurrentDim0 - 1, CurrentDim1 - 1, N1) *
571 iterB(CurrentDim0 - 1, CurrentDim1 - 1, N2) +
573 }
574 template <int CurrentDim0>
575 typename promote<T, U>::V eval(const int N1, const int N2,
576 const Number<CurrentDim0> &,
577 const Number<1> &) const {
578 return iterA(CurrentDim0 - 1, 0, N1) * iterB(CurrentDim0 - 1, 0, N2) +
580 }
581 typename promote<T, U>::V eval(const int N1, const int N2,
582 const Number<1> &, const Number<1> &) const {
583 return iterA(0, 0, N1) * iterB(0, 0, N2);
584 }
585
586 public:
592 typename promote<T, U>::V operator()(const int &N1, const int &N2) const
593 {
594 return eval(N1, N2, Number<Dim03>(), Number<Dim14>());
595 }
596 };
597
598 template <class A, class B, class T, class U, int Dim03, int Dim14, int Dim2,
599 int Dim5, char i, char j, char k, char l>
600 Tensor2_Expr<Tensor3_times_Tensor3_12_12<A, B, T, U, Dim03, Dim14, Dim2, Dim5,
601 i, j, k, l>,
602 typename promote<T, U>::V, Dim2, Dim5, k, l>
605 using TensorExpr = Tensor3_times_Tensor3_12_12<A, B, T, U, Dim03, Dim14,
606 Dim2, Dim5, i, j, k, l>;
608 l>(TensorExpr(a, b));
609 };
610
611 /* A(i,j,k)*B(k,l,m) -> Tensor4 */
612
613 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim23,
614 int Dim4, int Dim5, char i, char j, char k, char l, char m>
616 {
619
620 template <int CurrentDim>
621 typename promote<T, U>::V
622 eval(const int N1, const int N2, const int N3, const int N4,
623 const Number<CurrentDim> &) const
624 {
625 return iterA(N1, N2, CurrentDim - 1) * iterB(CurrentDim - 1, N3, N4)
626 + eval(N1, N2, N3, N4, Number<CurrentDim - 1>());
627 }
628 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
629 const int N4, const Number<1> &) const
630 {
631 return iterA(N1, N2, 0) * iterB(0, N3, N4);
632 }
633
634 public:
640 auto operator()(const int &N1, const int &N2, const int &N3,
641 const int &N4) const {
642 return eval(N1, N2, N3, N4, Number<Dim23>());
643 }
644 };
645
646 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim23,
647 int Dim4, int Dim5, char i, char j, char k, char l, char m>
650 using TensorExpr = Tensor3_times_Tensor3_21<A, B, T, U, Dim0, Dim1, Dim23,
651 Dim4, Dim5, i, j, k, l, m>;
653 Dim5, i, j, l, m>(TensorExpr(a, b));
654 };
655
656 // A(i,m,j)*B(m,l,k) -> Tensor4
657
658 template <class A, class B, class T, class U, int Dim0, int Dim10, int Dim2,
659 int Dim3, int Dim4, char i, char j, char k, char l, char m>
663
664 template <int CurrentDim>
665 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
666 const int N4,
667 const Number<CurrentDim> &) const {
668 return iterA(N1, CurrentDim - 1, N2) * iterB(CurrentDim - 1, N3, N4) +
669 eval(N1, N2, N3, N4, Number<CurrentDim - 1>());
670 }
671 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
672 const int N4, const Number<1> &) const {
673 return iterA(N1, 0, N2) * iterB(0, N3, N4);
674 }
675
676 public:
681 auto operator()(const int &N1, const int &N2, const int &N3,
682 const int &N4) const {
683 return eval(N1, N2, N3, N4, Number<Dim10>());
684 }
685 };
686
687 template <class A, class B, class T, class U, int Dim0, int Dim10, int Dim2,
688 int Dim3, int Dim4, char i, char j, char k, char l, char m>
691 using TensorExpr = Tensor3_times_Tensor3_10<A, B, T, U, Dim0, Dim10, Dim2,
692 Dim3, Dim4, i, j, k, l, m>;
694 Dim4, i, j, k, l>(TensorExpr(a, b));
695 };
696
697 // A(i,j,m)*B(l,k,m) -> Tensor4
698
699 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
700 int Dim3, int Dim22, char i, char j, char k, char l, char m>
704
705 template <int CurrentDim>
706 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
707 const int N4,
708 const Number<CurrentDim> &) const {
709 return iterA(N1, N2, CurrentDim - 1) * iterB(N3, N4, CurrentDim - 1) +
710 eval(N1, N2, N3, N4, Number<CurrentDim - 1>());
711 }
712 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
713 const int N4, const Number<1> &) const {
714 return iterA(N1, N2, 0) * iterB( N3, N4, 0);
715 }
716
717 public:
722 auto operator()(const int &N1, const int &N2, const int &N3,
723 const int &N4) const {
724 return eval(N1, N2, N3, N4, Number<Dim22>());
725 }
726 };
727
728 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
729 int Dim3, int Dim22, char i, char j, char k, char l, char m>
732 using TensorExpr = Tensor3_times_Tensor3_22<A, B, T, U, Dim0, Dim1, Dim2,
733 Dim3, Dim22, i, j, k, l, m>;
735 Dim3, i, j, k, l>(TensorExpr(a, b));
736 };
737}
constexpr double a
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
Tensor3_Expr< B, U, Dim10, Dim3, Dim4, m, k, l > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< CurrentDim > &) const
auto operator()(const int &N1, const int &N2, const int &N3, const int &N4) const
Tensor3_Expr< A, T, Dim0, Dim10, Dim2, i, m, j > iterA
Tensor3_times_Tensor3_10(const Tensor3_Expr< A, T, Dim0, Dim10, Dim2, i, m, j > &a, const Tensor3_Expr< B, U, Dim10, Dim3, Dim4, m, k, l > &b)
Tensor3_Expr< A, T, Dim03, Dim14, Dim2, i, j, k > iterA
Tensor3_times_Tensor3_12_12(const Tensor3_Expr< A, T, Dim03, Dim14, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim03, Dim14, Dim5, i, j, l > &b)
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< CurrentDim0 > &, const Number< CurrentDim1 > &) const
Tensor3_Expr< B, U, Dim03, Dim14, Dim5, i, j, l > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< CurrentDim0 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Tensor3_Expr< A, T, Dim04, Dim13, Dim2, i, j, k > 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< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< CurrentDim0 > &, const Number< CurrentDim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< CurrentDim0 > &, const Number< 1 > &) const
Tensor3_times_Tensor3_12_21(const Tensor3_Expr< A, T, Dim04, Dim13, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim13, Dim04, Dim5, j, i, l > &b)
Tensor3_Expr< B, U, Dim13, Dim04, Dim5, j, i, l > iterB
auto operator()(const int &N1, const int &N2, const int &N3, const int &N4) const
Tensor3_times_Tensor3_21(const Tensor3_Expr< A, T, Dim0, Dim1, Dim23, i, j, k > &a, const Tensor3_Expr< B, U, Dim23, Dim4, Dim5, k, l, m > &b)
Tensor3_Expr< B, U, Dim23, Dim4, Dim5, k, l, m > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< CurrentDim > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
Tensor3_Expr< A, T, Dim0, Dim1, Dim23, i, j, k > iterA
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &) const
auto 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< CurrentDim > &) const
Tensor3_times_Tensor3_22(const Tensor3_Expr< A, T, Dim0, Dim1, Dim22, i, j, m > &a, const Tensor3_Expr< B, U, Dim2, Dim3, Dim22, k, l, m > &b)
Tensor3_Expr< A, T, Dim0, Dim1, Dim22, i, j, m > iterA
Tensor3_Expr< B, U, Dim2, Dim3, Dim22, k, l, m > iterB
Tensor3_Expr< A, T, Dim0, Dim14, Dim25, k, i, j > iterA
promote< T, U >::V eval(const int N1, const int N2, const Number< CurrentDim0 > &, const Number< 1 > &) const
Tensor3_Expr< B, U, Dim3, Dim14, Dim25, l, i, j > iterB
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< CurrentDim0 > &, const Number< CurrentDim1 > &) const
Tensor3_times_Tensor3_23_23(const Tensor3_Expr< A, T, Dim0, Dim14, Dim25, k, i, j > &a, const Tensor3_Expr< B, U, Dim3, Dim14, Dim25, l, i, j > &b)
promote< T, U >::V operator()(const int &N1, const int &N2) const
Tensor3_times_Tensor3_23_32(const Tensor3_Expr< A, T, Dim0, Dim15, Dim24, i, k, l > &a, const Tensor3_Expr< B, U, Dim3, Dim24, Dim15, j, l, k > &b)
Tensor3_Expr< B, U, Dim3, Dim24, Dim15, j, l, k > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
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< CurrentDim0 > &, const Number< 1 > &) const
Tensor3_Expr< A, T, Dim0, Dim15, Dim24, i, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const Number< CurrentDim0 > &, const Number< CurrentDim1 > &) const
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
Tensors class implemented by Walter Landry.
Definition FTensor.hpp:51
promote< T, U >::V T3_times_T3_210(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim2, Dim1, Dim0, k, j, i > &b, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &)
promote< T, U >::V T3_times_T3_201(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim2, Dim0, Dim1, k, i, j > &b, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &)
promote< T, U >::V T3_times_T3_012(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim0, Dim1, Dim2, i, j, k > &b, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &)
promote< T, U >::V T3_times_T3_021(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim0, Dim2, Dim1, i, k, j > &b, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &)
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)
promote< T, U >::V T3_times_T3_102(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim1, Dim0, Dim2, j, i, k > &b, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &)
promote< T, U >::V T3_times_T3_120(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor3_Expr< B, U, Dim1, Dim2, Dim0, j, k, i > &b, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &, const Number< Current_Dim2 > &)
constexpr AssemblyType A
FTensor::Index< 'm', 3 > m