rebl-AMR
tree.h
Go to the documentation of this file.
1 #ifndef _TREE_H_
2 #define _TREE_H_
3 #include "definitions.h"
4 
12 template <size_t N, typename value>
13 class Hdf5Xmf;
14 
15 template <size_t N, typename value>
16 class Tree
17 {
18  template <size_t N1, typename value2>
19  friend class Hdf5Xmf;
21  protected:
29  private:
31  std::unordered_map<morton<N>, int> refinelist;
33  // bitvector<N> derefinelist; /*!< list of elements tagged to be removed*/
34  // might have some of its elements removed, due to this reason, I do not use vector but rather list*/
35  // bitvector<N> mortonSTL ; /*!< vector to store geometric points in morton code */
36  std::unordered_map<morton<N>, int> derefinelist;
38  public:
40  // I wanted seed to each tree but that requires another template parameter M for seed which is normally less than
41  // N , i.e. M < N
42  // might not be bad to do this, I have not decided yet
43 
44  public:
45  Tree( real *length, real *coords, uint nx, uint ny, uint nz );
46  Tree( real *length, real *coords );
47  Tree() {};
48  void construct( real *length, real *coords, uint nx, uint ny, uint nz );
49  virtual void level( morton<N> key, uint *level );
50  void centroid( morton<N> key, real *xyz );
51  void enclosingBox( morton<N> key, real *X );
52  virtual typename bitmap<N, value>::iterator begin();
53  virtual typename bitmap<N, value>::iterator end();
54  virtual uint size();
55  void reserve( uint *reservedsize );
56  void siblings( morton<N> key, uint mylevel, morton<N> *sibkey );
57  void refine( morton<N> key );
58  void derefine( morton<N> key );
59  void refineRefineList();
61  void fourToOneP( uint istart,
62  uint iend );
64  void refineRefineList( uint istart, uint iend );
65  void fourToOne();
66  void findFlipLevel( morton<N> key, uint *mylevel, uint *changedirectionlevel,
67  uint *direction );
68  void flipForNbr( morton<N> *key, uint *mylevel, uint *changedirectionlevel,
69  uint *direction );
71  void addToList( morton<N> key );
72  uint count( morton<N> key );
73  void addToDerefineList( morton<N> key );
74  void derefineDerefineList( uint nlevel );
75  // geometry
76  uint isInsideSolid( const morton<N> key, const real *geom_xyz,
77  uint n );
78  virtual typename bitmap<N, value>::iterator find( morton<N> key );
79  void insertKey( morton<N> key );
80  void convertStl2Morton( uint geom_size, real *geom_xyz );
81  // template<size_t N1>
82  void pushToRefinelist( uint level );
84  bool isBoundary( morton<N> &key );
85  void extractBoundary();
86  void getDirections( morton<N> &key, vector<uint> &directions );
87  // void getElemNbr(morton<N> &key);
89  void clearRefineList();
90  void extractBoundaryP( uint istart, uint iend );
91  bool isInMeshList( const morton<N> &key );
92  bool isInRefineList( const morton<N> &key );
93  void constructHigherLevelNbrs( const morton<N> &key, const uint &keylevel, const uint &direction, morton<N> *nbr );
94  void printMesh();
95  bool isBoundary( const morton<N> &key, uint direction );
96  // void readRefineList(morton<N>&, uint);
97  std::pair<morton<N>, int> readRefineList( typename std::unordered_map<morton<N>, int>::iterator it );
98  morton<N> readDerefineList( typename std::unordered_map<morton<N>, int>::iterator it );
99  // typename std::unordered_map<morton<N>,int>::iterator readDerefineList(morton<N> key);
100  void getKey( uint i, morton<N> &key );
101  void clearMortonSTL();
102  // derefine functions
103  void retainFourToOne();
104  void removeFromDerefineList( typename std::unordered_map<morton<N>, int>::iterator it );
105  typename unordered_map<morton<N>, int>::iterator Dbegin();
106  typename unordered_map<morton<N>, int>::iterator Dend();
107  void derefineDerefineList();
108  void clearMesh();
109  void pushToDerefinelist( uint nlevel );
110  typename unordered_map<morton<N>, int>::iterator Rbegin();
111  typename unordered_map<morton<N>, int>::iterator Rend();
112  typename std::unordered_map<morton<N>, int>::iterator findInDerefine( morton<N> key );
113  void mortonSTLclear();
114  void flipRefineElemTag( typename std::unordered_map<morton<N>, int>::iterator it );
115  void refinelistReset();
116  void constructNonlocalHigherLevelNbrs( const morton<N> &key, const uint &keylevel, const uint &direction, morton<N> *nbr );
117  void insertSeed( morton<N> &key );
118 
119  void insertNbrs( vector<int> &Nbrs );
120  void enclosingBoxFixedLevel( morton<N> key, uint mylevel, real *X );
121  void centroidFixedLevel( morton<N> key, const uint mylevel, real *xyz );
122 
123  virtual void convertCoordToMorton( real *xyz, morton<N> &key );
124  typename std::unordered_map<morton<N>, int>::iterator findInList( morton<N> key ); /*
125  template <size_t N1, typename Nvalue1, size_t N2>
126  friend void convertCoordToMorton(Tree<N1,Nvalue1> T, real *xyz, morton<N2> &key );
127  */
128 
129  /*
130  template <size_t N1, typename Nvalue1, size_t M1, typename Mvalue1>
131  friend class Phdf5;
132  */
133 
134  ~Tree();
135 };
136 // the reason I am keeping these separate is because of the need for the solution vector in the base class
137 // template<size_t N>
138 // class Hdf5XmfV;
139 
145 template <size_t N, typename value>
146 class Voxel : public Tree<N, value>
147 {
148  private:
153 
154  public:
155  Voxel( real *length, real *coords ) : Tree<N, value>( length, coords, 2, 2, 2 ) {};
156  void setLevel( uint *l );
157  void generateSearchTree( real *geom_xyz, uint n );
158  void distributeGeomToLeaves( real *geom_xyz, uint n );
159  uint checkSiblingStatus( morton<N> key, morton<N> *sibkey );
160  ;
161  void derefineGeomTree();
162  bool IsInsideSegment( morton<N> key, real *xyz );
163 
164  template <size_t N1, typename value1>
165  friend class Hdf5XmfV;
166  ~Voxel();
167  // add ete <size_t N, typename value>
168  // void Tree<N, value>::refine( morton<N> key )
169  // rase because regular refine does not free the memory, though I reallocate in the next step, normally it should not leak
170  // void erase(morton key); /* rather specialized version of erase, since the memory has to be freed as well*/
171 };
172 
180 #if ( 1 )
181 template <size_t N, typename value>
182 class FullTree : public Tree<N, value>
183 {
184  private:
187  std::unordered_map<morton<N>, int> refinelist;
189  std::unordered_map<morton<N>, int> derefinelist;
191  public:
192  FullTree( real *length, real *coords ) : Tree<N, value>( length, coords, 2, 2, 2 ) {};
193  void setLevel( const uint &l );
194  void level( morton<N> key, uint *level );
195  void insertKey( morton<N> key );
196  uint getLevel();
197  // this class has its own mesh as private so it needs ti have its own iterators as well, inheritance does not do this automatically
198  void nbrsConstrcut( vector<uint> &Nbrs, uint myrank );
199  bool isBoundary( uint &direction, uint myrank );
200  typename bitmap<N, value>::iterator find( morton<N> key );
201  uint size();
202  //
203  void convertCoordToMorton(real* xyz , morton<N>&key);
204  void assignProcs( vector<uint> &Nbrs, uint myrank );
205  void findFlipLevel( morton<WSIZE> key,uint fixedlevel, uint *changedirectionlevel, uint *direction ) ;
206  void flipForNbr( morton<WSIZE> *key, uint fixedlevel, uint *changedirectionlevel, uint *direction );
207 
208  typename bitmap<N, value>::iterator begin();
209  typename bitmap<N, value>::iterator end();
210  // void centroid( morton<N> key, real *xyz ); /*!< calculates the centroid of the cube given the morton key of the element*/
211  // void enclosingBox( morton<N> key, real *X ); /*!< calculates the range that an element occupies in 3D space for a given Element*/
212  ~FullTree() {};
213  // add erase because regular refine does not free the memory, though I reallocate in the next step, normally it should not leak
214  // void erase(morton key); /* rather specialized version of erase, since the memory has to be freed as well*/
215 };
216 #endif
217 
218 #endif
void refineRefineList()
Definition: tree.cpp:460
bitmap< N, value >::iterator end()
Definition: full_tree.cpp:27
uint getLevel()
Definition: full_tree.cpp:40
real ancestorlength[3]
Definition: tree.h:22
This Class is specifically designed for weak analysis to operate on the fulltree topology in this cla...
Definition: tree.h:182
unordered_map< morton< N >, int >::iterator Dbegin()
Definition: tree.cpp:1664
void convertStl2Morton(uint geom_size, real *geom_xyz)
Definition: tree.cpp:1131
virtual bitmap< N, value >::iterator begin()
Definition: tree.cpp:311
void derefineGeomTree()
Definition: voxel.cpp:229
std::pair< morton< N >, int > readRefineList(typename std::unordered_map< morton< N >, int >::iterator it)
Definition: tree.cpp:1360
void generateSearchTree(real *geom_xyz, uint n)
Definition: voxel.cpp:61
void level(morton< N > key, uint *level)
Definition: full_tree.cpp:14
morton< N > ancestorkey
Definition: tree.h:24
void assignProcs(vector< uint > &Nbrs, uint myrank)
Definition: full_tree.cpp:215
void refine(morton< N > key)
Definition: tree.cpp:394
void centroid(morton< N > key, real *xyz)
Definition: tree.cpp:114
void reserve(uint *reservedsize)
Definition: tree.cpp:336
void derefine(morton< N > key)
Definition: tree.cpp:1883
void insertKey(morton< N > key)
Definition: full_tree.cpp:33
uint fixedlevel
Definition: tree.h:185
std::unordered_map< morton< N >, int > derefinelist
Definition: tree.h:36
void extractBoundary()
Definition: tree.cpp:1464
std::vector< morton< N > > bitvector
Definition: definitions.h:102
virtual uint size()
Definition: tree.cpp:329
uint npz
Definition: tree.h:27
void nbrsConstrcut(vector< uint > &Nbrs, uint myrank)
Definition: full_tree.cpp:67
uint size()
Definition: full_tree.cpp:362
void flipRefineElemTag(typename std::unordered_map< morton< N >, int >::iterator it)
Definition: tree.cpp:1374
void fourToOneP(uint istart, uint iend)
void pushToRefinelist(uint level)
Definition: tree.cpp:1263
void findFlipLevel(morton< WSIZE > key, uint fixedlevel, uint *changedirectionlevel, uint *direction)
Definition: full_tree.cpp:144
bitvector< N > boundarylist
Definition: tree.h:39
void setLevel(uint *l)
Definition: voxel.cpp:8
bitvector< N > lookup
Definition: tree.h:152
uint refineListSize()
Definition: tree.cpp:836
bool isBoundary(uint &direction, uint myrank)
Definition: full_tree.cpp:188
uint npx
Definition: tree.h:25
void extractBoundaryP(uint istart, uint iend)
Definition: tree.cpp:1491
unordered_map< morton< N >, int >::iterator Rbegin()
Definition: tree.cpp:1644
bitmap< N, value > mesh
Definition: tree.h:186
uint checkSiblingStatus(morton< N > key, morton< N > *sibkey)
Definition: voxel.cpp:193
bitmap< N, value >::iterator find(morton< N > key)
Definition: full_tree.cpp:47
void flipForNbr(morton< N > *key, uint *mylevel, uint *changedirectionlevel, uint *direction)
Definition: tree.cpp:860
bool isBoundary(morton< N > &key)
Definition: tree.cpp:1323
virtual void convertCoordToMorton(real *xyz, morton< N > &key)
Definition: tree.cpp:1200
void clearMesh()
Definition: tree.cpp:1952
void addToList(morton< N > key)
Definition: tree.cpp:880
void flipForNbr(morton< WSIZE > *key, uint fixedlevel, uint *changedirectionlevel, uint *direction)
Definition: full_tree.cpp:168
void removeFromDerefineList(typename std::unordered_map< morton< N >, int >::iterator it)
Definition: tree.cpp:1855
~FullTree()
Definition: tree.h:212
morton< N > readDerefineList(typename std::unordered_map< morton< N >, int >::iterator it)
Definition: tree.cpp:1388
bitmap< N, value > mesh
Definition: tree.h:151
void pushToDerefinelist(uint nlevel)
Definition: tree.cpp:1720
This Class Generates an unbalancerd Voxel to improve search by geometry partitioning.
Definition: tree.h:146
bitvector< N > mortonSTL
Definition: tree.h:32
This Class Generates a 4:1 balancerd AMR mesh.
Definition: tree.h:16
void construct(real *length, real *coords, uint nx, uint ny, uint nz)
Definition: tree.cpp:1300
bitvector< N > mortonSTL
Definition: tree.h:188
bitmap< N, value > mesh
Definition: tree.h:30
uint maxlevel
Definition: tree.h:149
void derefineDerefineList()
Definition: tree.cpp:1921
uint isInsideSolid(const morton< N > key, const real *geom_xyz, uint n)
Definition: tree.cpp:524
std::unordered_map< morton< N >, value * > bitmap
Definition: definitions.h:93
void constructNonlocalHigherLevelNbrs(const morton< N > &key, const uint &keylevel, const uint &direction, morton< N > *nbr)
Definition: tree.cpp:1578
void insertSeed(morton< N > &key)
Definition: tree.cpp:1970
uint count(morton< N > key)
Definition: tree.cpp:930
std::bitset< N > morton
Definition: definitions.h:45
void enclosingBox(morton< N > key, real *X)
Definition: tree.cpp:189
void clearRefineList()
Definition: tree.cpp:496
double real
Definition: definitions.h:37
void refinelistReset()
Definition: tree.cpp:842
std::unordered_map< morton< N >, int > derefinelist
Definition: tree.h:189
void fourToOne()
Definition: tree.cpp:739
void findFlipLevel(morton< N > key, uint *mylevel, uint *changedirectionlevel, uint *direction)
Definition: tree.cpp:897
std::unordered_map< morton< N >, int > refinelist
Definition: tree.h:187
void getKey(uint i, morton< N > &key)
Definition: tree.cpp:1629
unsigned int uint
Definition: definitions.h:38
uint npy
Definition: tree.h:26
bool isInRefineList(const morton< N > &key)
Definition: tree.cpp:1535
real ancestorcoords[3]
Definition: tree.h:23
virtual void level(morton< N > key, uint *level)
Definition: tree.cpp:65
void siblings(morton< N > key, uint mylevel, morton< N > *sibkey)
Definition: tree.cpp:348
bitmap< N, value >::iterator begin()
Definition: full_tree.cpp:21
uint IsInVectorList(morton< N > key)
Definition: tree.cpp:559
~Voxel()
Definition: voxel.cpp:38
void constructHigherLevelNbrs(const morton< N > &key, const uint &keylevel, const uint &direction, morton< N > *nbr)
Definition: tree.cpp:1547
bool IsInsideSegment(morton< N > key, real *xyz)
Definition: voxel.cpp:318
void printMesh()
Definition: tree.cpp:1610
void setLevel(const uint &l)
Definition: full_tree.cpp:6
Voxel(real *length, real *coords)
Definition: tree.h:155
void retainFourToOne()
Definition: tree.cpp:1785
uint numMax
Definition: tree.h:150
void distributeGeomToLeaves(real *geom_xyz, uint n)
Definition: voxel.cpp:106
void insertNbrs(vector< int > &Nbrs)
Definition: tree.cpp:1983
void enclosingBoxFixedLevel(morton< N > key, uint mylevel, real *X)
Definition: tree.cpp:248
void clearMortonSTL()
Definition: tree.cpp:1638
unordered_map< morton< N >, int >::iterator Rend()
Definition: tree.cpp:1650
bool isInMeshList(const morton< N > &key)
Definition: tree.cpp:1521
void centroidFixedLevel(morton< N > key, const uint mylevel, real *xyz)
Definition: tree.cpp:149
std::unordered_map< morton< N >, int > refinelist
Definition: tree.h:31
virtual bitmap< N, value >::iterator find(morton< N > key)
Definition: tree.cpp:1083
~Tree()
Definition: tree.cpp:47
virtual bitmap< N, value >::iterator end()
Definition: tree.cpp:317
void convertCoordToMorton(real *xyz, morton< N > &key)
Definition: full_tree.cpp:368
Tree()
Definition: tree.h:47
unordered_map< morton< N >, int >::iterator Dend()
Definition: tree.cpp:1670
FullTree(real *length, real *coords)
Definition: tree.h:192
std::unordered_map< morton< N >, int >::iterator findInDerefine(morton< N > key)
Definition: tree.cpp:1849
std::unordered_map< morton< N >, int >::iterator findInList(morton< N > key)
Definition: tree.cpp:1105
void addToDerefineList(morton< N > key)
If any of the siblings are listed in the dereffinement do not add to the list as derefining one child...
Definition: tree.cpp:1685
Definition: tree.h:13
void mortonSTLclear()
Definition: tree.cpp:1959
void insertKey(morton< N > key)
Definition: tree.cpp:1315
friend class Hdf5XmfV
Definition: tree.h:165
void getDirections(morton< N > &key, vector< uint > &directions)
Definition: tree.cpp:1424