v0.14.0
Loading...
Searching...
No Matches
Ddg_times_Tensor2_symmetric.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Ddg*Tensor2_symmetric and Tensor2_symmetric*Ddg,
3 yielding a Tensor2 or Tensor2_symmetric. */
4
5#pragma once
6
7namespace FTensor
8{
9 /* A(i,j,k,l)*B(j,l) */
10
11 template <class A, class B, class T, class U, int Dim, char i, char j,
12 char k, char l>
14 {
17
18 template <int Current_Dim0, int Current_Dim1>
19 typename promote<T, U>::V
20 eval(const int N1, const int N2, const Number<Current_Dim0> &,
21 const Number<Current_Dim1> &) const
22 {
23 return iterA(Current_Dim0 - 1, N1, Current_Dim1 - 1, N2)
24 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
27 }
28 template <int Current_Dim1>
29 typename promote<T, U>::V
30 eval(const int N1, const int N2, const Number<1> &,
31 const Number<Current_Dim1> &) const
32 {
33 return iterA(0, N1, Current_Dim1 - 1, N2) * iterB(0, Current_Dim1 - 1)
35 }
36 typename promote<T, U>::V eval(const int N1, const int N2,
37 const Number<1> &, const Number<1> &) const
38 {
39 return iterA(0, N1, 0, N2) * iterB(0, 0);
40 }
41
42 public:
46 : iterA(a), iterB(b)
47 {}
48 typename promote<T, U>::V operator()(const int N1, const int N2) const
49 {
50 return eval(N1, N2, Number<Dim>(), Number<Dim>());
51 }
52 };
53
54 template <class A, class B, class T, class U, int Dim, char i, char j,
55 char k, char l>
56 Tensor2_Expr<Ddg_times_Tensor2_symmetric_13<A, B, T, U, Dim, i, j, k, l>,
57 typename promote<T, U>::V, Dim, Dim, i, k>
60 {
61 using TensorExpr
64 TensorExpr(a, b));
65 }
66
67 /* B(j,l)*A(i,j,k,l) */
68
69 template <class A, class B, class T, class U, int Dim, char i, char j,
70 char k, char l>
71 Tensor2_Expr<Ddg_times_Tensor2_symmetric_13<A, B, T, U, Dim, i, j, k, l>,
72 typename promote<T, U>::V, Dim, Dim, i, k>
75 {
76 using TensorExpr
79 TensorExpr(a, b));
80 }
81
82 /* A(i,j,k,l)*B(i,j) */
83
84 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
85 char j, char k, char l>
87 {
90
91 template <int Current_Dim0, int Current_Dim1>
92 typename promote<T, U>::V
93 eval(const int N1, const int N2, const Number<Current_Dim0> &,
94 const Number<Current_Dim1> &) const
95 {
96 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N1, N2)
97 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
100 }
101 template <int Current_Dim1>
102 typename promote<T, U>::V
103 eval(const int N1, const int N2, const Number<1> &,
104 const Number<Current_Dim1> &) const
105 {
106 return iterA(0, Current_Dim1 - 1, N1, N2) * iterB(0, Current_Dim1 - 1)
108 }
109 typename promote<T, U>::V eval(const int N1, const int N2,
110 const Number<1> &, const Number<1> &) const
111 {
112 return iterA(0, 0, N1, N2) * iterB(0, 0);
113 }
114
115 public:
119 : iterA(a), iterB(b)
120 {}
121 typename promote<T, U>::V operator()(const int N1, const int N2) const
122 {
123 return eval(N1, N2, Number<Dim01>(), Number<Dim01>());
124 }
125 };
126
127 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
128 char j, char k, char l>
129 Tensor2_symmetric_Expr<
130 Ddg_times_Tensor2_symmetric_01<A, B, T, U, Dim01, Dim23, i, j, k, l>,
131 typename promote<T, U>::V, Dim23, k, l>
134 {
135 using TensorExpr
138 k, l>(TensorExpr(a, b));
139 }
140
141 /* B(i,j)*A(i,j,k,l) */
142
143 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
144 char j, char k, char l>
145 Tensor2_symmetric_Expr<
146 Ddg_times_Tensor2_symmetric_01<A, B, T, U, Dim01, Dim23, i, j, k, l>,
147 typename promote<T, U>::V, Dim23, k, l>
150 {
151 using TensorExpr
154 k, l>(TensorExpr(a, b));
155 }
156
157 /* A(i,j,k,l)*B(k,l) */
158
159 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
160 char j, char k, char l>
162 {
165
166 template <int Current_Dim0, int Current_Dim1>
167 typename promote<T, U>::V
168 eval(const int N1, const int N2, const Number<Current_Dim0> &,
169 const Number<Current_Dim1> &) const
170 {
171 return iterA(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1)
172 * iterB(Current_Dim0 - 1, Current_Dim1 - 1)
175 }
176 template <int Current_Dim1>
177 typename promote<T, U>::V
178 eval(const int N1, const int N2, const Number<1> &,
179 const Number<Current_Dim1> &) const
180 {
181 return iterA(N1, N2, 0, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1)
183 }
184 typename promote<T, U>::V eval(const int N1, const int N2,
185 const Number<1> &, const Number<1> &) const
186 {
187 return iterA(N1, N2, 0, 0) * iterB(0, 0);
188 }
189
190 public:
194 : iterA(a), iterB(b)
195 {}
196 typename promote<T, U>::V operator()(const int N1, const int N2) const
197 {
198 return eval(N1, N2, Number<Dim23>(), Number<Dim23>());
199 }
200 };
201
202 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
203 char j, char k, char l>
204 Tensor2_symmetric_Expr<
205 Ddg_times_Tensor2_symmetric_23<A, B, T, U, Dim01, Dim23, i, j, k, l>,
206 typename promote<T, U>::V, Dim01, i, j>
209 {
210 using TensorExpr
213 i, j>(TensorExpr(a, b));
214 }
215
216 /* B(k,l)*A(i,j,k,l) */
217
218 template <class A, class B, class T, class U, int Dim01, int Dim23, char i,
219 char j, char k, char l>
220 Tensor2_symmetric_Expr<
221 Ddg_times_Tensor2_symmetric_23<A, B, T, U, Dim01, Dim23, i, j, k, l>,
222 typename promote<T, U>::V, Dim01, i, j>
225 {
226 using TensorExpr
229 i, j>(TensorExpr(a, b));
230 }
231}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
Tensor2_symmetric_Expr< B, U, Dim01, i, j > iterB
promote< T, U >::V operator()(const int N1, const int N2) const
Ddg_times_Tensor2_symmetric_01(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim01, i, j > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
Tensor2_symmetric_Expr< B, U, Dim, j, l > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Ddg_times_Tensor2_symmetric_13(const Ddg_Expr< A, T, Dim, Dim, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim, j, l > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V operator()(const int N1, const int N2) const
Ddg_Expr< A, T, Dim, Dim, i, j, k, l > iterA
Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< Current_Dim1 > &) const
Tensor2_symmetric_Expr< B, U, Dim23, k, l > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &, const Number< 1 > &) const
Ddg_times_Tensor2_symmetric_23(const Ddg_Expr< A, T, Dim01, Dim23, i, j, k, l > &a, const Tensor2_symmetric_Expr< B, U, Dim23, k, l > &b)
promote< T, U >::V operator()(const int N1, const int N2) 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