v0.15.0
Loading...
Searching...
No Matches
Tensor3_times_Tensor1.hpp
Go to the documentation of this file.
1/* Declarations for expressions like Tensor3*Tensor1 -> Tensor2 */
2
3#pragma once
4
5namespace FTensor
6{
7 /* A(i,j,k)*B(j) -> Tensor2 */
8
9 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
10 char i, char j, char k>
12 {
15
16 template <int Current_Dim>
17 typename promote<T, U>::V
18 eval(const int N1, const int N2, const Number<Current_Dim> &) const
19 {
20 return iterA(N1, Current_Dim - 1, N2) * iterB(Current_Dim - 1)
21 + eval(N1, N2, Number<Current_Dim - 1>());
22 }
23 typename promote<T, U>::V
24 eval(const int N1, const int N2, const Number<1> &) const
25 {
26 return iterA(N1, 0, N2) * iterB(0);
27 }
28
29 public:
35 typename promote<T, U>::V operator()(const int N1, const int N2) const
36 {
37 return eval(N1, N2, Number<Dim1>());
38 }
39 };
40
41 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
42 char i, char j, char k>
43 Tensor2_Expr<Tensor3_times_Tensor1_1<A, B, T, U, Dim0, Dim1, Dim2, i, j, k>,
44 typename promote<T, U>::V, Dim0, Dim2, i, k>
53
54 /* B(j)*A(i,j,k) -> Tensor2 */
55
56 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
57 char i, char j, char k>
58 Tensor2_Expr<Tensor3_times_Tensor1_1<A, B, T, U, Dim0, Dim1, Dim2, i, j, k>,
59 typename promote<T, U>::V, Dim0, Dim2, i, k>
68
69 /* A(i,j,k)*B(i) -> Tensor2 */
70
71 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
72 char i, char j, char k>
74 {
77
78 template <int Current_Dim>
79 typename promote<T, U>::V
80 eval(const int N1, const int N2, const Number<Current_Dim> &) const
81 {
82 return iterA(Current_Dim - 1, N1, N2) * iterB(Current_Dim - 1)
83 + eval(N1, N2, Number<Current_Dim - 1>());
84 }
85 typename promote<T, U>::V
86 eval(const int N1, const int N2, const Number<1> &) const
87 {
88 return iterA(0, N1, N2) * iterB(0);
89 }
90
91 public:
97 typename promote<T, U>::V operator()(const int N1, const int N2) const
98 {
99 return eval(N1, N2, Number<Dim0>());
100 }
101 };
102
103 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
104 char i, char j, char k>
105 Tensor2_Expr<Tensor3_times_Tensor1_0<A, B, T, U, Dim0, Dim1, Dim2, i, j, k>,
106 typename promote<T, U>::V, Dim1, Dim2, j, k>
115
116 /* B(i)*A(i,j,k) -> Tensor2 */
117
118 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
119 char i, char j, char k>
120 Tensor2_Expr<Tensor3_times_Tensor1_0<A, B, T, U, Dim0, Dim1, Dim2, i, j, k>,
121 typename promote<T, U>::V, Dim1, Dim2, j, k>
130
131 /* A(i,j,k)*B(k) -> Tensor2 */
132
133 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
134 char i, char j, char k>
136 {
139
140 template <int CurrentDim>
141 typename promote<T, U>::V
142 eval(const int N1, const int N2, const Number<CurrentDim> &) const
143 {
144 return iterA(N1, N2, CurrentDim - 1) * iterB(CurrentDim - 1)
145 + eval(N1, N2, Number<CurrentDim - 1>());
146 };
147 typename promote<T, U>::V
148 eval(const int N1, const int N2, const Number<1> &) const
149 {
150 return iterA(N1, N2, 0) * iterB(0);
151 };
152
153 public:
159 typename promote<T, U>::V operator()(const int N1, const int N2) const
160 {
161 return eval(N1, N2, Number<Dim2>());
162 }
163 };
164
165 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
166 char i, char j, char k>
167 Tensor2_Expr<Tensor3_times_Tensor1_2<A, B, T, U, Dim0, Dim1, Dim2, i, j, k>,
168 typename promote<T, U>::V, Dim0, Dim1, i, j>
177
178 /* A(i,j,k)*B(k) -> Tensor2 */
179
180 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
181 char i, char j, char k>
182 Tensor2_Expr<Tensor3_times_Tensor1_2<A, B, T, U, Dim0, Dim1, Dim2, i, j, k>,
183 typename promote<T, U>::V, Dim0, Dim1, i, j>
192
193 /* A(i,j,k)*B(m) -> Tensor4 */
194
195 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
196 int Dim3, char i, char j, char k, char l>
200
201 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
202 const int N4) const {
203 return iterA(N1, N2, N3) * iterB(N4);
204 };
205
206 public:
211 typename promote<T, U>::V operator()(const int N1, const int N2,
212 const int N3, const int N4) const {
213 return eval(N1, N2, N3, N4);
214 }
215 };
216
217 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
218 int Dim3, char i, char j, char k, char l>
219 Tensor4_Expr<
220 Tensor3_times_Tensor1_34<A, B, T, U, Dim0, Dim1, Dim2, Dim3, i, j, k, l>,
221 typename promote<T, U>::V, Dim0, Dim1, Dim3, Dim3, i, j, k, l>
224 using TensorExpr = Tensor3_times_Tensor1_34<A, B, T, U, Dim0, Dim1, Dim2,
225 Dim3, i, j, k, l>;
227 Dim3, i, j, k, l>(TensorExpr(a, b));
228 };
229
230 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
231 int Dim3, char i, char j, char k, char l>
232 Tensor4_Expr<
233 Tensor3_times_Tensor1_34<A, B, T, U, Dim0, Dim1, Dim2, Dim3, i, j, k, l>,
234 typename promote<T, U>::V, Dim0, Dim1, Dim3, Dim3, i, j, k, l>
237 using TensorExpr = Tensor3_times_Tensor1_34<A, B, T, U, Dim0, Dim1, Dim2,
238 Dim3, i, j, k, l>;
240 Dim3, i, j, k, l>(TensorExpr(a, b));
241 };
242
243 } // namespace FTensor
constexpr double a
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
Tensor3_times_Tensor1_0(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor1_Expr< B, U, Dim0, i > &b)
Tensor1_Expr< B, U, Dim0, i > iterB
Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > iterA
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< Current_Dim > &) const
Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > iterA
promote< T, U >::V operator()(const int N1, const int N2) const
Tensor1_Expr< B, U, Dim1, j > iterB
Tensor3_times_Tensor1_1(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor1_Expr< B, U, Dim1, j > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &) const
Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > iterA
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< CurrentDim > &) const
Tensor1_Expr< B, U, Dim2, k > iterB
Tensor3_times_Tensor1_2(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor1_Expr< B, U, Dim2, k > &b)
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) const
Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > iterA
Tensor1_Expr< B, U, Dim3, l > iterB
Tensor3_times_Tensor1_34(const Tensor3_Expr< A, T, Dim0, Dim1, Dim2, i, j, k > &a, const Tensor1_Expr< B, U, Dim3, l > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const int N4) const
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