v0.14.0
Loading...
Searching...
No Matches
Dg_times_Tensor2.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Dg*Tensor2 and Tensor2*Dg, yielding a
3 Dg, Tensor3, or Tensor1. */
4
5#pragma once
6
7namespace FTensor
8{
9 /* A(i,j,k)*B(k,l)->Dg */
10
11 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
12 char i, char j, char k, char l>
14 {
17
18 template <int Current_Dim>
19 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
20 const Number<Current_Dim> &) const
21 {
22 return iterA(N1, N2, Current_Dim - 1) * iterB(Current_Dim - 1, N3)
24 }
25 typename promote<T, U>::V
26 eval(const int N1, const int N2, const int N3, const Number<1> &) const
27 {
28 return iterA(N1, N2, 0) * iterB(0, N3);
29 }
30
31 public:
34 : iterA(a), iterB(b)
35 {}
36 typename promote<T, U>::V
37 operator()(const int N1, const int N2, const int N3) const
38 {
39 return eval(N1, N2, N3, Number<Dim2>());
40 }
41 };
42
43 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
44 char i, char j, char k, char l>
45 Dg_Expr<Dg_times_Tensor2_0<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
46 typename promote<T, U>::V, Dim01, Dim3, i, j, l>
49 {
50 using TensorExpr
52 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim3, i, j, l>(
53 TensorExpr(a, b));
54 }
55
56 /* B(k,l)*A(i,j,k)->Dg */
57
58 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
59 char i, char j, char k, char l>
60 Dg_Expr<Dg_times_Tensor2_0<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
61 typename promote<T, U>::V, Dim01, Dim3, i, j, l>
64 {
65 using TensorExpr
67 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim3, i, j, l>(
68 TensorExpr(a, b));
69 }
70
71 /* A(i,j,k)*B(l,k)->Dg */
72
73 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
74 char i, char j, char k, char l>
76 {
79
80 template <int Current_Dim>
81 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
82 const Number<Current_Dim> &) const
83 {
84 return iterA(N1, N2, Current_Dim - 1) * iterB(N3, Current_Dim - 1)
86 }
87 typename promote<T, U>::V
88 eval(const int N1, const int N2, const int N3, const Number<1> &) const
89 {
90 return iterA(N1, N2, 0) * iterB(N3, 0);
91 }
92
93 public:
96 : iterA(a), iterB(b)
97 {}
98 typename promote<T, U>::V
99 operator()(const int N1, const int N2, const int N3) const
100 {
101 return eval(N1, N2, N3, Number<Dim2>());
102 }
103 };
104
105 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
106 char i, char j, char k, char l>
107 Dg_Expr<Dg_times_Tensor2_1<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
108 typename promote<T, U>::V, Dim01, Dim3, i, j, l>
111 {
112 using TensorExpr
114 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim3, i, j, l>(
115 TensorExpr(a, b));
116 }
117
118 /* B(l,k)*A(i,j,k)->Dg */
119
120 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
121 char i, char j, char k, char l>
122 Dg_Expr<Dg_times_Tensor2_1<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
123 typename promote<T, U>::V, Dim01, Dim3, i, j, l>
126 {
127 using TensorExpr
129 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim3, i, j, l>(
130 TensorExpr(a, b));
131 }
132
133 /* A(i,j,k)*B(j,l)->Tensor3 */
134
135 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
136 char i, char j, char k, char l>
138 {
141
142 template <int Current_Dim>
143 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
144 const Number<Current_Dim> &) const
145 {
146 return iterA(N1, Current_Dim - 1, N2) * iterB(Current_Dim - 1, N3)
148 }
149 typename promote<T, U>::V
150 eval(const int N1, const int N2, const int N3, const Number<1> &) const
151 {
152 return iterA(N1, 0, N2) * iterB(0, N3);
153 }
154
155 public:
158 : iterA(a), iterB(b)
159 {}
160 typename promote<T, U>::V
161 operator()(const int N1, const int N2, const int N3) const
162 {
163 return eval(N1, N2, N3, Number<Dim01>());
164 }
165 };
166
167 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
168 char i, char j, char k, char l>
169 Tensor3_Expr<Dg_times_Tensor2_1_0<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
170 typename promote<T, U>::V, Dim01, Dim2, Dim3, i, k, l>
173 {
174 using TensorExpr
177 Dim3, i, k, l>(TensorExpr(a, b));
178 }
179
180 /* B(j,l)*A(i,j,k)->Tensor3 */
181
182 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
183 char i, char j, char k, char l>
184 Tensor3_Expr<Dg_times_Tensor2_1_0<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
185 typename promote<T, U>::V, Dim01, Dim2, Dim3, i, k, l>
188 {
189 using TensorExpr
192 Dim3, i, k, l>(TensorExpr(a, b));
193 }
194
195 /* A(i,j,k)*B(l,j)->Tensor3 */
196
197 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
198 char i, char j, char k, char l>
200 {
203
204 template <int Current_Dim>
205 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
206 const Number<Current_Dim> &) const
207 {
208 return iterA(N1, Current_Dim - 1, N2) * iterB(N3, Current_Dim - 1)
210 }
211 typename promote<T, U>::V
212 eval(const int N1, const int N2, const int N3, const Number<1> &) const
213 {
214 return iterA(N1, 0, N2) * iterB(N3, 0);
215 }
216
217 public:
220 : iterA(a), iterB(b)
221 {}
222 typename promote<T, U>::V
223 operator()(const int N1, const int N2, const int N3) const
224 {
225 return eval(N1, N2, N3, Number<Dim01>());
226 }
227 };
228
229 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
230 char i, char j, char k, char l>
231 Tensor3_Expr<Dg_times_Tensor2_1_1<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
232 typename promote<T, U>::V, Dim01, Dim2, Dim3, i, k, l>
235 {
236 using TensorExpr
239 Dim3, i, k, l>(TensorExpr(a, b));
240 }
241
242 /* B(l,j)*A(i,j,k)->Tensor3 */
243
244 template <class A, class B, class T, class U, int Dim01, int Dim2, int Dim3,
245 char i, char j, char k, char l>
246 Tensor3_Expr<Dg_times_Tensor2_1_1<A, B, T, U, Dim01, Dim2, Dim3, i, j, k, l>,
247 typename promote<T, U>::V, Dim01, Dim2, Dim3, i, k, l>
250 {
251 using TensorExpr
254 Dim3, i, k, l>(TensorExpr(a, b));
255 }
256
257 /* A(i,j,k)*B(j,k)->Tensor1 */
258
259 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
260 char j, char k>
262 {
265
266 template <int Current_Dim0, int Current_Dim1>
267 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
268 const Number<Current_Dim1> &) const
269 {
270 return iterA(N1, Current_Dim0 - 1, Current_Dim1 - 1)
271 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
273 }
274 template <int Current_Dim1>
275 typename promote<T, U>::V
276 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
277 {
278 return iterA(N1, 0, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
280 }
281 typename promote<T, U>::V
282 eval(const int N1, const Number<1> &, const Number<1> &) const
283 {
284 return iterA(N1, 0, 0) * iterB(0, 0);
285 }
286
287 public:
290 : iterA(a), iterB(b)
291 {}
292 typename promote<T, U>::V operator()(const int N1) const
293 {
294 return eval(N1, Number<Dim01>(), Number<Dim2>());
295 }
296 };
297
298 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
299 char j, char k>
301 typename promote<T, U>::V, Dim01, i>
304 {
307 TensorExpr(a, b));
308 }
309
310 /* B(j,k)*A(i,j,k)->Tensor1 */
311
312 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
313 char j, char k>
315 typename promote<T, U>::V, Dim01, i>
318 {
321 TensorExpr(a, b));
322 }
323
324 /* A(i,j,k)*B(k,j)->Tensor1 */
325
326 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
327 char j, char k>
329 {
332
333 template <int Current_Dim0, int Current_Dim1>
334 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
335 const Number<Current_Dim1> &) const
336 {
337 return iterA(N1, Current_Dim0 - 1, Current_Dim1 - 1)
338 * iterB(Current_Dim1 - 1, Current_Dim0 - 1)
340 }
341 template <int Current_Dim1>
342 typename promote<T, U>::V
343 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
344 {
345 return iterA(N1, 0, Current_Dim1 - 1) * iterB(Current_Dim1 - 1, 0)
347 }
348 typename promote<T, U>::V
349 eval(const int N1, const Number<1> &, const Number<1> &) const
350 {
351 return iterA(N1, 0, 0) * iterB(0, 0);
352 }
353
354 public:
357 : iterA(a), iterB(b)
358 {}
359 typename promote<T, U>::V operator()(const int N1) const
360 {
361 return eval(N1, Number<Dim01>(), Number<Dim2>());
362 }
363 };
364
365 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
366 char j, char k>
368 typename promote<T, U>::V, Dim01, i>
371 {
374 TensorExpr(a, b));
375 }
376
377 /* B(k,j)*A(i,j,k)->Tensor1 */
378
379 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
380 char j, char k>
382 typename promote<T, U>::V, Dim01, i>
385 {
388 TensorExpr(a, b));
389 }
390
391 /* A(j,i,k)*B(j,k)->Tensor1 */
392
393 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
394 char j, char k>
396 {
399
400 template <int Current_Dim0, int Current_Dim1>
401 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
402 const Number<Current_Dim1> &) const
403 {
404 return iterA(Current_Dim0 - 1, N1, Current_Dim1 - 1)
405 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
407 }
408 template <int Current_Dim1>
409 typename promote<T, U>::V
410 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
411 {
412 return iterA(0, N1, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
414 }
415 typename promote<T, U>::V
416 eval(const int N1, const Number<1> &, const Number<1> &) const
417 {
418 return iterA(0, N1, 0) * iterB(0, 0);
419 }
420
421 public:
424 : iterA(a), iterB(b)
425 {}
426 typename promote<T, U>::V operator()(const int N1) const
427 {
428 return eval(N1, Number<Dim01>(), Number<Dim2>());
429 }
430 };
431
432 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
433 char j, char k>
435 typename promote<T, U>::V, Dim01, i>
438 {
441 TensorExpr(a, b));
442 }
443
444 /* B(j,k)*A(j,i,k)->Tensor1 */
445
446 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
447 char j, char k>
449 typename promote<T, U>::V, Dim01, i>
452 {
455 TensorExpr(a, b));
456 }
457
458 /* A(k,i,j)*B(j,k)->Tensor1 */
459
460 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
461 char j, char k>
463 {
466
467 template <int Current_Dim0, int Current_Dim1>
468 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
469 const Number<Current_Dim1> &) const
470 {
471 return iterA(Current_Dim0 - 1, N1, Current_Dim1 - 1)
472 * iterB(Current_Dim1 - 1, Current_Dim0 - 1)
474 }
475 template <int Current_Dim1>
476 typename promote<T, U>::V
477 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
478 {
479 return iterA(0, N1, Current_Dim1 - 1) * iterB(Current_Dim1 - 1, 0)
481 }
482 typename promote<T, U>::V
483 eval(const int N1, const Number<1> &, const Number<1> &) const
484 {
485 return iterA(0, N1, 0) * iterB(0, 0);
486 }
487
488 public:
491 : iterA(a), iterB(b)
492 {}
493 typename promote<T, U>::V operator()(const int N1) const
494 {
495 return eval(N1, Number<Dim01>(), Number<Dim2>());
496 }
497 };
498
499 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
500 char j, char k>
502 typename promote<T, U>::V, Dim01, i>
505 {
508 TensorExpr(a, b));
509 }
510
511 /* B(j,k)*A(k,i,j)->Tensor1 */
512
513 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
514 char j, char k>
516 typename promote<T, U>::V, Dim01, i>
519 {
522 TensorExpr(a, b));
523 }
524
525 /* A(j,k,i)*B(j,k)->Tensor1 */
526
527 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
528 char j, char k>
530 {
533
534 template <int Current_Dim0, int Current_Dim1>
535 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
536 const Number<Current_Dim1> &) const
537 {
538 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N1)
539 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
541 }
542 template <int Current_Dim1>
543 typename promote<T, U>::V
544 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
545 {
546 return iterA(0, Current_Dim1 - 1, N1) * iterB(0, Current_Dim1 - 1)
548 }
549 typename promote<T, U>::V
550 eval(const int N1, const Number<1> &, const Number<1> &) const
551 {
552 return iterA(0, 0, N1) * iterB(0, 0);
553 }
554
555 public:
558 : iterA(a), iterB(b)
559 {}
560 typename promote<T, U>::V operator()(const int N1) const
561 {
562 return eval(N1, Number<Dim01>(), Number<Dim01>());
563 }
564 };
565
566 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
567 char j, char k>
569 typename promote<T, U>::V, Dim2, i>
572 {
575 TensorExpr(a, b));
576 }
577
578 /* B(j,k)*A(j,k,i)->Tensor1 */
579
580 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
581 char j, char k>
583 typename promote<T, U>::V, Dim2, i>
586 {
589 TensorExpr(a, b));
590 }
591
592 /* A(j,k,i)*B(k,j)->Tensor1 */
593
594 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
595 char j, char k>
597 {
600
601 template <int Current_Dim0, int Current_Dim1>
602 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
603 const Number<Current_Dim1> &) const
604 {
605 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N1)
606 * iterB(Current_Dim1 - 1, Current_Dim0 - 1)
608 }
609 template <int Current_Dim1>
610 typename promote<T, U>::V
611 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
612 {
613 return iterA(0, Current_Dim1 - 1, N1) * iterB(Current_Dim1 - 1, 0)
615 }
616 typename promote<T, U>::V
617 eval(const int N1, const Number<1> &, const Number<1> &) const
618 {
619 return iterA(0, 0, N1) * iterB(0, 0);
620 }
621
622 public:
625 : iterA(a), iterB(b)
626 {}
627 typename promote<T, U>::V operator()(const int N1) const
628 {
629 return eval(N1, Number<Dim01>(), Number<Dim01>());
630 }
631 };
632
633 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
634 char j, char k>
636 typename promote<T, U>::V, Dim2, i>
639 {
642 TensorExpr(a, b));
643 }
644
645 /* B(k,j)*A(j,k,i)->Tensor1 */
646
647 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
648 char j, char k>
650 typename promote<T, U>::V, Dim2, i>
653 {
656 TensorExpr(a, b));
657 }
658}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
Tensor2_Expr< B, U, Dim01, Dim01, j, k > iterB
Dg_Expr< A, T, Dim01, Dim2, j, k, i > iterA
promote< T, U >::V eval(const int N1, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
Dg_times_Tensor2_01(const Dg_Expr< A, T, Dim01, Dim2, j, k, i > &a, const Tensor2_Expr< B, U, Dim01, Dim01, j, k > &b)
Tensor2_Expr< B, U, Dim01, Dim2, j, k > iterB
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
Dg_Expr< A, T, Dim01, Dim2, j, i, k > iterA
promote< T, U >::V operator()(const int N1) const
Dg_times_Tensor2_02(const Dg_Expr< A, T, Dim01, Dim2, j, i, k > &a, const Tensor2_Expr< B, U, Dim01, Dim2, j, k > &b)
promote< T, U >::V eval(const int N1, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
Dg_times_Tensor2_0(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_Expr< B, U, Dim2, Dim3, k, l > &b)
Tensor2_Expr< B, U, Dim2, Dim3, k, l > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &) const
Dg_Expr< A, T, Dim01, Dim2, i, j, k > iterA
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim > &) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
Dg_times_Tensor2_10(const Dg_Expr< A, T, Dim01, Dim2, j, k, i > &a, const Tensor2_Expr< B, U, Dim01, Dim01, k, j > &b)
Tensor2_Expr< B, U, Dim01, Dim01, k, j > iterB
promote< T, U >::V operator()(const int N1) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
Dg_Expr< A, T, Dim01, Dim2, j, k, i > iterA
promote< T, U >::V eval(const int N1, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
Tensor2_Expr< B, U, Dim01, Dim2, j, k > iterB
Dg_times_Tensor2_12(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_Expr< B, U, Dim01, Dim2, j, k > &b)
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
Dg_Expr< A, T, Dim01, Dim2, i, j, k > iterA
promote< T, U >::V eval(const int N1, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Dg_times_Tensor2_1_0(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_Expr< B, U, Dim01, Dim3, j, l > &b)
Tensor2_Expr< B, U, Dim01, Dim3, j, l > iterB
Dg_Expr< A, T, Dim01, Dim2, i, j, k > iterA
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &) const
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Tensor2_Expr< B, U, Dim3, Dim01, l, j > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim > &) const
Dg_Expr< A, T, Dim01, Dim2, i, j, k > iterA
Dg_times_Tensor2_1_1(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_Expr< B, U, Dim3, Dim01, l, j > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim > &) const
Dg_Expr< A, T, Dim01, Dim2, i, j, k > iterA
Dg_times_Tensor2_1(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_Expr< B, U, Dim3, Dim2, l, k > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &) const
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Tensor2_Expr< B, U, Dim3, Dim2, l, k > iterB
Dg_Expr< A, T, Dim01, Dim2, k, i, j > iterA
Tensor2_Expr< B, U, Dim2, Dim01, j, k > iterB
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
Dg_times_Tensor2_20(const Dg_Expr< A, T, Dim01, Dim2, k, i, j > &a, const Tensor2_Expr< B, U, Dim2, Dim01, j, k > &b)
promote< T, U >::V eval(const int N1, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1) const
promote< T, U >::V eval(const int N1, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1) const
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
Dg_times_Tensor2_21(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_Expr< B, U, Dim2, Dim01, k, j > &b)
Tensor2_Expr< B, U, Dim2, Dim01, k, j > iterB
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
Dg_Expr< A, T, Dim01, Dim2, i, j, k > iterA
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