v0.13.2
Loading...
Searching...
No Matches
Tensor4_times_Tensor2_symmetric.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Tensor4*Tensor2_symmetric and Tensor2_symmetric*Tensor4, yielding a
3 Tensor2. */
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 Dim0, int Dim1, int Dim,
12 char i, 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:
43 typename promote<T, U>::V operator()(const int N1, const int N2) const
44 {
45 return eval(N1, N2, Number<Dim>(), Number<Dim>());
46 }
47
51 : iterA(a), iterB(b)
52 {}
53 };
54
55 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
56 char i, char j, char k, char l>
57 Tensor2_Expr<
58 Tensor4_times_Tensor2_symmetric_23<A, B, T, U, Dim0, Dim1, Dim, i, j, k, l>,
59 typename promote<T, U>::V, Dim0, Dim1, i, j>
62 {
63 using TensorExpr
64 = Tensor4_times_Tensor2_symmetric_23<A, B, T, U, Dim0, Dim1, Dim, i, j,
65 k, l>;
67 j>(TensorExpr(a, b));
68 }
69
70 /* B(k,l)*A(i,j,k,l) */
71
72 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
73 char i, char j, char k, char l>
74 Tensor2_Expr<
75 Tensor4_times_Tensor2_symmetric_23<A, B, T, U, Dim0, Dim1, Dim, i, j, k, l>,
76 typename promote<T, U>::V, Dim0, Dim1, i, j>
79 {
80 using TensorExpr
81 = Tensor4_times_Tensor2_symmetric_23<A, B, T, U, Dim0, Dim1, Dim, i, j,
82 k, l>;
84 j>(TensorExpr(a, b));
85 }
86
87 /* A(i,j,k,l)*B(l,k) */
88
89 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
90 char i, char j, char k, char l>
92 {
95
96 template <int Current_Dim0, int Current_Dim1>
97 typename promote<T, U>::V
98 eval(const int N1, const int N2, const Number<Current_Dim0> &,
99 const Number<Current_Dim1> &) const
100 {
101 return iterA(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1)
102 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
105 }
106 template <int Current_Dim1>
107 typename promote<T, U>::V
108 eval(const int N1, const int N2, const Number<1> &,
109 const Number<Current_Dim1> &) const
110 {
111 return iterA(N1, N2, 0, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
113 }
114 typename promote<T, U>::V eval(const int N1, const int N2,
115 const Number<1> &, const Number<1> &) const
116 {
117 return iterA(N1, N2, 0, 0) * iterB(0, 0);
118 }
119
120 public:
121 typename promote<T, U>::V operator()(const int N1, const int N2) const
122 {
123 return eval(N1, N2, Number<Dim>(), Number<Dim>());
124 }
125
129 : iterA(a), iterB(b)
130 {}
131 };
132
133 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
134 char i, char j, char k, char l>
135 Tensor2_Expr<
136 Tensor4_times_Tensor2_symmetric_32<A, B, T, U, Dim0, Dim1, Dim, i, j, k, l>,
137 typename promote<T, U>::V, Dim0, Dim1, i, j>
140 {
141 using TensorExpr
142 = Tensor4_times_Tensor2_symmetric_32<A, B, T, U, Dim0, Dim1, Dim, i, j,
143 k, l>;
145 j>(TensorExpr(a, b));
146 }
147
148 /* B(l,k)*A(i,j,k,l) */
149
150 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim,
151 char i, char j, char k, char l>
152 Tensor2_Expr<
153 Tensor4_times_Tensor2_symmetric_32<A, B, T, U, Dim0, Dim1, Dim, i, j, k, l>,
154 typename promote<T, U>::V, Dim0, Dim1, i, j>
157 {
158 using TensorExpr
159 = Tensor4_times_Tensor2_symmetric_32<A, B, T, U, Dim0, Dim1, Dim, i, j,
160 k, l>;
162 j>(TensorExpr(a, b));
163 }
164
165 /* A(i,j,k,l)*B(i,l) */
166
167 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
168 char i, char j, char k, char l>
170 {
173
174 template <int Current_Dim0, int Current_Dim1>
175 typename promote<T, U>::V
176 eval(const int N1, const int N2, const Number<Current_Dim0> &,
177 const Number<Current_Dim1> &) const
178 {
179 return iterA(Current_Dim0 - 1, N1, N2, Current_Dim1 - 1)
180 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
183 }
184 template <int Current_Dim1>
185 typename promote<T, U>::V
186 eval(const int N1, const int N2, const Number<1> &,
187 const Number<Current_Dim1> &) const
188 {
189 return iterA(0, N1, N2, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
191 }
192 typename promote<T, U>::V eval(const int N1, const int N2,
193 const Number<1> &, const Number<1> &) const
194 {
195 return iterA(0, N1, N2, 0) * iterB(0, 0);
196 }
197
198 public:
199 typename promote<T, U>::V operator()(const int N1, const int N2) const
200 {
201 return eval(N1, N2, Number<Dim>(), Number<Dim>());
202 }
203
207 : iterA(a), iterB(b)
208 {}
209 };
210
211 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
212 char i, char j, char k, char l>
213 Tensor2_Expr<
214 Tensor4_times_Tensor2_symmetric_03<A, B, T, U, Dim1, Dim2, Dim, i, j, k, l>,
215 typename promote<T, U>::V, Dim1, Dim2, j, k>
218 {
219 using TensorExpr
220 = Tensor4_times_Tensor2_symmetric_03<A, B, T, U, Dim1, Dim2, Dim, i, j,
221 k, l>;
223 k>(TensorExpr(a, b));
224 }
225
226 /* B(i,l)*A(i,j,k,l) */
227
228 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
229 char i, char j, char k, char l>
230 Tensor2_Expr<
231 Tensor4_times_Tensor2_symmetric_03<A, B, T, U, Dim1, Dim2, Dim, i, j, k, l>,
232 typename promote<T, U>::V, Dim1, Dim2, j, k>
235 {
236 using TensorExpr
237 = Tensor4_times_Tensor2_symmetric_03<A, B, T, U, Dim1, Dim2, Dim, i, j,
238 k, l>;
240 k>(TensorExpr(a, b));
241 }
242
243 /* A(i,j,k,l)*B(l,i) */
244
245 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
246 char i, char j, char k, char l>
248 {
251
252 template <int Current_Dim0, int Current_Dim1>
253 typename promote<T, U>::V
254 eval(const int N1, const int N2, const Number<Current_Dim0> &,
255 const Number<Current_Dim1> &) const
256 {
257 return iterA(Current_Dim0 - 1, N1, N2, Current_Dim1 - 1)
258 * iterB(Current_Dim1 - 1, Current_Dim0 - 1)
261 }
262 template <int Current_Dim1>
263 typename promote<T, U>::V
264 eval(const int N1, const int N2, const Number<1> &,
265 const Number<Current_Dim1> &) const
266 {
267 return iterA(0, N1, N2, Current_Dim1 - 1) * iterB(Current_Dim1 - 1, 0)
269 }
270 typename promote<T, U>::V eval(const int N1, const int N2,
271 const Number<1> &, const Number<1> &) const
272 {
273 return iterA(0, N1, N2, 0) * iterB(0, 0);
274 }
275
276 public:
277 typename promote<T, U>::V operator()(const int N1, const int N2) const
278 {
279 return eval(N1, N2, Number<Dim>(), Number<Dim>());
280 }
281
285 : iterA(a), iterB(b)
286 {}
287 };
288
289 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
290 char i, char j, char k, char l>
291 Tensor2_Expr<
292 Tensor4_times_Tensor2_symmetric_30<A, B, T, U, Dim1, Dim2, Dim, i, j, k, l>,
293 typename promote<T, U>::V, Dim1, Dim2, j, k>
296 {
297 using TensorExpr
298 = Tensor4_times_Tensor2_symmetric_30<A, B, T, U, Dim1, Dim2, Dim, i, j,
299 k, l>;
301 k>(TensorExpr(a, b));
302 }
303
304 /* B(l,i)*A(i,j,k,l) */
305
306 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
307 char i, char j, char k, char l>
308 Tensor2_Expr<
309 Tensor4_times_Tensor2_symmetric_30<A, B, T, U, Dim1, Dim2, Dim, i, j, k, l>,
310 typename promote<T, U>::V, Dim1, Dim2, j, k>
313 {
314 using TensorExpr
315 = Tensor4_times_Tensor2_symmetric_30<A, B, T, U, Dim1, Dim2, Dim, i, j,
316 k, l>;
318 k>(TensorExpr(a, b));
319 }
320
321 /* A(i,j,k,l)*B(i,k) */
322
323 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
324 char i, char j, char k, char l>
326 {
329
330 template <int Current_Dim0, int Current_Dim1>
331 typename promote<T, U>::V
332 eval(const int N1, const int N2, const Number<Current_Dim0> &,
333 const Number<Current_Dim1> &) const
334 {
335 return iterA(Current_Dim0 - 1, N1, Current_Dim1 - 1, N2)
336 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
339 }
340 template <int Current_Dim1>
341 typename promote<T, U>::V
342 eval(const int N1, const int N2, const Number<1> &,
343 const Number<Current_Dim1> &) const
344 {
345 return iterA(0, N1, Current_Dim1 - 1, N2) * iterB(0, Current_Dim1 - 1)
347 }
348 typename promote<T, U>::V eval(const int N1, const int N2,
349 const Number<1> &, const Number<1> &) const
350 {
351 return iterA(0, N1, 0, N2) * iterB(0, 0);
352 }
353
354 public:
355 typename promote<T, U>::V operator()(const int N1, const int N2) const
356 {
357 return eval(N1, N2, Number<Dim>(), Number<Dim>());
358 }
359
363 : iterA(a), iterB(b)
364 {}
365 };
366
367 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
368 char i, char j, char k, char l>
369 Tensor2_Expr<
370 Tensor4_times_Tensor2_symmetric_02<A, B, T, U, Dim1, Dim2, Dim, i, j, k, l>,
371 typename promote<T, U>::V, Dim1, Dim2, j, l>
374 {
375 using TensorExpr
376 = Tensor4_times_Tensor2_symmetric_02<A, B, T, U, Dim1, Dim2, Dim, i, j,
377 k, l>;
379 l>(TensorExpr(a, b));
380 }
381
382 /* B(i,k)*A(i,j,k,l) */
383
384 template <class A, class B, class T, class U, int Dim, int Dim1, int Dim2,
385 char i, char j, char k, char l>
386 Tensor2_Expr<
387 Tensor4_times_Tensor2_symmetric_02<A, B, T, U, Dim1, Dim2, Dim, i, j, k, l>,
388 typename promote<T, U>::V, Dim1, Dim2, j, l>
391 {
392 using TensorExpr
393 = Tensor4_times_Tensor2_symmetric_02<A, B, T, U, Dim1, Dim2, Dim, i, j,
394 k, l>;
396 l>(TensorExpr(a, b));
397 }
398
399 /* A(i,j,k,l)*B(i,j) */
400
401 template <class A, class B, class T, class U, int Dim, int Dim2, int Dim3,
402 char i, char j, char k, char l>
404 {
407
408 template <int Current_Dim0, int Current_Dim1>
409 typename promote<T, U>::V
410 eval(const int N3, const int N4, const Number<Current_Dim0> &,
411 const Number<Current_Dim1> &) const
412 {
413 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N3, N4) *
414 iterB(Current_Dim0 - 1, Current_Dim1 - 1) +
416 }
417 template <int Current_Dim1>
418 typename promote<T, U>::V
419 eval(const int N3, const int N4, const Number<1> &,
420 const Number<Current_Dim1> &) const
421 {
422 return iterA(0, Current_Dim1 - 1, N3, N4) * iterB(0, Current_Dim1 - 1)
424 }
425 typename promote<T, U>::V eval(const int N3, const int N4,
426 const Number<1> &, const Number<1> &) const
427 {
428 return iterA(0, 0, N3, N4) * iterB(0, 0);
429 }
430
431 public:
432 typename promote<T, U>::V operator()(const int N3, const int N4) const
433 {
434 return eval(N3, N4, Number<Dim>(), Number<Dim>());
435 }
436
440 : iterA(a), iterB(b)
441 {}
442 };
443
444 template <class A, class B, class T, class U, int Dim, int Dim2, int Dim3,
445 char i, char j, char k, char l>
446 Tensor2_Expr<Tensor4_times_Tensor2_symmetric_01<A, B, T, U, Dim, Dim2,
447 Dim3, i, j, k, l>,
448 typename promote<T, U>::V, Dim2, Dim3, k, l>
451 using TensorExpr
452 = Tensor4_times_Tensor2_symmetric_01<A, B, T, U, Dim, Dim2, Dim3, i, j,
453 k, l>;
455 l>(TensorExpr(a, b));
456 }
457
458 /* B(i,j)*A(i,j,k,l) */
459
460 template <class A, class B, class T, class U, int Dim, int Dim2, int Dim3,
461 char i, char j, char k, char l>
462 Tensor2_Expr<
463 Tensor4_times_Tensor2_symmetric_01<A, B, T, U, Dim, Dim2, Dim3, i, j, k, l>,
464 typename promote<T, U>::V, Dim2, Dim3, k, l>
467 {
468 using TensorExpr
469 = Tensor4_times_Tensor2_symmetric_01<A, B, T, U, Dim, Dim2, Dim3, i, j,
470 k, l>;
472 l>(TensorExpr(a, b));
473 }
474
475}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
Tensor4_Expr< A, T, Dim, Dim, Dim2, Dim3, i, j, k, l > iterA
Tensor4_times_Tensor2_symmetric_01(const Tensor4_Expr< A, T, Dim, Dim, Dim2, Dim3, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim, i, j > &b)
promote< T, U >::V operator()(const int N3, const int N4) const
promote< T, U >::V eval(const int N3, const int N4, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N3, const int N4, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N3, const int N4, const Number< 1 > &, const Number< 1 > &) const
Tensor4_times_Tensor2_symmetric_02(const Tensor4_Expr< A, T, Dim, Dim1, Dim2, Dim, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim, i, k > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
Tensor4_Expr< A, T, Dim, Dim1, Dim2, Dim, i, j, k, l > iterA
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< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Tensor4_times_Tensor2_symmetric_03(const Tensor4_Expr< A, T, Dim, Dim1, Dim2, Dim, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim, i, l > &b)
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< Current_Dim1 > &) const
Tensor4_Expr< A, T, Dim, Dim1, Dim2, Dim, i, j, k, l > iterA
promote< T, U >::V operator()(const int N1, const int N2) const
Tensor2_symmetric_Expr< B, U, Dim, k, l > iterB
promote< T, U >::V operator()(const int N1, const int N2) const
Tensor4_times_Tensor2_symmetric_23(const Tensor4_Expr< A, T, Dim0, Dim1, Dim, Dim, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim, k, l > &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< Current_Dim0 > &, const Number< Current_Dim1 > &) const
Tensor4_Expr< A, T, Dim0, Dim1, Dim, Dim, i, j, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Tensor4_times_Tensor2_symmetric_30(const Tensor4_Expr< A, T, Dim, Dim1, Dim2, Dim, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim, l, i > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
Tensor4_Expr< A, T, Dim, Dim1, Dim2, Dim, i, j, k, l > iterA
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
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 eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Tensor4_Expr< A, T, Dim0, Dim1, Dim, Dim, i, j, k, l > iterA
Tensor2_symmetric_Expr< B, U, Dim, l, k > iterB
Tensor4_times_Tensor2_symmetric_32(const Tensor4_Expr< A, T, Dim0, Dim1, Dim, Dim, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim, l, k > &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< 1 > &, const Number< Current_Dim1 > &) const
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