v0.16.0
Loading...
Searching...
No Matches
Tensor2_Expr.hpp
Go to the documentation of this file.
1/* Declares a wrapper class for rank 2 Tensor expressions. I
2 specialize it for when I wrap a simple Tensor2 or Tensor2_ptr so
3 that it has a reference to the Tensor2(_ptr) and not a copy.
4 Otherwise assignment wouldn't work. */
5
6#pragma once
7
17#include "Tensor2_transform.hpp"
18#include "conj_Tensor2.hpp"
19#include "minus_Tensor2.hpp"
20
21#include "../permute.hpp"
22
23namespace FTensor
24{
25 template <class A, class T, int Dim0, int Dim1, char i, char j>
27 {
29
30 public:
31 Tensor2_Expr(const A &a) : iter(a) {}
32 Tensor2_Expr(const Tensor2_Expr &) = default;
33 T operator()(const int N1, const int N2) const { return iter(N1, N2); }
34 };
35
36 template <class A, class T, int Tensor_Dim0, int Tensor_Dim1, int Dim0,
37 int Dim1, char i, char j>
38 class Tensor2_Expr<Tensor2<A, Tensor_Dim0, Tensor_Dim1>, T, Dim0, Dim1, i, j>
39 {
41
42 public:
44 Tensor2_Expr(const Tensor2_Expr &) = default;
45 T &operator()(const int N1, const int N2) { return iter(N1, N2); }
46 T operator()(const int N1, const int N2) const { return iter(N1, N2); }
47 T* ptr(const int N1, const int N2) const { return iter.ptr(N1, N2); }
48
49 /* Various assignment operators. I have to explicitly declare the
50 second operator= because otherwise the compiler will generate its
51 own and not use the template code. */
52
53 template <class B, class U, int Dim1_0, int Dim1_1, char i_1, char j_1>
55 {
56 for(int ii = 0; ii < Dim0; ++ii)
57 for(int jj = 0; jj < Dim1; ++jj)
58 {
59 iter(ii, jj) = permute(*this, rhs, ii, jj);
60 }
61 return *this;
62 }
63
64 template <class B, class U, int Dim1_0, int Dim1_1, char i_1, char j_1>
65 auto &
67 {
68 return equals(rhs);
69 }
70
72 Dim0, Dim1, i, j> &rhs)
73 {
74 return equals(rhs);
75 }
76
77 template <class B, class U, int Dim, char i_1, char j_1>
79 for (int ii = 0; ii != Dim; ++ii)
80 for (int jj = 0; jj != Dim; ++jj) {
81 iter(ii, jj) = rhs(ii, jj);
82 }
83 return *this;
84 }
85
86 template <class B, class U, int Dim, char i_1, char j_1>
88 return equals(rhs);
89 }
90
91 template <class B, class U, int Dim1_0, int Dim1_1, char i_1, char j_1>
93 {
94 for(int ii = 0; ii < Dim0; ++ii)
95 for(int jj = 0; jj < Dim1; ++jj)
96 {
97 iter(ii, jj) += permute(*this, rhs, ii, jj);
98 }
99 return *this;
100 }
101
102 template <class B, class U, int Dim1_0, int Dim1_1, char i_1, char j_1>
104 {
105 for(int ii = 0; ii < Dim0; ++ii)
106 for(int jj = 0; jj < Dim1; ++jj)
107 {
108 iter(ii, jj) -= permute(*this, rhs, ii, jj);
109 }
110 return *this;
111 }
112
113 template <class B, class U, int Dim, char i_1, char j_1>
115 for (int ii = 0; ii != Dim; ++ii)
116 for (int jj = 0; jj != Dim; ++jj) {
117 iter(ii, jj) += rhs(ii, jj);
118 }
119 return *this;
120 }
121
122 template <class B, class U, int Dim, char i_1, char j_1>
124 for (int ii = 0; ii != Dim; ++ii)
125 for (int jj = 0; jj != Dim; ++jj) {
126 iter(ii, jj) -= rhs(ii, jj);
127 }
128 return *this;
129 }
130
131 /* This is for int's, double's, etc. */
132
133 template <class U> auto &operator=(const U &u)
134 {
135 for(int ii = 0; ii < Dim0; ++ii)
136 for(int jj = 0; jj < Dim1; ++jj)
137 {
138 iter(ii, jj) = u;
139 }
140 return *this;
141 }
142
143 template <class U> auto &operator+=(const U &u)
144 {
145 for(int ii = 0; ii < Dim0; ++ii)
146 for(int jj = 0; jj < Dim1; ++jj)
147 {
148 iter(ii, jj) += u;
149 }
150 return *this;
151 }
152
153 template <class U> auto &operator-=(const U &u)
154 {
155 for(int ii = 0; ii < Dim0; ++ii)
156 for(int jj = 0; jj < Dim1; ++jj)
157 {
158 iter(ii, jj) -= u;
159 }
160 return *this;
161 }
162
163 template <class U> auto &operator*=(const U &u)
164 {
165 for(int ii = 0; ii < Dim0; ++ii)
166 for(int jj = 0; jj < Dim1; ++jj)
167 {
168 iter(ii, jj) *= u;
169 }
170 return *this;
171 }
172
173 template <class U> auto &operator/=(const U &u)
174 {
175 for(int ii = 0; ii < Dim0; ++ii)
176 for(int jj = 0; jj < Dim1; ++jj)
177 {
178 iter(ii, jj) /= u;
179 }
180 return *this;
181 }
182
183 /* ADOL-C */
184
185 template <class B, class U, int Dim1_0, int Dim1_1, char i_1, char j_1>
187 {
188 for(int ii = 0; ii < Dim0; ++ii)
189 for(int jj = 0; jj < Dim1; ++jj)
190 {
191 iter(ii, jj) <<= permute(*this, rhs, ii, jj);
192 }
193 return *this;
194 }
195
196 template <class B, class U, int Dim1_0, int Dim1_1, char i_1, char j_1>
198 {
199 for(int ii = 0; ii < Dim0; ++ii)
200 for(int jj = 0; jj < Dim1; ++jj)
201 {
202 iter(ii, jj) >>= permute_ref(*this, rhs, ii, jj);
203 }
204 return *this;
205 }
206
207 };
208
209 /* Specialized for Dg_number_rhs_0 (Dg with the
210 first or second index explicitly given). */
211
212 template <class A, class T, int Dim0, int Dim1, char i, char j, int N>
213 class Tensor2_Expr<Dg_number_rhs_0<A, T, N>, T, Dim0, Dim1, i, j>
214 {
216
217 public:
219 T &operator()(const int N1, const int N2) { return iter(N, N1, N2); }
220 T operator()(const int N1, const int N2) const { return iter(N, N1, N2); }
221
222 /* Various assignment operators. I have to explicitly declare the
223 second operator= because otherwise the compiler will generate its
224 own and not use the template code. */
225
226 template <class B, class U, int Dim1_0, int Dim1_1, char i_1, char j_1>
228 {
229 for(int ii = 0; ii < Dim0; ++ii)
230 for(int jj = 0; jj < Dim1; ++jj)
231 {
232 iter(ii, jj) = permute(*this, rhs, ii, jj);
233 }
234 return *this;
235 }
236
238 const Tensor2_Expr<Dg_number_rhs_0<A, T, N>, T, Dim0, Dim1, i, j> &result)
239 {
240 return operator=<Dg_number_rhs_0<A, T, N>, T>(result);
241 }
242
243 };
244}
constexpr double a
auto & operator=(const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i_1, j_1 > &rhs)
auto & operator=(const Tensor2_Expr< Dg_number_rhs_0< A, T, N >, T, Dim0, Dim1, i, j > &result)
auto & operator+=(const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i_1, j_1 > &rhs)
auto & operator=(const Tensor2_Expr< Tensor2< A, Tensor_Dim0, Tensor_Dim1 >, T, Dim0, Dim1, i, j > &rhs)
auto & operator<<=(const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i_1, j_1 > &rhs)
auto & equals(const Tensor2_symmetric_Expr< B, U, Dim, i_1, j_1 > &rhs)
auto & operator=(const Tensor2_symmetric_Expr< B, U, Dim, i_1, j_1 > &rhs)
auto & operator>>=(const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i_1, j_1 > &rhs)
auto & operator=(const FTensor::Tensor2_Expr< B, U, Dim1_0, Dim1_1, i_1, j_1 > &rhs)
auto & operator+=(const Tensor2_symmetric_Expr< B, U, Dim, i_1, j_1 > &rhs)
auto & equals(const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i_1, j_1 > &rhs)
auto & operator-=(const Tensor2_symmetric_Expr< B, U, Dim, i_1, j_1 > &rhs)
auto & operator-=(const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i_1, j_1 > &rhs)
Tensor2_Expr(const Tensor2_Expr &)=default
T operator()(const int N1, const int N2) const
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
Tensors class implemented by Walter Landry.
Definition FTensor.hpp:51
U & permute_ref(const Tensor2_Expr< A, T, Dim0_0, Dim0_1, i0, j0 > &, const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i1, j1 > &rhs, const int N0, const int N1)
Definition permute.hpp:66
U permute(const Tensor2_Expr< A, T, Dim0_0, Dim0_1, i0, j0 > &, const Tensor2_Expr< B, U, Dim1_0, Dim1_1, i1, j1 > &rhs, const int N0, const int N1)
Definition permute.hpp:11
constexpr AssemblyType A
const int N
Definition speed_test.cpp:3