00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _TREEINTVECTSET_H_
00012 #define _TREEINTVECTSET_H_
00013
00014 #include "Box.H"
00015 #include "Pool.H"
00016 #include "NamespaceHeader.H"
00017
00018 class IntVectSet;
00019 class ProblemDomain;
00020
00021
00022
00023
00024 #ifdef TIVS_NODESIZE
00025 #undef TIVS_NODESIZE
00026 #endif
00027 #if (CH_SPACEDIM==1)
00028 #define TIVS_NODESIZE 2
00029 #elif (CH_SPACEDIM==2)
00030 #define TIVS_NODESIZE 4
00031 #elif (CH_SPACEDIM==3)
00032 #define TIVS_NODESIZE 8
00033 #elif (CH_SPACEDIM==4)
00034 #define TIVS_NODESIZE 16
00035 #elif (CH_SPACEDIM==5)
00036 #define TIVS_NODESIZE 32
00037 #elif (CH_SPACEDIM==6)
00038 #define TIVS_NODESIZE 64
00039 #else
00040
00041 #error TIVS_NODESIZE is only defined for 1D, 2D, 3D, 4D, 5D, or 6D
00042 #endif
00043
00045
00093 class TreeIntVectSet
00094 {
00095 public:
00097 inline TreeIntVectSet();
00098
00100 TreeIntVectSet(const Box&);
00101
00103 TreeIntVectSet(const TreeIntVectSet& a_sivs);
00104
00106 ~TreeIntVectSet();
00107
00109 void define(const Box&);
00110
00112 void define(const TreeIntVectSet& a_sivs);
00113
00115 void swap(TreeIntVectSet& a_other);
00116
00118 TreeIntVectSet& operator=(const TreeIntVectSet& a_sivs);
00119
00121 TreeIntVectSet& operator|=(const TreeIntVectSet& a_sivs);
00122
00124 TreeIntVectSet& operator|=(const IntVect& a_iv);
00125
00127 TreeIntVectSet& operator|=(const Box& a_box);
00128
00130 TreeIntVectSet& operator&=(const TreeIntVectSet& s_sivs);
00131
00133 TreeIntVectSet& operator&=(const Box& a_box);
00134
00136 TreeIntVectSet& operator&=(const ProblemDomain& a_domain);
00137
00139 TreeIntVectSet& operator-=(const TreeIntVectSet& a_sivs);
00140
00142 TreeIntVectSet& operator-=(const IntVect& a_iv);
00143
00145 TreeIntVectSet& operator-=(const Box& a_box);
00146
00148 bool operator==(const TreeIntVectSet& lhs) const;
00149
00156 bool operator<(const TreeIntVectSet& a_sivs) const;
00157
00159
00162 Vector<Box> createBoxes() const;
00163
00165
00168 void createBoxes(Vector<Box>& boxes, int& size) const;
00169
00171 bool contains(const IntVect& iv) const;
00172
00174 bool contains(const Box& box) const;
00175
00177
00180 TreeIntVectSet chop(int idir, int chop_pnt);
00181
00183
00186 void chop(int dir, int chop_pnt, TreeIntVectSet& a_hi);
00187
00189
00192 void grow(int igrow);
00193
00195
00198 void grow(int idir, int igrow);
00199
00201
00204 void refine(int iref = 2);
00205
00207
00210 void coarsen(int iref = 2);
00211
00213
00216 void shift(const IntVect& iv);
00217
00219 void clear();
00220
00222 void nestingRegion(int a_radius, const Box& a_domain, int granularity);
00223
00225 void nestingRegion(int a_radius, const ProblemDomain& a_domain, int granularity);
00226
00228 inline const Box& minBox() const;
00229
00231 bool isEmpty() const;
00232
00234 int numPts() const;
00235
00236 friend void dumpTree(const TreeIntVectSet* set);
00237
00239 void compact() const;
00240
00242 void recalcMinBox() const;
00243
00246 int linearSize() const;
00247
00248 void linearIn(const void* const inBuf);
00249
00250 void linearOut(void* const a_outBuf) const;
00253 private:
00254
00255 friend class TreeIntVectSetIterator;
00256 friend class MeshRefine;
00257
00258 #ifndef DOXYGEN
00259 struct TreeNode {
00260 TreeNode* nodes;
00261 TreeNode():nodes(0)
00262 {}
00263 };
00264 #endif
00265
00266 TreeNode m_tree;
00267 Box m_minBox, m_spanBox;
00268 int m_depth;
00269
00270 void trimCoarsen(int icoarse);
00271
00272
00273 static Pool treeNodePoolObject;
00274 static Pool* treeNodePool;
00275
00276 static void quadrantBox(const Box& inputBox, int quadrant, Box& outputQuadrant);
00277 static void clearTree(TreeNode& tree);
00278 static void expandNode(TreeNode& node);
00279 void growTree();
00280 void remove(const Box& box, TreeIntVectSet* resdiual);
00281 void transfer(TreeNode& node, const Box& a_box);
00282
00283
00284 static int oppositeQuadrant(int index);
00285 static bool nextIntVect(const Box& box, IntVect& iv);
00286 static void nextNode(int& currentDepth);
00287 static void cloneNode(const TreeNode& src, TreeNode& dest);
00288
00289
00290
00291
00292 static Vector<int> index, bufferOffset;
00293 static Vector<TreeNode*> parents;
00294 static Vector<Box> boxes;
00295
00296
00297
00298
00299 static TreeNode full;
00300 friend struct Flag;
00301 friend class IntVectSet;
00302 };
00303
00304 void dumpTree(const TreeIntVectSet* set);
00305
00306 class TreeIntVectSetIterator
00307 {
00308 public:
00309 TreeIntVectSetIterator();
00310 TreeIntVectSetIterator(const TreeIntVectSet& ivs);
00311 void define(const TreeIntVectSet& ivs);
00312 const IntVect& operator()() const ;
00313 bool ok() const;
00314 void operator++();
00315 void begin();
00316 void end();
00317 void clear();
00318 private:
00319 const TreeIntVectSet* m_ivs;
00320 Vector<const TreeIntVectSet::TreeNode*> nodes;
00321 Vector<Box> boxes;
00322 Vector<int> index;
00323 int m_depth;
00324 IntVect m_current;
00325
00326 void findNextNode();
00327 void findNext();
00328
00329 };
00330
00331 inline
00332 TreeIntVectSetIterator::TreeIntVectSetIterator():m_ivs(0), m_depth(-1)
00333 {}
00334
00335 inline
00336 TreeIntVectSetIterator::TreeIntVectSetIterator(const TreeIntVectSet& ivs)
00337 {
00338 define(ivs);
00339 }
00340
00341 inline
00342 void TreeIntVectSetIterator::clear()
00343 {
00344 m_depth = -1;
00345 m_ivs = 0;
00346 }
00347
00348 inline
00349 void TreeIntVectSetIterator::define(const TreeIntVectSet& ivs)
00350 {
00351 m_ivs = &ivs;
00352 int max = ivs.index.size();
00353
00354 if(boxes.size() < max)
00355 {
00356 boxes.resize(max);
00357 index.resize(max);
00358 nodes.resize(max);
00359 }
00360 begin();
00361 }
00362
00363 inline
00364 bool TreeIntVectSetIterator::ok() const
00365 {
00366 return m_depth >= 0;
00367 }
00368
00369 inline
00370 void TreeIntVectSetIterator::end()
00371 {
00372 m_depth = -1;
00373 }
00374
00375 inline
00376 TreeIntVectSet& TreeIntVectSet::operator|=(const IntVect& iv)
00377 {
00378 return *this|=Box(iv, iv);
00379 }
00380
00381 inline
00382 TreeIntVectSet& TreeIntVectSet::operator-=(const IntVect& iv)
00383 {
00384 return *this-=Box(iv, iv);
00385 }
00386
00387 inline
00388 void TreeIntVectSetIterator::operator++()
00389 {
00390 findNext();
00391 }
00392
00393 inline
00394 const IntVect& TreeIntVectSetIterator::operator()() const
00395 {
00396 return m_current;
00397 }
00398
00399
00400
00401 inline
00402 TreeIntVectSet::~TreeIntVectSet()
00403 {
00404 clearTree(m_tree);
00405 }
00406 inline
00407 TreeIntVectSet::TreeIntVectSet(const TreeIntVectSet& a_tivs)
00408 {
00409 define(a_tivs);
00410 }
00411
00412 inline
00413 TreeIntVectSet::TreeIntVectSet(const Box& a_box)
00414 {
00415 define(a_box);
00416 }
00417
00418 inline
00419 TreeIntVectSet::TreeIntVectSet()
00420 {
00421 m_tree.nodes = 0;
00422 m_depth=1;
00423
00424 }
00425
00426 inline
00427 const Box&
00428 TreeIntVectSet::minBox() const
00429 {
00430 return m_minBox;
00431 }
00432
00433 inline void TreeIntVectSet::nextNode(int& depth)
00434 {
00435 index[0] = 0;
00436 index[depth]++;
00437 while(index[depth] == TIVS_NODESIZE)
00438 {
00439 index[depth] = 0;
00440 depth--;
00441 index[depth]++;
00442 }
00443 }
00444
00445 #include "NamespaceFooter.H"
00446 #endif // TREEINTVECTSET_H