00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _INTVECTSET_H_
00012 #define _INTVECTSET_H_
00013
00014 #include "SPACE.H"
00015
00016 #ifndef WRAPPER
00017 #include <iostream>
00018 #include "Box.H"
00019 #include "IntVect.H"
00020 #include "TreeIntVectSet.H"
00021 #include "DenseIntVectSet.H"
00022 #include "parstream.H"
00023 #include "NamespaceHeader.H"
00024
00025 #endif
00026
00028
00044 class IntVectSet
00045 {
00046 public:
00047 friend
00048 class IVSIterator;
00049
00055
00056 ~IntVectSet();
00057
00059 IntVectSet();
00061 void
00062 define();
00063
00065 IntVectSet(const IntVectSet& ivs);
00067 void
00068 define(const IntVectSet& ivs);
00070 void
00071 define_intvectset(const IntVectSet& ivs){ define(ivs);}
00073 IntVectSet
00074 copy() const {return *this;}
00075
00077 explicit
00078 IntVectSet(const DenseIntVectSet& a_dense);
00080 void
00081 define (const DenseIntVectSet& a_dense);
00083 explicit
00084 IntVectSet(const TreeIntVectSet& a_tree);
00086 void
00087 define (const TreeIntVectSet& a_tree);
00088
00090
00091 explicit
00092 IntVectSet(const IntVect& iv);
00094 void
00095 define(const IntVect& iv);
00097 void
00098 define_intvect(const IntVect& iv){define(iv);}
00099
00101
00102 explicit
00103 IntVectSet(const Box& b);
00105
00106 void
00107 define(const Box& b);
00109 void
00110 define_box(const Box& b){define(b);}
00111
00118
00120 IntVectSet&
00121 operator|=(const IntVectSet& ivs);
00122
00124 void
00125 or_intvectset(const IntVectSet& ivs) { *this |= ivs;}
00126
00128 IntVectSet&
00129 operator|=(const IntVect& iv);
00131 void
00132 or_intvect(const IntVect& ivs) { *this |= ivs;}
00133
00135 IntVectSet&
00136 operator|=(const Box& b);
00138 void
00139 or_box(const Box& b) { *this |= b;}
00140
00142 friend
00143 IntVectSet
00144 operator|(const IntVectSet& ivs1, const IntVectSet& ivs2);
00145
00147 friend
00148 IntVectSet
00149 operator|(const IntVectSet& ivs, const IntVect& iv);
00150
00152 friend
00153 IntVectSet
00154 operator|(const IntVect& iv, const IntVectSet& ivs);
00155
00157 friend
00158 IntVectSet
00159 operator|(const IntVectSet& ivs, const Box& b);
00160
00162 friend
00163 IntVectSet
00164 operator|(const Box& b, const IntVectSet& ivs);
00165
00172
00174 IntVectSet
00175 operator-(const IntVectSet& ivs) const;
00176
00178 IntVectSet
00179 operator-(const Box& b) const;
00180
00182 IntVectSet
00183 operator-(const IntVect& iv) const;
00184
00186
00190 IntVectSet&
00191 operator-=(const IntVectSet& ivs);
00193 void
00194 minus(const IntVectSet& ivs){*this -= ivs;}
00195
00197
00201 IntVectSet&
00202 operator-=(const Box& b);
00204 void
00205 minus_box(const Box& b){ *this -=b;}
00206
00208
00212 IntVectSet&
00213 operator-=(const IntVect& iv);
00215 void
00216 minus_intvect(const IntVect& iv){ *this -=iv;}
00217
00223
00225
00228 friend
00229 IntVectSet
00230 operator&(const IntVectSet& ivs1, const IntVectSet& ivs2);
00231
00233
00236 friend
00237 IntVectSet
00238 operator&(const IntVectSet& ivs, const Box& b);
00239
00241
00244 friend
00245 IntVectSet
00246 operator&(const Box& b, const IntVectSet& ivs);
00247
00249 IntVectSet&
00250 operator&=(const IntVectSet& ivs);
00252 void
00253 and_intvectset(const IntVectSet& ivs){*this &= ivs;}
00254
00256 IntVectSet&
00257 operator&=(const Box& b);
00259 void
00260 and_box(const Box& b){*this &= b;}
00261
00263 IntVectSet&
00264 operator&=(const ProblemDomain& domain);
00266 void
00267 and_domain(const ProblemDomain& d){*this &= d;}
00268
00274
00276
00281 void
00282 grow(int igrow);
00283
00285
00290 friend
00291 IntVectSet
00292 grow(const IntVectSet& ivs, int igrow);
00293
00295
00300 IntVectSet&
00301 grow(int idir, int igrow);
00303 void
00304 grow_dir(int idir, int igrow){grow(idir, igrow);}
00305
00307
00313 IntVectSet&
00314 refine(int iref = 2);
00315
00317
00324 friend
00325 IntVectSet
00326 refine(const IntVectSet& ivs, int iref = 2);
00327
00329
00335 IntVectSet&
00336 coarsen(int iref = 2);
00337
00339
00346 friend
00347 IntVectSet
00348 coarsen(const IntVectSet& ivs, int iref = 2);
00349
00351 void
00352 shift(const IntVect& iv);
00353
00355
00361 void
00362 nestingRegion(int radius, const Box& domain, int granularity = 1);
00363
00365
00371 void
00372 nestingRegion(int radius, const ProblemDomain& probdomain, int granularity = 1);
00374 void
00375 nestingRegion_prob(int radius, const ProblemDomain& probdomain)
00376 {
00377 nestingRegion(radius, probdomain);
00378 }
00379
00381 void
00382 makeEmpty();
00383
00385
00392 IntVectSet chop(int dir, int chop_pnt);
00393
00394 void chop(int dir, int chop_pnt, IntVectSet& a_hi);
00396
00400 static void setMaxDense(const int& a_maxDense);
00401
00407
00409 int
00410 numPts() const;
00411
00413 const Box&
00414 minBox() const;
00415
00417 void
00418 recalcMinBox() const;
00419
00421 bool
00422 isEmpty() const;
00423
00425 bool
00426 isDense() const;
00427
00429 bool
00430 contains(const IntVect& iv) const;
00431
00433 bool
00434 contains(const IntVectSet& ivs) const;
00436 bool
00437 contains_intvectset(const IntVectSet& ivs) const {return contains(ivs);}
00438
00440
00444 bool
00445 contains(const Box& box) const;
00447 bool
00448 contains_box(const Box& b) const {return contains(b);}
00449
00451
00455 Vector<Box>
00456 boxes() const;
00457
00459
00464 void
00465 compact() const;
00466
00472
00474 int
00475 linearSize() const;
00476
00478 void
00479 linearIn(const void* const a_inBuf);
00480
00482
00485 void
00486 linearOut(void* const a_outBuf) const;
00487
00490
00491 bool
00492 operator==(const IntVectSet& a_ivs) const;
00493
00504 bool
00505 operator<(const IntVectSet& a_ivs) const;
00506
00508 void
00509 printBoxes(std::ostream& a_ostream) const;
00510
00512 void
00513 p() const { printBoxes(pout());}
00514
00516 friend
00517 std::ostream&
00518 operator<<(std::ostream& os, const IntVectSet& ivs);
00519
00520 void convert() const;
00521
00522
00523
00524 static long int count;
00525 static long int peakcount;
00526
00527
00528 static int s_maxDense;
00529
00530 private:
00531
00532 bool m_isdense;
00533 TreeIntVectSet m_ivs;
00534 DenseIntVectSet m_dense;
00535
00536
00537
00538 friend void dumpmemoryatexit();
00539 static void clearStaticMemory();
00540
00541 };
00542
00544
00560 class IVSIterator
00561 {
00562 public:
00563
00568 IVSIterator():m_isdense(true)
00569 {}
00570
00575 IVSIterator(const IntVectSet& ivs);
00576
00577 ~IVSIterator()
00578 {}
00579
00584 void define(const IntVectSet& ivs);
00585
00587 const IntVect& operator()() const ;
00588
00590 const IntVect& iv() const { return this->operator()();}
00591
00593 bool ok() const;
00594
00596 void operator++();
00597
00599 void incr() { ++(*this);}
00600
00602 void begin();
00603
00605 void reset();
00606
00608
00609 void end();
00610
00611 private:
00612 bool m_isdense;
00613 DenseIntVectSetIterator m_dense;
00614 TreeIntVectSetIterator m_tree;
00615 };
00616
00617 #ifndef WRAPPER
00618
00619 inline const IntVect& IVSIterator::operator()() const
00620 {
00621 if(m_isdense) return m_dense();
00622 return m_tree();
00623 }
00624
00625 inline bool IVSIterator::ok() const
00626 {
00627 if(m_isdense) return m_dense.ok();
00628 return m_tree.ok();
00629 }
00630
00631 inline void IVSIterator::operator++()
00632 {
00633 if(m_isdense) ++m_dense;
00634 else ++m_tree;
00635 }
00636 inline void IVSIterator::reset()
00637 {
00638 begin();
00639 }
00640
00641 inline void IVSIterator::begin()
00642 {
00643 if(m_isdense) m_dense.begin();
00644 else m_tree.begin();
00645 }
00646
00647 inline void IVSIterator::end()
00648 {
00649 if(m_isdense) m_dense.end();
00650 else m_tree.end();
00651 }
00652
00653 inline IntVectSet::IntVectSet(): m_isdense(true)
00654 {
00655 count++;
00656 if(count > peakcount) peakcount = count;
00657 }
00658
00659 inline void IntVectSet::define(const IntVectSet& ige_in)
00660 {
00661 *this = ige_in;
00662 }
00663
00664 inline IntVectSet::IntVectSet(const IntVectSet& ige_in)
00665 {
00666 count++;
00667 if(count > peakcount) peakcount = count;
00668
00669 *this = ige_in;
00670 }
00671
00672 inline bool
00673 IntVectSet::isDense() const
00674 {
00675 return m_isdense;
00676 }
00677
00678 #endif
00679
00680 #include "NamespaceFooter.H"
00681 #endif