Skip to content
Snippets Groups Projects
mpitest.cpp 2.43 KiB
Newer Older
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include <mpi.h>
#include <vector>
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include <iostream>
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include "datastructures/Body.hpp"

int main(int argc, char** argv) {
	using namespace nbody;
	using namespace std;

	MPI::Init(argc, argv);
	MPI::Datatype Btype;
	MPI::Datatype type[3] = {MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE};
	int blocks[3] = {3, 3, 1};
	MPI::Aint disp[3];
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	Body data[16];

	if (MPI::COMM_WORLD.Get_rank() == 0) {
		for (int i = 0; i < 16; i++) {
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			Body b((double) i, (double) i, (double) i);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			data[i] = b;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		if (MPI::COMM_WORLD.Get_rank() == 0) {
			for (int i = 0; i < 16; i++) {
				cout << MPI::COMM_WORLD.Get_rank() << " " <<  data[i].position[0] << endl;
			}
		}


	} else {
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		for (int i = 0; i < 16; i++) {
			Body b((double) 0, (double) 0, (double) 0);

			data[i] = b;
		}
		if (MPI::COMM_WORLD.Get_rank() != 0) {
			for (int i = 0; i < 16; i++) {
				cout << MPI::COMM_WORLD.Get_rank() << " " <<  data[i].position[0] << endl;
			}
		}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	/*
	disp[0] = MPI::Get_address(data[0].position);
	disp[1] = MPI::Get_address(data[0].velocity);
	disp[2] = MPI::Get_address(&data[0].mass);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	*/
	disp[0] = MPI::Get_address(data[0].position) - MPI::Get_address(&data[0]);
	disp[1] = MPI::Get_address(data[0].velocity) - MPI::Get_address(&data[0]);
	disp[2] = MPI::Get_address(&data[0].mass) - MPI::Get_address(&data[0]);
	Btype = Btype.Create_struct(3, blocks, disp, type);
	Btype.Commit();
	MPI::COMM_WORLD.Bcast(MPI::BOTTOM, 16, Btype, 0);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	cout << "------" << endl;
	Btype.Free();

Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	if (MPI::COMM_WORLD.Get_rank() != 0) {
		for (int i = 0; i < 16; i++) {
			cout << MPI::COMM_WORLD.Get_rank() << " " <<  data[i].position[0] << endl;
		}
	}

	MPI::Finalize();
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	/*
	MPI::Datatype Btype;
	MPI::Datatype type[3] = {MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE};
	int blocks[3] = {3, 3, 1};
	MPI::Aint disp[3];
	//Body data[16];
	vector<Body> data;

	MPI::Init(argc, argv);
	if (MPI::COMM_WORLD.Get_rank() == 0) {
		for (int i = 0; i < 16; i++) {
			Body b;

			data.push_back(b);
		}

	} else {
		data.reserve(16);
	}
	*/

Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	MPI::Init(argc, argv);
	MPI::Datatype Btype;
	MPI::Datatype type[3] = {MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE};
	int blocks[3] = {3, 3, 1};
	MPI::Aint disp[3];
	Body data[16];
	disp[0] = MPI::Get_address(data[0].position);
	disp[1] = MPI::Get_address(data[0].velocity);
	disp[2] = MPI::Get_address(&data[0].mass);
	Btype = Btype.Create_struct(3, blocks, disp, type);
	Btype.Commit();
	MPI::COMM_WORLD.Bcast(MPI::BOTTOM, 16, Btype, 0);
	Btype.Free();
	MPI::Finalize();
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	return 0;
}