v0.14.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) +
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:
30 : iterA(a), iterB(b) {}
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>
44 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, i, j, l>(
45 TensorExpr(a, b));
46}
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>
57 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, i, j, l>(
58 TensorExpr(a, b));
59}
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) +
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:
83 : iterA(a), iterB(b) {}
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>
97 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, i, j, k>(
98 TensorExpr(a, b));
99}
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>
110 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, i, j, k>(
111 TensorExpr(a, b));
112}
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) +
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:
136 : iterA(a), iterB(b) {}
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>
150 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, j, k, l>(
151 TensorExpr(a, b));
152}
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>
163 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, j, k, l>(
164 TensorExpr(a, b));
165}
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) +
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:
189 : iterA(a), iterB(b) {}
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>
203 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, i, k, l>(
204 TensorExpr(a, b));
205}
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>
216 return Dg_Expr<TensorExpr, typename promote<T, U>::V, Dim01, Dim23, i, k, l>(
217 TensorExpr(a, b));
218}
219
220} // namespace FTensor
static Number< 2 > N2
static Number< 1 > N1
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
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