v0.13.2
Loading...
Searching...
No Matches
Tensor2_symmetric_times_Tensor2.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for
2 Tensor2_symmetric*Tensor2. This includes the double
3 contraction A(i,j)*B(i,j) (yielding a double) as well as the more
4 complicated single contraction A(i,j)*B(j,k) (yielding a Tensor2
5 expression). */
6
7#pragma once
8
9namespace FTensor
10{
11 /* Double contraction. */
12
13 /* A(i,j)*B(i,j) */
14
15 template <class A, class B, class T, class U, int Dim, char i, char j,
16 int Current_Dim0, int Current_Dim1>
17 typename promote<T, U>::V
21 {
22 return a(Current_Dim0 - 1, Current_Dim1 - 1)
23 * b(Current_Dim0 - 1, Current_Dim1 - 1)
26 }
27
28 template <class A, class B, class T, class U, int Dim, char i, char j,
29 int Current_Dim1>
30 typename promote<T, U>::V
33 const Number<1> &, const Number<Current_Dim1> &)
34 {
35 return a(0, Current_Dim1 - 1) * b(0, Current_Dim1 - 1)
37 }
38
39 template <class A, class B, class T, class U, int Dim, char i, char j>
40 typename promote<T, U>::V
43 const Number<1> &, const Number<1> &)
44 {
45 return a(0, 0) * b(0, 0);
46 }
47
48 template <class A, class B, class T, class U, int Dim, char i, char j>
49 typename promote<T, U>::V
52 {
54 }
55
56 /* B(i,j)*A(i,j) */
57
58 template <class A, class B, class T, class U, int Dim, char i, char j>
59 typename promote<T, U>::V
62
63 {
65 }
66
67 /* Double contraction with switched indices. The perspicacious reader
68 will note that it just replicated code for the aligned indices case
69 above, but with B(i,j) -> B(j,i). This is ok, since A is
70 symmetric. */
71
72 /* A(i,j)*B(j,i) */
73
74 template <class A, class B, class T, class U, int Dim, char i, char j,
75 int Current_Dim0, int Current_Dim1>
76 typename promote<T, U>::V
80 {
81 return a(Current_Dim0 - 1, Current_Dim1 - 1)
82 * b(Current_Dim0 - 1, Current_Dim1 - 1)
85 }
86
87 template <class A, class B, class T, class U, int Dim, char i, char j,
88 int Current_Dim1>
89 typename promote<T, U>::V
92 const Number<1> &, const Number<Current_Dim1> &)
93 {
94 return a(0, Current_Dim1 - 1) * b(0, Current_Dim1 - 1)
96 }
97
98 template <class A, class B, class T, class U, int Dim, char i, char j>
99 typename promote<T, U>::V
102 const Number<1> &, const Number<1> &)
103 {
104 return a(0, 0) * b(0, 0);
105 }
106
107 template <class A, class B, class T, class U, int Dim, char i, char j>
108 typename promote<T, U>::V
111 {
112 return T2s_times_T2_01(a, b, Number<Dim>(), Number<Dim>());
113 }
114
115 /* B(j,i)*A(i,j) */
116
117 template <class A, class B, class T, class U, int Dim, char i, char j>
118 typename promote<T, U>::V
121
122 {
123 return T2s_times_T2_01(a, b, Number<Dim>(), Number<Dim>());
124 }
125
126 /* Single contraction. The wrapper class has a different name for
127 each possible placing of the indices (e.g. A(i,j)*B(j,k) has the
128 number 10 because the contraction indices are on the second and
129 first slots (counting from 0). */
130
131 /* A(i,j)*B(j,k) */
132
133 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
134 char j, char k>
136 {
139
140 template <int Current_Dim>
141 typename promote<T, U>::V
142 eval(const int N1, const int N2, const Number<Current_Dim> &) const
143 {
144 return iterA(N1, Current_Dim - 1) * iterB(Current_Dim - 1, N2)
146 }
147 typename promote<T, U>::V
148 eval(const int N1, const int N2, const Number<1> &) const
149 {
150 return iterA(N1, 0) * iterB(0, N2);
151 }
152
153 public:
157 : iterA(a), iterB(b)
158 {}
159 typename promote<T, U>::V operator()(const int N1, const int N2) const
160 {
161 return eval(N1, N2, Number<Dim>());
162 }
163 };
164
165 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
166 char j, char k>
167 Tensor2_Expr<
168 Tensor2_symmetric_times_Tensor2_10<A, B, T, U, Dim, Dim1, i, j, k>,
169 typename promote<T, U>::V, Dim, Dim1, i, k>
172 {
173 using TensorExpr
176 TensorExpr(a, b));
177 }
178
179 /* B(j,k)*A(i,j) */
180
181 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
182 char j, char k>
183 Tensor2_Expr<
184 Tensor2_symmetric_times_Tensor2_10<A, B, T, U, Dim, Dim1, i, j, k>,
185 typename promote<T, U>::V, Dim, Dim1, i, k>
188 {
189 using TensorExpr
192 TensorExpr(a, b));
193 }
194
195 /* A(i,j)*B(k,j) */
196
197 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
198 char j, char k>
200 {
203
204 template <int Current_Dim>
205 typename promote<T, U>::V
206 eval(const int N1, const int N2, const Number<Current_Dim> &) const
207 {
208 return iterA(N1, Current_Dim - 1) * iterB(N2, Current_Dim - 1)
210 }
211 typename promote<T, U>::V
212 eval(const int N1, const int N2, const Number<1> &) const
213 {
214 return iterA(N1, 0) * iterB(N2, 0);
215 }
216
217 public:
221 : iterA(a), iterB(b)
222 {}
223 typename promote<T, U>::V operator()(const int N1, const int N2) const
224 {
225 return eval(N1, N2, Number<Dim>());
226 }
227 };
228
229 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
230 char j, char k>
231 Tensor2_Expr<
232 Tensor2_symmetric_times_Tensor2_11<A, B, T, U, Dim, Dim1, i, j, k>,
233 typename promote<T, U>::V, Dim, Dim1, i, k>
236 {
237 using TensorExpr
240 TensorExpr(a, b));
241 }
242
243 /* B(k,j)*A(i,j) */
244
245 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
246 char j, char k>
247 Tensor2_Expr<
248 Tensor2_symmetric_times_Tensor2_11<A, B, T, U, Dim, Dim1, i, j, k>,
249 typename promote<T, U>::V, Dim, Dim1, i, k>
252 {
253 using TensorExpr
256 TensorExpr(a, b));
257 }
258
259 /* A(j,i)*B(j,k) */
260
261 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
262 char j, char k>
264 {
267
268 template <int Current_Dim>
269 typename promote<T, U>::V
270 eval(const int N1, const int N2, const Number<Current_Dim> &) const
271 {
272 return iterA(Current_Dim - 1, N1) * iterB(Current_Dim - 1, N2)
274 }
275 typename promote<T, U>::V
276 eval(const int N1, const int N2, const Number<1> &) const
277 {
278 return iterA(0, N1) * iterB(0, N2);
279 }
280
281 public:
285 : iterA(a), iterB(b)
286 {}
287 typename promote<T, U>::V operator()(const int N1, const int N2) const
288 {
289 return eval(N1, N2, Number<Dim>());
290 }
291 };
292
293 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
294 char j, char k>
295 Tensor2_Expr<
296 Tensor2_symmetric_times_Tensor2_00<A, B, T, U, Dim, Dim1, i, j, k>,
297 typename promote<T, U>::V, Dim, Dim1, i, k>
300 {
301 using TensorExpr
304 TensorExpr(a, b));
305 }
306
307 /* B(j,k)*A(j,i) */
308
309 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
310 char j, char k>
311 Tensor2_Expr<
312 Tensor2_symmetric_times_Tensor2_00<A, B, T, U, Dim, Dim1, i, j, k>,
313 typename promote<T, U>::V, Dim, Dim1, i, k>
316 {
317 using TensorExpr
320 TensorExpr(a, b));
321 }
322
323 /* A(j,i)*B(k,j) */
324
325 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
326 char j, char k>
328 {
331
332 template <int Current_Dim>
333 typename promote<T, U>::V
334 eval(const int N1, const int N2, const Number<Current_Dim> &) const
335 {
336 return iterA(Current_Dim - 1, N1) * iterB(N2, Current_Dim - 1)
338 }
339 typename promote<T, U>::V
340 eval(const int N1, const int N2, const Number<1> &) const
341 {
342 return iterA(0, N1) * iterB(N2, 0);
343 }
344
345 public:
349 : iterA(a), iterB(b)
350 {}
351 typename promote<T, U>::V operator()(const int N1, const int N2) const
352 {
353 return eval(N1, N2, Number<Dim>());
354 }
355 };
356
357 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
358 char j, char k>
359 Tensor2_Expr<
360 Tensor2_symmetric_times_Tensor2_01<A, B, T, U, Dim, Dim1, i, j, k>,
361 typename promote<T, U>::V, Dim, Dim1, i, k>
364 {
365 using TensorExpr
368 TensorExpr(a, b));
369 }
370
371 /* B(k,j)*A(j,i) */
372
373 template <class A, class B, class T, class U, int Dim, int Dim1, char i,
374 char j, char k>
375 Tensor2_Expr<
376 Tensor2_symmetric_times_Tensor2_01<A, B, T, U, Dim, Dim1, i, j, k>,
377 typename promote<T, U>::V, Dim, Dim1, i, k>
380 {
381 using TensorExpr
384 TensorExpr(a, b));
385 }
386}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
Tensor2_symmetric_times_Tensor2_00(const Tensor2_symmetric_Expr< A, T, Dim, j, i > &a, const Tensor2_Expr< B, U, Dim, Dim1, j, k > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim > &) 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
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim > &) const
Tensor2_symmetric_times_Tensor2_01(const Tensor2_symmetric_Expr< A, T, Dim, j, i > &a, const Tensor2_Expr< B, U, Dim1, Dim, k, j > &b)
promote< T, U >::V operator()(const int N1, const int N2) 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
Tensor2_symmetric_times_Tensor2_10(const Tensor2_symmetric_Expr< A, T, Dim, i, j > &a, const Tensor2_Expr< B, U, Dim, Dim1, j, k > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim > &) const
promote< T, U >::V operator()(const int N1, const int N2) const
Tensor2_symmetric_times_Tensor2_11(const Tensor2_symmetric_Expr< A, T, Dim, i, j > &a, const Tensor2_Expr< B, U, Dim1, Dim, k, j > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim > &) const
FTensor::Index< 'i', SPACE_DIM > i
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 T2s_times_T2_01(const Tensor2_symmetric_Expr< A, T, Dim, i, j > &a, const Tensor2_Expr< B, U, Dim, Dim, i, j > &b, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &)
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