Blame view

stim/math/vector.h 5.18 KB
57729e5b   David Mayerich   changed directory...
1
2
3
4
5
6
  #ifndef RTS_VECTOR_H

  #define RTS_VECTOR_H

  

  #include <iostream>

  #include <cmath>

  #include <sstream>

a9275be5   David Mayerich   added vector fiel...
7
  //#include "rts/math/point.h"

87da9adc   David Mayerich   fixed issues with...
8
  #include "../cuda/callable.h"

57729e5b   David Mayerich   changed directory...
9
  

a9275be5   David Mayerich   added vector fiel...
10
  

8a86bd56   David Mayerich   changed rts names...
11
  namespace stim

57729e5b   David Mayerich   changed directory...
12
13
14
15
  {

  

  

  

a9275be5   David Mayerich   added vector fiel...
16
17
  template <class T, int N=3>

  struct vec

57729e5b   David Mayerich   changed directory...
18
19
20
  {

  	T v[N];

  

a9275be5   David Mayerich   added vector fiel...
21
  	CUDA_CALLABLE vec()

57729e5b   David Mayerich   changed directory...
22
23
24
25
26
27
28
  	{

  		//memset(v, 0, sizeof(T) * N);

  		for(int i=0; i<N; i++)

  			v[i] = 0;

  	}

  

  	//efficiency constructor, makes construction easier for 1D-4D vectors

559d0fcb   David Mayerich   wave interactions...
29
  	CUDA_CALLABLE vec(T rhs)

a9275be5   David Mayerich   added vector fiel...
30
  	{

559d0fcb   David Mayerich   wave interactions...
31
32
  		for(int i=0; i<N; i++)

  			v[i] = rhs;

a9275be5   David Mayerich   added vector fiel...
33
34
35
36
37
38
39
  	}

  	CUDA_CALLABLE vec(T x, T y)

  	{

  		v[0] = x;

  		v[1] = y;

  	}

  	CUDA_CALLABLE vec(T x, T y, T z)

57729e5b   David Mayerich   changed directory...
40
  	{

a9275be5   David Mayerich   added vector fiel...
41
42
43
44
45
46
47
48
49
50
  		v[0] = x;

  		v[1] = y;

  		v[2] = z;

  	}

  	CUDA_CALLABLE vec(T x, T y, T z, T w)

  	{

  		v[0] = x;

  		v[1] = y;

  		v[2] = z;

  		v[3] = w;

57729e5b   David Mayerich   changed directory...
51
52
  	}

  

559d0fcb   David Mayerich   wave interactions...
53
54
55
56
  	//copy constructor

  	CUDA_CALLABLE vec( const vec<T, N>& other){

  		for(int i=0; i<N; i++)

  			v[i] = other.v[i];

57729e5b   David Mayerich   changed directory...
57
58
  	}

  

ecfd14df   David Mayerich   implemented D fie...
59
60
61
62
63
64
65
66
67
68
69
70
71
  	

  	template< typename U >

  	CUDA_CALLABLE operator vec<U, N>(){

  		vec<U, N> result;

  		for(int i=0; i<N; i++)

  			result.v[i] = v[i];

  

  		return result;

  	}

  

  	//template<class U>

  	//friend vec<U, N>::operator vec<T, N>();

  

8d4f0940   David Mayerich   ERROR in plane wa...
72
  	CUDA_CALLABLE T len() const

57729e5b   David Mayerich   changed directory...
73
74
75
76
77
78
79
  	{

          //compute and return the vector length

          T sum_sq = (T)0;

          for(int i=0; i<N; i++)

          {

              sum_sq += v[i] * v[i];

          }

ecfd14df   David Mayerich   implemented D fie...
80
          return sqrt(sum_sq);

57729e5b   David Mayerich   changed directory...
81
82
83
  

  	}

  

8d4f0940   David Mayerich   ERROR in plane wa...
84
  	CUDA_CALLABLE vec<T, N> cart2sph() const

57729e5b   David Mayerich   changed directory...
85
86
87
88
  	{

  		//convert the vector from cartesian to spherical coordinates

  		//x, y, z -> r, theta, phi (where theta = 0 to 2*pi)

  

a9275be5   David Mayerich   added vector fiel...
89
  		vec<T, N> sph;

57729e5b   David Mayerich   changed directory...
90
91
92
93
94
95
96
  		sph[0] = std::sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);

  		sph[1] = std::atan2(v[1], v[0]);

  		sph[2] = std::acos(v[2] / sph[0]);

  

  		return sph;

  	}

  

8d4f0940   David Mayerich   ERROR in plane wa...
97
  	CUDA_CALLABLE vec<T, N> sph2cart() const

57729e5b   David Mayerich   changed directory...
98
99
100
101
  	{

  		//convert the vector from cartesian to spherical coordinates

  		//r, theta, phi -> x, y, z (where theta = 0 to 2*pi)

  

a9275be5   David Mayerich   added vector fiel...
102
  		vec<T, N> cart;

57729e5b   David Mayerich   changed directory...
103
104
105
106
107
108
109
  		cart[0] = v[0] * std::cos(v[1]) * std::sin(v[2]);

  		cart[1] = v[0] * std::sin(v[1]) * std::sin(v[2]);

  		cart[2] = v[0] * std::cos(v[2]);

  

  		return cart;

  	}

  

8d4f0940   David Mayerich   ERROR in plane wa...
110
  	CUDA_CALLABLE vec<T, N> norm() const

57729e5b   David Mayerich   changed directory...
111
112
  	{

          //compute and return the vector norm

a9275be5   David Mayerich   added vector fiel...
113
          vec<T, N> result;

57729e5b   David Mayerich   changed directory...
114
115
116
117
118
119
120
121
122
123
124
125
126
  

          //compute the vector length

          T l = len();

  

          //normalize

          for(int i=0; i<N; i++)

          {

              result.v[i] = v[i] / l;

          }

  

          return result;

  	}

  

8d4f0940   David Mayerich   ERROR in plane wa...
127
  	CUDA_CALLABLE vec<T, 3> cross(const vec<T, 3> rhs) const

57729e5b   David Mayerich   changed directory...
128
  	{

a9275be5   David Mayerich   added vector fiel...
129
  		vec<T, 3> result;

57729e5b   David Mayerich   changed directory...
130
131
  

  		//compute the cross product (only valid for 3D vectors)

8d4f0940   David Mayerich   ERROR in plane wa...
132
133
134
  		result[0] = v[1] * rhs.v[2] - v[2] * rhs.v[1];

  		result[1] = v[2] * rhs.v[0] - v[0] * rhs.v[2];

  		result[2] = v[0] * rhs.v[1] - v[1] * rhs.v[0];

57729e5b   David Mayerich   changed directory...
135
136
137
138
  

  		return result;

  	}

  

8d4f0940   David Mayerich   ERROR in plane wa...
139
      CUDA_CALLABLE T dot(vec<T, N> rhs) const

57729e5b   David Mayerich   changed directory...
140
141
142
143
144
145
146
147
148
149
150
      {

          T result = (T)0;

  

          for(int i=0; i<N; i++)

              result += v[i] * rhs.v[i];

  

          return result;

  

      }

  

  	//arithmetic

8d4f0940   David Mayerich   ERROR in plane wa...
151
  	CUDA_CALLABLE vec<T, N> operator+(vec<T, N> rhs) const

57729e5b   David Mayerich   changed directory...
152
  	{

559d0fcb   David Mayerich   wave interactions...
153
  		vec<T, N> result;

57729e5b   David Mayerich   changed directory...
154
  

559d0fcb   David Mayerich   wave interactions...
155
156
  		for(int i=0; i<N; i++)

  		    result.v[i] = v[i] + rhs.v[i];

57729e5b   David Mayerich   changed directory...
157
  

559d0fcb   David Mayerich   wave interactions...
158
159
160
161
162
163
164
165
166
167
  		return result;

  	}

  	CUDA_CALLABLE vec<T, N> operator+(T rhs) const

  	{

  		vec<T, N> result;

  

  		for(int i=0; i<N; i++)

  		    result.v[i] = v[i] + rhs;

  

  		return result;

57729e5b   David Mayerich   changed directory...
168
  	}

8d4f0940   David Mayerich   ERROR in plane wa...
169
  	CUDA_CALLABLE vec<T, N> operator-(vec<T, N> rhs) const

57729e5b   David Mayerich   changed directory...
170
  	{

a9275be5   David Mayerich   added vector fiel...
171
          vec<T, N> result;

57729e5b   David Mayerich   changed directory...
172
173
174
175
176
177
  

          for(int i=0; i<N; i++)

              result.v[i] = v[i] - rhs.v[i];

  

          return result;

  	}

8d4f0940   David Mayerich   ERROR in plane wa...
178
  	CUDA_CALLABLE vec<T, N> operator*(T rhs) const

57729e5b   David Mayerich   changed directory...
179
  	{

a9275be5   David Mayerich   added vector fiel...
180
          vec<T, N> result;

57729e5b   David Mayerich   changed directory...
181
182
183
184
185
186
  

          for(int i=0; i<N; i++)

              result.v[i] = v[i] * rhs;

  

          return result;

  	}

8d4f0940   David Mayerich   ERROR in plane wa...
187
  	CUDA_CALLABLE vec<T, N> operator/(T rhs) const

57729e5b   David Mayerich   changed directory...
188
  	{

a9275be5   David Mayerich   added vector fiel...
189
          vec<T, N> result;

57729e5b   David Mayerich   changed directory...
190
191
192
193
194
195
  

          for(int i=0; i<N; i++)

              result.v[i] = v[i] / rhs;

  

          return result;

  	}

d609550e   David Mayerich   fixed bug in plan...
196
197
198
199
200
  	CUDA_CALLABLE vec<T, N> operator*=(T rhs){

  		for(int i=0; i<N; i++)

  			v[i] = v[i] * rhs;

  		return *this;

  	}

559d0fcb   David Mayerich   wave interactions...
201
202
203
204
205
  	CUDA_CALLABLE vec<T, N> & operator=(T rhs){

  		for(int i=0; i<N; i++)

  			v[i] = rhs;

  		return *this;

  	}

ecfd14df   David Mayerich   implemented D fie...
206
207
208
209
210
211
212
  

  	template<typename Y>

  	CUDA_CALLABLE vec<T, N> & operator=(vec<Y, N> rhs){

  		for(int i=0; i<N; i++)

  			v[i] = rhs.v[i];

  		return *this;

  	}

559d0fcb   David Mayerich   wave interactions...
213
214
215
  	//unary minus

  	CUDA_CALLABLE vec<T, N> operator-() const{

  		vec<T, N> r;

57729e5b   David Mayerich   changed directory...
216
  

559d0fcb   David Mayerich   wave interactions...
217
218
219
  		//negate the vector

  		for(int i=0; i<N; i++)

  		    r.v[i] = -v[i];

a9275be5   David Mayerich   added vector fiel...
220
  

559d0fcb   David Mayerich   wave interactions...
221
222
  		return r;

  	}

a9275be5   David Mayerich   added vector fiel...
223
  

8d4f0940   David Mayerich   ERROR in plane wa...
224
  	CUDA_CALLABLE bool operator==(vec<T, N> rhs) const

57729e5b   David Mayerich   changed directory...
225
226
227
228
229
230
231
  	{

          if ( (rhs.v[0] == v[0]) && (rhs.v[1] == v[1]) && (rhs.v[2] == v[2]) )

              return true;

  

          return false;

  	}

  

ecfd14df   David Mayerich   implemented D fie...
232
  	std::string str() const

57729e5b   David Mayerich   changed directory...
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  	{

  		std::stringstream ss;

  

  		ss<<"[";

  		for(int i=0; i<N; i++)

  		{

  			ss<<v[i];

  			if(i != N-1)

  				ss<<", ";

  		}

  		ss<<"]";

  

  		return ss.str();

  	}

  

8d4f0940   David Mayerich   ERROR in plane wa...
248
249
  	//bracket operator - allows assignment to the vector

  	CUDA_CALLABLE T& operator[](const unsigned int i)

57729e5b   David Mayerich   changed directory...
250
251
252
253
254
255
256
257
258
259
  	{

          return v[i];

      }

  

  };

  

  

  }	//end namespace rts

  

  template <typename T, int N>

8a86bd56   David Mayerich   changed rts names...
260
  std::ostream& operator<<(std::ostream& os, stim::vec<T, N> v)

57729e5b   David Mayerich   changed directory...
261
  {

ecfd14df   David Mayerich   implemented D fie...
262
      os<<v.str();

57729e5b   David Mayerich   changed directory...
263
264
265
      return os;

  }

  

57729e5b   David Mayerich   changed directory...
266
  

57729e5b   David Mayerich   changed directory...
267
268
  

  template <typename T, int N>

8a86bd56   David Mayerich   changed rts names...
269
  CUDA_CALLABLE stim::vec<T, N> operator*(T lhs, stim::vec<T, N> rhs)

57729e5b   David Mayerich   changed directory...
270
  {

8a86bd56   David Mayerich   changed rts names...
271
  	stim::vec<T, N> r;

57729e5b   David Mayerich   changed directory...
272
273
274
275
276
277
278
279
280
  

      return rhs * lhs;

  }

  

  //#if __GNUC__ > 3 && __GNUC_MINOR__ > 7

  //template<class T, int N> using rtsVector = rts::vector<T, N>;

  //#endif

  

  #endif