Proto
Proto_Point.H
1 #pragma once
2 #ifndef _PROTO_POINT_Ht__
3 #define _PROTO_POINT_Ht__
4 #include "Proto_cuda.H"
5 #include "Proto_gpu.H"
6 
7 #include "Proto_PAssert.H"
8 
9 #include <iostream>
10 #include <array>
11 
12 namespace Proto
13 {
14  #ifdef PR_HDF5
15  class HDF5Handler;
16  #endif
17 
21  class Point
22  {
23  #ifdef PR_HDF5
24  friend class Proto::HDF5Handler;
25  #endif
26  public:
28 
29 
34  CUDA_DECORATION inline Point();
35 
37 
51  CUDA_DECORATION inline Point(const int (&a_tuple)[DIM]);
52 
54 
73  template<typename... vals>
74  CUDA_DECORATION inline explicit Point(vals... args) { unpack(0, args...); }
75 
77  CUDA_DECORATION inline Point(const Point& a_pt);
78 
81 
82 
85 
90  inline static Point Ones(int a_scale=1);
91 
93 
96  inline static Point Unit() { return Ones(1); }
97 
99 
102  CUDA_DECORATION
103  inline static Point Zeros();
104 
105 
107 
110  inline static Point Zeroes() { return Zeros(); }
111 
113 
116  inline static Point Zero() { return Zeros(); }
117 
119 
125  CUDA_DECORATION
126  inline static Point Basis(int a_dir, int a_scale=1);
127 
131 
134 
139  CUDA_DECORATION inline const int& operator[](unsigned char a_index) const;
140 
147  CUDA_DECORATION inline int& operator[](unsigned char a_index);
148 
150 
152 
156 
161  CUDA_DECORATION inline Point& operator=(const Point& a_rhs);
162 
164 
173  CUDA_DECORATION inline bool operator<(const Point& a_rhs) const;
174 
176 
182  CUDA_DECORATION inline bool operator==(const Point& a_pt) const;
183 
185 
190  CUDA_DECORATION inline bool operator!=(const Point& a_pt) const;
191 
193 
198  CUDA_DECORATION inline Point operator+(const Point& a_rhs) const;
199 
207  CUDA_DECORATION inline Point operator-(const Point& a_rhs) const;
208 
210 
216  CUDA_DECORATION inline Point operator*(const Point& a_pt) const;
217 
219 
226  CUDA_DECORATION inline Point operator/(const Point& a_pt) const;
227 
229 
236  CUDA_DECORATION inline Point operator%(const Point& a_pt) const;
237 
244  inline Point operator+(int a_nref) const;
247 
252  inline Point operator-(int a_nref) const;
253 
255 
260  inline Point operator*(int a_nref) const;
261 
269  inline Point operator/(int a_nref) const;
270 
272 
278  inline Point operator%(int a_nref) const;
279 
281  CUDA_DECORATION inline void operator+=(const Point& a_pt);
284  CUDA_DECORATION inline void operator-=(const Point& a_pt);
285 
287  CUDA_DECORATION inline void operator*=(const Point& a_pt);
288 
290 
295  CUDA_DECORATION inline void operator/=(const Point& a_pt);
296 
298  CUDA_DECORATION inline void operator%=(const Point& a_pt);
299 
301  inline void operator+=(int a_n);
302 
304  inline void operator-=(int a_n);
305 
307  inline void operator*=(int a_n);
308 
310 
313  inline void operator/=(int a_n);
314 
316  inline void operator%=(int a_n);
318 
324  inline Point coarsen(unsigned int a_refRatio) const;
325 
326 
327 
328  inline size_t linearSize() const
329  {
330  size_t retval = DIM*sizeof(int);
331  return retval;
332  }
333 
334  inline void linearOut(char* a_buf) const
335  {
336  int* intbuf = (int *) a_buf;
337  for(int idir = 0; idir < DIM; idir++)
338  {
339  intbuf[idir] = m_tuple[idir];
340  }
341  }
342 
343  inline void linearIn(const char* a_buf)
344  {
345  const int* intbuf = (int *) a_buf;
346  for(int idir = 0; idir < DIM; idir++)
347  {
348  m_tuple[idir] = intbuf[idir];
349  }
350  }
351 
353 
356  inline int sum() const;
357 
359 
362  inline int absSum() const;
365 
366 
369 
372  inline void print() const;
373 
375 
376  int m_tuple[DIM];
377 
378  private:
379 
380  template<typename... vars>
381  CUDA_DECORATION inline void unpack(int D, int i, vars... args)
382  {
383  if (D < DIM)
384  {
385  m_tuple[D] = i;
386  unpack(D+1, args...);
387  }
388  }
389  }; //end class Point
390 
391  template<>
392  CUDA_DECORATION
393  inline void Point::unpack(int D, int i)
394  {
395  if (D < DIM)
396  {
397  m_tuple[D] = i;
398  }
399  }
400 
402 
403 
406  inline std::ostream& operator <<(std::ostream& a_os, const Point& a_pt)
407  {
408  a_os << "(" ;
409  for (int dir = 0; dir < DIM; dir++)
410  {
411  a_os << a_pt[dir];
412  if(a_pt[dir] < 10)
413  {
414  a_os << " ";
415  }
416  if (dir < DIM-1)
417  {
418  a_os << ",";
419  }
420  }
421  a_os << ")";
422  return a_os;
423  }
424 
426  inline Point operator*(int a_scale, Point a_pt)
427  {
428  return (a_pt*a_scale);
429  }
430 
432  inline Point operator-(Point a_pt)
433  {
434  return a_pt*(-1);
435  }
436 
438 
439 #include "implem/Proto_PointImplem.H"
440 } //end namespace Proto
441 #endif //end include guard
CUDA_DECORATION void operator*=(const Point &a_pt)
In Place Componentwise Multiplication Operator.
Definition: Proto_Point.H:251
Definition: Proto_HDF5.H:9
Point coarsen(unsigned int a_refRatio) const
Coarsen Operator.
Definition: Proto_Point.H:292
CUDA_DECORATION void operator+=(const Point &a_pt)
In Place Componentwise Addition Operator.
Definition: Proto_Point.H:239
CUDA_DECORATION const int & operator[](unsigned char a_index) const
Get Component (Const)
Definition: Proto_Point.H:56
CUDA_DECORATION Point & operator=(const Point &a_rhs)
Asignment Operator.
Definition: Proto_Point.H:78
CUDA_DECORATION bool operator!=(const Point &a_pt) const
Inequality Operator.
Definition: Proto_Point.H:112
CUDA_DECORATION Point operator-(const Point &a_rhs) const
Componentwise Point Subtraction Operator.
Definition: Proto_Point.H:130
std::ostream & operator<<(std::ostream &a_os, const Box &a_box)
OStream Operator.
Definition: Proto_Box.H:850
CUDA_DECORATION Point operator%(const Point &a_pt) const
Componentwise Point Modulus Operator.
Definition: Proto_Point.H:184
CUDA_DECORATION Point operator+(const Point &a_rhs) const
Componentwise Point Addition Operator.
Definition: Proto_Point.H:118
CUDA_DECORATION Point(vals... args)
Variadic Constructor.
Definition: Proto_Point.H:74
static CUDA_DECORATION Point Zeros()
Get Zeros.
Definition: Proto_Point.H:37
CUDA_DECORATION Point operator/(const Point &a_pt) const
Componentwise Point Division Operator.
Definition: Proto_Point.H:153
static Point Zeroes()
Get Zeros (Pedantic Spelling)
Definition: Proto_Point.H:110
static CUDA_DECORATION Point Basis(int a_dir, int a_scale=1)
Get Basis.
Definition: Proto_Point.H:48
CUDA_DECORATION void operator/=(const Point &a_pt)
In Place Componentwise Division Operator.
Definition: Proto_Point.H:257
CUDA_DECORATION Point operator*(const Point &a_pt) const
Componentwise Point Multiplication Operator.
Definition: Proto_Point.H:142
static Point Zero()
Get Zeros (Alternate Spelling)
Definition: Proto_Point.H:116
CUDA_DECORATION bool operator==(const Point &a_pt) const
Equality Operator.
Definition: Proto_Point.H:101
CUDA_DECORATION Point()
Definition: Proto_Point.H:4
Definition: Proto_Box.H:11
Integer Valued Vector.
Definition: Proto_Point.H:21
static Point Ones(int a_scale=1)
Get Ones.
Definition: Proto_Point.H:25
CUDA_DECORATION bool operator<(const Point &a_rhs) const
Less-Than Operator.
Definition: Proto_Point.H:88
int sum() const
Sum Operator.
Definition: Proto_Point.H:304
CUDA_DECORATION void operator%=(const Point &a_pt)
In Place Componentwise Modulus Operator.
Definition: Proto_Point.H:263
CUDA_DECORATION void operator-=(const Point &a_pt)
In Place Componentwise Subtraction Operator.
Definition: Proto_Point.H:245
int absSum() const
Absolute Value Sum Operator.
Definition: Proto_Point.H:313
void print() const
Print Function.
Definition: Proto_Point.H:322
int m_tuple[DIM]
Integer coordinates of the Point.
Definition: Proto_Point.H:376
static Point Unit()
Get Unit Point.
Definition: Proto_Point.H:96