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 #ifndef TREEINTVECTSET_H
00029 #define TREEINTVECTSET_H
00030
00031
00032 #include "Box.H"
00033 #include "Pool.H"
00034 class IntVectSet;
00035 class ProblemDomain;
00036
00037
00038
00039
00040 #if (CH_SPACEDIM==2)
00041 #define TIVS_NODESIZE 4
00042 #elif (CH_SPACEDIM==3)
00043 #define TIVS_NODESIZE 8
00044 #else
00045
00046
00047 error_only_tested_for_2D_and_3D
00048 #endif
00049
00051
00054 class TreeIntVectSet
00055 {
00056 public:
00058 inline TreeIntVectSet();
00059
00061 TreeIntVectSet(const Box&);
00062
00064 TreeIntVectSet(const TreeIntVectSet& a_sivs);
00065
00067 ~TreeIntVectSet();
00068
00070 void define(const Box&);
00071
00073 void define(const TreeIntVectSet& a_sivs);
00074
00076 TreeIntVectSet& operator=(const TreeIntVectSet& a_sivs);
00077
00079 TreeIntVectSet& operator|=(const TreeIntVectSet& a_sivs);
00080
00082 TreeIntVectSet& operator|=(const IntVect& a_iv);
00083
00085 TreeIntVectSet& operator|=(const Box& a_box);
00086
00088 TreeIntVectSet& operator&=(const TreeIntVectSet& s_sivs);
00089
00091 TreeIntVectSet& operator&=(const Box& a_box);
00092
00094 TreeIntVectSet& operator&=(const ProblemDomain& a_domain);
00095
00097 TreeIntVectSet& operator-=(const TreeIntVectSet& a_sivs);
00098
00100 TreeIntVectSet& operator-=(const IntVect& a_iv);
00101
00103 TreeIntVectSet& operator-=(const Box& a_box);
00104
00106
00109 Vector<Box> createBoxes() const;
00110
00111
00112 void createBoxes(Vector<Box>& boxes, int& size) const;
00113
00115 bool contains(const IntVect& iv) const;
00116
00118 bool contains(const Box& box) const;
00119
00121
00124 TreeIntVectSet chop(int idir, int chop_pnt);
00125
00127
00130 void grow(int igrow);
00131
00133
00136 void grow(int idir, int igrow);
00137
00139
00142 void refine(int iref = 2);
00143
00145
00148 void coarsen(int iref = 2);
00149
00151
00154 void shift(const IntVect& iv);
00155
00157 void clear();
00158
00160 void nestingRegion(int a_radius, const Box& a_domain);
00161
00163 void nestingRegion(int a_radius, const ProblemDomain& a_domain);
00164
00166 inline const Box& minBox() const;
00167
00169 bool isEmpty() const;
00170
00172 int numPts() const;
00173
00174 friend void dumpTree(const TreeIntVectSet* set);
00175
00177 void compact() const;
00178
00180 void recalcMinBox() const;
00181
00182 int linearSize() const;
00183
00184 void linearIn(const void* const inBuf);
00185
00186 void linearOut(void* const a_outBuf) const;
00187
00188
00189 private:
00190
00191 friend class TreeIntVectSetIterator;
00192
00193 struct TreeNode {
00194 TreeNode* nodes;
00195 TreeNode():nodes(0){;}
00196 };
00197
00198 TreeNode m_tree;
00199 Box m_minBox, m_spanBox;
00200 int m_depth;
00201
00202
00203
00204 static Pool treeNodePool;
00205
00206 static void quadrantBox(const Box& inputBox, int quadrant, Box& outputQuadrant);
00207 static void clearTree(TreeNode& tree);
00208 static void expandNode(TreeNode& node);
00209 void growTree();
00210
00211
00212 static int oppositeQuadrant(int index);
00213 static bool nextIntVect(const Box& box, IntVect& iv);
00214 static void nextNode(int& currentDepth);
00215 static void cloneNode(const TreeNode& src, TreeNode& dest);
00216
00217
00218
00219
00220 static Vector<int> index, bufferOffset;
00221 static Vector<TreeNode*> parents;
00222 static Vector<Box> boxes;
00223
00224
00225
00226
00227 static TreeNode full;
00228 friend struct Flag;
00229 friend class IntVectSet;
00230 };
00231
00232
00233 class TreeIntVectSetIterator
00234 {
00235 public:
00236 TreeIntVectSetIterator();
00237 TreeIntVectSetIterator(const TreeIntVectSet& ivs);
00238 void define(const TreeIntVectSet& ivs);
00239 const IntVect& operator()() const ;
00240 bool ok() const;
00241 void operator++();
00242 void begin();
00243 void end();
00244 void clear();
00245 private:
00246 const TreeIntVectSet* m_ivs;
00247 Vector<const TreeIntVectSet::TreeNode*> nodes;
00248 Vector<Box> boxes;
00249 Vector<int> index;
00250 int m_depth;
00251 IntVect m_current;
00252
00253 void findNextNode();
00254 void findNext();
00255
00256 };
00257
00258 inline
00259 TreeIntVectSetIterator::TreeIntVectSetIterator():m_ivs(0), m_depth(-1) {;}
00260
00261 inline
00262 TreeIntVectSetIterator::TreeIntVectSetIterator(const TreeIntVectSet& ivs)
00263 {
00264 define(ivs);
00265 }
00266
00267 inline
00268 void TreeIntVectSetIterator::clear()
00269 {
00270 m_depth = -1;
00271 m_ivs = 0;
00272 }
00273
00274
00275
00276
00277
00278
00279
00280 inline
00281 void TreeIntVectSetIterator::define(const TreeIntVectSet& ivs)
00282 {
00283 m_ivs = &ivs;
00284 int max = ivs.index.size();
00285
00286 if(boxes.size() < max)
00287 {
00288 boxes.resize(max);
00289 index.resize(max);
00290 nodes.resize(max);
00291 }
00292 begin();
00293 }
00294
00295 inline
00296 bool TreeIntVectSetIterator::ok() const
00297 {
00298 return m_depth >= 0;
00299 }
00300
00301 inline
00302 void TreeIntVectSetIterator::end()
00303 {
00304 m_depth = -1;
00305 }
00306
00307 inline
00308 TreeIntVectSet& TreeIntVectSet::operator|=(const IntVect& iv)
00309 {
00310 return *this|=Box(iv, iv);
00311 }
00312
00313 inline
00314 TreeIntVectSet& TreeIntVectSet::operator-=(const IntVect& iv)
00315 {
00316 return *this-=Box(iv, iv);
00317 }
00318
00319 inline
00320 void TreeIntVectSetIterator::operator++()
00321 {
00322 findNext();
00323 }
00324
00325 inline
00326 const IntVect& TreeIntVectSetIterator::operator()() const
00327 {
00328 return m_current;
00329 }
00330
00331
00332
00333 inline
00334 TreeIntVectSet::~TreeIntVectSet()
00335 {
00336 clearTree(m_tree);
00337 }
00338 inline
00339 TreeIntVectSet::TreeIntVectSet(const TreeIntVectSet& a_tivs)
00340 {
00341 define(a_tivs);
00342 }
00343
00344 inline
00345 TreeIntVectSet::TreeIntVectSet(const Box& a_box)
00346 {
00347 define(a_box);
00348 }
00349
00350 inline
00351 TreeIntVectSet::TreeIntVectSet()
00352 {
00353 m_tree.nodes = 0;
00354 m_depth=1;
00355
00356 }
00357
00358 inline
00359 const Box&
00360 TreeIntVectSet::minBox() const
00361 {
00362 return m_minBox;
00363 }
00364
00365 inline void TreeIntVectSet::nextNode(int& depth)
00366 {
00367 index[0] = 0;
00368 index[depth]++;
00369 while(index[depth] == TIVS_NODESIZE)
00370 {
00371 index[depth] = 0;
00372 depth--;
00373 index[depth]++;
00374 }
00375 }
00376
00377 #endif // TREEINTVECTSET_H