42
42
namespace rheolef {
48
49
typedef size_t size_type;
49
typedef Float element_type;
50
typedef T element_type;
53
tensor (const Float& init_val = 0);
54
tensor (Float x[3][3]);
55
tensor (const tensor& a);
54
tensor_basic (const T& init_val = 0);
55
tensor_basic (T x[3][3]);
56
tensor_basic (const tensor_basic<T>& a);
59
tensor& operator = (const tensor& a);
60
tensor& operator = (const Float& val);
60
tensor_basic<T>& operator = (const tensor_basic<T>& a);
61
tensor_basic<T>& operator = (const T& val);
64
void fill (const Float& init_val);
65
void fill (const T& init_val);
66
void set_row (const point& r, size_t i, size_t d = 3);
67
void set_column (const point& c, size_t j, size_t d = 3);
67
void set_row (const point_basic<T>& r, size_t i, size_t d = 3);
68
void set_column (const point_basic<T>& c, size_t j, size_t d = 3);
71
Float& operator()(size_type i, size_type j);
72
Float operator()(size_type i, size_type j) const;
73
point row(size_type i) const;
74
point col(size_type i) const;
72
T& operator()(size_type i, size_type j);
73
T operator()(size_type i, size_type j) const;
74
point_basic<T> row(size_type i) const;
75
point_basic<T> col(size_type i) const;
75
76
size_t nrow() const; // = 3, for template matrix compatibility
76
77
size_t ncol() const;
80
friend std::istream& operator >> (std::istream& in, tensor& a);
81
friend std::ostream& operator << (std::ostream& out, const tensor& a);
82
81
std::ostream& put (std::ostream& s, size_type d = 3) const;
82
std::istream& get (std::istream&);
86
friend bool operator == (const tensor&, const tensor&);
87
friend tensor operator - (const tensor&);
88
friend tensor operator + (const tensor&, const tensor&);
89
friend tensor operator - (const tensor&, const tensor&);
90
friend tensor operator * (Float, const tensor&);
91
friend tensor operator * (const tensor& a, Float k);
92
friend tensor operator / (const tensor& a, Float k);
93
friend point operator * (const tensor& a, const point& x);
94
friend point operator * (const point& yt, const tensor& a);
95
point trans_mult (const point& x) const;
96
friend tensor trans (const tensor& a, size_type d = 3);
97
friend tensor operator * (const tensor& a, const tensor& b);
98
friend tensor inv (const tensor& a, size_type d = 3);
99
friend tensor diag (const point& d);
100
friend tensor identity (size_t d=3);
101
friend tensor dyadic (const point& u, const point& v, size_t d=3);
86
bool operator== (const tensor_basic<T>&) const;
87
bool operator!= (const tensor_basic<T>& b) const { return ! operator== (b); }
89
friend tensor_basic<U> operator- (const tensor_basic<U>&);
91
friend tensor_basic<U> operator+ (const tensor_basic<U>&, const tensor_basic<U>&);
93
friend tensor_basic<U> operator- (const tensor_basic<U>&, const tensor_basic<U>&);
95
friend tensor_basic<U> operator* (int k, const tensor_basic<U>& a);
97
friend tensor_basic<U> operator* (const U& k, const tensor_basic<U>& a);
99
friend tensor_basic<U> operator* (const tensor_basic<U>& a, int k);
101
friend tensor_basic<U> operator* (const tensor_basic<U>& a, const U& k);
103
friend tensor_basic<U> operator/ (const tensor_basic<U>& a, int k);
105
friend tensor_basic<U> operator/ (const tensor_basic<U>& a, const U& k);
107
friend point_basic<U> operator* (const tensor_basic<U>&, const point_basic<U>&);
109
friend point_basic<U> operator* (const point_basic<U>& yt, const tensor_basic<U>& a);
110
point_basic<T> trans_mult (const point_basic<T>& x) const;
112
friend tensor_basic<U> trans (const tensor_basic<U>& a, size_t d = 3);
114
friend tensor_basic<U> operator* (const tensor_basic<U>& a, const tensor_basic<U>& b);
116
friend void prod (const tensor_basic<U>& a, const tensor_basic<U>& b, tensor_basic<U>& result,
117
size_t di=3, size_t dj=3, size_t dk=3);
119
friend tensor_basic<U> inv (const tensor_basic<U>& a, size_t d = 3);
121
friend tensor_basic<U> diag (const point_basic<U>& d);
123
friend tensor_basic<U> identity (size_t d=3);
125
friend tensor_basic<U> dyadic (const point_basic<U>& u, const point_basic<U>& v, size_t d=3);
103
127
// metric and geometric transformations:
105
friend Float dotdot (const tensor&, const tensor&);
106
friend Float norm2 (const tensor& a) { return dotdot(a,a); }
107
friend Float dist2 (const tensor& a, const tensor& b) { return norm2(a-b); }
108
friend Float norm (const tensor& a) { return ::sqrt(norm2(a)); }
109
friend Float dist (const tensor& a, const tensor& b) { return norm(a-b); }
110
Float determinant (size_type d = 3) const;
111
friend Float determinant (const tensor& A, size_t d = 3);
112
friend bool invert_3x3 (const tensor& A, tensor& result);
130
friend U dotdot (const tensor_basic<U>&, const tensor_basic<U>&);
132
friend U norm2 (const tensor_basic<U>& a) { return dotdot(a,a); }
134
friend U dist2 (const tensor_basic<U>& a, const tensor_basic<U>& b) { return norm2(a-b); }
136
friend U norm (const tensor_basic<U>& a) { return ::sqrt(norm2(a)); }
138
friend U dist (const tensor_basic<U>& a, const tensor_basic<U>& b) { return norm(a-b); }
139
T determinant (size_type d = 3) const;
141
friend U determinant (const tensor_basic<U>& A, size_t d = 3);
143
friend bool invert_3x3 (const tensor_basic<U>& A, tensor_basic<U>& result);
115
146
// eigenvalues & eigenvectors:
128
159
// v=(v1,v2,v3) are right pseudo-eigenvectors in rows (othonormal matrix)
129
160
// and s=(s1,s2,s3) are eigenvalues, sorted in decreasing order s1 >= s2 >= s3
131
point svd (tensor& u, tensor& v, size_t dim = 3) const;
162
point_basic<T> svd (tensor_basic<T>& u, tensor_basic<T>& v, size_t dim = 3) const;
136
std::istream& get (std::istream&);
167
typedef tensor_basic<Float> tensor;
172
std::istream& operator>> (std::istream& in, tensor_basic<T>& a)
178
std::ostream& operator<< (std::ostream& out, const tensor_basic<T>& a)
138
182
// t = a otimes b
139
tensor otimes (const point& a, const point& b, size_t na = 3);
184
tensor_basic<T> otimes (const point_basic<T>& a, const point_basic<T>& b, size_t na = 3);
140
185
// t += a otimes b
141
void cumul_otimes (tensor& t, const point& a, const point& b, size_t na = 3);
142
void cumul_otimes (tensor& t, const point& a, const point& b, size_t na, size_t nb);
187
void cumul_otimes (tensor_basic<T>& t, const point_basic<T>& a, const point_basic<T>& b, size_t na = 3);
189
void cumul_otimes (tensor_basic<T>& t, const point_basic<T>& a, const point_basic<T>& b, size_t na, size_t nb);
145
192
// -----------------------------------------------------------------------
147
194
// -----------------------------------------------------------------------
151
tensor::fill (const Float& init_val)
199
tensor_basic<T>::fill (const T& init_val)
153
201
for (size_type i = 0; i < 3; i++) for (size_type j = 0; j < 3; j++)
154
202
_x[i][j] = init_val;
207
tensor_basic<T>::reset ()
163
tensor::tensor (const Float& init_val)
213
tensor_basic<T>::tensor_basic (const T& init_val)
168
tensor::tensor (Float x[3][3])
219
tensor_basic<T>::tensor_basic (T x[3][3])
170
221
for (size_type i = 0; i < 3; i++) for (size_type j = 0; j < 3; j++)
171
222
_x[i][j] = x[i][j];
174
tensor::tensor (const tensor& a)
226
tensor_basic<T>::tensor_basic (const tensor_basic<T>& a)
176
228
for (size_type i = 0; i < 3; i++) for (size_type j = 0; j < 3; j++)
177
229
_x[i][j] = a._x[i][j];
181
tensor::operator = (const tensor& a)
234
tensor_basic<T>::operator= (const tensor_basic<T>& a)
183
236
for (size_type i = 0; i < 3; i++) for (size_type j = 0; j < 3; j++)
184
237
_x[i][j] = a._x[i][j];
189
tensor::operator = (const Float& val)
243
tensor_basic<T>::operator= (const T& val)
191
245
for (size_type i = 0; i < 3; i++) for (size_type j = 0; j < 3; j++)
209
tensor::operator()(size_type i, size_type j)
215
tensor::operator()(size_type i, size_type j) const
220
std::istream& operator >> (std::istream& in, tensor& a)
225
std::ostream& operator << (std::ostream& out, const tensor& a)
231
operator * (const tensor& a, Float k)
252
tensor_basic<T>::nrow() const
259
tensor_basic<T>::ncol() const
266
tensor_basic<T>::operator()(size_type i, size_type j)
273
tensor_basic<T>::operator()(size_type i, size_type j) const
280
operator* (int k, const tensor_basic<T>& a)
287
operator* (const tensor_basic<T>& a, int k)
294
operator* (const tensor_basic<T>& a, const T& k)
237
operator / (const tensor& a, Float k)
301
operator/ (const tensor_basic<T>& a, int k)
308
operator/ (const tensor_basic<T>& a, const T& k)
243
tensor::trans_mult (const point& x) const
315
tensor_basic<T>::trans_mult (const point_basic<T>& x) const
245
317
return x*(*this);
249
cumul_otimes (tensor& t, const point& a, const point& b, size_t n)
322
cumul_otimes (tensor_basic<T>& t, const point_basic<T>& a, const point_basic<T>& b, size_t n)
251
324
cumul_otimes (t, a, b, n, n);
255
otimes (const point& a, const point& b, size_t n)
329
otimes (const point_basic<T>& a, const point_basic<T>& b, size_t n)
258
332
cumul_otimes (t, a, b, n, n);
263
determinant (const tensor& A, size_t d)
338
determinant (const tensor_basic<T>& A, size_t d)
265
340
return A.determinant (d);
269
diag (const point& d)
345
diag (const point_basic<T>& d)
279
356
identity (size_t d)
282
359
for (size_t i = 0; i < d; i++) a(i,i) = 1;
287
dyadic (const point& u, const point& v, size_t d)
365
dyadic (const point_basic<T>& u, const point_basic<T>& v, size_t d)
290
368
for (size_t i = 0; i < d; i++)
291
369
for (size_t j = 0; j < d; j++)
292
370
a(i,j) = u[i]*v[j];
297
tensor::set_column (const point& c, size_t j, size_t d)
376
tensor_basic<T>::set_column (const point_basic<T>& c, size_t j, size_t d)
299
378
for (size_t i = 0; i < d; i++)
300
379
operator()(i,j) = c[i];
304
tensor::set_row (const point& r, size_t i, size_t d)
384
tensor_basic<T>::set_row (const point_basic<T>& r, size_t i, size_t d)
306
386
for (size_t j = 0; j < d; j++)
307
387
operator()(i,j) = r[j];