#include "datastructures/BarnesHutTree.hpp" #include "parallelization/MpiSimulation.hpp" #include using namespace nbody; using namespace std; int main(int argc, char* argv[]) { if (argc == 2) { MpiSimulation simulation(argc, argv); MpiBodyComm comm; vector bodies; /* if (simulation.getProcessId() == 0) { bodies = Tree::dubinskiParse(argv[1]); comm.sendBlocking(1, bodies); } else { comm.recvBlocking(0, bodies); } */ MPI::Datatype Btype; MPI::Datatype type[3] = {MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE}; int blocks[3] = {3, 3, 1}; MPI::Aint disp[3]; if (simulation.getProcessId() == 0) { bodies = Tree::dubinskiParse(argv[1]); } else { bodies.reserve(128); } disp[0] = MPI::Get_address(bodies[0].position); disp[1] = MPI::Get_address(bodies[0].velocity); disp[2] = MPI::Get_address(&bodies[0].mass); Btype = Btype.Create_struct(3, blocks, disp, type); Btype.Commit(); //MPI::COMM_WORLD.Bcast(MPI::BOTTOM, 128, Btype, 0); if (simulation.getProcessId() == 0) { MPI::COMM_WORLD.Send(MPI::BOTTOM, 128, Btype, 1, 0); } else if (simulation.getProcessId() == 1) { MPI::COMM_WORLD.Recv(MPI::BOTTOM, 128, Btype, 0, 0); } Btype.Free(); /* if (simulation.getProcessId() == 0) { BarnesHutTree tree; vector bodies = Tree::dubinskiParse(argv[1]); cout << bodies.size() << endl; tree.build(bodies); if (!tree.isCorrect()) { cout << "Tree not correct" << endl; return -1; } tree.print(); tree.computeForces(); tree.moveBodies(); tree.rebuildTree(); if (!tree.isCorrect()) { cout << "Tree not correct" << endl; return -1; } tree.print(); comm.sendBlocking(1, bodies); } else if (simulation.getProcessId() == 1) { vector recved; comm.recvBlocking(0, recved); } */ } else { std::cout << "You need to specify the body input file." << endl; } return 0; }