diff --git a/bh_tree_mpi/datastructures/BarnesHutTree.cpp b/bh_tree_mpi/datastructures/BarnesHutTree.cpp
index 8e531524e98c47c41cc96ced8dbb120dcbc3dac0..16e8ac62034510c27675d1a1c2deb135c7cba69c 100644
--- a/bh_tree_mpi/datastructures/BarnesHutTree.cpp
+++ b/bh_tree_mpi/datastructures/BarnesHutTree.cpp
@@ -37,7 +37,6 @@ namespace nbody {
void BarnesHutTree::build(vector
bodies) {
TreeNode* current;
- unsigned long nodes = 0;
this->clean();
if (bodies.empty()) return;
@@ -59,24 +58,25 @@ namespace nbody {
}
if (current->isSplitable()) {
vector subboxes = this->splitBB(current);
- vector localBodies = current->getBodies();
- TreeNode* after = current->next;
-
current->leaf = false;
- for (vector::iterator bit = subboxes.begin(); bit != subboxes.end(); bit++) {
+
+ for (vector::iterator it = subboxes.begin(); it != subboxes.end(); it++) {
TreeNode* child = new TreeNode(this);
- nodes++;
- child->bb = *bit;
- child->bodies = bit->containedBodies(localBodies);
- current->next->insertBefore(child);
- child->afterSubtree = (bit == subboxes.begin()) ? current->afterSubtree : child->next;
+ child->bb = *it;
+ //TODO: move bodies
+ child->bodies = it->containedBodies(current->bodies);
+ current->insertAfter(child);
+ if (it != subboxes.begin()) {
+ child->afterSubtree = child->next;
+ } else {
+ child->afterSubtree = current->afterSubtree;
+ }
}
current->bodies.clear();
}
current = current->next;
}
- cout << "nodes " << nodes << endl;
}
}
diff --git a/bh_tree_mpi/datastructures/Tree.cpp b/bh_tree_mpi/datastructures/Tree.cpp
index 9521a780533754e8fb7b9b84bdbc38640f44463c..f8c5e5ca7a0f6c383808a782e6f8bb74a0a6d965 100644
--- a/bh_tree_mpi/datastructures/Tree.cpp
+++ b/bh_tree_mpi/datastructures/Tree.cpp
@@ -37,14 +37,9 @@ namespace nbody {
if (!current->isCorrect()) {
return false;
}
- if (current->next != this->nodes && current->next != current->afterSubtree) {
- cout << "inner node: " << current->bodies.size() << endl;
- } else {
- cout << "leaf: " << current->bodies.size() << endl;
- }
- //TODO: fix
+
/*
- if (current->next != this->nodes && current->next != current->afterSubtree) {
+ if (!current->leaf) {
//inner node
int numChildren = 0;
@@ -67,6 +62,15 @@ namespace nbody {
return true;
}
+ unsigned long Tree::numberOfNodes() {
+ unsigned long nodes = 0;
+
+ for (TreeNode* node = this->nodes->next; node != this->nodes; node = node->next) {
+ nodes++;
+ }
+ return nodes;
+ }
+
vector Tree::dubinskiParse(string filename) {
vector result;
string line;
diff --git a/bh_tree_mpi/datastructures/Tree.hpp b/bh_tree_mpi/datastructures/Tree.hpp
index f599a35e215b85e8b81d31ed148b2c68bae2a778..8eda165c3325fdcae02e3eaaae3231d0809274c2 100644
--- a/bh_tree_mpi/datastructures/Tree.hpp
+++ b/bh_tree_mpi/datastructures/Tree.hpp
@@ -24,6 +24,7 @@ namespace nbody {
virtual void clean();
virtual void build(vector bodies) = 0;
virtual int numberOfChildren() = 0;
+ virtual unsigned long numberOfNodes();
virtual bool isCorrect();
};
diff --git a/bh_tree_mpi/datastructures/TreeNode.cpp b/bh_tree_mpi/datastructures/TreeNode.cpp
index 9150c099e98335f5cb99094b2bff38be174d8445..026230a58f7c1f70fe25691c90fc564b0fa890b3 100644
--- a/bh_tree_mpi/datastructures/TreeNode.cpp
+++ b/bh_tree_mpi/datastructures/TreeNode.cpp
@@ -70,7 +70,7 @@ namespace nbody {
}
void TreeNode::insertAfter(TreeNode* node) {
- this->insertBefore(node->next);
+ this->next->insertBefore(node);
}
void TreeNode::unlink() {
@@ -97,28 +97,37 @@ namespace nbody {
}
for (vector::iterator it = this->bodies.begin(); it != this->bodies.end(); it++) {
if (!this->bb.isContained(*it)) {
-
cout << "bb out of bounds" << endl;
return false;
}
}
- if (this->next == this->afterSubtree && !this->leaf) {
- cout << "inner node inconsistency" << endl;
- return false;
- }
if (!this->leaf) {
TreeNode* current = this->next;
+ int children = 0;
+ while (current != NULL && current != this->afterSubtree) {
+ current = current->afterSubtree;
+ children++;
+ }
+ if (current == NULL) {
+ cout << "afterSubtree null" << endl;
+ return false;
+ }
+ if (children != this->tree->numberOfChildren()) {
+ cout << "wrong number of children " << children << endl;
+ return false;
+ }
+ current = this->next;
for (int i = 0; i < this->tree->numberOfChildren(); i++) {
current = current->afterSubtree;
}
- if (current->afterSubtree != this->afterSubtree) {
- cout << "inner node afterSubtree inconsistent" << endl;
+ if (current != this->afterSubtree) {
+ cout << "last sibling afterSubtree inconsistent" << endl;
return false;
}
}
if (!this->leaf && this->bodies.size() > 0) {
- cout << "non-empty leaf" << endl;
+ cout << "non-empty inner node" << endl;
return false;
}
return true;
diff --git a/bh_tree_mpi/datastructures/TreeNode.hpp b/bh_tree_mpi/datastructures/TreeNode.hpp
index 85648a8db7388b696df005fac03b8f3e05f40904..73d1124695015bc2d5c53d3875946c510b9f80ce 100644
--- a/bh_tree_mpi/datastructures/TreeNode.hpp
+++ b/bh_tree_mpi/datastructures/TreeNode.hpp
@@ -15,6 +15,7 @@ namespace nbody {
friend void Tree::clean();
friend void BarnesHutTree::build(vector bodies);
friend bool Tree::isCorrect();
+ friend unsigned long Tree::numberOfNodes();
protected:
Box bb;
vector bodies;