OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
TwoDGrid.h
Go to the documentation of this file.
1 // MAUS WARNING: THIS IS LEGACY CODE.
2 #ifndef Mesh_hh
3 #define Mesh_hh
4 
5 #include <vector>
6 #include <algorithm>
7 #include <math.h>
8 #include <ostream>
9 
10 #include "src/legacy/Interface/Meshing/Mesh.hh"
11 #include "src/legacy/Interface/Meshing/ThreeDGrid.hh"
12 
13 //Holds grid info for 2dTo1d interpolation algorithm;
14 //also controls memory usage (essentially a boost::shared_pointer but not as elegent);
15 class TwoDGrid : public Mesh
16 {
17 public:
18  class Iterator;
19  //get value
20  Mesh * Clone() {return new TwoDGrid(*this);}
21  Mesh * Dual () {return NULL;}
22  //ERROR SHOULD NOT ALLOW MESH WITH 1 GRID POINT (causes error in LowerBound)
23  TwoDGrid();
24  TwoDGrid(double dX, double dY, double minX, double minY, int numberOfXCoords, int numberOfYCoords);
25  TwoDGrid(int xSize, const double *x, int ySize, const double *y);
26  TwoDGrid(std::vector<double> x, std::vector<double> y);
27  ~TwoDGrid();
28  //get coordinate; round bracket indexing starts at 1 goes to nCoords
29  inline double& x (const int& i) {return _x[i-1];}
30  inline double& y (const int& j) {return _y[j-1];}
31  inline const double& x (const int& i) const {return _x[i-1];}
32  inline const double& y (const int& j) const {return _y[j-1];}
33  inline int xSize() const {return int(_x.size());}
34  inline int ySize() const {return int(_y.size());}
35 
36  std::vector<double> xVector() {return std::vector<double>(_x);}
37  std::vector<double> yVector() {return std::vector<double>(_y);}
38 
39  double* newXArray() {double *x = new double[_x.size()]; for(unsigned int i=0; i<_x.size(); i++) x[i]=_x[i]; return x;}
40  double* newYArray() {double *y = new double[_y.size()]; for(unsigned int i=0; i<_y.size(); i++) y[i]=_y[i]; return y;}
41 
42  //if you are sure the grid has constant spacing ConstSpacing is quicker; VarSpacing in either case
43  //return lower bound on x for insertion i.e. 0 if x < x[1], 1 if x[1] < x < x[2], ... , x.size()-1 if x > x.back()
44  inline void xLowerBound (const double& x, int& xIndex) const
45  {if(_constantSpacing) xIndex = static_cast<int>(floor( (x - _x[0])/(_x[1]-_x[0]) )); else xIndex = std::lower_bound(_x.begin(), _x.end(), x)-_x.begin()-1;}
46  inline void yLowerBound (const double& y, int& yIndex) const
47  {if(_constantSpacing) yIndex = static_cast<int>(floor( (y - _y[0])/(_y[1]-_y[0]) )); else yIndex = std::lower_bound(_y.begin(), _y.end(), y)-_y.begin()-1;}
48  inline void LowerBound (const double& x, int& xIndex, const double& y, int& yIndex) const
49  {xLowerBound(x, xIndex); yLowerBound(y, yIndex);}
50 
51  inline double MinX() const {return _x[0];}
52  inline double MaxX() const {return _x[_xSize-1];}
53  inline double MinY() const {return _y[0];}
54  inline double MaxY() const {return _y[_ySize-1];}
55 
56  void Add (VectorMap* map); //add *map if it has not already been added
57  void Remove(VectorMap* map); //remove *map if it exists; delete this if there are no more VectorMaps
58 
59  void SetX(int nXCoords, double * x) {_x = std::vector<double>(x,x+nXCoords);}
60  void SetY(int nYCoords, double * y) {_y = std::vector<double>(y,y+nYCoords);}
61 
62  Mesh::Iterator Begin() const;
63  Mesh::Iterator End() const;
64  //position of mesh point
65  virtual void Position(const Mesh::Iterator& it, double * position) const;
66  //position of centre of mesh point at it and opposite diagonal in +ve index direction
67  virtual void CentrePosition(const Mesh::Iterator& it, double * position) const;
68  int PositionDimension() const {return 2;}
69  int ToInteger(const Mesh::Iterator& lhs) const {return (lhs.State()[0]-1)*(_ySize)+lhs.State()[1]-1;}
70 
71  void SetConstantSpacing(bool spacing) {_constantSpacing = spacing;}
72  void SetConstantSpacing();
73  bool GetConstantSpacing() const {return _constantSpacing; }
74 
75  Mesh::Iterator Nearest(const double* position) const;
76 
77 protected:
78 
79  //Change position
80  Mesh::Iterator& AddEquals(Mesh::Iterator& lhs, int difference) const;
81  Mesh::Iterator& SubEquals(Mesh::Iterator& lhs, int difference) const;
82  Mesh::Iterator& AddEquals(Mesh::Iterator& lhs, const Mesh::Iterator& rhs) const;
83  Mesh::Iterator& SubEquals(Mesh::Iterator& lhs, const Mesh::Iterator& rhs) const;
84  Mesh::Iterator& AddOne (Mesh::Iterator& lhs) const;
85  Mesh::Iterator& SubOne (Mesh::Iterator& lhs) const;
86  //Check relative position
87  bool IsGreater(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs) const;
88 
89 private:
90  std::vector<double> _x;
91  std::vector<double> _y;
92  int _xSize;
93  int _ySize;
94  std::vector<VectorMap*> _maps;
96 
97  friend Mesh::Iterator operator++(Mesh::Iterator& lhs, int);
98  friend Mesh::Iterator operator--(Mesh::Iterator& lhs, int);
99  friend Mesh::Iterator& operator++(Mesh::Iterator& lhs);
100  friend Mesh::Iterator& operator--(Mesh::Iterator& lhs);
101  friend Mesh::Iterator operator- (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
102  friend Mesh::Iterator operator+ (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
103  friend Mesh::Iterator& operator-=(Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
104  friend Mesh::Iterator& operator+=(Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
105  friend Mesh::Iterator operator- (const Mesh::Iterator&, const int&);
106  friend Mesh::Iterator operator+ (const Mesh::Iterator&, const int&);
107  friend Mesh::Iterator& operator-=(Mesh::Iterator&, const int&);
108  friend Mesh::Iterator& operator+=(Mesh::Iterator&, const int&);
109 
110  friend bool operator==(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
111  friend bool operator!=(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
112  friend bool operator>=(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
113  friend bool operator<=(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
114  friend bool operator< (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
115  friend bool operator> (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
116 
117 };
118 
119 //Holds grid info for some vector mapping;
120 //also controls memory usage (essentially a boost::shared_pointer but not as elegent);
121 class NDGrid : public Mesh
122 {
123 public:
124  class Iterator;
125 
126  Mesh * Clone() {return new NDGrid(*this);}
127  Mesh * Dual () {return NULL;}
128  //get value
129  NDGrid();
130  NDGrid(int nDimensions, int* size, double* spacing, double* min);
131  NDGrid(std::vector<int> size, std::vector<const double *> gridCoordinates);
132  NDGrid(std::vector< std::vector<double> > gridCoordinates);
133  ~NDGrid() {;}
134 
135  //get coordinate; round bracket indexing starts at 1 goes to nCoords
136  inline double& coord ( const int& index, const int& dimension) {return _coord[dimension][index-1];}
137  inline const double& coord ( const int& index, const int& dimension) const {return _coord[dimension][index-1];}
138  inline int size ( const int& dimension ) const {return _coord[dimension].size();}
139  std::vector<double> coordVector( const int& dimension ) const {return _coord[dimension];}
140  double* newCoordArray ( const int& dimension ) const;
141 
142  //if you are sure the grid has constant spacing ConstSpacing is quicker; VarSpacing in either case
143  //indexing starts at 0 and goes to nCoords+1
144  inline void coordLowerBound (const double& x, const int& dimension, int& xIndex) const
145  {
146  if(_constantSpacing) xIndex = static_cast<int>(floor( (x - _coord[dimension][0])/(_coord[dimension][1]-_coord[dimension][0]) ));
147  else xIndex = std::lower_bound(_coord[dimension].begin(), _coord[dimension].end(), x)-_coord[dimension].begin()-1;
148  }
149 
150  inline void LowerBound (const std::vector<double>& pos, std::vector<int>& xIndex) const
151  {xIndex = std::vector<int>(pos.size()); for(unsigned int i=0; i<pos.size(); i++) coordLowerBound(pos[i], i, xIndex[i]);}
152  inline double Min (const int& dimension) const {return _coord[dimension][0];}
153  inline double Max (const int& dimension) const {return _coord[dimension][_coord[dimension].size()-1];}
154 
155  void SetCoord ( int dimension, int nCoords, double * x) {_coord[dimension] = std::vector<double>(x, x+nCoords);}
156 
157  Mesh::Iterator Begin() const {return Mesh::Iterator(std::vector<int>(_coord.size(), 1), this);}
158  Mesh::Iterator End() const {std::vector<int> end(_coord.size(), 1); end[0] = _coord[0].size()+1; return Mesh::Iterator(end, this);}
159 
160  void Position(const Mesh::Iterator& it, double * position) const {for(unsigned int i=0; i<it.State().size(); i++) position[i] = _coord[i][it[i]-1];}
161  int PositionDimension() const {return _coord.size();}
162 
163  bool GetConstantSpacing() const {return _constantSpacing;}
164  void SetConstantSpacing(bool spacing) {_constantSpacing = spacing;}
165  void SetConstantSpacing();
166  int ToInteger (const Mesh::Iterator& lhs) const;
167  Mesh::Iterator Nearest (const double* position) const;
168 
169 protected:
170 
171  //Change position
172  virtual Mesh::Iterator& AddEquals(Mesh::Iterator& lhs, int difference) const;
173  virtual Mesh::Iterator& SubEquals(Mesh::Iterator& lhs, int difference) const;
174  virtual Mesh::Iterator& AddEquals(Mesh::Iterator& lhs, const Mesh::Iterator& rhs) const;
175  virtual Mesh::Iterator& SubEquals(Mesh::Iterator& lhs, const Mesh::Iterator& rhs) const;
176  virtual Mesh::Iterator& AddOne (Mesh::Iterator& lhs) const;
177  virtual Mesh::Iterator& SubOne (Mesh::Iterator& lhs) const;
178  //Check relative position
179  virtual bool IsGreater(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs) const;
180 
181 private:
182  std::vector< std::vector<double> > _coord;
183  std::vector<VectorMap*> _maps;
185 
186  friend Mesh::Iterator operator++(Mesh::Iterator& lhs, int);
187  friend Mesh::Iterator operator--(Mesh::Iterator& lhs, int);
188  friend Mesh::Iterator& operator++(Mesh::Iterator& lhs);
189  friend Mesh::Iterator& operator--(Mesh::Iterator& lhs);
190  friend Mesh::Iterator operator- (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
191  friend Mesh::Iterator operator+ (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
192  friend Mesh::Iterator& operator-=(Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
193  friend Mesh::Iterator& operator+=(Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
194 
195  friend bool operator==(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
196  friend bool operator!=(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
197  friend bool operator>=(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
198  friend bool operator<=(const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
199  friend bool operator< (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
200  friend bool operator> (const Mesh::Iterator& lhs, const Mesh::Iterator& rhs);
201 };
202 
203 #endif
Mesh * Dual()
Definition: TwoDGrid.h:21
friend bool operator>=(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
double Max(const int &dimension) const
Definition: TwoDGrid.h:153
int PositionDimension() const
Definition: TwoDGrid.h:161
virtual Mesh::Iterator & SubOne(Mesh::Iterator &lhs) const
Definition: TwoDGrid.cpp:274
friend Mesh::Iterator operator--(Mesh::Iterator &lhs, int)
std::vector< VectorMap * > _maps
Definition: TwoDGrid.h:94
void SetConstantSpacing()
Definition: TwoDGrid.cpp:288
double & y(const int &j)
Definition: TwoDGrid.h:30
Definition: Mesh.h:35
void LowerBound(const std::vector< double > &pos, std::vector< int > &xIndex) const
Definition: TwoDGrid.h:150
friend bool operator!=(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
bool IsGreater(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs) const
Definition: TwoDGrid.cpp:109
friend Mesh::Iterator operator--(Mesh::Iterator &lhs, int)
Mesh * Clone()
Definition: TwoDGrid.h:20
friend bool operator<=(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
double & x(const int &i)
Definition: TwoDGrid.h:29
friend bool operator!=(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
void SetX(int nXCoords, double *x)
Definition: TwoDGrid.h:59
std::vector< double > xVector()
Definition: TwoDGrid.h:36
bool _constantSpacing
Definition: TwoDGrid.h:95
friend Mesh::Iterator operator-(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
double MinY() const
Definition: TwoDGrid.h:53
~NDGrid()
Definition: TwoDGrid.h:133
Mesh * Clone()
Definition: TwoDGrid.h:126
friend Mesh::Iterator operator+(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
void SetConstantSpacing(bool spacing)
Definition: TwoDGrid.h:164
int _xSize
Definition: TwoDGrid.h:92
void SetCoord(int dimension, int nCoords, double *x)
Definition: TwoDGrid.h:155
friend bool operator>(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
void SetY(int nYCoords, double *y)
Definition: TwoDGrid.h:60
void Add(VectorMap *map)
Definition: TwoDGrid.cpp:123
friend bool operator<(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
friend Mesh::Iterator operator++(Mesh::Iterator &lhs, int)
friend Mesh::Iterator operator+(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
virtual bool IsGreater(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs) const
Definition: TwoDGrid.cpp:297
virtual void Position(const Mesh::Iterator &it, double *position) const
Definition: TwoDGrid.cpp:50
std::vector< double > _x
Definition: TwoDGrid.h:90
std::vector< std::vector< double > > _coord
Definition: TwoDGrid.h:182
friend bool operator==(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
double MaxX() const
Definition: TwoDGrid.h:52
Mesh::Iterator & SubEquals(Mesh::Iterator &lhs, int difference) const
Definition: TwoDGrid.cpp:76
std::vector< double > coordVector(const int &dimension) const
Definition: TwoDGrid.h:139
virtual void CentrePosition(const Mesh::Iterator &it, double *position) const
Definition: TwoDGrid.cpp:56
double * newYArray()
Definition: TwoDGrid.h:40
double MaxY() const
Definition: TwoDGrid.h:54
Mesh::Iterator End() const
Definition: TwoDGrid.cpp:45
friend bool operator==(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
void yLowerBound(const double &y, int &yIndex) const
Definition: TwoDGrid.h:46
virtual Mesh::Iterator & AddEquals(Mesh::Iterator &lhs, int difference) const
Definition: TwoDGrid.cpp:209
virtual Mesh::Iterator & AddOne(Mesh::Iterator &lhs) const
Definition: TwoDGrid.cpp:266
const double & y(const int &j) const
Definition: TwoDGrid.h:32
void SetConstantSpacing(bool spacing)
Definition: TwoDGrid.h:71
void LowerBound(const double &x, int &xIndex, const double &y, int &yIndex) const
Definition: TwoDGrid.h:48
virtual Mesh::Iterator & SubEquals(Mesh::Iterator &lhs, int difference) const
Definition: TwoDGrid.cpp:233
NDGrid()
////// NDGrid ///////
Definition: TwoDGrid.cpp:164
Mesh::Iterator Nearest(const double *position) const
Definition: TwoDGrid.cpp:315
const double & coord(const int &index, const int &dimension) const
Definition: TwoDGrid.h:137
double MinX() const
Definition: TwoDGrid.h:51
friend bool operator>=(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
friend Mesh::Iterator & operator+=(Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Mesh::Iterator & SubOne(Mesh::Iterator &lhs) const
Definition: TwoDGrid.cpp:102
void Position(const Mesh::Iterator &it, double *position) const
Definition: TwoDGrid.h:160
friend Mesh::Iterator & operator-=(Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Mesh::Iterator Nearest(const double *position) const
Definition: TwoDGrid.cpp:140
Mesh * Dual()
Definition: TwoDGrid.h:127
std::vector< double > yVector()
Definition: TwoDGrid.h:37
bool GetConstantSpacing() const
Definition: TwoDGrid.h:163
std::vector< double > _y
Definition: TwoDGrid.h:91
int _ySize
Definition: TwoDGrid.h:93
friend Mesh::Iterator operator-(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Mesh::Iterator & AddOne(Mesh::Iterator &lhs) const
Definition: TwoDGrid.cpp:95
int size(const int &dimension) const
Definition: TwoDGrid.h:138
void coordLowerBound(const double &x, const int &dimension, int &xIndex) const
Definition: TwoDGrid.h:144
void SetConstantSpacing()
Definition: TwoDGrid.cpp:129
double * newXArray()
Definition: TwoDGrid.h:39
void Remove(VectorMap *map)
Definition: TwoDGrid.cpp:116
const double & x(const int &i) const
Definition: TwoDGrid.h:31
int ToInteger(const Mesh::Iterator &lhs) const
Definition: TwoDGrid.cpp:304
Mesh::Iterator Begin() const
Definition: TwoDGrid.cpp:40
std::vector< VectorMap * > _maps
Definition: TwoDGrid.h:183
int ToInteger(const Mesh::Iterator &lhs) const
Definition: TwoDGrid.h:69
TwoDGrid()
Definition: TwoDGrid.cpp:8
friend Mesh::Iterator operator++(Mesh::Iterator &lhs, int)
~TwoDGrid()
Definition: TwoDGrid.cpp:36
Mesh::Iterator Begin() const
Definition: TwoDGrid.h:157
friend Mesh::Iterator & operator+=(Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Mesh::Iterator End() const
Definition: TwoDGrid.h:158
int PositionDimension() const
Definition: TwoDGrid.h:68
friend bool operator<=(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
friend bool operator<(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
bool GetConstantSpacing() const
Definition: TwoDGrid.h:73
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:95
int ySize() const
Definition: TwoDGrid.h:34
friend Mesh::Iterator & operator-=(Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
void xLowerBound(const double &x, int &xIndex) const
Definition: TwoDGrid.h:44
bool _constantSpacing
Definition: TwoDGrid.h:184
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Definition: PETE.h:816
friend bool operator>(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Mesh::Iterator & AddEquals(Mesh::Iterator &lhs, int difference) const
Definition: TwoDGrid.cpp:67
double * newCoordArray(const int &dimension) const
Definition: TwoDGrid.cpp:200
double Min(const int &dimension) const
Definition: TwoDGrid.h:152
int xSize() const
Definition: TwoDGrid.h:33
double & coord(const int &index, const int &dimension)
Definition: TwoDGrid.h:136