00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef _TREEINTVECTSET_H_
00053 #define _TREEINTVECTSET_H_
00054
00055 #include "Box.H"
00056 #include "Pool.H"
00057
00058 class IntVectSet;
00059 class ProblemDomain;
00060
00061
00062
00063
00064 #if (CH_SPACEDIM==2)
00065 #define TIVS_NODESIZE 4
00066 #elif (CH_SPACEDIM==3)
00067 #define TIVS_NODESIZE 8
00068 #else
00069
00070 #error TIVS_NODESIZE is only defined for 2D and 3D
00071 #endif
00072
00074
00122 class TreeIntVectSet
00123 {
00124 public:
00126 inline TreeIntVectSet();
00127
00129 TreeIntVectSet(const Box&);
00130
00132 TreeIntVectSet(const TreeIntVectSet& a_sivs);
00133
00135 ~TreeIntVectSet();
00136
00138 void define(const Box&);
00139
00141 void define(const TreeIntVectSet& a_sivs);
00142
00144 TreeIntVectSet& operator=(const TreeIntVectSet& a_sivs);
00145
00147 TreeIntVectSet& operator|=(const TreeIntVectSet& a_sivs);
00148
00150 TreeIntVectSet& operator|=(const IntVect& a_iv);
00151
00153 TreeIntVectSet& operator|=(const Box& a_box);
00154
00156 TreeIntVectSet& operator&=(const TreeIntVectSet& s_sivs);
00157
00159 TreeIntVectSet& operator&=(const Box& a_box);
00160
00162 TreeIntVectSet& operator&=(const ProblemDomain& a_domain);
00163
00165 TreeIntVectSet& operator-=(const TreeIntVectSet& a_sivs);
00166
00168 TreeIntVectSet& operator-=(const IntVect& a_iv);
00169
00171 TreeIntVectSet& operator-=(const Box& a_box);
00172
00174 bool operator==(const TreeIntVectSet& lhs) const;
00175
00182 bool operator<(const TreeIntVectSet& a_sivs) const;
00183
00185
00188 Vector<Box> createBoxes() const;
00189
00191
00194 void createBoxes(Vector<Box>& boxes, int& size) const;
00195
00197 bool contains(const IntVect& iv) const;
00198
00200 bool contains(const Box& box) const;
00201
00203
00206 TreeIntVectSet chop(int idir, int chop_pnt);
00207
00209
00212 void grow(int igrow);
00213
00215
00218 void grow(int idir, int igrow);
00219
00221
00224 void refine(int iref = 2);
00225
00227
00230 void coarsen(int iref = 2);
00231
00233
00236 void shift(const IntVect& iv);
00237
00239 void clear();
00240
00242 void nestingRegion(int a_radius, const Box& a_domain, int granularity);
00243
00245 void nestingRegion(int a_radius, const ProblemDomain& a_domain, int granularity);
00246
00248 inline const Box& minBox() const;
00249
00251 bool isEmpty() const;
00252
00254 int numPts() const;
00255
00256 friend void dumpTree(const TreeIntVectSet* set);
00257
00259 void compact() const;
00260
00262 void recalcMinBox() const;
00263
00266 int linearSize() const;
00267
00268 void linearIn(const void* const inBuf);
00269
00270 void linearOut(void* const a_outBuf) const;
00273 private:
00274
00275 friend class TreeIntVectSetIterator;
00276
00277 #ifndef DOXYGEN
00278 struct TreeNode {
00279 TreeNode* nodes;
00280 TreeNode():nodes(0)
00281 {}
00282 };
00283 #endif
00284
00285 TreeNode m_tree;
00286 Box m_minBox, m_spanBox;
00287 int m_depth;
00288
00289 void trimCoarsen(int icoarse);
00290
00291
00292 static Pool treeNodePool;
00293
00294 static void quadrantBox(const Box& inputBox, int quadrant, Box& outputQuadrant);
00295 static void clearTree(TreeNode& tree);
00296 static void expandNode(TreeNode& node);
00297 void growTree();
00298
00299 static int oppositeQuadrant(int index);
00300 static bool nextIntVect(const Box& box, IntVect& iv);
00301 static void nextNode(int& currentDepth);
00302 static void cloneNode(const TreeNode& src, TreeNode& dest);
00303
00304
00305
00306
00307 static Vector<int> index, bufferOffset;
00308 static Vector<TreeNode*> parents;
00309 static Vector<Box> boxes;
00310
00311
00312
00313
00314 static TreeNode full;
00315 friend struct Flag;
00316 friend class IntVectSet;
00317 };
00318
00319 class TreeIntVectSetIterator
00320 {
00321 public:
00322 TreeIntVectSetIterator();
00323 TreeIntVectSetIterator(const TreeIntVectSet& ivs);
00324 void define(const TreeIntVectSet& ivs);
00325 const IntVect& operator()() const ;
00326 bool ok() const;
00327 void operator++();
00328 void begin();
00329 void end();
00330 void clear();
00331 private:
00332 const TreeIntVectSet* m_ivs;
00333 Vector<const TreeIntVectSet::TreeNode*> nodes;
00334 Vector<Box> boxes;
00335 Vector<int> index;
00336 int m_depth;
00337 IntVect m_current;
00338
00339 void findNextNode();
00340 void findNext();
00341
00342 };
00343
00344 inline
00345 TreeIntVectSetIterator::TreeIntVectSetIterator():m_ivs(0), m_depth(-1)
00346 {}
00347
00348 inline
00349 TreeIntVectSetIterator::TreeIntVectSetIterator(const TreeIntVectSet& ivs)
00350 {
00351 define(ivs);
00352 }
00353
00354 inline
00355 void TreeIntVectSetIterator::clear()
00356 {
00357 m_depth = -1;
00358 m_ivs = 0;
00359 }
00360
00361 inline
00362 void TreeIntVectSetIterator::define(const TreeIntVectSet& ivs)
00363 {
00364 m_ivs = &ivs;
00365 int max = ivs.index.size();
00366
00367 if(boxes.size() < max)
00368 {
00369 boxes.resize(max);
00370 index.resize(max);
00371 nodes.resize(max);
00372 }
00373 begin();
00374 }
00375
00376 inline
00377 bool TreeIntVectSetIterator::ok() const
00378 {
00379 return m_depth >= 0;
00380 }
00381
00382 inline
00383 void TreeIntVectSetIterator::end()
00384 {
00385 m_depth = -1;
00386 }
00387
00388 inline
00389 TreeIntVectSet& TreeIntVectSet::operator|=(const IntVect& iv)
00390 {
00391 return *this|=Box(iv, iv);
00392 }
00393
00394 inline
00395 TreeIntVectSet& TreeIntVectSet::operator-=(const IntVect& iv)
00396 {
00397 return *this-=Box(iv, iv);
00398 }
00399
00400 inline
00401 void TreeIntVectSetIterator::operator++()
00402 {
00403 findNext();
00404 }
00405
00406 inline
00407 const IntVect& TreeIntVectSetIterator::operator()() const
00408 {
00409 return m_current;
00410 }
00411
00412
00413
00414 inline
00415 TreeIntVectSet::~TreeIntVectSet()
00416 {
00417 clearTree(m_tree);
00418 }
00419 inline
00420 TreeIntVectSet::TreeIntVectSet(const TreeIntVectSet& a_tivs)
00421 {
00422 define(a_tivs);
00423 }
00424
00425 inline
00426 TreeIntVectSet::TreeIntVectSet(const Box& a_box)
00427 {
00428 define(a_box);
00429 }
00430
00431 inline
00432 TreeIntVectSet::TreeIntVectSet()
00433 {
00434 m_tree.nodes = 0;
00435 m_depth=1;
00436
00437 }
00438
00439 inline
00440 const Box&
00441 TreeIntVectSet::minBox() const
00442 {
00443 return m_minBox;
00444 }
00445
00446 inline void TreeIntVectSet::nextNode(int& depth)
00447 {
00448 index[0] = 0;
00449 index[depth]++;
00450 while(index[depth] == TIVS_NODESIZE)
00451 {
00452 index[depth] = 0;
00453 depth--;
00454 index[depth]++;
00455 }
00456 }
00457
00458 #endif // TREEINTVECTSET_H