Newer
Older
#include <BarnesHutTree.hpp>
#include <MpiSimulation.hpp>
#include <iostream>
#include <mpi.h>
using namespace nbody;
using namespace std;
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
//MpiSimulation simulation(argc, argv);
Body data[4];
int mysize, myrank;
Body b[2];
int bodyBlocklengths[8] = {1, 1, 3, 3, 3, 1, 1, 1};
MPI_Datatype bodyDatatypes[8] = {MPI_LB, MPI_UNSIGNED_LONG, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_UB};
MPI_Aint bodyDisplacements[8];
MPI_Aint baseAdress;
MPI_Datatype mpi_body;
MPI_Get_address(&(b[0]), &baseAdress);
bodyDisplacements[0] = baseAdress - baseAdress;
MPI_Get_address(&(b[0].id), &bodyDisplacements[1]);
bodyDisplacements[1] -= baseAdress;
MPI_Get_address(&(b[0].position[0]), &bodyDisplacements[2]);
bodyDisplacements[2] -= baseAdress;
MPI_Get_address(&(b[0].velocity[0]), &bodyDisplacements[3]);
bodyDisplacements[3] -= baseAdress;
MPI_Get_address(&(b[0].acceleration[0]), &bodyDisplacements[4]);
bodyDisplacements[4] -= baseAdress;
MPI_Get_address(&(b[0].mass), &bodyDisplacements[5]);
bodyDisplacements[5] -= baseAdress;
MPI_Get_address(&(b[0].refinement), &bodyDisplacements[6]);
bodyDisplacements[6] -= baseAdress;
MPI_Get_address(&(b[7]), &bodyDisplacements[7]);
bodyDisplacements[7] -= baseAdress;
MPI_Type_create_struct(8, bodyBlocklengths, bodyDisplacements, bodyDatatypes, &mpi_body);
MPI_Type_commit(&mpi_body);
MPI_Comm_size(MPI_COMM_WORLD, &mysize);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
if (myrank == 0) {
srandom(42);
for (int i = 0; i < 4; i++) {
Body b(random() / random(), random() / random(), random() / random(), random() / random(), random() / random(), random() / random(), random() / random());
b.setId(i);
data[i] = b;
}
MPI_Send(&data[0], 4, mpi_body, 1, 0, MPI_COMM_WORLD);
} else if (myrank == 1) {
MPI_Status status;
MPI_Recv(&data[0], 4, mpi_body, 0, 0, MPI_COMM_WORLD, &status);
}
MPI_Finalize();
/*
if (myrank == 0) {
srandom(42);
for (int i = 0; i < 4; i++) {
Body b(random() / random(), random() / random(), random() / random(), random() / random(), random() / random(), random() / random(), random() / random());
b.setId(i);
data[i] = b;
}
//MPI_Send(&data[0], 4, *simulation.getDatatype(), 1, 0, MPI_COMM_WORLD);
} else if (myrank == 1) {
MPI_Status status;
//MPI_Recv(&data[0], 4, *simulation.getDatatype(), 0, 0, MPI_COMM_WORLD, &status);
}
*/
//simulation.distributeBodies();
//simulation.distributeDomains();
//simulation.buildTree();
/*
for (int i = 0; i < 1; i++) {
//local tree is built and correct domains are distributed