v0.14.0
Loading...
Searching...
No Matches
Dg_times_Tensor1.hpp
Go to the documentation of this file.
1/* This file has all of the declarations for expressions like
2 Dg*Tensor1 and Tensor1*Dg, yielding a
3 Tensor2_symmetric or Tensor2. */
4
5#pragma once
6
7namespace FTensor
8{
9 /* A(i,j,k)*B(k)->Tensor2_symmetric */
10
11 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
12 char j, char k>
14 {
17
18 template <int Current_Dim>
19 typename promote<T, U>::V
20 eval(const int N1, const int N2, const Number<Current_Dim> &) const
21 {
22 return iterA(N1, N2, Current_Dim - 1) * iterB(Current_Dim - 1)
24 }
25 typename promote<T, U>::V
26 eval(const int N1, const int N2, const Number<1> &) const
27 {
28 return iterA(N1, N2, 0) * iterB(0);
29 }
30
31 public:
34 : iterA(a), iterB(b)
35 {}
36 typename promote<T, U>::V operator()(const int N1, const int N2) const
37 {
38 return eval(N1, N2, Number<Dim2>());
39 }
40 };
41
42 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
43 char j, char k>
44 Tensor2_symmetric_Expr<Dg_times_Tensor1_2<A, B, T, U, Dim01, Dim2, i, j, k>,
45 typename promote<T, U>::V, Dim01, i, j>
48 {
51 i, j>(TensorExpr(a, b));
52 }
53
54 /* B(k)*A(i,j,k)->Tensor2_symmetric */
55
56 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
57 char j, char k>
58 Tensor2_symmetric_Expr<Dg_times_Tensor1_2<A, B, T, U, Dim01, Dim2, i, j, k>,
59 typename promote<T, U>::V, Dim01, i, j>
62 {
65 i, j>(TensorExpr(a, b));
66 }
67
68 /* A(i,k,j)*B(k)->Tensor2 */
69
70 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
71 char j, char k>
73 {
76
77 template <int Current_Dim>
78 typename promote<T, U>::V
79 eval(const int N1, const int N2, const Number<Current_Dim> &) const
80 {
81 return iterA(N1, Current_Dim - 1, N2) * iterB(Current_Dim - 1)
83 }
84 typename promote<T, U>::V
85 eval(const int N1, const int N2, const Number<1> &) const
86 {
87 return iterA(N1, 0, N2) * iterB(0);
88 }
89
90 public:
93 : iterA(a), iterB(b)
94 {}
95 typename promote<T, U>::V operator()(const int N1, const int N2) const
96 {
97 return eval(N1, N2, Number<Dim01>());
98 }
99 };
100
101 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
102 char j, char k>
103 Tensor2_Expr<Dg_times_Tensor1_1<A, B, T, U, Dim01, Dim2, i, j, k>,
104 typename promote<T, U>::V, Dim01, Dim2, i, j>
107 {
110 j>(TensorExpr(a, b));
111 }
112
113 /* B(k)*A(i,k,j)->Tensor2 */
114
115 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
116 char j, char k>
117 Tensor2_Expr<Dg_times_Tensor1_1<A, B, T, U, Dim01, Dim2, i, j, k>,
118 typename promote<T, U>::V, Dim01, Dim2, i, j>
121 {
124 j>(TensorExpr(a, b));
125 }
126
127 /* A(k,i,j)*B(k)->Tensor2 */
128
129 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
130 char j, char k>
132 {
135
136 template <int Current_Dim>
137 typename promote<T, U>::V
138 eval(const int N1, const int N2, const Number<Current_Dim> &) const
139 {
140 return iterA(N1, Current_Dim - 1, N2) * iterB(Current_Dim - 1)
142 }
143 typename promote<T, U>::V
144 eval(const int N1, const int N2, const Number<1> &) const
145 {
146 return iterA(N1, 0, N2) * iterB(0);
147 }
148
149 public:
152 : iterA(a), iterB(b)
153 {}
154 typename promote<T, U>::V operator()(const int N1, const int N2) const
155 {
156 return eval(N1, N2, Number<Dim01>());
157 }
158 };
159
160 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
161 char j, char k>
162 Tensor2_Expr<Dg_times_Tensor1_0<A, B, T, U, Dim01, Dim2, i, j, k>,
163 typename promote<T, U>::V, Dim01, Dim2, i, j>
166 {
169 j>(TensorExpr(a, b));
170 }
171
172 /* B(k)*A(k,i,j)->Tensor2 */
173
174 template <class A, class B, class T, class U, int Dim01, int Dim2, char i,
175 char j, char k>
176 Tensor2_Expr<Dg_times_Tensor1_0<A, B, T, U, Dim01, Dim2, i, j, k>,
177 typename promote<T, U>::V, Dim01, Dim2, i, j>
180 {
183 j>(TensorExpr(a, b));
184 }
185}
static Number< 2 > N2
static Number< 1 > N1
constexpr double a
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim > &) const
Dg_times_Tensor1_0(const Dg_Expr< A, T, Dim01, Dim2, k, i, j > &a, const Tensor1_Expr< B, U, Dim01, k > &b)
Dg_Expr< A, T, Dim01, Dim2, k, i, j > iterA
promote< T, U >::V operator()(const int N1, const int N2) const
Tensor1_Expr< B, U, Dim01, k > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &) const
Dg_times_Tensor1_1(const Dg_Expr< A, T, Dim01, Dim2, i, k, j > &a, const Tensor1_Expr< B, U, Dim01, k > &b)
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &) const
Tensor1_Expr< B, U, Dim01, k > iterB
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim > &) const
promote< T, U >::V operator()(const int N1, const int N2) const
Dg_Expr< A, T, Dim01, Dim2, i, k, j > iterA
Dg_times_Tensor1_2(const Dg_Expr< A, T, Dim01, Dim2, i, j, k > &a, const Tensor1_Expr< B, U, Dim2, k > &b)
promote< T, U >::V operator()(const int N1, const int N2) const
promote< T, U >::V eval(const int N1, const int N2, const Number< Current_Dim > &) const
Dg_Expr< A, T, Dim01, Dim2, i, j, k > iterA
promote< T, U >::V eval(const int N1, const int N2, const Number< 1 > &) const
Tensor1_Expr< B, U, Dim2, k > iterB
FTensor::Index< 'i', SPACE_DIM > i
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