VTK  9.0.2
BHTree.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3 Copyright (c) 2007, Los Alamos National Security, LLC
4 
5 All rights reserved.
6 
7 Copyright 2007. Los Alamos National Security, LLC.
8 This software was produced under U.S. Government contract DE-AC52-06NA25396
9 for Los Alamos National Laboratory (LANL), which is operated by
10 Los Alamos National Security, LLC for the U.S. Department of Energy.
11 The U.S. Government has rights to use, reproduce, and distribute this software.
12 NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY,
13 EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE.
14 If software is modified to produce derivative works, such modified software
15 should be clearly marked, so as not to confuse it with the version available
16 from LANL.
17 
18 Additionally, redistribution and use in source and binary forms, with or
19 without modification, are permitted provided that the following conditions
20 are met:
21 - Redistributions of source code must retain the above copyright notice,
22  this list of conditions and the following disclaimer.
23 - Redistributions in binary form must reproduce the above copyright notice,
24  this list of conditions and the following disclaimer in the documentation
25  and/or other materials provided with the distribution.
26 - Neither the name of Los Alamos National Security, LLC, Los Alamos National
27  Laboratory, LANL, the U.S. Government, nor the names of its contributors
28  may be used to endorse or promote products derived from this software
29  without specific prior written permission.
30 
31 THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
32 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
33 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34 ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR
35 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
36 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
37 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
38 OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
39 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
40 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
41 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 
43 =========================================================================*/
44 
45 // .NAME BHTree - Create a Barnes Hut tree from the given points
46 //
47 // .SECTION Description
48 // BHTree takes point locations and distributes them recursively in
49 // a Barnes Hut tree. The tree is a quadtree or octree, dividing on physical
50 // location such that one point or one node appears within a child
51 // so that it is essentially AMR.
52 //
53 // This is used to ensure unique points in the vtk data set and so the
54 // succeeding steps of threading the tree for iteration is not done.
55 //
56 // BHLeaf is the actual point with the index matching the vtkPoints index.
57 // BHNode are negative numbers. This allows a quick recognition of a leaf
58 // or a node. Children numbered with 0 are empty.
59 //
60 
61 #ifndef BHTree_h
62 #define BHTree_h
63 
64 #include <vector>
65 
66 const int MAX_DIM = 3;
67 const int MAX_CHILD = 8;
68 
70 //
71 // Leaf information
72 //
74 
75 class BHLeaf
76 {
77 public:
78  BHLeaf(int dim, double* loc);
79  BHLeaf();
80 
81  bool sameAs(int dim, double* loc);
82 
83  double location[MAX_DIM];
84 };
85 
87 //
88 // BH node information
89 //
90 // Barnes Hut octree structure for N-body is represented by vector
91 // of BHNode which divide space into octants which are filled with one
92 // particle or one branching node. As the tree is built the child[8]
93 // array is used. Afterwards the tree is walked linking the nodes and
94 // replacing the child structure with data about the tree. When building
95 // the tree child information is an integer which is the index of the
96 // halo particle which was put into a vector of BHLeaf, or the index
97 // of the BHNode offset by the number of particles
98 //
100 
101 class BHNode
102 {
103 public:
105  BHNode(int dim, int numChild, double* minLoc, double* maxLoc);
106  BHNode(int dim, int numChild, BHNode* parent, int child);
107 
108  double length[MAX_DIM]; // Length of octant on each side
109  double center[MAX_DIM]; // Physical center of octant
110  int child[MAX_CHILD]; // Index of leaf or node
111 };
112 
114 //
115 // Barnes Hut Tree
116 //
118 
119 class BHTree
120 {
121 public:
122  BHTree(int dimension, int numChild,
123  double* minLoc, // Bounding box of tree
124  double* maxLoc); // Bounding box of tree
126 
127  int insertLeaf(double* loc);
128  int getChildIndex(BHNode* node, double* loc);
129  void print();
130 
131 private:
132  int dimension;
133  int numberOfChildren;
134  int leafIndex;
135  int nodeIndex;
136 
137  double minRange[MAX_DIM]; // Physical range of data
138  double maxRange[MAX_DIM]; // Physical range of data
139 
140  std::vector<BHLeaf*> bhLeaf;
141  std::vector<BHNode*> bhNode;
142 };
143 
144 #endif
const int MAX_CHILD
Definition: BHTree.h:67
const int MAX_DIM
Definition: BHTree.h:66
Definition: BHTree.h:76
bool sameAs(int dim, double *loc)
double location[MAX_DIM]
Definition: BHTree.h:83
BHLeaf(int dim, double *loc)
Definition: BHTree.h:102
BHNode(int dim, int numChild, double *minLoc, double *maxLoc)
double center[MAX_DIM]
Definition: BHTree.h:109
BHNode(int dim, int numChild, BHNode *parent, int child)
double length[MAX_DIM]
Definition: BHTree.h:108
int child[MAX_CHILD]
Definition: BHTree.h:110
Definition: BHTree.h:120
BHTree(int dimension, int numChild, double *minLoc, double *maxLoc)
int insertLeaf(double *loc)
void print()
int getChildIndex(BHNode *node, double *loc)