v0.15.0
Loading...
Searching...
No Matches
Dg_times_Tensor2_symmetric.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Dg*Tensor2_symmetric and Tensor2_symmetric*Dg,
3 yielding a 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, char i,
12 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)
23 + eval(N1, N2, N3, Number<Current_Dim - 1>());
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:
37 typename promote<T, U>::V
38 operator()(const int N1, const int N2, const int N3) const
39 {
40 return eval(N1, N2, N3, Number<Dim2>());
41 }
42 };
43
44 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
45 char j, char k, char l>
46 Dg_Expr<Dg_times_Tensor2_symmetric_0<A, B, T, U, Dim01, Dim2, i, j, k, l>,
47 typename promote<T, U>::V, Dim01, Dim2, i, j, l>
56
57 /* B(k,l)*A(i,j,k)->Dg */
58
59 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
60 char j, char k, char l>
61 Dg_Expr<Dg_times_Tensor2_symmetric_0<A, B, T, U, Dim01, Dim2, i, j, k, l>,
62 typename promote<T, U>::V, Dim01, Dim2, i, j, l>
71
72 /* A(i,j,k)*B(l,k)->Dg */
73
74 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
75 char j, char k, char l>
77 {
80
81 template <int Current_Dim>
82 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
83 const Number<Current_Dim> &) const
84 {
85 return iterA(N1, N2, Current_Dim - 1) * iterB(N3, Current_Dim - 1)
86 + eval(N1, N2, N3, Number<Current_Dim - 1>());
87 }
88 typename promote<T, U>::V
89 eval(const int N1, const int N2, const int N3, const Number<1> &) const
90 {
91 return iterA(N1, N2, 0) * iterB(N3, 0);
92 }
93
94 public:
100 typename promote<T, U>::V
101 operator()(const int N1, const int N2, const int N3) const
102 {
103 return eval(N1, N2, N3, Number<Dim2>());
104 }
105 };
106
107 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
108 char j, char k, char l>
109 Dg_Expr<Dg_times_Tensor2_symmetric_1<A, B, T, U, Dim01, Dim2, i, j, k, l>,
110 typename promote<T, U>::V, Dim01, Dim2, i, j, l>
119
120 /* B(l,k)*A(i,j,k)->Dg */
121
122 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
123 char j, char k, char l>
124 Dg_Expr<Dg_times_Tensor2_symmetric_1<A, B, T, U, Dim01, Dim2, i, j, k, l>,
125 typename promote<T, U>::V, Dim01, Dim2, i, j, l>
134
135 /* A(i,j,k)*B(j,l)->Tensor3 */
136
137 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
138 char j, char k, char l>
140 {
143
144 template <int Current_Dim>
145 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
146 const Number<Current_Dim> &) const
147 {
148 return iterA(N1, Current_Dim - 1, N2) * iterB(Current_Dim - 1, N3)
149 + eval(N1, N2, N3, Number<Current_Dim - 1>());
150 }
151 typename promote<T, U>::V
152 eval(const int N1, const int N2, const int N3, const Number<1> &) const
153 {
154 return iterA(N1, 0, N2) * iterB(0, N3);
155 }
156
157 public:
163 typename promote<T, U>::V
164 operator()(const int N1, const int N2, const int N3) const
165 {
166 return eval(N1, N2, N3, Number<Dim01>());
167 }
168 };
169
170 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
171 char j, char k, char l>
172 Tensor3_Expr<
173 Dg_times_Tensor2_symmetric_1_0<A, B, T, U, Dim01, Dim2, i, j, k, l>,
174 typename promote<T, U>::V, Dim01, Dim2, Dim01, i, k, l>
183
184 /* B(j,l)*A(i,j,k)->Tensor3 */
185
186 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
187 char j, char k, char l>
188 Tensor3_Expr<
189 Dg_times_Tensor2_symmetric_1_0<A, B, T, U, Dim01, Dim2, i, j, k, l>,
190 typename promote<T, U>::V, Dim01, Dim2, Dim01, i, k, l>
199
200 /* A(i,j,k)*B(l,j)->Tensor3 */
201
202 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
203 char j, char k, char l>
205 {
208
209 template <int Current_Dim>
210 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
211 const Number<Current_Dim> &) const
212 {
213 return iterA(N1, Current_Dim - 1, N2) * iterB(N3, Current_Dim - 1)
214 + eval(N1, N2, N3, Number<Current_Dim - 1>());
215 }
216 typename promote<T, U>::V
217 eval(const int N1, const int N2, const int N3, const Number<1> &) const
218 {
219 return iterA(N1, 0, N2) * iterB(N3, 0);
220 }
221
222 public:
228 typename promote<T, U>::V
229 operator()(const int N1, const int N2, const int N3) const
230 {
231 return eval(N1, N2, N3, Number<Dim01>());
232 }
233 };
234
235 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
236 char j, char k, char l>
237 Tensor3_Expr<
238 Dg_times_Tensor2_symmetric_1_1<A, B, T, U, Dim01, Dim2, i, j, k, l>,
239 typename promote<T, U>::V, Dim01, Dim2, Dim01, i, k, l>
248
249 /* B(l,j)*A(i,j,k)->Tensor3 */
250
251 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
252 char j, char k, char l>
253 Tensor3_Expr<
254 Dg_times_Tensor2_symmetric_1_1<A, B, T, U, Dim01, Dim2, i, j, k, l>,
255 typename promote<T, U>::V, Dim01, Dim2, Dim01, i, k, l>
264
265 /* A(i,j,k)*B(j,k)->Tensor1 */
266
267 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
269 {
272
273 template <int Current_Dim0, int Current_Dim1>
274 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
275 const Number<Current_Dim1> &) const
276 {
277 return iterA(N1, Current_Dim0 - 1, Current_Dim1 - 1)
278 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
280 }
281 template <int Current_Dim1>
282 typename promote<T, U>::V
283 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
284 {
285 return iterA(N1, 0, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
287 }
288 typename promote<T, U>::V
289 eval(const int N1, const Number<1> &, const Number<1> &) const
290 {
291 return iterA(N1, 0, 0) * iterB(0, 0);
292 }
293
294 public:
300 typename promote<T, U>::V operator()(const int N1) const
301 {
302 return eval(N1, Number<Dim>(), Number<Dim>());
303 }
304 };
305
306 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
308 typename promote<T, U>::V, Dim, i>
316
317 /* B(j,k)*A(i,j,k)->Tensor1 */
318
319 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
321 typename promote<T, U>::V, Dim, i>
329
330 /* A(i,j,k)*B(k,j)->Tensor1 */
331
332 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
334 {
337
338 template <int Current_Dim0, int Current_Dim1>
339 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
340 const Number<Current_Dim1> &) const
341 {
342 return iterA(N1, Current_Dim0 - 1, Current_Dim1 - 1)
343 * iterB(Current_Dim1 - 1, Current_Dim0 - 1)
345 }
346 template <int Current_Dim1>
347 typename promote<T, U>::V
348 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
349 {
350 return iterA(N1, 0, Current_Dim1 - 1) * iterB(Current_Dim1 - 1, 0)
352 }
353 typename promote<T, U>::V
354 eval(const int N1, const Number<1> &, const Number<1> &) const
355 {
356 return iterA(N1, 0, 0) * iterB(0, 0);
357 }
358
359 public:
365 typename promote<T, U>::V operator()(const int N1) const
366 {
367 return eval(N1, Number<Dim>(), Number<Dim>());
368 }
369 };
370
371 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
373 typename promote<T, U>::V, Dim, i>
381
382 /* B(k,j)*A(i,j,k)->Tensor1 */
383
384 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
386 typename promote<T, U>::V, Dim, i>
394
395 /* A(j,i,k)*B(j,k)->Tensor1 */
396
397 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
399 {
402
403 template <int Current_Dim0, int Current_Dim1>
404 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
405 const Number<Current_Dim1> &) const
406 {
407 return iterA(Current_Dim0 - 1, N1, Current_Dim1 - 1)
408 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
410 }
411 template <int Current_Dim1>
412 typename promote<T, U>::V
413 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
414 {
415 return iterA(0, N1, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
417 }
418 typename promote<T, U>::V
419 eval(const int N1, const Number<1> &, const Number<1> &) const
420 {
421 return iterA(0, N1, 0) * iterB(0, 0);
422 }
423
424 public:
430 typename promote<T, U>::V operator()(const int N1) const
431 {
432 return eval(N1, Number<Dim>(), Number<Dim>());
433 }
434 };
435
436 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
438 typename promote<T, U>::V, Dim, i>
446
447 /* B(j,k)*A(j,i,k)->Tensor1 */
448
449 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
451 typename promote<T, U>::V, Dim, i>
459
460 /* A(k,i,j)*B(j,k)->Tensor1 */
461
462 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
464 {
467
468 template <int Current_Dim0, int Current_Dim1>
469 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
470 const Number<Current_Dim1> &) const
471 {
472 return iterA(Current_Dim0 - 1, N1, Current_Dim1 - 1)
473 * iterB(Current_Dim1 - 1, Current_Dim0 - 1)
475 }
476 template <int Current_Dim1>
477 typename promote<T, U>::V
478 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
479 {
480 return iterA(0, N1, Current_Dim1 - 1) * iterB(Current_Dim1 - 1, 0)
482 }
483 typename promote<T, U>::V
484 eval(const int N1, const Number<1> &, const Number<1> &) const
485 {
486 return iterA(0, N1, 0) * iterB(0, 0);
487 }
488
489 public:
495 typename promote<T, U>::V operator()(const int N1) const
496 {
497 return eval(N1, Number<Dim>(), Number<Dim>());
498 }
499 };
500
501 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
503 typename promote<T, U>::V, Dim, i>
511
512 /* B(j,k)*A(k,i,j)->Tensor1 */
513
514 template <class A, class B, class T, class U, int Dim, char i, char j, char k>
516 typename promote<T, U>::V, Dim, i>
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:
561 typename promote<T, U>::V operator()(const int N1) const
562 {
563 return eval(N1, Number<Dim01>(), Number<Dim01>());
564 }
565 };
566
567 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
568 char j, char k>
570 typename promote<T, U>::V, Dim2, i>
579
580 /* B(j,k)*A(j,k,i)->Tensor1 */
581
582 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
583 char j, char k>
585 typename promote<T, U>::V, Dim2, i>
594
595 /* A(j,k,i)*B(k,j)->Tensor1 */
596
597 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
598 char j, char k>
600 {
603
604 template <int Current_Dim0, int Current_Dim1>
605 typename promote<T, U>::V eval(const int N1, const Number<Current_Dim0> &,
606 const Number<Current_Dim1> &) const
607 {
608 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N1)
609 * iterB(Current_Dim1 - 1, Current_Dim0 - 1)
611 }
612 template <int Current_Dim1>
613 typename promote<T, U>::V
614 eval(const int N1, const Number<1> &, const Number<Current_Dim1> &) const
615 {
616 return iterA(0, Current_Dim1 - 1, N1) * iterB(Current_Dim1 - 1, 0)
618 }
619 typename promote<T, U>::V
620 eval(const int N1, const Number<1> &, const Number<1> &) const
621 {
622 return iterA(0, 0, N1) * iterB(0, 0);
623 }
624
625 public:
631 typename promote<T, U>::V operator()(const int N1) const
632 {
633 return eval(N1, Number<Dim01>(), Number<Dim01>());
634 }
635 };
636
637 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
638 char j, char k>
640 typename promote<T, U>::V, Dim2, i>
649
650 /* B(k,j)*A(j,k,i)->Tensor1 */
651
652 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
653 char j, char k>
655 typename promote<T, U>::V, Dim2, i>
664}
constexpr double a
Dg_Expr< A, T, Dim01, Dim2, j, k, i > iterA
Dg_times_Tensor2_symmetric_01(const Dg_Expr< A, T, Dim01, Dim2, j, k, i > &a, const Tensor2_symmetric_Expr< B, U, Dim01, j, k > &b)
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) 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< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1) const
Tensor2_symmetric_Expr< B, U, Dim01, j, k > iterB
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1) const
Tensor2_symmetric_Expr< B, U, Dim, j, k > iterB
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
Dg_times_Tensor2_symmetric_02(const Dg_Expr< A, T, Dim, Dim, j, i, k > &a, const Tensor2_symmetric_Expr< B, U, Dim, j, k > &b)
promote< T, U >::V eval(const int N1, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
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
Tensor2_symmetric_Expr< B, U, Dim2, k, l > iterB
Dg_times_Tensor2_symmetric_0(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_symmetric_Expr< B, U, Dim2, k, l > &b)
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
Dg_times_Tensor2_symmetric_10(const Dg_Expr< A, T, Dim01, Dim2, j, k, i > &a, const Tensor2_symmetric_Expr< B, U, Dim01, k, j > &b)
promote< T, U >::V eval(const int N1, const Number< 1 > &, const Number< Current_Dim1 > &) const
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
Tensor2_symmetric_Expr< B, U, Dim01, k, j > iterB
Dg_Expr< A, T, Dim01, Dim2, j, k, i > iterA
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_symmetric_12(const Dg_Expr< A, T, Dim, Dim, i, j, k > &a, const Tensor2_symmetric_Expr< B, U, Dim, 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< Current_Dim1 > &) const
Tensor2_symmetric_Expr< B, U, Dim, j, k > iterB
promote< T, U >::V operator()(const int N1) const
Tensor2_symmetric_Expr< B, U, Dim01, j, l > iterB
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
Dg_times_Tensor2_symmetric_1_0(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_symmetric_Expr< B, U, Dim01, j, l > &b)
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 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
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< Current_Dim > &) const
Tensor2_symmetric_Expr< B, U, Dim01, l, j > iterB
Dg_times_Tensor2_symmetric_1_1(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_symmetric_Expr< B, U, Dim01, l, j > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &) const
Dg_times_Tensor2_symmetric_1(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor2_symmetric_Expr< B, U, Dim2, l, k > &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
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Tensor2_symmetric_Expr< B, U, Dim2, l, k > iterB
Dg_times_Tensor2_symmetric_20(const Dg_Expr< A, T, Dim, Dim, k, i, j > &a, const Tensor2_symmetric_Expr< B, U, Dim, 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< Current_Dim1 > &) const
Tensor2_symmetric_Expr< B, U, Dim, j, k > iterB
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_symmetric_21(const Dg_Expr< A, T, Dim, Dim, i, j, k > &a, const Tensor2_symmetric_Expr< B, U, Dim, k, j > &b)
promote< T, U >::V eval(const int N1, const Number< 1 > &, 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 eval(const int N1, const Number< 1 > &, const Number< 1 > &) const
Tensor2_symmetric_Expr< B, U, Dim, k, j > iterB
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 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