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

* bodies distribution

parent c04b3b64
Branches
No related merge requests found
......@@ -201,6 +201,25 @@ namespace nbody {
return result;
}
vector<Box> Box::splitLongestSide() {
vector<Box> result;
int longestIndex = -1;
double longestSide = -1.0;
for (int i = 0; i < 3; i++) {
if (this->max[i] - this->min[i] > longestSide) {
longestSide = this->max[i] - this->min[i];
longestIndex = i;
}
}
double middle = this->min[longestIndex] + (this->max[longestIndex] - this->min[longestIndex]) / 2.0;
result.push_back(*this);
result.back().max[longestIndex] = middle;
result.push_back(*this);
result.back().min[longestIndex] = middle;
return result;
}
bool Box::isCorrect() {
for (int i = 0; i < 3; i++) {
if (this->max[i] < this->min[i]) {
......
......@@ -32,6 +32,7 @@ namespace nbody {
virtual bool overlapsSphere(double* sphereCenter, double sphereRadius);
virtual double distanceToPosition(double* position);
virtual vector<Box> octreeSplit();
virtual vector<Box> splitLongestSide();
};
}
......
......@@ -30,6 +30,10 @@ namespace nbody {
return this->bb;
}
void Node::setBB(Box bb) {
this->bb = bb;
}
bool Node::isSplitable() {
if (this->bodies.size() < 2) {
return false;
......@@ -165,4 +169,8 @@ namespace nbody {
}
return sqrt(distance) > this->getL();
}
void Node::setBodies(vector<Body> bodies) {
this->bodies = bodies;
}
}
......@@ -34,6 +34,7 @@ namespace nbody {
virtual void extendBBforBodies();
virtual void extendBBtoCube();
virtual Box getBB();
virtual void setBB(Box bb);
virtual vector<Body> getBodies();
virtual void insertBefore(Node* node);
virtual void insertAfter(Node* node);
......@@ -43,6 +44,7 @@ namespace nbody {
virtual bool isCorrect();
virtual void print();
virtual bool sufficientForBody(Body body);
virtual void setBodies(vector<Body> bodies);
};
}
......
......@@ -4,6 +4,7 @@
#include "../datastructures/Box.hpp"
#include "MpiSimulation.hpp"
#include "../datastructures/Tree.hpp"
#include "../datastructures/Node.hpp"
namespace nbody {
using namespace std;
......@@ -18,12 +19,6 @@ namespace nbody {
this->mpiSize = MPI::COMM_WORLD.Get_size();
this->mpiRank = MPI::COMM_WORLD.Get_rank();
float log2 = logf(this->mpiSize) / logf(2.0f);
if (ceilf(log2) != log2 || floorf(log2) != log2) {
cerr << "number of processes needs to be a power of two" << endl;
MPI::Finalize();
exit(-1);
}
this->correctState = true;
this->bodyType = MPI::DATATYPE_NULL;
//displacements are calculated from the start of the structure
......@@ -83,25 +78,53 @@ namespace nbody {
void MpiSimulation::distributeBodies() {
this->comms.push_back(MpiBodyComm(&this->bodyType));
if (this->mpiRank == 0) {
vector<Node> nodes;
Box bb;
vector<Box> domains;
vector<MpiBodyComm>::iterator it;
nodes.push_back(Node(NULL));
nodes.front().setBodies(this->bodies);
bb = nodes.front().getBB();
bb.extendForBodies(this->bodies);
bb.extendToCube();
domains = bb.octreeSplit();
for (int i = 1; i < this->mpiSize; i++) {
vector<Body> toSend = domains[i].extractBodies(this->bodies);
nodes.front().setBB(bb);
while (nodes.size() < this->mpiSize) {
int mostBodiesIndex = 0;
for (unsigned int i = 0; i < nodes.size(); i++) {
if (nodes[i].getBodies().size() > nodes[mostBodiesIndex].getBodies().size()) {
mostBodiesIndex = i;
}
}
vector<Box> subdomains = nodes[mostBodiesIndex].getBB().splitLongestSide();
vector<Body> buf = nodes[mostBodiesIndex].getBodies();
Node n(NULL);
Box bb;
n.setBodies(subdomains[0].extractBodies(buf));
bb.extendForBodies(n.getBodies());
n.setBB(bb);
nodes.insert(nodes.begin() + mostBodiesIndex, n);
n = Node(NULL);
n.setBodies(subdomains[1].extractBodies(buf));
bb.extendForBodies(n.getBodies());
n.setBB(bb);
nodes.insert(nodes.begin() + mostBodiesIndex, n);
nodes.erase(nodes.begin() + mostBodiesIndex + 2);
}
this->bodies = nodes[0].getBodies();
/*
for (unsigned int i = 1; i < nodes.size(); i++) {
vector<MpiBodyComm>::iterator it = this->comms.begin();
it = this->comms.begin();
while (!it->sendUnblocking(i, toSend) && it != this->comms.end()) it++;
while (!it->sendUnblocking(i, nodes[i].getBodies()) && it != this->comms.end()) it++;
if (it == this->comms.end()) {
this->comms.push_back(MpiBodyComm(&this->bodyType));
this->comms.back().sendUnblocking(i, toSend);
this->comms.back().sendUnblocking(i, nodes[i].getBodies());
}
}
*/
} else {
this->comms[0].recvBlocking(0, this->bodies);
//this->comms[0].recvBlocking(0, this->bodies);
}
cout << this->mpiRank << ": SIZE: " << this->bodies.size() << endl;
}
}
......@@ -12,8 +12,8 @@ namespace nbody {
class MpiSimulation : public Simulation {
friend class MpiBodyComm;
protected:
int mpiSize;
int mpiRank;
unsigned int mpiSize;
unsigned int mpiRank;
MPI::Datatype bodyType;
vector<MpiBodyComm> comms;
bool correctState;
......
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