Skip to content
Snippets Groups Projects
mpimain.cpp 2.7 KiB
Newer Older
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include <BarnesHutTree.hpp>
#include <MpiSimulation.hpp>
#include <iostream>
#include <mpi.h>
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include <cstdlib>
#include <Tree.hpp>

using namespace nbody;
using namespace std;

int main(int argc, char* argv[]) {
	MPI_Init(&argc, &argv);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	//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;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	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;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed

Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		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();

	/*
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	for (int i = 0; i < 1; i++) {
		//local tree is built and correct domains are distributed
		simulation.runStep();
	}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	*/
	//simulation.cleanup();
	//MPI_Finalize();