Newer
Older
#include <string>
#include <sstream>
}
Tree::~Tree() {
}
void Tree::clean() {
while (current != this->nodes) {
if (!current->isCorrect()) {
return false;
}
current = current->next;
}
return true;
unsigned long Tree::numberOfNodes() {
unsigned long nodes = 0;
for (Node* node = this->nodes->next; node != this->nodes; node = node->next) {
void Tree::accumulateForceOnto(Body& body) {
Node* n = this->nodes->next;
while (n != this->nodes) {
if (n->sufficientForBody(body)) {
n->representative.accumulateForceOnto(body);
} else if (n->leaf) {
for (vector<Body>::iterator it = n->bodies.begin(); it != n->bodies.end(); it++) {
it->accumulateForceOnto(body);
}
}
n = n->afterSubtree;
}
}
void Tree::computeForces() {
for (Node* n = this->nodes->next; n != this->nodes; n = n->next) {
if (n->leaf) {
for (vector<Body>::iterator it = n->bodies.begin(); it != n->bodies.end(); it++) {
this->accumulateForceOnto(*it);
vector<Body> Tree::dubinskiParse(string filename) {
vector<Body> result;
string line;
ifstream infile(filename.c_str(), ifstream::in);
while (infile >> mass >> px >> py >> pz) {
Body b(px, py, pz, mass);
vector<Body> result;
while (this->nodes->next != this->nodes) {
if (this->nodes->next->leaf) {
for (vector<Body>::iterator it = this->nodes->next->bodies.begin(); it != this->nodes->next->bodies.end(); it++) {
if (!it->refinement) {
result.push_back(*it);
}
}
}
Node* h = this->nodes->next;
this->nodes->next->unlink();
delete(h);
}
this->clean();
return result;
}
vector<Body> Tree::copyRefinements(Box domain) {
vector<Body> result;
Node* current = this->nodes->next;
while (current != this->nodes) {
bool sufficient = current->sufficientForBox(domain);
if (sufficient) {
result.push_back(current->representative);
current = current->afterSubtree;
} else if (current->leaf) {
result.insert(result.end(), current->bodies.begin(), current->bodies.end());
current = current->next;
} else {
current = current->next;
}
}
return result;
}
Box Tree::getRootBB() {
return this->nodes->next->bb;
}
void Tree::rebuild(Box domain) {
this->build(this->extractLocalBodies(), domain);
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
void Tree::advance() {
for (Node* n = this->nodes->next; n != this->nodes; n = n->next) {
if (n->leaf) {
for (vector<Body>::iterator it = n->bodies.begin(); it != n->bodies.end(); it++) {
if (!it->refinement) {
it->integrate();
}
}
}
}
}
Box Tree::getLocalBB() {
Box result;
for (Node* n = this->nodes->next; n != this->nodes; n = n->next) {
if (n->leaf) {
for (vector<Body>::iterator it = n->bodies.begin(); it != n->bodies.end(); it++) {
if (!it->refinement) {
result.extend(*it);
}
}
}
}
return result;
}
void Tree::print() {
this->nodes->next->bb.print();
}