v0.14.0
Loading...
Searching...
No Matches
Ddg_times_Tensor4.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Ddg*Tensor4 and Tensor4*Ddg, yielding a
3 Tensor4. */
4
5#pragma once
6
7namespace FTensor {
8
9/* S(i,j,m,n)*A(m,n,k,l) */
10
11template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
12 int Dim3, char i, char j, char k, char l, char m, char n>
16
17 template <int Current_Dim0, int Current_Dim1>
18 inline typename promote<T, U>::V
19 eval(const int N1, const int N2, const int N3, const int N4,
20 const Number<Current_Dim0> &, const Number<Current_Dim1> &) const {
21 return iterA(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1) *
22 iterB(Current_Dim0 - 1, Current_Dim1 - 1, N3, N4) +
25 }
26 template <int Current_Dim1>
27 inline typename promote<T, U>::V
28 eval(const int N1, const int N2, const int N3, const int N4,
29 const Number<1> &, const Number<Current_Dim1> &) const {
30 return iterA(N1, N2, 0, Current_Dim1 - 1) *
31 iterB(0, Current_Dim1 - 1, N3, N4) +
33 }
34 inline typename promote<T, U>::V eval(const int N1, const int N2,
35 const int N3, const int N4,
36 const Number<1> &,
37 const Number<1> &) const {
38 return iterA(N1, N2, 0, 0) * iterB(0, 0, N3, N4);
39 }
40
41public:
45 : iterA(a), iterB(b) {}
46 typename promote<T, U>::V operator()(const int N1, const int N2, const int N3,
47 const int N4) const {
48 return eval(N1, N2, N3, N4, Number<Dim23>(), Number<Dim23>());
49 }
50};
51
52template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
53 int Dim3, char i, char j, char k, char l, char m, char n>
54Tensor4_Expr<Ddg_times_Tensor4_2301_ijkl<A, B, T, U, Dim01, Dim23, Dim2, Dim3, i, j,
55 k, l, m, n>,
56 typename promote<T, U>::V, Dim01, Dim01, Dim2, Dim3, i, j, k, l>
59 using TensorExpr = Ddg_times_Tensor4_2301_ijkl<A, B, T, U, Dim01, Dim23, Dim2,
60 Dim3, i, j, k, l, m, n>;
62 Dim3, i, j, k, l>(TensorExpr(a, b));
63}
64
65/* A(m,n,k,l)*S(i,j,m,n) */
66
67template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim2,
68 int Dim3, char i, char j, char k, char l, char m, char n>
69Tensor4_Expr<Ddg_times_Tensor4_2301_ijkl<A, B, T, U, Dim01, Dim23, Dim2, Dim3, i, j,
70 k, l, m, n>,
71 typename promote<T, U>::V, Dim01, Dim01, Dim2, Dim3, i, j, k, l>
74 using TensorExpr = Ddg_times_Tensor4_2301_ijkl<A, B, T, U, Dim01, Dim23, Dim2,
75 Dim3, i, j, k, l, m, n>;
77 Dim3, i, j, k, l>(TensorExpr(a, b));
78}
79
80/* S(m,n,k,l)*A(i,j,m,n) */
81/* A(i,j,m,n)*S(m,n,k,l) */
82
83template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim0,
84 int Dim1, char i, char j, char k, char l, char m, char n>
88
89 template <int Current_Dim0, int Current_Dim1>
90 inline typename promote<T, U>::V
91 eval(const int N1, const int N2, const int N3, const int N4,
92 const Number<Current_Dim0> &, const Number<Current_Dim1> &) const {
93 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N3, N4) *
94 iterB(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1) +
97 }
98 template <int Current_Dim1>
99 inline typename promote<T, U>::V
100 eval(const int N1, const int N2, const int N3, const int N4,
101 const Number<1> &, const Number<Current_Dim1> &) const {
102 return iterA(0, Current_Dim1 - 1, N3, N4) *
103 iterB(N1, N2, 0, Current_Dim1 - 1) +
105 }
106 inline typename promote<T, U>::V eval(const int N1, const int N2,
107 const int N3, const int N4,
108 const Number<1> &,
109 const Number<1> &) const {
110 return iterA(0, 0, N3, N4) * iterB(N1, N2, 0, 0);
111 }
112
113public:
117 : iterA(a), iterB(b) {}
118 typename promote<T, U>::V operator()(const int N1, const int N2, const int N3,
119 const int N4) const {
120 return eval(N1, N2, N3, N4, Number<Dim01>(), Number<Dim01>());
121 }
122};
123
124/* S(k,l,m,n)*A(i,j,m,n) */
125
126template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim0,
127 int Dim1, char i, char j, char k, char l, char m, char n>
128Tensor4_Expr<Ddg_times_Tensor4_2323_klij<A, B, T, U, Dim01, Dim23, Dim0, Dim1,
129 i, j, k, l, m, n>,
130 typename promote<T, U>::V, Dim0, Dim1, Dim23, Dim23, i, j, k, l>
133 using TensorExpr = Ddg_times_Tensor4_2323_klij<A, B, T, U, Dim01, Dim23, Dim0,
134 Dim1, i, j, k, l, m, n>;
136 Dim23, i, j, k, l>(TensorExpr(a, b));
137}
138
139/* A(i,j,m,n)*S(k,l,m,n) */
140
141template <class A, class B, class T, class U, int Dim01, int Dim23, int Dim0,
142 int Dim1, char i, char j, char k, char l, char m, char n>
143Tensor4_Expr<Ddg_times_Tensor4_2323_klij<A, B, T, U, Dim01, Dim23, Dim0, Dim1,
144 i, j, k, l, m, n>,
145 typename promote<T, U>::V, Dim0, Dim1, Dim23, Dim23, i, j, k, l>
148 using TensorExpr = Ddg_times_Tensor4_2323_klij<A, B, T, U, Dim01, Dim23, Dim0,
149 Dim1, i, j, k, l, m, n>;
151 Dim23, i, j, k, l>(TensorExpr(a, b));
152}
153
154} // namespace FTensor
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
Ddg_times_Tensor4_2301_ijkl(const Ddg_Expr< A, T, Dim01, Dim23, i, j, m, n > &a, const Tensor4_Expr< B, U, Dim23, Dim23, Dim2, Dim3, m, n, k, l > &b)
Tensor4_Expr< B, U, Dim23, Dim23, Dim2, Dim3, m, n, k, l > iterB
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
Ddg_Expr< A, T, Dim01, Dim23, i, j, m, n > iterA
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 operator()(const int N1, const int N2, const int N3, const int N4) const
Ddg_Expr< A, T, Dim01, Dim23, m, n, k, l > iterA
promote< T, U >::V operator()(const int N1, const int N2, const int N3, const int N4) 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
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
Tensor4_Expr< B, U, Dim0, Dim1, Dim23, Dim23, i, j, m, n > iterB
Ddg_times_Tensor4_2323_klij(const Ddg_Expr< A, T, Dim01, Dim23, m, n, k, l > &a, const Tensor4_Expr< B, U, Dim0, Dim1, Dim23, Dim23, i, j, m, n > &b)
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
FTensor::Index< 'n', SPACE_DIM > n
FTensor::Index< 'm', SPACE_DIM > m
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