Memosa-FVM  0.2
Gradient.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 _GRADIENT_H_
6 #define _GRADIENT_H_
7 
8 
9 #include "Vector.h"
10 
11 template <class T>
12 class Gradient
13 {
14 public:
18 
20 
21  static string getTypeName()
22  {
23  return "Gradient<" + NumTypeTraits<T>::getTypeName() + ">";
24  }
25 
26  static int getDimension() {return NumTypeTraits<T>::getDimension()+1;}
27 
28  static void getShape(int *shp)
29  {
30  *shp = 3;
32  }
33 
34  static int getDataSize()
35  {
37  }
38 
39  T& operator[](int n) {return _data[n];}
40  const T& operator[](int n) const {return _data[n];}
41 
42 
44  {
45  for(int i=0;i<3;i++)
46  _data[i] = o;
47  return *this;
48  }
49 
51  {
52  for(int i=0;i<3;i++)
53  _data[i] = o._data[i];
54  return *this;
55  }
56 
57  void accumulate(const Coord& wt, const T& v)
58  {
59  for(int i=0;i<3;i++)
60  _data[i] += wt[i]*v;
61  }
62 
64  {
65  for(int i=0;i<3;i++)
66  _data[i] += o._data[i];
67  return *this;
68  }
69 
71  {
72  for(int i=0;i<3;i++)
73  _data[i] -= o._data[i];
74  return *this;
75  }
76 
78  {
79  Gradient r;
80  for(int i=0;i<3;i++)
81  r._data[i] = -_data[i];
82  return r;
83  }
84 
86  {
87  for(int i=0;i<3;i++)
88  _data[i] *= s;
89  return *this;
90  }
91 
93  {
94  for(int i=0;i<3;i++)
95  _data[i] *= o._data[i];
96  return *this;
97  }
98 
99  T operator*=(const Coord& v)
100  {
102  for(int i=0;i<3;i++)
103  r += _data[i]*v[i];
104  return r;
105  }
106 
108  {
109  for(int i=0;i<3;i++)
110  _data[i] /= s;
111  return *this;
112  }
113 
114  // elementwise
116  {
117  for(int i=0;i<3;i++)
118  _data[i] /= o._data[i];
119  return *this;
120  }
121 
122  void zero()
123  {
124  for(int i=0;i<3;i++) _data[i] = NumTypeTraits<T>::getZero();
125  }
126 
127  static void accumulateOneNorm(Gradient& sum, const Gradient& v)
128  {
129  for(int i=0; i<3; i++)
131  }
132 
133  static void accumulateDotProduct(Gradient& sum, const Gradient& v0, const Gradient& v1)
134  {
135  for(int i=0; i<3; i++)
137  }
138 
139  static void reduceSum(T_Scalar& sum, const This_T& x)
140  {
141  for(int i=0; i<3; i++)
142  NumTypeTraits<T>::reduceSum(sum,x[i]);
143  }
144 
145  static void safeDivide(Gradient& x, const Gradient& y)
146  {
147  for(int i=0; i<3; i++)
149  }
150 
151  static void normalize(Gradient& x, const Gradient& y)
152  {
153  for(int i=0; i<3; i++)
155  }
156 
157  static void setMax(Gradient& x, const Gradient& y)
158  {
159  for(int i=0; i<3; i++)
161  }
162  static Gradient getZero()
163  {
164  Gradient z;
165  z.zero();
166  return z;
167  }
168 
169  void print(ostream &os) const
170  {
171  os << "[ " ;
172  for(int i=0;i<3;i++)
173  os << _data[i] << " " ;
174  os << "]";
175  }
176 
177  static void write(FILE* fp, const Gradient& x)
178  {
179  for(int i=0; i<3; i++)
180  {
182  fprintf(fp, " ");
183  }
184  }
185 
186  T mag2() const
187  {
189  for(int i=0; i<3; i++)
190  r+=_data[i]*_data[i];
191  return r;
192  }
193 
194  bool operator<(const double tolerance) const
195  {
196  return mag2() < tolerance*tolerance;
197  }
198 private:
199  T _data[3];
200 };
201 
202 template<class T>
203 inline ostream& operator<<(ostream &os,
204  const Gradient<T> &v)
205 {
206  v.print(os);
207  return os;
208 }
209 
210 template<class T>
212 operator+(const Gradient<T>& a, const Gradient<T>& b)
213 {
214  return Gradient<T>(a) += b;
215 }
216 
217 template<class T>
220 {
221  return Gradient<T>(a) *= s;
222 }
223 
224 template<class T>
225 T
226 operator*(const Gradient<T>& a, const typename Gradient<T>::Coord& v)
227 {
228  return Gradient<T>(a) *= v;
229 }
230 
231 // does elemenwise operation
232 template<class T>
234 operator*(const Gradient<T>& a, const Gradient<T>& b)
235 {
236  return Gradient<T>(a) *= b;
237 }
238 
239 template<class T>
242 {
243  return Gradient<T>(a) /= s;
244 }
245 
246 // for statements like x /= 2;
247 template<class T>
249 operator/(const Gradient<T>& a, const int& s)
250 {
251  return Gradient<T>(a) /= typename NumTypeTraits<T>::T_Scalar(s);
252 }
253 
254 template<class T>
257 {
258  return -Gradient<T>(a);
259 }
260 
261 
262 #endif
263 
ostream & operator<<(ostream &os, const Gradient< T > &v)
Definition: Gradient.h:203
Gradient operator-() const
Definition: Gradient.h:77
NumTypeTraits< T >::T_Scalar T_Scalar
Definition: Gradient.h:16
Gradient & operator-=(const Gradient &o)
Definition: Gradient.h:70
T operator*=(const Coord &v)
Definition: Gradient.h:99
Gradient & operator+=(const Gradient &o)
Definition: Gradient.h:63
T & operator[](int n)
Definition: Gradient.h:39
static Gradient getZero()
Definition: Gradient.h:162
NumTypeTraits< T >::T_BuiltIn T_BuiltIn
Definition: Gradient.h:17
Gradient< T > operator+(const Gradient< T > &a, const Gradient< T > &b)
Definition: Gradient.h:212
static void setMax(Gradient &x, const Gradient &y)
Definition: Gradient.h:157
static void normalize(Gradient &x, const Gradient &y)
Definition: Gradient.h:151
Gradient< T > This_T
Definition: Gradient.h:15
static int getDataSize()
Definition: Gradient.h:34
void print(ostream &os) const
Definition: Gradient.h:169
static void getShape(int *shp)
Definition: Gradient.h:28
T mag2() const
Definition: Gradient.h:186
Vector< T_Scalar, 3 > Coord
Definition: Gradient.h:19
static void reduceSum(T_Scalar &sum, const This_T &x)
Definition: Gradient.h:139
Gradient< T > operator/(const Gradient< T > &a, const typename NumTypeTraits< T >::T_Scalar &s)
Definition: Gradient.h:241
Gradient< T > operator*(const Gradient< T > &a, const typename NumTypeTraits< T >::T_Scalar &s)
Definition: Gradient.h:219
bool operator<(const double tolerance) const
Definition: Gradient.h:194
Gradient & operator=(const T_Scalar &o)
Definition: Gradient.h:43
void accumulate(const Coord &wt, const T &v)
Definition: Gradient.h:57
static void accumulateOneNorm(Gradient &sum, const Gradient &v)
Definition: Gradient.h:127
static string getTypeName()
Definition: Gradient.h:21
Gradient & operator=(const Gradient &o)
Definition: Gradient.h:50
static void write(FILE *fp, const Gradient &x)
Definition: Gradient.h:177
void zero()
Definition: Gradient.h:122
Gradient & operator*=(const Gradient &o)
Definition: Gradient.h:92
static void safeDivide(Gradient &x, const Gradient &y)
Definition: Gradient.h:145
static void accumulateDotProduct(Gradient &sum, const Gradient &v0, const Gradient &v1)
Definition: Gradient.h:133
Gradient< T > operator-(const Gradient< T > &a)
Definition: Gradient.h:256
Gradient & operator/=(const T_Scalar &s)
Definition: Gradient.h:107
static int getDimension()
Definition: Gradient.h:26
Gradient & operator*=(const T_Scalar &s)
Definition: Gradient.h:85
T _data[3]
Definition: Gradient.h:199
Gradient & operator/=(const Gradient &o)
Definition: Gradient.h:115
const T & operator[](int n) const
Definition: Gradient.h:40