From 80e146f5ffc59ba95ebd8df84a4c3ed75956f206 Mon Sep 17 00:00:00 2001 From: Paul Heinzlreiter Date: Tue, 21 Jun 2016 16:24:36 +0200 Subject: [PATCH] * fixing bh tree build --- bh_tree_mpi/datastructures/BarnesHutTree.cpp | 22 ++++++++-------- bh_tree_mpi/datastructures/Tree.cpp | 18 ++++++++----- bh_tree_mpi/datastructures/Tree.hpp | 1 + bh_tree_mpi/datastructures/TreeNode.cpp | 27 +++++++++++++------- bh_tree_mpi/datastructures/TreeNode.hpp | 1 + 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/bh_tree_mpi/datastructures/BarnesHutTree.cpp b/bh_tree_mpi/datastructures/BarnesHutTree.cpp index 8e53152..16e8ac6 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 9521a78..f8c5e5c 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 f599a35..8eda165 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 9150c09..026230a 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 85648a8..73d1124 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; -- GitLab