v0.14.0
Loading...
Searching...
No Matches
Tensor4_times_Dg_double.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Tensor4*Dg and Tensor3*Dg, yielding a
3 Tensor3. */
4
5#pragma once
6
7namespace FTensor {
8/* A(i,j,k,l)*B(k,l,m) */
9
10template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
11 int Dim3, int Dim4, char i, char j, char k, char l, char m>
15
16 template <int Current_Dim0, int Current_Dim1>
17 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
19 const Number<Current_Dim1> &) const {
20 return iterA(N1, N2, Current_Dim0 - 1, Current_Dim1 - 1) *
21 iterB(Current_Dim0 - 1, Current_Dim1 - 1, N3) +
23 }
24 template <int Current_Dim1>
25 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
26 const Number<1> &,
27 const Number<Current_Dim1> &) const {
28 return iterA(N1, N2, 0, Current_Dim1 - 1) * iterB(0, Current_Dim1 - 1, N3) +
30 }
31 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
32 const Number<1> &, const Number<1> &) const {
33 return iterA(N1, N2, 0, 0) * iterB(0, 0, N3);
34 }
35
36public:
37 typename promote<T, U>::V operator()(const int N1, const int N2,
38 const int N3) const {
39 return eval(N1, N2, N3, Number<Dim2>(), Number<Dim3>());
40 }
41
45 : iterA(a), iterB(b) {
46 static_assert(Dim2 == Dim3, "Dim2 and Dim3 should be equal");
47 }
48};
49
50template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
51 int Dim3, int Dim4, char i, char j, char k, char l, char m>
52inline Tensor3_Expr<const Tensor4_times_Dg_23<A, B, T, U, Dim0, Dim1, Dim2,
53 Dim3, Dim4, i, j, k, l, m>,
54 typename promote<T, U>::V, Dim0, Dim1, Dim4, i, j, m>
57 typedef const Tensor4_times_Dg_23<A, B, T, U, Dim0, Dim1, Dim2, Dim3, Dim4, i,
58 j, k, l, m>
59 TensorExpr;
61 i, j, m>(TensorExpr(a, b));
62}
63
64/* B(k,l,m) * A(i,j,k,l) */
65
66template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
67 int Dim3, int Dim4, char i, char j, char k, char l, char m>
68inline Tensor3_Expr<const Tensor4_times_Dg_23<A, B, T, U, Dim0, Dim1, Dim2,
69 Dim3, Dim4, i, j, k, l, m>,
70 typename promote<T, U>::V, Dim0, Dim1, Dim4, i, j, m>
73 typedef const Tensor4_times_Dg_23<A, B, T, U, Dim0, Dim1, Dim2, Dim3, Dim4, i,
74 j, k, l, m>
75 TensorExpr;
77 i, j, m>(TensorExpr(a, b));
78}
79
80/* A(i,j,k,l)*B(i,j,m) */
81
82template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
83 int Dim3, int Dim4, char i, char j, char k, char l, char m>
87
88 template <int Current_Dim0, int Current_Dim1>
89 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
91 const Number<Current_Dim1> &) const {
92 return iterA(Current_Dim0 - 1, Current_Dim1 - 1, N1, N2) *
93 iterB(Current_Dim0 - 1, Current_Dim1 - 1, N3) +
95 }
96 template <int Current_Dim1>
97 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
98 const Number<1> &,
99 const Number<Current_Dim1> &) const {
100 return iterA(0, Current_Dim1 - 1, N1, N2) * iterB(0, Current_Dim1 - 1, N3) +
102 }
103 typename promote<T, U>::V eval(const int N1, const int N2, const int N3,
104 const Number<1> &, const Number<1> &) const {
105 return iterA(0, 0, N1, N2) * iterB(0, 0, N3);
106 }
107
108public:
109 typename promote<T, U>::V operator()(const int N1, const int N2,
110 const int N3) const {
111 return eval(N1, N2, N3, Number<Dim0>(), Number<Dim1>());
112 }
113
117 : iterA(a), iterB(b) {
118 static_assert(Dim0 == Dim1, "Dim0 and Dim1 should be equal");
119 }
120};
121
122template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
123 int Dim3, int Dim4, char i, char j, char k, char l, char m>
124inline Tensor3_Expr<const Tensor4_times_Dg_01<A, B, T, U, Dim0, Dim1, Dim2,
125 Dim3, Dim4, i, j, k, l, m>,
126 typename promote<T, U>::V, Dim2, Dim3, Dim4, k, l, m>
129 typedef const Tensor4_times_Dg_01<A, B, T, U, Dim0, Dim1, Dim2, Dim3, Dim4, i,
130 j, k, l, m>
131 TensorExpr;
133 k, l, m>(TensorExpr(a, b));
134}
135
136/* B(i,j,m)*A(i,j,k,l) */
137
138template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim2,
139 int Dim3, int Dim4, char i, char j, char k, char l, char m>
140inline Tensor3_Expr<const Tensor4_times_Dg_01<A, B, T, U, Dim0, Dim1, Dim2,
141 Dim3, Dim4, i, j, k, l, m>,
142 typename promote<T, U>::V, Dim2, Dim3, Dim4, k, l, m>
145 typedef const Tensor4_times_Dg_01<A, B, T, U, Dim0, Dim1, Dim2, Dim3, Dim4, i,
146 j, k, l, m>
147 TensorExpr;
149 k, l, m>(TensorExpr(a, b));
150}
151
152} // namespace FTensor
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
promote< T, U >::V operator()(const int N1, const int N2, const int N3) const
Tensor4_times_Dg_01(const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > &a, const Dg_Expr< B, U, Dim0, Dim4, i, j, m > &b)
const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > iterA
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &, const Number< 1 > &) const
const Dg_Expr< B, U, Dim0, Dim4, i, j, m > iterB
const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > iterA
Tensor4_times_Dg_23(const Tensor4_Expr< A, T, Dim0, Dim1, Dim2, Dim3, i, j, k, l > &a, const Dg_Expr< B, U, Dim2, Dim4, k, l, m > &b)
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< Current_Dim0 > &, const Number< Current_Dim1 > &) const
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 Number< Current_Dim1 > &) const
const Dg_Expr< B, U, Dim2, Dim4, k, l, m > iterB
promote< T, U >::V eval(const int N1, const int N2, const int N3, const Number< 1 > &, const Number< 1 > &) const
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