1# ifndef _RHEOLEF_TENSOR_H
2# define _RHEOLEF_TENSOR_H
85#include "rheolef/point.h"
104 tensor_basic (
const std::initializer_list<std::initializer_list<T> >& il);
130 std::istream&
get (std::istream&);
193 size_t di=3,
size_t dj=3,
size_t dk=3);
233 return a.put (out); }
237void cumul_otimes (tensor_basic<T>& t,
const point_basic<T>& a,
const point_basic<T>& b,
size_t na = 3);
240void cumul_otimes (tensor_basic<T>& t,
const point_basic<T>& a,
const point_basic<T>& b,
size_t na,
size_t nb);
282 _x[i][j] = a._x[i][j];
286 typedef typename std::initializer_list<std::initializer_list<T> >::const_iterator
const_iterator;
287 typedef typename std::initializer_list<T>::const_iterator const_iterator_row;
289 check_macro (il.size() <= 3,
"unexpected initializer list size=" << il.size() <<
" > 3");
291 for (
const_iterator iter = il.begin(); iter != il.end(); ++iter, ++i) {
292 const std::initializer_list<T>&
row = *iter;
293 check_macro (
row.size() <= 3,
"unexpected initializer list size=" <<
row.size() <<
" > 3");
295 for (const_iterator_row jter =
row.begin(); jter !=
row.end(); ++jter, ++j) {
306 _x[i][j] = a._x[i][j];
346template <
class T,
class U>
350 details::is_rheolef_arithmetic<U>::value
392 return A.determinant (
d);
421 for (
size_t i = 0; i <
d; i++) sum += a(i,i);
429 for (
size_t i = 0; i <
d; i++)
430 operator()(i,j) = c[i];
437 for (
size_t j = 0; j <
d; j++)
438 operator()(i,j) = r[j];
446 for (
size_t i = 0; i <
d; i++)
469 return sqrt(
norm2(a));
483#ifdef _RHEOLEF_HAVE_MPI
485 namespace serialization {
486 template<
class Archive,
class T>
508 struct is_mpi_datatype<
rheolef::tensor_basic<double> > : mpl::true_ { };
std::ostream & put(std::ostream &s, size_type d=3) const
T & operator()(size_type i, size_type j)
tensor_basic< T > & operator=(const tensor_basic< T > &a)
std::istream & get(std::istream &)
point_basic< T > trans_mult(const point_basic< T > &x) const
tensor_basic< T > & operator+=(const tensor_basic< T > &)
static tensor_basic< T > eye(size_type d=3)
point_basic< T > col(size_type i) const
T determinant(size_type d=3) const
tensor_basic< T > & operator*=(const T &k)
tensor_basic(const std::initializer_list< std::initializer_list< T > > &il)
const T & operator()(size_type i, size_type j) const
tensor_basic< T > operator*(const tensor_basic< T > &b) const
tensor_basic(const tensor_basic< T > &a)
bool is_symmetric(size_type d=3) const
point_basic< T > eig(tensor_basic< T > &q, size_t dim=3) const
const tensor_basic< T > & operator+() const
tensor_basic< T > operator-() const
tensor_basic< T > operator/(const T &k) const
void fill(const T &init_val)
bool operator!=(const tensor_basic< T > &b) const
void set_row(const point_basic< T > &r, size_t i, size_t d=3)
tensor_basic< T > & operator-=(const tensor_basic< T > &)
bool operator==(const tensor_basic< T > &) const
tensor_basic< T > & operator/=(const T &k)
point_basic< T > row(size_type i) const
tensor_basic(const T &init_val=0)
point_basic< T > svd(tensor_basic< T > &u, tensor_basic< T > &v, size_t dim=3) const
void set_column(const point_basic< T > &c, size_t j, size_t d=3)
tensor_basic< Float > tensor
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
void serialize(Archive &ar, class rheolef::point_basic< T > &x, const unsigned int version)
This file is part of Rheolef.
tensor_basic< T > inv(const tensor_basic< T > &a, size_t d)
tensor_basic< U > otimes(const point_basic< U > &u, const point_basic< U > &v, size_t d=3)
T ddot(const tensor_basic< T > &a, const tensor_basic< T > &b)
ddot(x,y): see the expression page for the full documentation
U tr(const tensor_basic< U > &a, size_t d=3)
tensor_basic< T > exp(const tensor_basic< T > &a, size_t d)
std::ostream & operator<<(std::ostream &os, const catchmark &m)
T norm2(const vec< T, M > &x)
norm2(x): see the expression page for the full documentation
U determinant(const tensor_basic< U > &A, size_t d=3)
void prod(const tensor_basic< T > &a, const tensor_basic< T > &b, tensor_basic< T > &result, size_t di, size_t dj, size_t dk)
T dist2(const point_basic< T > &x, const point_basic< T > &y)
std::istream & operator>>(std::istream &is, const catchmark &m)
csr< T, M > diag(const vec< T, M > &d)
void cumul_otimes(tensor_basic< T > &t, const point_basic< T > &a, const point_basic< T > &b, size_t na, size_t nb)
csr< T, sequential > trans(const csr< T, sequential > &a)
trans(a): see the form page for the full documentation
T dist(const point_basic< T > &x, const point_basic< T > &y)
csr< T, sequential > operator*(const T &lambda, const csr< T, sequential > &a)
T norm(const vec< T, M > &x)
norm(x): see the expression page for the full documentation
bool invert_3x3(const tensor_basic< T > &A, tensor_basic< T > &result)
float_traits< T >::type type
helper for std::complex<T>: get basic T type
helper for point_basic<T> & tensor_basic<T>: get basic T type