Memosa-FVM  0.2
Vector.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 _VECTOR_H_
6 #define _VECTOR_H_
7 
8 #include "NumType.h"
9 
10 #include <sstream>
11 inline string intAsString(const int i)
12 {
13  ostringstream osBuffer;
14  osBuffer << i;
15  return osBuffer.str();
16 }
17 
18 template <class T, int N>
19 class Vector
20 {
21 public:
23 
27 
28  typedef T T_NumType;
29 
30  enum {Length = N};
31 
32  // not initialized
33  Vector() {}
34 
35  Vector(const Vector& o)
36  {
37  for(int i=0;i<N;i++)
38  _data[i] = o[i];
39  }
40 
41  static string getTypeName()
42  {
43  return "Vector<" + NumTypeTraits<T>::getTypeName() +
44  "," + intAsString(N) +
45  ">";
46  }
47  static int getDimension() {return NumTypeTraits<T>::getDimension()+1;}
48 
49  static void getShape(int *shp) { *shp = N; NumTypeTraits<T>::getShape(shp+1);}
50 
51  void* getData()
52  {
53  return _data;
54  }
55  static int getDataSize()
56  {
58  }
59 
60  T& operator[](int n) {return _data[n];}
61  const T& operator[](int n) const {return _data[n];}
62 
63  void printFromC(ostream &os) const
64  {
65  os << "[ " ;
66  os << scientific;
67  for(int i=0;i<N;i++)
68  os << _data[i] << " " ;
69  os << "]";
70  }
71 
72  static void write(FILE* fp, const Vector& x)
73  {
74  for(int i=0; i<N; i++)
75  {
76  NumTypeTraits<T>::write(fp,x[i]);
77  fprintf(fp, " ");
78  }
79  }
80 
81  Vector& operator=(const T& o)
82  {
83  for(int i=0;i<N;i++)
84  _data[i] = o;
85  return *this;
86  }
87 
88 #if 0
89  Vector& operator=(const int o)
90  {
91  for(int i=0;i<N;i++)
92  _data[i] = o;
93  return *this;
94  }
95 #endif
96 
97  Vector& operator=(const Vector& o)
98  {
99  for(int i=0;i<N;i++)
100  _data[i] = o[i];
101  return *this;
102  }
103 
105  {
106  Vector r;
107  for(int i=0;i<N;i++)
108  r[i]=-_data[i];
109  return r;
110  }
111 
113  {
114  for(int i=0;i<N;i++)
115  _data[i] += o[i];
116  return *this;
117  }
118 
120  {
121  for(int i=0;i<N;i++)
122  _data[i] -= o[i];
123  return *this;
124  }
125 
126  Vector& operator/=(const T s)
127  {
128  for(int i=0;i<N;i++)
129  _data[i] /= s;
130  return *this;
131  }
132 
133  // elementwise operation
135  {
136  for(int i=0;i<N;i++)
137  _data[i] /= o[i];
138  return *this;
139  }
140 
141  Vector& operator*=(const T s)
142  {
143  for(int i=0;i<N;i++)
144  _data[i] *= s;
145  return *this;
146  }
147 
148  // elementwise operation
150  {
151  for(int i=0;i<N;i++)
152  _data[i] *= o[i];
153  return *this;
154  }
155 
156  void zero()
157  {
158  for(int i=0;i<N;i++) _data[i] = NumTypeTraits<T>::getZero();
159  }
160 
161  T mag2() const
162  {
164  for(int i=0; i<N; i++)
165  r+=_data[i]*_data[i];
166  return r;
167  }
168 
169  bool operator<(const double tolerance) const
170  {
171  return mag2() < tolerance*tolerance;
172  }
173 
174  bool greaterThanElementwise(const Vector& y) const
175  {
176  for(int i=0; i<N; i++)
177  if (_data[i] <= y[i])
178  return false;
179  return true;
180  }
181 
182  static Vector getZero()
183  {
184  Vector z;
185  z.zero();
186  return z;
187  }
188 
189  static void accumulateOneNorm(Vector& sum, const Vector& v)
190  {
191  for(int i=0; i<N; i++)
193  }
194 
195  static void accumulateDotProduct(Vector& sum, const Vector& v0, const Vector& v1)
196  {
197  for(int i=0; i<N; i++)
198  sum[i]+=v0[i]*v1[i];
199  }
200 
201  static void reduceSum(T_Scalar& sum, const This_T& x)
202  {
203  for(int i=0; i<N; i++)
204  NumTypeTraits<T>::reduceSum(sum,x[i]);
205  }
206 
207  static void safeDivide(Vector& x, const Vector& y)
208  {
209  for(int i=0; i<N; i++)
210  NumTypeTraits<T>::safeDivide(x[i],y[i]);
211  }
212 
213  static void normalize(Vector& x, const Vector& y)
214  {
215  const T ymag = sqrt(y.mag2());
216  for(int i=0; i<N; i++)
217  NumTypeTraits<T>::safeDivide(x[i],ymag);
218  }
219 
220 
221  static void setMax(Vector& x, const Vector& y)
222  {
223  if (x.mag2() < y.mag2())
224  for(int i=0; i<N; i++)
225  x[i]=y[i];
226  }
227 
228 private:
229  T _data[N];
230 };
231 
232 template<class T, int N>
233 inline ostream& operator<<(ostream &os,
234  const Vector<T,N> &v)
235 {
236  v.printFromC(os);
237  return os;
238 }
239 
240 template<class T>
242 cross(const Vector<T,3>& a, const Vector<T,3>& b)
243 {
244  Vector<T,3> c;
245  c[0] = a[1]*b[2]-a[2]*b[1];
246  c[1] = a[2]*b[0]-a[0]*b[2];
247  c[2] = a[0]*b[1]-a[1]*b[0];
248  return c;
249 }
250 
251 template<class T>
252 T
253 dot(const Vector<T,3>& a, const Vector<T,3>& b)
254 {
255  return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];
256 }
257 
258 template<class T>
259 T
260 mag(const Vector<T,3>& a)
261 {
262  return sqrt(dot(a,a));
263 }
264 
265 template<class T>
266 T
267 mag2(const Vector<T,3>& a)
268 {
269  return dot(a,a);
270 }
271 
272 template<class T, int N>
274 operator+(const Vector<T,N>& a, const Vector<T,N>& b)
275 {
276  return Vector<T,N>(a) += b;
277 }
278 
279 template<class T, int N>
281 operator-(const Vector<T,N>& a, const Vector<T,N>& b)
282 {
283  return Vector<T,N>(a) -= b;
284 }
285 
286 template<class T, int N>
289 {
290  return -Vector<T,N>(a);
291 }
292 
293 template<class T, int N>
295 operator*(const T s, const Vector<T,N>& a)
296 {
297  return Vector<T,N>(a) *= s;
298 }
299 
300 template<class T, int N>
302 operator*(const Vector<T,N>& a, const T s)
303 {
304  return Vector<T,N>(a) *= s;
305 }
306 
307 // does elemenwise operation
308 template<class T, int N>
310 operator*(const Vector<T,N>& a, const Vector<T,N>& b)
311 {
312  return Vector<T,N>(a) *= b;
313 }
314 
315 template<class T, int N>
317 operator/(const Vector<T,N>& a, const T s)
318 {
319  return Vector<T,N>(a) /= s;
320 }
321 
322 // does elementwise operation
323 template<class T, int N>
325 operator/(const Vector<T,N>& a, const Vector<T,N>& b)
326 {
327  return Vector<T,N>(a) /= b;
328 }
329 
330 template<class T, int N>
332 {
333  static void limit(Vector<T,N>& val, const double min, const double max)
334  {
335  for(int i=0; i<N; i++)
336  {
337  if (val[i] < min)
338  val[i] = min;
339  else if (val[i] > max)
340  val[i] = max;
341  }
342  }
343 };
344 
345 #endif
static void write(FILE *fp, const Vector &x)
Definition: Vector.h:72
Vector & operator/=(const Vector &o)
Definition: Vector.h:134
T & operator[](int n)
Definition: Vector.h:60
Vector & operator/=(const T s)
Definition: Vector.h:126
ostream & operator<<(ostream &os, const Vector< T, N > &v)
Definition: Vector.h:233
bool operator<(const double tolerance) const
Definition: Vector.h:169
T mag2() const
Definition: Vector.h:161
Vector & operator=(const Vector &o)
Definition: Vector.h:97
Vector()
Definition: Vector.h:33
Definition: Vector.h:19
void printFromC(ostream &os) const
Definition: Vector.h:63
Vector(const Vector &o)
Definition: Vector.h:35
const T & operator[](int n) const
Definition: Vector.h:61
static void normalize(Vector &x, const Vector &y)
Definition: Vector.h:213
Vector< T, N > operator*(const T s, const Vector< T, N > &a)
Definition: Vector.h:295
bool greaterThanElementwise(const Vector &y) const
Definition: Vector.h:174
double max(double x, double y)
Definition: Octree.cpp:18
T mag(const Vector< T, 3 > &a)
Definition: Vector.h:260
Vector & operator*=(const Vector &o)
Definition: Vector.h:149
static void accumulateOneNorm(Vector &sum, const Vector &v)
Definition: Vector.h:189
T T_NumType
Definition: Vector.h:28
T _data[N]
Definition: Vector.h:229
Vector< T, N > This_T
Definition: Vector.h:22
Tangent sqrt(const Tangent &a)
Definition: Tangent.h:317
Vector operator-()
Definition: Vector.h:104
static int getDimension()
Definition: Vector.h:47
Vector & operator=(const T &o)
Definition: Vector.h:81
void * getData()
Definition: Vector.h:51
Vector & operator+=(const Vector &o)
Definition: Vector.h:112
static void accumulateDotProduct(Vector &sum, const Vector &v0, const Vector &v1)
Definition: Vector.h:195
Vector & operator*=(const T s)
Definition: Vector.h:141
static void limit(Vector< T, N > &val, const double min, const double max)
Definition: Vector.h:333
Vector< T_BuiltIn, N > VBuiltIn
Definition: Vector.h:26
string intAsString(const int i)
Definition: Vector.h:11
Vector< T, N > operator+(const Vector< T, N > &a, const Vector< T, N > &b)
Definition: Vector.h:274
Vector< T, 3 > cross(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
Definition: Vector.h:242
NumTypeTraits< T >::T_Scalar T_Scalar
Definition: Vector.h:24
NumTypeTraits< T >::T_BuiltIn T_BuiltIn
Definition: Vector.h:25
static int getDataSize()
Definition: Vector.h:55
Vector< T, N > operator-(const Vector< T, N > &a, const Vector< T, N > &b)
Definition: Vector.h:281
static void reduceSum(T_Scalar &sum, const This_T &x)
Definition: Vector.h:201
static void safeDivide(Vector &x, const Vector &y)
Definition: Vector.h:207
void zero()
Definition: Vector.h:156
double min(double x, double y)
Definition: Octree.cpp:23
Vector & operator-=(const Vector &o)
Definition: Vector.h:119
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
Definition: Vector.h:253
static Vector getZero()
Definition: Vector.h:182
static string getTypeName()
Definition: Vector.h:41
static void getShape(int *shp)
Definition: Vector.h:49
static void setMax(Vector &x, const Vector &y)
Definition: Vector.h:221
T mag2(const Vector< T, 3 > &a)
Definition: Vector.h:267
Vector< T, N > operator/(const Vector< T, N > &a, const T s)
Definition: Vector.h:317