v0.15.0
Loading...
Searching...
No Matches
Ddg_times_Tensor1.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Ddg*Tensor1 and Tensor1*Ddg, yielding a
3 Dg. */
4
5#pragma once
6
7namespace FTensor {
8/* A(i,j,k,l)*B(k)->Dg */
9
10template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
11 char j, char k, char l>
15
16 template <int Current_Dim>
17 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
18 const Number<Current_Dim> &) const {
19 return iterA(N1, N2, Current_Dim - 1, N3) * iterB(Current_Dim - 1) +
20 eval(N1, N2, N3, Number<Current_Dim - 1>());
21 }
22 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
23 const Number<1> &) const {
24 return iterA(N1, N2, 0, N3) * iterB(0);
25 }
26
27public:
31 typename promote<T, U>::V operator()(const int N1, const int N2,
32 const int N3) const {
33 return eval(N1, N2, N3, Number<Dim23>());
34 }
35};
36
37template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
38 char j, char k, char l>
39Dg_Expr<Ddg_times_Tensor1_2<A, B, T, U, Dim01, Dim23, i, j, k, l>,
40 typename promote<T, U>::V, Dim01, Dim23, i, j, l>
47
48/* B(k)*A(i,j,k,l)->Dg */
49
50template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
51 char j, char k, char l>
52Dg_Expr<Ddg_times_Tensor1_2<A, B, T, U, Dim01, Dim23, i, j, k, l>,
53 typename promote<T, U>::V, Dim01, Dim23, i, j, l>
60
61/* A(i,j,k,l)*B(l)->Dg */
62
63template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
64 char j, char k, char l>
68
69 template <int Current_Dim>
70 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
71 const Number<Current_Dim> &) const {
72 return iterA(N1, N2, Current_Dim - 1, N3) * iterB(Current_Dim - 1) +
73 eval(N1, N2, N3, Number<Current_Dim - 1>());
74 }
75 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
76 const Number<1> &) const {
77 return iterA(N1, N2, 0, N3) * iterB(0);
78 }
79
80public:
84 typename promote<T, U>::V operator()(const int N1, const int N2,
85 const int N3) const {
86 return eval(N1, N2, N3, Number<Dim23>());
87 }
88};
89
90template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
91 char j, char k, char l>
92Dg_Expr<Ddg_times_Tensor1_3<A, B, T, U, Dim01, Dim23, i, j, k, l>,
93 typename promote<T, U>::V, Dim01, Dim23, i, j, k>
100
101/* B(l)*A(i,j,k,l)->Dg */
102
103template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
104 char j, char k, char l>
105Dg_Expr<Ddg_times_Tensor1_3<A, B, T, U, Dim01, Dim23, i, j, k, l>,
106 typename promote<T, U>::V, Dim01, Dim23, i, j, k>
113
114/* A(i,j,k,l)*B(i)->Christof */
115
116template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
117 char j, char k, char l>
121
122 template <int Current_Dim>
123 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
124 const Number<Current_Dim> &) const {
125 return iterA(Current_Dim - 1, N3, N1, N2) * iterB(Current_Dim - 1) +
126 eval(N1, N2, N3, Number<Current_Dim - 1>());
127 }
128 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
129 const Number<1> &) const {
130 return iterA(0, N3, N1, N2) * iterB(0);
131 }
132
133public:
137 typename promote<T, U>::V operator()(const int N1, const int N2,
138 const int N3) const {
139 return eval(N1, N2, N3, Number<Dim01>());
140 }
141};
142
143template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
144 char j, char k, char l>
145Dg_Expr<Ddg_times_Tensor1_0<A, B, T, U, Dim01, Dim23, i, j, k, l>,
146 typename promote<T, U>::V, Dim01, Dim23, j, k, l>
153
154/* B(i)*A(i,j,k,l)->Christof */
155
156template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
157 char j, char k, char l>
158Dg_Expr<Ddg_times_Tensor1_0<A, B, T, U, Dim01, Dim23, i, j, k, l>,
159 typename promote<T, U>::V, Dim01, Dim23, j, k, l>
166
167/* A(i,j,k,l)*B(j)->Christof */
168
169template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
170 char j, char k, char l>
174
175 template <int Current_Dim>
176 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
177 const Number<Current_Dim> &) const {
178 return iterA(Current_Dim - 1, N3, N1, N2) * iterB(Current_Dim - 1) +
179 eval(N1, N2, N3, Number<Current_Dim - 1>());
180 }
181 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
182 const Number<1> &) const {
183 return iterA(0, N3, N1, N2) * iterB(0);
184 }
185
186public:
190 typename promote<T, U>::V operator()(const int N1, const int N2,
191 const int N3) const {
192 return eval(N1, N2, N3, Number<Dim01>());
193 }
194};
195
196template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
197 char j, char k, char l>
198Dg_Expr<Ddg_times_Tensor1_1<A, B, T, U, Dim01, Dim23, i, j, k, l>,
199 typename promote<T, U>::V, Dim01, Dim23, i, k, l>
206
207/* B(j)*A(i,j,k,l)->Christof */
208
209template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
210 char j, char k, char l>
211Dg_Expr<Ddg_times_Tensor1_1<A, B, T, U, Dim01, Dim23, i, j, k, l>,
212 typename promote<T, U>::V, Dim01, Dim23, i, k, l>
219
220} // namespace FTensor
constexpr double a
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim > &) const
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Tensor1_Expr< B, U, Dim01, i > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &) const
Ddg_times_Tensor1_0(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor1_Expr< B, U, Dim01, i > &b)
Tensor1_Expr< B, U, Dim01, j > iterB
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< 1 > &) const
Ddg_times_Tensor1_1(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor1_Expr< B, U, Dim01, j > &b)
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
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< Current_Dim > &) const
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
Tensor1_Expr< B, U, Dim23, k > iterB
Ddg_times_Tensor1_2(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor1_Expr< B, U, Dim23, k > &b)
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim > &) const
Ddg_times_Tensor1_3(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor1_Expr< B, U, Dim23, l > &b)
Tensor1_Expr< B, U, Dim23, l > iterB
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< 1 > &) 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