rheolef  6.5
tensor4.h
Go to the documentation of this file.
1 # ifndef _RHEOLEF_TENSOR4_H
2 # define _RHEOLEF_TENSOR4_H
3 
14 #include "rheolef/point.h"
15 #include "rheolef/tensor.h"
16 namespace rheolef {
17 
18 template<class T>
20 public:
21 
22  typedef size_t size_type;
23  typedef T element_type;
24  typedef T float_type;
25 
26 
27  tensor4_basic (const T& init_val = 0);
29 
30 #ifdef _RHEOLEF_HAVE_STD_INITIALIZER_LIST
31  tensor4_basic (const std::initializer_list<std::initializer_list<
32  std::initializer_list<std::initializer_list<T> > > >& il);
33 #endif // _RHEOLEF_HAVE_STD_INITIALIZER_LIST
34 
35 
37  tensor4_basic<T>& operator= (const T& val);
38 
39 
41  const T& operator()(size_type i, size_type j, size_type k, size_type l) const;
42 
43 
44  tensor4_basic<T>& operator*= (const T& k);
45  tensor4_basic<T>& operator/= (const T& k) { return operator*= (1./k); }
48 
49  std::ostream& put (std::ostream& out, size_type d=3) const;
50 
51 protected:
52  T _x [3][3][3][3];
53 };
55 
56 template <class T>
57 T norm2 (const tensor4_basic<T>&);
58 template <class T>
59 T norm (const tensor4_basic<T>& a) { return sqrt(norm2(a)); }
60 template <class T>
61 tensor4_basic<T> dexp (const tensor_basic<T>& a, size_t d = 3);
62 
63 template <class T>
64 tensor_basic<T> ddot (const tensor4_basic<T>&, const tensor_basic<T>&);
65 template <class T>
66 tensor_basic<T> ddot (const tensor_basic<T>&, const tensor4_basic<T>&);
67 @endcode
68 template<class T> struct float_traits<tensor4_basic<T> > { typedef typename float_traits<T>::type type; };
69 template<class T> struct scalar_traits<tensor4_basic<T> > { typedef T type; };
70 
71 template<class T>
72 inline
74 {
75  operator= (init_val);
76 }
77 template<class T>
78 inline
80 {
81  operator= (a);
82 }
83 template<class T>
84 inline
85 T&
87 {
88  return _x[i%3][j%3][k%3][l%3];
89 }
90 template<class T>
91 inline
92 const T&
94 {
95  return _x[i%3][j%3][k%3][l%3];
96 }
97 template <class T>
98 inline
100 operator* (const T& k, const tensor4_basic<T>& a)
101 {
102  tensor4_basic<T> b = a;
103  b *= k;
104  return b;
105 }
106 template <class T>
107 inline
108 tensor4_basic<T>
109 operator* (const tensor4_basic<T>& a, const T& k)
110 {
111  return k*a;
112 }
113 template <class T>
114 inline
115 tensor4_basic<T>
116 operator/ (const tensor4_basic<T>& a, const T& k)
117 {
118  return (1./k)/a;
119 }
120 
121 }// namespace rheolef
122 # endif /* _RHEOLEF_TENSOR4_H */
123