.\" .de Id .. .de Sp .if n .sp .if t .sp 0.4 .. .TH tensor 2rheolef "rheolef-6.5" "rheolef-6.5" "rheolef-6.5" .\" label: /*Class:tensor .SH NAME \fBtensor\fP - a N*N tensor, N=1,2,3 .\" skip: @cindex tensor .\" skip: @clindex tensor .\" skip: @clindex point .\" skip: @clindex field .SH SYNOPSYS The \fBtensor\fP class defines a 3*3 tensor, as the value of a tensorial valued field. Basic algebra with scalars, vectors of R^3 (i.e. the \fBpoint\fP class) and \fBtensor\fP objects are supported. .\" skip start:AUTHOR: .\" skip start:DATE: .\" END .SH IMPLEMENTATION .\" begin_example .Sp .nf template class tensor_basic { public: typedef size_t size_type; typedef T element_type; typedef T float_type; // allocators: tensor_basic (const T& init_val = 0); tensor_basic (T x[3][3]); tensor_basic (const tensor_basic& a); static tensor_basic eye (size_type d = 3); #ifdef _RHEOLEF_HAVE_STD_INITIALIZER_LIST tensor_basic (const std::initializer_list >& il); #endif // _RHEOLEF_HAVE_STD_INITIALIZER_LIST // affectation: tensor_basic& operator = (const tensor_basic& a); tensor_basic& operator = (const T& val); // modifiers: void fill (const T& init_val); void reset (); void set_row (const point_basic& r, size_t i, size_t d = 3); void set_column (const point_basic& c, size_t j, size_t d = 3); // accessors: T& operator()(size_type i, size_type j); T operator()(size_type i, size_type j) const; point_basic row(size_type i) const; point_basic col(size_type i) const; size_t nrow() const; // = 3, for template matrix compatibility size_t ncol() const; // inputs/outputs: std::ostream& put (std::ostream& s, size_type d = 3) const; std::istream& get (std::istream&); // algebra: bool operator== (const tensor_basic&) const; bool operator!= (const tensor_basic& b) const { return ! operator== (b); } template friend tensor_basic operator- (const tensor_basic&); template friend tensor_basic operator+ (const tensor_basic&, const tensor_basic&); template friend tensor_basic operator- (const tensor_basic&, const tensor_basic&); template friend tensor_basic operator* (int k, const tensor_basic& a); template friend tensor_basic operator* (const U& k, const tensor_basic& a); template friend tensor_basic operator* (const tensor_basic& a, int k); template friend tensor_basic operator* (const tensor_basic& a, const U& k); template friend tensor_basic operator/ (const tensor_basic& a, int k); template friend tensor_basic operator/ (const tensor_basic& a, const U& k); template friend point_basic operator* (const tensor_basic&, const point_basic&); template friend point_basic operator* (const point_basic& yt, const tensor_basic& a); point_basic trans_mult (const point_basic& x) const; template friend tensor_basic trans (const tensor_basic& a, size_t d = 3); template friend tensor_basic operator* (const tensor_basic& a, const tensor_basic& b); template friend void prod (const tensor_basic& a, const tensor_basic& b, tensor_basic& result, size_t di=3, size_t dj=3, size_t dk=3); // tr(a) = a00 + a11 + a22 template friend U tr (const tensor_basic& a, size_t d=3); // a = u otimes v <==> aij = ui*vj template friend tensor_basic otimes (const point_basic& u, const point_basic& v, size_t d=3); template friend tensor_basic inv (const tensor_basic& a, size_t d = 3); template friend tensor_basic diag (const point_basic& d); template friend point_basic diag (const tensor_basic& a); // metric and geometric transformations: template friend U ddot (const tensor_basic&, const tensor_basic&); T determinant (size_type d = 3) const; template friend U determinant (const tensor_basic& A, size_t d = 3); template friend bool invert_3x3 (const tensor_basic& A, tensor_basic& result); // spectral: // eigenvalues & eigenvectors: // a = q*d*q^T // a may be symmetric // where q=(q1,q2,q3) are eigenvectors in rows (othonormal matrix) // and d=(d1,d2,d3) are eigenvalues, sorted in decreasing order d1 >= d2 >= d3 // return d point_basic eig (tensor_basic& q, size_t dim = 3) const; point_basic eig (size_t dim = 3) const; // singular value decomposition: // a = u*s*v^T // a can be unsymmetric // where u=(u1,u2,u3) are left pseudo-eigenvectors in rows (othonormal matrix) // v=(v1,v2,v3) are right pseudo-eigenvectors in rows (othonormal matrix) // and s=(s1,s2,s3) are eigenvalues, sorted in decreasing order s1 >= s2 >= s3 // return s point_basic svd (tensor_basic& u, tensor_basic& v, size_t dim = 3) const; // data: T _x[3][3]; }; typedef tensor_basic tensor; // nonlinear algebra: template tensor_basic exp (const tensor_basic& a, size_t d = 3); // inputs/outputs: template inline std::istream& operator>> (std::istream& in, tensor_basic& a) { return a.get (in); } template inline std::ostream& operator<< (std::ostream& out, const tensor_basic& a) { return a.put (out); } // t += a otimes b template void cumul_otimes (tensor_basic& t, const point_basic& a, const point_basic& b, size_t na = 3); template void cumul_otimes (tensor_basic& t, const point_basic& a, const point_basic& b, size_t na, size_t nb); .Sp .fi .\" end_example