Skip to content
Snippets Groups Projects
MpiSimulation.cpp 1.15 KiB
Newer Older
#include "../datastructures/Body.hpp"
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include "MpiSimulation.hpp"

namespace nbody {
	MpiSimulation::MpiSimulation(int& argc, char**& argv) {
		MPI::Datatype types[5] = {MPI::LB, MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE, MPI::UB};
		int blocklengths[5] = {1, 3, 3, 1, 1};
		MPI::Aint displacements[5];
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		CommBody example;

		MPI::Init(argc, argv);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		example.mass = 0.0;
		example.position[0] = 0.0;
		example.position[1] = 0.0;
		example.position[2] = 0.0;
		example.velocity[0] = 0.0;
		example.velocity[1] = 0.0;
		example.velocity[2] = 0.0;
		displacements[0] = MPI::Get_address(&example);
		displacements[1] = MPI::Get_address(&example.position[0]);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		displacements[2] = MPI::Get_address(&example.velocity[0]);
		displacements[3] = MPI::Get_address(&example.mass);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		displacements[4] = MPI::Get_address(&example + sizeof(CommBody));
		this->mpiBody = this->mpiBody.Create_struct(5, blocklengths, displacements, types);
		this->mpiBody.Commit();
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		this->mpiSize = MPI::COMM_WORLD.Get_size();
		this->mpiRank = MPI::COMM_WORLD.Get_rank();
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		MPI::COMM_WORLD.Bcast(&example, 1, this->mpiBody, 0);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	}

	MpiSimulation::~MpiSimulation() {
		this->mpiBody.Free();
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		MPI::Finalize();
	}
}