Memosa-FVM  0.2
DiagonalTensor.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _DIAGONALTENSOR_H_
6 #define _DIAGONALTENSOR_H_
7 
8 #include "NumType.h"
9 #include "Vector.h"
10 #include <sstream>
11 
12 
13 template <class T, int N>
15 {
16 public:
20 
22  {}
23 
25  {
26  for(int i=0; i<N; i++)
27  _data[i] = o._data[i];
28  }
29 
30  DiagonalTensor(const T& o)
31  {
32  for(int i=0; i<N; i++)
33  _data[i] = o;
34  }
35 
36 
37  static string getTypeName()
38  {
39  return "DiagonalTensor<" + NumTypeTraits<T>::getTypeName() +
40  "," + intAsString(N) +
41  ">";
42  }
43  static int getDimension() {return 1;}
44 
45  static void getShape(int *shp) { *shp = N;}
46  static int getDataSize()
47  {
49  }
50 
51  T& operator[](int n) {return _data[n];}
52  const T& operator[](int n) const {return _data[n];}
53 
54  void printFromC(ostream &os) const
55  {
56  os << "[ " ;
57  for(int i=0;i<N;i++)
58  os << _data[i] << " " ;
59  os << "]";
60  }
61 
62  static void write(FILE* fp, const DiagonalTensor& x)
63  {
64  for(int i=0; i<N; i++)
65  {
66  NumTypeTraits<T>::write(fp,x[i]);
67  fprintf(fp, " ");
68  }
69  }
70 
72  {
73  for(int i=0;i<N;i++)
74  _data[i] = o;
75  return *this;
76  }
77 
79  {
80  for(int i=0;i<N;i++)
81  _data[i] = o[i];
82  return *this;
83  }
84 
86  {
88  for(int i=0;i<N;i++)
89  r[i]=-_data[i];
90  return r;
91  }
92 
94  {
95  for(int i=0;i<N;i++)
96  _data[i] += o[i];
97  return *this;
98  }
99 
101  {
102  for(int i=0;i<N;i++)
103  _data[i] += s;
104  return *this;
105  }
106 
108  {
109  for(int i=0;i<N;i++)
110  _data[i] -= o[i];
111  return *this;
112  }
113 
115  {
116  for(int i=0;i<N;i++)
117  _data[i] -= s;
118  return *this;
119  }
120 
122  {
123  for(int i=0;i<N;i++)
124  _data[i] /= s;
125  return *this;
126  }
127 
129  {
130  for(int i=0;i<N;i++)
131  _data[i] /= o[i];
132  return *this;
133  }
134 
136  {
137  for(int i=0;i<N;i++)
138  _data[i] *= s;
139  return *this;
140  }
141 
143  {
144  for(int i=0;i<N;i++)
145  _data[i] *= o[i];
146  return *this;
147  }
148 
149  void zero()
150  {
151  for(int i=0;i<N;i++) _data[i] = NumTypeTraits<T>::getZero();
152  }
153 
154  T mag2() const
155  {
157  for(int i=0; i<N; i++)
158  r+=_data[i]*_data[i];
159  return r;
160  }
161 
162  bool operator<(const double tolerance) const
163  {
164  return mag2() < tolerance*tolerance;
165  }
166 
168  {
169  DiagonalTensor z;
170  z.zero();
171  return z;
172  }
173 
174  static double doubleMeasure(const DiagonalTensor& x)
175  {
176  double m=0;
177  for (int i=0; i<N; i++)
179  return m;
180  }
181 
183  {
184  DiagonalTensor n;
185  for(int i=0; i<N; i++)
187 
188  return n;
189  }
190 
192  {
193  DiagonalTensor n;
194  for(int i=0; i<N; i++)
196 
197  return n;
198  }
199 
200  static void accumulateOneNorm(DiagonalTensor& sum, const DiagonalTensor& v)
201  {
202  for(int i=0; i<N; i++)
204  }
205 
207  const DiagonalTensor& v1)
208  {
209  for(int i=0; i<N; i++)
210  NumTypeTraits<T>::accumulateDotProduct(sum[i],v0[i],v1[i]);
211  }
212 
213  static void reduceSum(T_Scalar& sum, const This_T& x)
214  {
215  for(int i=0; i<N; i++)
216  NumTypeTraits<T>::reduceSum(sum,x[i]);
217  }
218 
219  static void safeDivide(DiagonalTensor& x, const DiagonalTensor& y)
220  {
221  for(int i=0; i<N; i++)
222  NumTypeTraits<T>::safeDivide(x[i],y[i]);
223  }
224 
225  static void normalize(DiagonalTensor& x, const DiagonalTensor& y)
226  {
227  for(int i=0; i<N; i++)
228  NumTypeTraits<T>::normalize(x[i],y[i]);
229  }
230 
231  static void setMax(DiagonalTensor& x, const DiagonalTensor& y)
232  {
233  for(int i=0; i<N; i++)
234  NumTypeTraits<T>::setMax(x[i],y[i]);
235  }
236 
237 private:
238  T _data[N];
239 };
240 
241 template<class T, int N>
242 inline ostream& operator<<(ostream &os,
243  const DiagonalTensor<T,N> &v)
244 {
245  v.printFromC(os);
246  return os;
247 }
248 
249 
250 template<class T, int N>
253 {
254  return DiagonalTensor<T,N>(a) += b;
255 }
256 
257 template<class T, int N>
260 {
261  return DiagonalTensor<T,N>(a) -= b;
262 }
263 
264 template<class T, int N>
267 {
268  return -DiagonalTensor<T,N>(a);
269 }
270 
271 template<class T, int N>
274 {
275  return DiagonalTensor<T,N>(a) *= b;
276 }
277 
278 template<class T, int N>
280 operator*(const T s, const DiagonalTensor<T,N>& a)
281 {
282  return DiagonalTensor<T,N>(a) *= s;
283 }
284 
285 template<class T, int N>
287 operator*(const DiagonalTensor<T,N>& a, const T s)
288 {
289  return DiagonalTensor<T,N>(a) *= s;
290 }
291 
292 template<class T, int N>
295 {
296  Vector<T,N> r;
297  for(int i=0; i<N; i++) r[i] = a[i]*b[i];
298  return r;
299 }
300 
301 template<class T, int N>
303 operator/(const DiagonalTensor<T,N>& a, const T s)
304 {
305  return DiagonalTensor<T,N>(a) /= s;
306 }
307 
308 template<class T, int N>
311 {
312  Vector<T,N> r;
313  for(int i=0; i<N; i++) r[i] = a[i]/b[i];
314  return r;
315 }
316 
317 template<class T, int N>
320 {
322  for(int i=0; i<N; i++) r[i] = a[i]/b[i];
323  return r;
324 }
325 
326 template<class T, int N>
328 operator/(const T s, const DiagonalTensor<T,N>& a)
329 {
331  for(int i=0; i<N; i++) r[i] = s/a[i];
332  return r;
333 }
334 
335 template<class T, int N>
337 {
338  return x[0];
339 }
340 
341 #endif
342 
DiagonalTensor & operator=(const DiagonalTensor &o)
DiagonalTensor & operator+=(const DiagonalTensor &o)
DiagonalTensor & operator-=(const T s)
static void normalize(DiagonalTensor &x, const DiagonalTensor &y)
T mag2() const
static double doubleMeasure(const DiagonalTensor &x)
T & operator[](int n)
Definition: Vector.h:19
DiagonalTensor< T, N > operator-(const DiagonalTensor< T, N > &a, const DiagonalTensor< T, N > &b)
const T & operator[](int n) const
DiagonalTensor & operator/=(const T s)
static string getTypeName()
DiagonalTensor< T, N > This_T
DiagonalTensor & operator=(const T &o)
static DiagonalTensor getUnity()
bool operator<(const double tolerance) const
static int getDimension()
DiagonalTensor< T, N > operator+(const DiagonalTensor< T, N > &a, const DiagonalTensor< T, N > &b)
void printFromC(ostream &os) const
static void setMax(DiagonalTensor &x, const DiagonalTensor &y)
static int getDataSize()
DiagonalTensor(const DiagonalTensor &o)
ostream & operator<<(ostream &os, const DiagonalTensor< T, N > &v)
static void accumulateDotProduct(DiagonalTensor &sum, const DiagonalTensor &v0, const DiagonalTensor &v1)
string intAsString(const int i)
Definition: Vector.h:11
DiagonalTensor & operator/=(const DiagonalTensor &o)
static void safeDivide(DiagonalTensor &x, const DiagonalTensor &y)
DiagonalTensor & operator*=(const DiagonalTensor &o)
static void accumulateOneNorm(DiagonalTensor &sum, const DiagonalTensor &v)
static DiagonalTensor getNegativeUnity()
NumTypeTraits< T >::T_BuiltIn T_BuiltIn
T DiagToOffDiag(const DiagonalTensor< T, N > &x)
static DiagonalTensor getZero()
DiagonalTensor< T, N > operator/(const DiagonalTensor< T, N > &a, const T s)
DiagonalTensor< T, N > operator*(const DiagonalTensor< T, N > &a, const DiagonalTensor< T, N > &b)
NumTypeTraits< T >::T_Scalar T_Scalar
DiagonalTensor & operator+=(const T s)
DiagonalTensor & operator*=(const T s)
DiagonalTensor operator-()
static void reduceSum(T_Scalar &sum, const This_T &x)
static void getShape(int *shp)
DiagonalTensor(const T &o)
DiagonalTensor & operator-=(const DiagonalTensor &o)
static void write(FILE *fp, const DiagonalTensor &x)