Chombo + EB + MF  3.2
BoxLayout.H
Go to the documentation of this file.
1 #ifdef CH_LANG_CC
2 /*
3  * _______ __
4  * / ___/ / ___ __ _ / / ___
5  * / /__/ _ \/ _ \/ V \/ _ \/ _ \
6  * \___/_//_/\___/_/_/_/_.__/\___/
7  * Please refer to Copyright.txt, in Chombo's root directory.
8  */
9 #endif
10 
11 #ifndef _BOXLAYOUT_H_
12 #define _BOXLAYOUT_H_
13 
14 #include "Box.H"
15 #include "Vector.H"
16 #include "RefCountedPtr.H"
17 #include "DataIndex.H"
18 #include "SPMD.H"
19 #include "LoHiSide.H"
20 #include "ProblemDomain.H"
21 #include "NamespaceHeader.H"
22 
23 class DataIterator;
24 class TimedDataIterator;
25 class LayoutIterator;
26 template<class T> class LayoutData;
27 
28 ///Base class to transform boxes in an existing layout
29 /**
30  If you want to do something esoteric to each box in a layout and preserve
31  its ordering and proc assignment, here is what you do.
32  Define your own transformation that inherits from this and here is
33  what the code will look like.
34 
35  class MyTransform: public BaseTransform
36  {
37  virtual Box operator()(const Box& a_inputBox)
38  {
39  ///do what you need to output the box you want given the input
40  }
41  };
42 
43  BoxLayout bl1; //fill this one with starting layout
44  BoxLayout bl2 = bl1;
45  MyTransform mytrans;
46  bl2.transform(mytrans);
47  */
49 {
50 public:
51  ///
52  virtual Box operator()(const Box& a_inputBox) = 0;
53 
54  ///apparently I have to declare this to make some compilers happy.
55  virtual ~BaseTransform()
56  {
57  ;
58  }
59 };
60 
61 struct Entry
62 {
64  :
65  m_procID(procID())
66  {}
67 
68  Entry(const Box& a_box)
69  :
70  box(a_box),
71  m_procID(procID())
72  {}
73 
74  Entry(const Box& a_box, const unsigned int a_index)
75  :
76  box(a_box),
77  m_procID(procID())
78  {}
79 
80  bool operator < (const Entry& rhs) const
81  {
82  return box < rhs.box;
83  }
84 
86  unsigned int m_procID;// not used in serial code.
87 };
88 
89 ///A not-necessarily-disjoint collective of boxes.
90 /**
91  A BoxLayout is a collection of Box objects that are assigned
92  to process numbers. Each box is associated with only one
93  process. Processes are numbered from 0 to n-1 (for a job with
94  n processes).
95 
96  A BoxLayout can be either open or closed.
97 
98  Open BoxLayout:
99  - Created by null construction or deepCopy.
100  - Boxes may be added to it.
101  - Non-const operations may be performed on the boxes in it.
102 
103  Closed BoxLayout:
104  - Created by constructor with vectors of Boxes and processors given explicitly.
105  - Cannot be modified.
106  - Represented as sorted boxes.
107  - Many uses of BoxLayouts require a closed BoxLayout.
108 
109  <b>Ref-counting</b>
110 
111  BoxLayout is an explicitly ref-counted object.
112 
113  Assignment and copy are compiler-generated. They increment the refcount
114  on the contained data members. They perform shallow, ref-counted
115  operations.
116 
117  Refcounting is a process whereby multiple instantiations make
118  use of a single implementation of that object and keep a tally
119  of how many instantiations are sharing. Thus:
120  <PRE>
121 
122  BoxLayout b1(boxes, procIDs);
123 
124  b1 ----> refcount = 1
125  ----> m_boxes
126  ----> m_processors
127 
128  BoxLayout b2(b1)
129 
130  b1 ----> refcount = 2 <---- b2
131  ----> m_boxes <----
132  ----> m_processors <----
133 
134  BoxLayout b3;
135  b3 = b2;
136 
137  b1 ----> refcount = 3 <---- b2
138  ----> m_boxes <----
139  ----> m_processors <----
140  ^^^
141  |||
142  b3
143  </PRE>
144 */
146 {
147 public:
148 
149  /**
150  \name Constructors, destructors, assignments, defines
151  */
152  /*@{*/
153 
154  ///
155  /**
156  Construct BoxLayout with no boxes.
157  */
158  BoxLayout();
159 
160  ///
161  /** Construct from a Vector of Boxes and a Vector of
162  processor assignments. On exit, the BoxLayout will be closed.
163  */
164  BoxLayout(const Vector<Box>& a_boxes,
165  const Vector<int>& a_procIDs);
166 
167  ///
168  /** Construct from a LayoutData<Box>.
169  On exit, the BoxLayout will be closed.
170  */
171  BoxLayout(const LayoutData<Box>& a_newLayout);
172 
173  ///
174  void transform(BaseTransform& a_transform);
175 
176  ///
177  /**
178  Ref-counted destruction. Once the last reference to the
179  implementation of this class is destroyed, the data members
180  are cleaned up
181  */
182  virtual
183  ~BoxLayout();
184 
185  ///
186  /**
187  Ref-counted assignment.
188  */
189  BoxLayout& operator=(const BoxLayout& a_rhs);
190 
191  ///
192  /** Define this BoxLayout from a Vector of Boxes and a
193  Vector of processor assignments. Any pre-existing layout will
194  be lost (ref-count dropped by one). The processor assignment Vector
195  must be the same length
196  as the Box Vector. On exit, the BoxLayout will be closed.
197  */
198  virtual void
199  define(const Vector<Box>& a_boxes,
200  const Vector<int>& a_procIDs);
201 
202  ///
203  /** Define this BoxLayout from a LayoutData<Box>.
204  We can iterate through the new BoxLayout by the same iterator as
205  through the underlying BoxLayout of the LayoutData<Box>.
206  Each Box in the new BoxLayout is in the same position as
207  each Box in the LayoutData<Box>.
208  On exit, the BoxLayout will be closed, and NOT re-sorted.
209  */
210  virtual void define(const LayoutData<Box>& a_newLayout);
211 
212  /*@}*/
213 
214  /**
215  \name Accessors
216  */
217  /*@{*/
218 
219  ///
220  /** const accessor operator. See also get(const LayoutIndex&).
221  */
222  Box
223  operator[](const LayoutIndex& it) const;
224 
225  ///
226  /** accessor operator. See also get(const LayoutIndex&).
227  */
228  Box
229  operator[](const LayoutIterator& it) const;
230 
231  ///
232  /** accessor operator. See also get(const LayoutIndex&).
233  */
234  Box
235  operator[](const DataIterator& it) const;
236 
237  ///
238  /** Get box indexed by <i>it</i>.
239 
240  As a consequence of the C++ compiler being free to choose which
241  version of operator[] when the object is technically non-const, we very
242  often get 'BoxLayout closed' errors.
243  This is a non-overloaded get method.
244  */
245  Box get(const LayoutIndex& it) const;
246 
247  ///
248  /** Get box indexed by <i>it</i>. equivalent to get(it()), just does the extra() for you.
249  */
250  Box get(const DataIterator& it) const;
251 
252  ///
253  /** Get box indexed by <i>it</i>. equivalent to get(it()), just does the extra() for you.
254  */
255  Box get(const LayoutIterator& it) const;
256 
257  ///
258  /** Returns the processor to which this box has been assigned.
259  Not a user function, at least, not a new user function. It can
260  be used safely at anytime, closed or open. A person needing this
261  level of knowledge of the processor assignment should have non-trivial
262  needs, like writing your own load balancer or such.
263  Most user-level parallel
264 
265  */
266  unsigned int
267  procID(const LayoutIndex& a_index) const ;
268 
269  /// Checks whether this layout has the same boxes in the same order as a_layout.
270  /** Checks whether this layout has the same boxes in the same order as a_layout.
271  */
272  bool sameBoxes(const BoxLayout& a_layout) const;
273 
274  /// Returns the number of boxes assigned to a given procID.
275  /** Returns the number of boxes assigned to a given procID.
276  */
277  int numBoxes(const int procID) const;
278 
279  /// Return number of cells in all boxes of entire box layout
280  long long numCells() const;
281 
282  /// Returns the total number of boxes in the BoxLayout.
283  /** Returns the total number of boxes in the BoxLayout.
284  */
285  unsigned int
286  size() const ;
287 
288  /** Not a user function. Used in I/O routine.
289  */
290  unsigned int index(const LayoutIndex& index) const;
291 
292  unsigned int lindex(const DataIndex& index) const;
293  /*@}*/
294 
295  /**
296  \name Checks
297  */
298  /*@{*/
299 
300  ///
301  /** Refcounted pointer check. Return <tt>true</tt> if these two objects
302  share the same implementation.
303  */
304  inline bool ptrEqual(const BoxLayout& rhs) const;
305 
306  /// check to see if BoxLayouts are equivalent
307  inline bool
308  operator==(const BoxLayout& rhs) const ;
309 
310  /**
311  RefCounted pointer compare. Need this to use DisjointBoxLayout as a Key in a std::map
312  */
313  inline bool operator<(const BoxLayout& rhs) const ;
314 
315  /**
316  current ref count for this object
317  */
318  int refCount() const
319  {
320  return m_boxes.refCount();
321  }
322  ///
323  /** Refcounted pointer check. Return <tt>true</tt> if these two objects
324  share the same implementation.
325  */
326  bool eq(const BoxLayout& rhs) const
327  {
328  return *this == rhs;
329  }
330 
331  /** Return <tt>true</tt> if close() has been called.
332  Closed BoxLayout is always sorted.
333  */
334  bool
335  isClosed() const;
336 
337  ///
338  /** Return <tt>true</tt> if sort() has been called.
339  */
340  bool
341  isSorted() const
342  {
343  return *m_sorted;
344  }
345 
346  /** not a user function
347  */
348  bool check(const LayoutIndex& index) const
349  { return index.m_layoutIntPtr == m_layout;}
350 
351  ///
352  /**
353  returns 'true' if you can use the same LayoutIterator and DataIterator on these
354  two layouts and data holders built on top of these layouts
355  */
356  bool compatible(const BoxLayout& a_rhs) const
357  {
358  return m_layout == a_rhs.m_layout;
359  }
360 
361  /*@}*/
362 
363  /**
364  \name Modification functions
365  */
366  /*@{*/
367 
368  ///
369  /** Mark this BoxLayout as complete and unchangeable.
370  */
371  virtual void
372  close();
373 
374  // not for general consumption.
375  virtual void
376  closeNoSort();
377 
378  ///
379  /** Actual deep copy operation. New object created with copied
380  data. This object disassociates itself with original implementation
381  safely. This object now is considered 'open' and can be non-const
382  modified. There is no assurance that the order in which this BoxLayout
383  is indexed corresponds to the indexing of <i>a_source</i>.
384 <PRE>
385  BoxLayout b1(boxes, procIDs);
386 
387  b1 ----> refcount = 1
388  ----> m_boxes
389  ----> m_processors
390 
391  BoxLayout b2(b1)
392 
393  b1 ----> refcount = 2 <---- b2
394  ----> m_boxes <----
395  ----> m_processors <----
396 
397  BoxLayout b3;
398  b3.deepCopy(b2);
399  b1 ----> refcount = 2 <---- b2 b3 ----> refcount = 1
400  ----> m_boxes <---- ----> m_boxes
401  ----> m_processors <---- ----> m_processors
402 </PRE>
403  */
404  virtual void
405  deepCopy(const BoxLayout& a_source);
406 
407  ///
408  /**
409  returns true iff:
410  - every Box in the BoxLayout can be coarsened by refRatio and return back
411  to the original Box when refined by refRatio.
412  - refRatio must be a positive non-zero integer.
413  */
414  bool coarsenable(int refRatio) const;
415 
416 
417  ///
418  /**
419  returns true iff:
420  - every Box in the BoxLayout can be coarsened by refRatio and return back
421  to the original Box when refined by refRatio.
422  - refRatio must be an IntVect with positive non-zero integer components.
423  */
424  bool coarsenable(IntVect refRatio) const;
425 
426  ///
427  /**
428  Coarsen a BoxLayout:
429  - <i>output</i> must be open
430  - <i>input</i> must be closed
431  - <i>refinement</i> must be a positive non-zero integer
432  - <i>output</i> and <i>input</i> do not share an
433  implementation.
434 
435  <i>output</i> is first deepCopy'ed from <i>input</i>,
436  then coarsen(refinement) is called on each box of <i>output</i>.
437 
438  <i>output</i> returns from this function closed.
439 
440  LayoutIterators and DataIterators from <i>input</i> and <i>output</i>
441  can be used interchangeably.
442  */
443  friend void coarsen(BoxLayout& output,
444  const BoxLayout& input,
445  int refinement);
446 
447  ///same idea but with anisotropic refinement
448  friend void coarsen(BoxLayout& output,
449  const BoxLayout& input,
450  const IntVect& refinement);
451 
452  ///
453  /**
454  if a_sd == side::lo, do growLo, else do grow hi with the other arguments.
455  */
456  void growSide(int idir, int length, Side::LoHiSide a_sd);
457 
458  ///
459  /**
460  Do surroundingNodes on each box.
461  */
462  void surroundingNodes();
463 
464  ///
465  /**
466  multiblock stuff.
467  */
468  void convertOldToNew(const IntVect& a_permutation,
469  const IntVect& a_sign,
470  const IntVect& a_translation);
471 
472  ///
473  /**
474  multiblock stuff.
475  */
476  void convertNewToOld(const IntVect& a_permutation,
477  const IntVect& a_sign,
478  const IntVect& a_translation);
479 
480  ///
481  /**
482  Do enclosedCells on each box.
483  */
484  void enclosedCells();
485 
486  ///
487  /**
488  coarsen each box by a_ref
489  */
490  void coarsen(int a_ref);
491 
492  ///
493  /**
494  refine each box by a_ref
495  */
496  void refine(int a_ref);
497 
498  ///
499  /**
500  grow each box by a_growth
501  */
502  void grow(int a_growth);
503 
504  ///
505  /**
506  grow each box by a_growth
507  */
508  void grow(IntVect a_growth);
509 
510  ///
511  /**
512  grow each box in a_dir by a_growth
513  */
514  void grow(int a_dir, int a_growth);
515 
516  ///
517  /**
518  shift each box by a_iv
519  */
520  void shift(const IntVect& a_iv);
521 
522  ///
523  /**
524  shift each box by a_iv
525  */
526  void shiftHalf(const IntVect& a_iv);
527 
528  ///
529  /**
530  set each box to the appropriate adjCellSide call
531  if a_sd == side::lo, do adjCellLo, else do adjCellhi with the other arguments.
532  */
533  void adjCellSide(int a_dir, int a_len, Side::LoHiSide a_sd);
534 
535  ///
536  /**
537  intersect all boxes with incoming box
538  */
539  void operator&= (const Box& a_box);
540 
541  ///
542  /**
543  intersect all boxes with incoming box
544  */
545  void operator&= (const ProblemDomain& a_domain);
546 
547  ///
548  /**
549  Refine a BoxLayout:
550  - <i>output</i> must be open
551  - <i>input</i> must be closed
552  - <i>refinement</i> must be a positive non-zero integer
553  - <i>output</i> and <i>input</i> do not share an
554  implementation.
555 
556  <i>output</i> is first deepCopy'ed from <i>input</i>,
557  then refine(refinement) is called on each box of <i>output</i>.
558 
559  <i>output</i> returns from this function closed.
560 
561  LayoutIterators and DataIterators from <i>input</i> and <i>output</i>
562  can be used interchangeably.
563  */
564  friend void refine(BoxLayout& output,
565  const BoxLayout& input,
566  int refinement);
567 
568  /// same idea but now with anisotropic refinement. now how much would you pay?
569  friend void refine(BoxLayout& output,
570  const BoxLayout& input,
571  const IntVect& refinement);
572 
573  ///
574  /** Assign a Box in the BoxLayout to a processor.
575  Requires the BoxLayout to be open.
576  */
577  void
578  setProcID(const LayoutIndex& a_index, unsigned int a_procID);
579 
580  //const or non-const operation ?.....I can think of usages either way...bvs
581  ///
582  /**
583  Sort the boxes of an open BoxLayout.
584  No change if the BoxLayout is closed.
585  */
586  void
587  sort();
588 
589  /*@}*/
590 
591  /**
592  \name Iterators
593  */
594  /*@{*/
595 
596  ///Parallel iterator.
597  /** Parallel iterator.
598 
599  Returns DataIndex object that corresponds to boxes
600  on the local processor only. */
602  dataIterator() const;
603 
604  ///
606  timedDataIterator() const;
607 
608  ///Iterator that processes through ALL the boxes in a BoxLayout.
609  /** Iterator that processes through ALL the boxes in a BoxLayout.
610 
611  If BoxLayout is closed, then LayoutIterator will return
612  the Boxes in sorted order. */
614  layoutIterator() const;
615 
616  /*@}*/
617 
618  /**
619  \name I/O functions
620  */
621  /*@{*/
622 
623  ///
624  /**
625  Invokes cout<<*this; pretty-print dump of BoxLayout.
626  */
627  void
628  print() const;
629 
630  ///
631  /**
632  Invokes cout<<*this; pretty-print dump of BoxLayout.
633  */
634  void p() const
635  {
636  print();
637  }
638 
639  /*@}*/
640 
641  /* Return all the constituent boxes. */
642  Vector<Box> boxArray() const;
643 
644  /** Return the processor id numbers corresponding to the boxes as returned by
645  * this->boxArray().
646  */
647  Vector<int> procIDs() const;
648 
649  inline unsigned int indexI(const LayoutIndex&) const;
650 
651  const Vector<Entry>* rawPtr() const
652  {
653  return m_boxes;
654  }
655 protected:
656 
657  void buildDataIndex();
658  friend class LayoutIterator;
659  friend class DataIterator;
660 
667 
668 #ifdef CH_MPI
669  RefCountedPtr<Vector<DataIndex> > m_dataIndex;
670 #endif
671 
672  void checkDefine(const Vector<Box>& a_boxes, const Vector<int>& procIDs);
673 private:
674 
675 };
676 
677 void coarsen_bl(BoxLayout& output, const BoxLayout& input, int refinement);
678 
679 void refine_bl(BoxLayout& output, const BoxLayout& input, int refinement);
680 
681 inline
682 void coarsen_bl(BoxLayout& output, const BoxLayout& input, int refinement)
683 {
684  coarsen(output, input, refinement);
685 }
686 
687 inline
688 void refine_bl(BoxLayout& output, const BoxLayout& input, int refinement)
689 {
690  refine(output, input, refinement);
691 }
692 
693 void mortonOrdering(Vector<Box>& a_boxes);
694 void serialMortonOrdering(Vector<Box>& a_boxes);
695 
696 //========================================================
697 
698 inline Box
699 BoxLayout::operator[](const LayoutIndex& a_layoutIndex) const
700 {
701  CH_assert(check(a_layoutIndex));// make sure this LayoutIndex came from my own iterator
702  return m_boxes->operator[](a_layoutIndex.m_index).box;
703 }
704 
705 
706 ///
707 /** Refcounted pointer check. Return <tt>true</tt> if these two objects
708  share the same implementation.
709 */
710 inline bool
712 {
713  return((m_layout==rhs.m_layout) && (m_boxes==rhs.m_boxes));
714 }
715 
716 inline bool
718 {
719  bool firstcomp = (m_layout == rhs.m_layout);
720  bool secondcomp = true;
721  if((m_boxes->size() >0) && (rhs.m_boxes->size() > 0))
722  {
723  secondcomp = (m_boxes->operator[](0).box == rhs.m_boxes->operator[](0).box);
724  }
725 
726  return (firstcomp && secondcomp);
727 }
728 
729 inline bool
731 {
732  if(*this == rhs) return false;
733  if(m_layout == rhs.m_layout) return m_boxes->operator[](0).box.numPts() < rhs.m_boxes->operator[](0).box.numPts();
734  return m_layout < rhs.m_layout;
735 }
736 
737 // member functions
738 // ================
739 
740 inline Box
741 BoxLayout::get(const LayoutIndex& a_layoutIndex) const
742 {
743  CH_assert(check(a_layoutIndex)); // make sure this LayoutIndex came from my own iterator
744  return m_boxes->operator[](a_layoutIndex.m_index).box;
745 }
746 
747 inline unsigned int
748 BoxLayout::index(const LayoutIndex& a_layoutIndex) const
749 {
750  return a_layoutIndex.m_index;
751 }
752 
753 inline bool
755 {
756  return *m_closed;
757 }
758 
759 inline unsigned int
760 BoxLayout::procID(const LayoutIndex& a_layoutIndex) const
761 {
762  CH_assert(check(a_layoutIndex));
763  return m_boxes->operator[](a_layoutIndex.m_index).m_procID;
764 }
765 
766 inline void
767 BoxLayout::setProcID(const LayoutIndex& a_layoutIndex, unsigned int a_procID)
768 {
769  CH_assert(check(a_layoutIndex));
770  m_boxes->operator[](a_layoutIndex.m_index).m_procID = a_procID;
771 }
772 
773 // global functions
774 // ================
775 
776 std::ostream& operator<<(std::ostream& os, const BoxLayout& a_layout);
777 
778 #include "NamespaceFooter.H"
779 
780 #endif
bool operator<(const BoxLayout &rhs) const
Definition: BoxLayout.H:730
Base class to transform boxes in an existing layout.
Definition: BoxLayout.H:48
bool compatible(const BoxLayout &a_rhs) const
Definition: BoxLayout.H:356
A reference-counting handle class.
Definition: RefCountedPtr.H:173
#define CH_assert(cond)
Definition: CHArray.H:37
Box refine(const Box &b, const IntVect &refinement_ratio)
A class to facilitate interaction with physical boundary conditions.
Definition: ProblemDomain.H:141
RefCountedPtr< bool > m_closed
Definition: BoxLayout.H:663
A not-necessarily-disjoint collective of boxes.
Definition: BoxLayout.H:145
Data that maintains a one-to-one mapping of T to the boxes in a BoxLayout.
Definition: BoxLayout.H:26
Entry()
Definition: BoxLayout.H:63
void refine_bl(BoxLayout &output, const BoxLayout &input, int refinement)
Definition: BoxLayout.H:688
std::ostream & operator<<(std::ostream &os, const BoxLayout &a_layout)
Box box
Definition: BoxLayout.H:85
bool operator==(const BoxLayout &rhs) const
check to see if BoxLayouts are equivalent
Definition: BoxLayout.H:717
int refCount() const
Definition: BoxLayout.H:318
Definition: DataIterator.H:190
void p() const
Definition: BoxLayout.H:634
RefCountedPtr< Vector< LayoutIndex > > m_indicies
Definition: BoxLayout.H:666
An Iterator based on a BoxLayout object.
Definition: LayoutIterator.H:35
RefCountedPtr< int > m_layout
Definition: BoxLayout.H:662
Definition: EBInterface.H:45
const Vector< Entry > * rawPtr() const
Definition: BoxLayout.H:651
void coarsen_bl(BoxLayout &output, const BoxLayout &input, int refinement)
Definition: BoxLayout.H:682
IndexTM< T, N > coarsen(const IndexTM< T, N > &a_p, T a_s)
Definition: IndexTMI.H:430
Box operator[](const LayoutIndex &it) const
Definition: BoxLayout.H:699
unsigned int index(const LayoutIndex &index) const
Definition: BoxLayout.H:748
const int * m_layoutIntPtr
Definition: DataIndex.H:102
virtual ~BaseTransform()
apparently I have to declare this to make some compilers happy.
Definition: BoxLayout.H:55
RefCountedPtr< bool > m_sorted
Definition: BoxLayout.H:664
bool check(const LayoutIndex &index) const
Definition: BoxLayout.H:348
void setProcID(const LayoutIndex &a_index, unsigned int a_procID)
Definition: BoxLayout.H:767
Box surroundingNodes(const Box &b, int dir)
Definition: Box.H:2161
bool operator<(const FaceIndex &f1, const FaceIndex &f2)
Definition: FaceIndex.H:212
BoxLayout m_layout
Definition: LayoutIterator.H:100
Box grow(const Box &b, int i)
Definition: Box.H:2277
Entry(const Box &a_box)
Definition: BoxLayout.H:68
Box enclosedCells(const Box &b, int dir)
Definition: Box.H:2178
LoHiSide
Definition: LoHiSide.H:27
Box get(const LayoutIndex &it) const
Definition: BoxLayout.H:741
size_t size() const
Definition: Vector.H:192
bool isSorted() const
Definition: BoxLayout.H:341
Entry(const Box &a_box, const unsigned int a_index)
Definition: BoxLayout.H:74
RefCountedPtr< Vector< Entry > > m_boxes
Definition: BoxLayout.H:661
RefCountedPtr< DataIterator > m_dataIterator
Definition: BoxLayout.H:665
A Rectangular Domain on an Integer Lattice.
Definition: Box.H:469
virtual Box operator()(const Box &a_inputBox)=0
Definition: DataIndex.H:114
An integer Vector in SpaceDim-dimensional space.
Definition: CHArray.H:42
bool ptrEqual(const BoxLayout &rhs) const
Definition: BoxLayout.H:711
An index for LayoutIterator.
Definition: DataIndex.H:30
void serialMortonOrdering(Vector< Box > &a_boxes)
bool isClosed() const
Definition: BoxLayout.H:754
void mortonOrdering(Vector< Box > &a_boxes)
int m_index
Definition: DataIndex.H:100
int procID()
local process ID
unsigned int m_procID
Definition: BoxLayout.H:86
Definition: BoxLayout.H:61
Definition: TimedDataIterator.H:23
unsigned int procID(const LayoutIndex &a_index) const
Definition: BoxLayout.H:760
bool eq(const BoxLayout &rhs) const
Definition: BoxLayout.H:326