Skip to content
Snippets Groups Projects
Commit e00fa29c authored by Paul Heinzlreiter's avatar Paul Heinzlreiter
Browse files

* foce computation

parent 2ac8fcd2
Branches
No related merge requests found
#include "Body.hpp"
#include <stdlib.h>
#include <iostream>
#include <cmath>
#include <cfloat>
namespace nbody {
using namespace std;
......@@ -112,6 +114,30 @@ namespace nbody {
}
}
void Body::accumulateForce(Body from) {
double distance2 = 0.0;
distance2 += (this->position[0] - from.position[0]) * (this->position[0] - from.position[0]);
distance2 += (this->position[1] - from.position[1]) * (this->position[1] - from.position[1]);
distance2 += (this->position[2] - from.position[2]) * (this->position[2] - from.position[2]);
if (fabs(distance2) < FLT_EPSILON) {
distance2 = FLT_EPSILON;
}
double distance = sqrt(distance2);
double mdist = -1.0 * ((this->weight * from.weight) / distance2);
for (int i = 0; i < 3; i++) {
double vec = (this->position[i] - from.position[i]) / distance;
this->acceleration += vec * mdist;
}
}
void Body::resetAcceleration() {
for (int i = 0; i < 3; i++) {
this->acceleration[i] = 0.0;
}
}
double Body::getPosition(int index) {
return this->position[index];
}
......
......@@ -25,7 +25,9 @@ namespace nbody {
virtual double getMass();
virtual void setPosition(int index, double value);
virtual void setMass(double value);
virtual void resetAcceleration();
virtual void integrate();
virtual void accumulateForce(Body from);
virtual void print();
};
}
......
......@@ -51,6 +51,17 @@ namespace nbody {
return nodes;
}
void Tree::accumulateForceFor(Body& body) {
body.resetAcceleration();
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++) {
body.accumulateForce(*it);
}
}
}
}
vector<Body> Tree::dubinskiParse(string filename) {
vector<Body> result;
string line;
......
......@@ -25,6 +25,7 @@ namespace nbody {
virtual void build(vector<Body> bodies) = 0;
virtual int numberOfChildren() = 0;
virtual unsigned long numberOfNodes();
virtual void accumulateForceFor(Body& body);
virtual bool isCorrect();
};
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment