v0.15.0
Loading...
Searching...
No Matches
Tensor4_times_Tensor4_double.hpp
Go to the documentation of this file.
1/**
2 * @file Tensor4_times_Tensor4_double.hpp
3 * @brief Tensor4 times Tensor4 yields Tensor4
4 * @date 2022-10-18
5 *
6 * @copyright Copyright (c) 2022
7 *
8 */
9
10#pragma once
11
12namespace FTensor {
13
14/* Double contraction. */
15
16/* A(i,j,k,l)*B(k,l,m,n) */
17
18template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
19 int Dim3, int Dim4, int Dim5, char i, char j, char k, char l, char m,
20 char n>
24
25 template <int Current_Dim0, int Current_Dim1>
26 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
27 const int N4, const Number<Current_Dim0> &,
28 const Number<Current_Dim1> &) const {
29 return iterA(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1) *
30 iterB(Current_Dim0 - 1, Current_Dim1 - 1, N3, N4) +
31 eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>(),
33 }
34 template <int Current_Dim1>
35 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
36 const int N4, const Number<1> &,
37 const Number<Current_Dim1> &) const {
38 return iterA(N1, N2, 0, Current_Dim1 - 1) *
39 iterB(0, Current_Dim1 - 1, N3, N4) +
40 eval(N1, N2, N3, N4, Number<Dim2>(), Number<Current_Dim1 - 1>());
41 }
42 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
43 const int N4, const Number<1> &,
44 const Number<1> &) const {
45 return iterA(N1, N2, 0, 0) * iterB(0, 0, N3, N4);
46 }
47
48public:
49 typename promote<T, U>::V operator()(const int N1, const int N2, const int N3,
50 const int N4) const {
51 return eval(N1, N2, N3, N4, Number<Dim2>(), Number<Dim3>());
52 }
53
58};
59
60template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
61 int Dim3, int Dim4, int Dim5, char i, char j, char k, char l, char m,
62 char n>
63inline auto
66 using TensorExpr =
67 Tensor4_times_Tensor4_2345<A, B, T, U, Dim0, Dim1, Dim2, Dim3, Dim4, Dim5,
68 i, j, k, l, m, n>;
70 Dim5, i, j, m, n>(TensorExpr(a, b));
71}
72
73/* A(i,j,k,l)*B(i,j,m,n) */
74
75template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
76 int Dim3, int Dim4, int Dim5, char i, char j, char k, char l, char m,
77 char n>
81
82 template <int Current_Dim0, int Current_Dim1>
83 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
84 const int N4, const Number<Current_Dim0> &,
85 const Number<Current_Dim1> &) const {
86 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N1, N2) *
87 iterB(Current_Dim0 - 1, Current_Dim1 - 1, N3, N4) +
88 eval(N1, N2, N3, N4, Number<Current_Dim0 - 1>(),
90 }
91 template <int Current_Dim1>
92 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
93 const int N4, const Number<1> &,
94 const Number<Current_Dim1> &) const {
95 return iterA(0, Current_Dim1 - 1, N1, N2) *
96 iterB(0, Current_Dim1 - 1, N3, N4) +
97 eval(N1, N2, N3, N4, Number<Dim2>(), Number<Current_Dim1 - 1>());
98 }
99 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
100 const int N4, const Number<1> &,
101 const Number<1> &) const {
102 return iterA(0, 0, N1, N2) * iterB(0, 0, N3, N4);
103 }
104
105public:
106 typename promote<T, U>::V operator()(const int N1, const int N2, const int N3,
107 const int N4) const {
108 return eval(N1, N2, N3, N4, Number<Dim2>(), Number<Dim3>());
109 }
110
115};
116
117template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
118 int Dim3, int Dim4, int Dim5, char i, char j, char k, char l, char m,
119 char n>
120inline auto
123 using TensorExpr =
124 Tensor4_times_Tensor4_0145<A, B, T, U, Dim0, Dim1, Dim2, Dim3, Dim4, Dim5,
125 i, j, k, l, m, n>;
127 Dim5, m, n, k, l>(TensorExpr(a, b));
128}
129}
constexpr double a
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &, const Number< Current_Dim1 > &) const
const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > iterA
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
Tensor4_times_Tensor4_0145(const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > &a, const Tensor4_Expr< B, U, Dim0, Dim1, Dim4, Dim5, i, j, m, n > &b)
const Tensor4_Expr< B, U, Dim0, Dim1, Dim4, Dim5, i, j, m, n > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4, const Number< 1 > &, const Number< 1 > &) const
Tensor4_times_Tensor4_2345(const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > &a, const Tensor4_Expr< B, U, Dim2, Dim3, Dim4, Dim5, k, l, m, n > &b)
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > iterA
const Tensor4_Expr< B, U, Dim2, Dim3, Dim4, Dim5, k, l, m, n > iterB
FTensor::Index< 'i', SPACE_DIM > i
const double n
refractive index of diffusive medium
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
FTensor::Index< 'm', 3 > m