OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
NDRegion.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 /***************************************************************************
3  *
4  * The IPPL Framework
5  *
6  *
7  * Visit http://people.web.psi.ch/adelmann/ for more details
8  *
9  ***************************************************************************/
10 
11 #ifndef NDREGION_H
12 #define NDREGION_H
13 
14 /***********************************************************************
15  * NDRegion is a simple container of N PRegion objects. It is templated
16  * on the type of data (T) and the number of PRegions (Dim). It can also
17  * be templated on the Mesh type, in order to provide a mesh for converting
18  * an NDIndex into an NDRegion.
19  ***********************************************************************/
20 
21 // include files
22 #include "Region/PRegion.h"
23 #include "Utility/PAssert.h"
24 
25 #include <iostream>
26 
27 // forward declarations
28 class Message;
29 template < class T, unsigned Dim > class NDRegion;
30 template <class T, unsigned Dim>
32 template <class T, unsigned Dim>
34 template <class T, unsigned Dim>
36 template <class T, unsigned Dim>
38 template <class T, unsigned Dim>
40 template <class T, unsigned Dim>
42 template <class T, unsigned Dim>
44 template <class T, unsigned Dim>
46 template <class T, unsigned Dim>
47 bool operator<(const NDRegion<T,Dim>&, const NDRegion<T,Dim>&);
48 template <class T, unsigned Dim>
49 bool operator==(const NDRegion<T,Dim>&, const NDRegion<T,Dim>&);
50 template <class T, unsigned Dim>
51 bool operator!=(const NDRegion<T,Dim>&, const NDRegion<T,Dim>&);
52 template < class T, unsigned Dim >
53 std::ostream& operator<<(std::ostream&, const NDRegion<T,Dim>&);
54 
55 template < class T, unsigned Dim >
56 class NDRegion {
57 
58 public:
59  // Null ctor does nothing.
60  NDRegion() {}
61 
62  // Construct from a simple array of PRegions
64  for (unsigned int i=0; i < Dim; i++)
65  p[i] = idx[i];
66  }
67 
68  // Construct from individual PRegions, for 1D thru 6D cases.
69  NDRegion(const PRegion<T>& r1) {
70  PInsist(Dim==1, "Number of arguments does not match NDRegion dimension!!");
71  p[0] = r1;
72  }
73  NDRegion(const PRegion<T>& r1, const PRegion<T>& r2) {
74  PInsist(Dim==2, "Number of arguments does not match NDRegion dimension!!");
75  p[0] = r1;
76  p[1] = r2;
77  }
78  NDRegion(const PRegion<T>& r1, const PRegion<T>& r2, const PRegion<T>& r3) {
79  PInsist(Dim==3, "Number of arguments does not match NDRegion dimension!!");
80  p[0] = r1;
81  p[1] = r2;
82  p[2] = r3;
83  }
84  NDRegion(const PRegion<T>& r1, const PRegion<T>& r2, const PRegion<T>& r3,
85  const PRegion<T>& r4) {
86  PInsist(Dim==4, "Number of arguments does not match NDRegion dimension!!");
87  p[0] = r1;
88  p[1] = r2;
89  p[2] = r3;
90  p[3] = r4;
91  }
92  NDRegion(const PRegion<T>& r1, const PRegion<T>& r2, const PRegion<T>& r3,
93  const PRegion<T>& r4, const PRegion<T>& r5) {
94  PInsist(Dim==5, "Number of arguments does not match NDRegion dimension!!");
95  p[0] = r1;
96  p[1] = r2;
97  p[2] = r3;
98  p[3] = r4;
99  p[4] = r5;
100  }
101  NDRegion(const PRegion<T>& r1, const PRegion<T>& r2, const PRegion<T>& r3,
102  const PRegion<T>& r4, const PRegion<T>& r5, const PRegion<T>& r6) {
103  PInsist(Dim==6, "Number of arguments does not match NDRegion dimension!!");
104  p[0] = r1;
105  p[1] = r2;
106  p[2] = r3;
107  p[3] = r4;
108  p[4] = r5;
109  p[5] = r6;
110  }
111 
112  // copy constructor
114  for (unsigned int i=0; i < Dim; i++)
115  p[i] = nr.p[i];
116  }
117 
118  // operator= definitions
120  for (unsigned int i=0; i < Dim; i++)
121  p[i] = nr.p[i];
122  return *this;
123  }
124 
125  // Return a reference to any of the PRegion<T> objects.
126  const PRegion<T>& operator[](unsigned d) const { return p[d]; }
127  PRegion<T>& operator[](unsigned d) { return p[d]; }
128 
129  // return the volume of this region
130  T volume() const {
131  T v = p[0].length();
132  for (unsigned int i=1; i < Dim; i++)
133  v *= p[i].length();
134  return v;
135  }
136 
137  // compute-assign operators
139  for (unsigned int i=0; i < Dim; i++)
140  p[i] += t;
141  return *this;
142  }
144  for (unsigned int i=0; i < Dim; i++)
145  p[i] -= t;
146  return *this;
147  }
149  for (unsigned int i=0; i < Dim; i++)
150  p[i] *= t;
151  return *this;
152  }
154  if (t != 0) {
155  for (unsigned int i=0; i < Dim; i++) p[i] /= t;
156  }
157  return *this;
158  }
159 
160  bool empty() const {
161  for (unsigned int i=0; i < Dim; i++)
162  if ( ! p[i].empty() )
163  return false;
164  return true;
165  }
166 
167  // useful functions with DomainMap.
169  NDRegion<T,Dim> retval;
170  for (unsigned int i=0; i < Dim; i++)
171  retval.p[i] = p[i].intersect(nr.p[i]);
172  return retval;
173  }
174 
175  bool touches(const NDRegion<T,Dim>& nr) const {
176  for (unsigned int i=0; i < Dim; i++)
177  if ( ! (p[i].touches(nr.p[i])) )
178  return false;
179  return true;
180  }
181 
182  bool contains(const NDRegion<T,Dim>& nr) const {
183  for (unsigned int i=0; i < Dim; i++)
184  if ( ! (p[i].contains(nr.p[i])) )
185  return false;
186  return true;
187  }
188 
189  // Split on dimension d, or the longest dimension.
191  unsigned d) const {
192  for (unsigned int i=0; i < Dim; i++) {
193  if (i == d) {
194  p[i].split(l.p[i], r.p[i]);
195  }
196  else {
197  l.p[i] = p[i];
198  r.p[i] = p[i];
199  }
200  }
201  return true;
202  }
203 
204  bool split(NDRegion<T,Dim>& l, NDRegion<T,Dim>& r) const {
205  // find longest dimension
206  unsigned d = 0;
207  T maxlen = p[0].length();
208  for (unsigned i=1; i < Dim; i++) {
209  if (p[i].length() > maxlen) {
210  maxlen = p[i].length();
211  d = i;
212  }
213  }
214  // split on this dimension
215  return split(l, r, d);
216  }
217 
218  // put data into a message to send to another node
220  for ( unsigned d = 0 ; d < Dim ; ++d )
221  p[d].putMessage(m);
222  return m;
223  }
224 
225  // get data out from a message
227  for ( unsigned d = 0 ; d < Dim ; ++d )
228  p[d].getMessage(m);
229  return m;
230  }
231 
232 private:
233  PRegion<T> p[Dim]; // Array of PRegions
234 
235 };
236 
237 
238 // Additive operations.
239 template <class T, unsigned Dim>
240 inline
242  NDRegion<T,Dim> retval(nr);
243  retval += t;
244  return retval;
245 }
246 template <class T, unsigned Dim>
247 inline
249  return (nr + t);
250 }
251 template <class T, unsigned Dim>
252 inline
254  return (nr + (-t));
255 }
256 template <class T, unsigned Dim>
257 inline
259  return (-nr + t);
260 }
261 
262 // Multipplicative operations.
263 template <class T, unsigned Dim>
264 inline
266  NDRegion<T,Dim> retval;
267  for (unsigned int i=0; i < Dim; i++)
268  retval[i] = -nr[i];
269  return retval;
270 }
271 template <class T, unsigned Dim>
272 inline
274  NDRegion<T,Dim> retval(nr);
275  retval *= t;
276  return retval;
277 }
278 template <class T, unsigned Dim>
279 inline
281  return (nr * t);
282 }
283 template <class T, unsigned Dim>
284 inline
286  return (t != 0 ? (nr * (1/t)) : nr);
287 }
288 
289 // Comparison operators so we can use a map container
290 // Just compare the PRegions in turn.
291 template <class T, unsigned Dim>
292 inline
293 bool operator<(const NDRegion<T,Dim>& A, const NDRegion<T,Dim>& B) {
294  for (unsigned int i=0; i < Dim; i++)
295  if ( !(A[i] < B[i]) ) return false;
296  return true;
297 }
298 template <class T, unsigned Dim>
299 inline
300 bool operator==(const NDRegion<T,Dim>& A, const NDRegion<T,Dim>& B) {
301  for (unsigned int i=0; i < Dim; i++)
302  if ( !(A[i] == B[i]) ) return false;
303  return true;
304 }
305 template <class T, unsigned Dim>
306 inline
307 bool operator!=(const NDRegion<T,Dim>& A, const NDRegion<T,Dim>& B) {
308  return !(A == B);
309 }
310 
311 // write NDRegion out to the given stream
312 template <class T, unsigned Dim>
313 inline
314 std::ostream& operator<<(std::ostream& out, const NDRegion<T,Dim>& idx) {
315  out << '{';
316  for (unsigned d = 0; d < Dim; ++d)
317  out << idx[d] << ((d==Dim-1) ? '}' : ',');
318  return out;
319 }
320 
321 
323 
324 // Build some helper objects for use in DomainMap
325 template < class T, unsigned Dim >
327 public:
329  static bool test(const NDRegion<T,Dim>& a,
330  const NDRegion<T,Dim>& b) {
331  return a.touches(b);
332  }
333 };
334 
335 template < class T, unsigned Dim >
337 public:
339  static bool test(const NDRegion<T,Dim>& a,
340  const NDRegion<T,Dim>& b) {
341  return a.contains(b);
342  }
343 };
344 
345 template < class T, unsigned Dim >
346 class SplitRegion {
347 public:
350  const NDRegion<T,Dim>& a) {
351  return a.split(l,r);
352  }
353 };
354 
355 
356 #endif // NDREGION_H
357 
358 /***************************************************************************
359  * $RCSfile: NDRegion.h,v $ $Author: adelmann $
360  * $Revision: 1.1.1.1 $ $Date: 2003/01/23 07:40:32 $
361  * IPPL_VERSION_ID: $Id: NDRegion.h,v 1.1.1.1 2003/01/23 07:40:32 adelmann Exp $
362  ***************************************************************************/
Matrix< T > operator+(const Matrix< T > &, const Matrix< T > &)
Matrix addition.
Definition: Matrix.h:275
Matrix< T > operator/(const Matrix< T > &, const T &)
Matrix divided by scalar.
Definition: Matrix.h:329
static bool test(NDRegion< T, Dim > &l, NDRegion< T, Dim > &r, const NDRegion< T, Dim > &a)
Definition: NDRegion.h:349
NDRegion< T, Dim > & operator=(const NDRegion< T, Dim > &nr)
Definition: NDRegion.h:119
Message & getMessage(Message &m)
Definition: NDRegion.h:226
Definition: rbendmap.h:8
NDRegion< T, Dim > & operator*=(const T t)
Definition: NDRegion.h:148
NDRegion(const PRegion< T > &r1, const PRegion< T > &r2)
Definition: NDRegion.h:73
const int nr
Definition: ClassicRandom.h:24
NDRegion< T, Dim > & operator-=(const T t)
Definition: NDRegion.h:143
NDRegion< T, Dim > & operator+=(const T t)
Definition: NDRegion.h:138
static bool test(const NDRegion< T, Dim > &a, const NDRegion< T, Dim > &b)
Definition: NDRegion.h:339
Matrix< T > operator*(const Matrix< T > &, const Matrix< T > &)
Matrix multiply.
Definition: Matrix.h:297
bool empty() const
Definition: NDRegion.h:160
bool contains(const NDRegion< T, Dim > &nr) const
Definition: NDRegion.h:182
NDRegion(const PRegion< T > &r1, const PRegion< T > &r2, const PRegion< T > &r3, const PRegion< T > &r4, const PRegion< T > &r5, const PRegion< T > &r6)
Definition: NDRegion.h:101
NDRegion(const NDRegion< T, Dim > &nr)
Definition: NDRegion.h:113
PRegion< T > p[Dim]
Definition: NDRegion.h:233
NDRegion< T, Dim > intersect(const NDRegion< T, Dim > &nr) const
Definition: NDRegion.h:168
NDRegion(const PRegion< T > &r1)
Definition: NDRegion.h:69
Message & putMessage(Message &m)
Definition: NDRegion.h:219
bool touches(const NDRegion< T, Dim > &nr) const
Definition: NDRegion.h:175
PRegion< T > & operator[](unsigned d)
Definition: NDRegion.h:127
bool split(NDRegion< T, Dim > &l, NDRegion< T, Dim > &r) const
Definition: NDRegion.h:204
NDRegion()
Definition: NDRegion.h:60
NDRegion(const PRegion< T > &r1, const PRegion< T > &r2, const PRegion< T > &r3)
Definition: NDRegion.h:78
bool operator!=(const Offset &off1, const Offset &off2)
Definition: Offset.cpp:225
bool split(NDRegion< T, Dim > &l, NDRegion< T, Dim > &r, unsigned d) const
Definition: NDRegion.h:190
NDRegion(const PRegion< T > &r1, const PRegion< T > &r2, const PRegion< T > &r3, const PRegion< T > &r4, const PRegion< T > &r5)
Definition: NDRegion.h:92
NDRegion(PRegion< T > *idx)
Definition: NDRegion.h:63
const PRegion< T > & operator[](unsigned d) const
Definition: NDRegion.h:126
NDRegion< T, Dim > & operator/=(const T t)
Definition: NDRegion.h:153
static bool test(const NDRegion< T, Dim > &a, const NDRegion< T, Dim > &b)
Definition: NDRegion.h:329
#define PInsist(c, m)
Definition: PAssert.h:135
const unsigned Dim
Matrix< T > operator-(const Matrix< T > &, const Matrix< T > &)
Matrix subtraction.
Definition: Matrix.h:282
NDRegion(const PRegion< T > &r1, const PRegion< T > &r2, const PRegion< T > &r3, const PRegion< T > &r4)
Definition: NDRegion.h:84
T volume() const
Definition: NDRegion.h:130
bool operator==(const TwoPolynomial &left, const TwoPolynomial &right)