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

typedef struct _A {
	double a[3];
	double b[3];
	double leap[3];
	double c;
	double d[2];
} A;

using namespace nbody;
using namespace std;

Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
int main(int argc, char** argv) {
	Body b[2];
	int blocklengths[7] = {1, 3, 3, 3, 1, 1, 1};
	MPI::Datatype datatypes[7] = {MPI::LB, MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE, MPI::BOOL, MPI::UB};
	MPI::Aint displacements[7];
	MPI::Datatype btype = MPI::DATATYPE_NULL;

	MPI::Init(argc, argv);
	displacements[0] = MPI::Get_address(&(b[0])) - MPI::Get_address(&(b[0]));
	displacements[1] = MPI::Get_address(&(b[0].position[0])) - MPI::Get_address(&(b[0]));
	displacements[2] = MPI::Get_address(&(b[0].velocity[0])) - MPI::Get_address(&(b[0]));
	displacements[3] = MPI::Get_address(&(b[0].acceleration[0])) - MPI::Get_address(&(b[0]));
	displacements[4] = MPI::Get_address(&(b[0].mass)) - MPI::Get_address(&(b[0]));
	displacements[5] = MPI::Get_address(&(b[0].refinement)) - MPI::Get_address(&(b[0]));
	displacements[6] = MPI::Get_address(&(b[1])) - MPI::Get_address(&(b[0]));
	btype = btype.Create_struct(7, blocklengths, displacements, datatypes);
	btype.Commit();
	srandom(1234);
	if (MPI::COMM_WORLD.Get_rank() == 0) {
		b[0].mass = (float) random() / (float) random();
		for (int i = 0; i < 3; i++) {
			b[0].position[i] = (float) random() / (float) random();
			b[1].position[i] = (float) random() / (float) random();
			b[0].acceleration[i] = (float) random() / (float) random();
			b[1].acceleration[i] = (float) random() / (float) random();
			b[0].velocity[i] = (float) random() / (float) random();
			b[1].velocity[i] = (float) random() / (float) random();
			b[0].refinement = ((random() % 2) != 0);
			b[1].refinement = ((random() % 2) != 0);

		b[0].print();
		b[1].print();
		cout << "---" << endl;

		MPI::COMM_WORLD.Send(b, 2, btype, 1, 0);
	} else if (MPI::COMM_WORLD.Get_rank() == 1) {
		MPI::COMM_WORLD.Recv(b, 2, btype, 0, 0);
		b[0].print();
		b[1].print();
	btype.Free();
	MPI::Finalize();
	A a[4];
	int blocklengths[7] = {1, 3, 3, 3, 1, 2, 1};
	MPI::Datatype datatypes[7] = {MPI::LB, MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE, MPI::DOUBLE, MPI::UB};
	MPI::Aint displacements[7];
	MPI::Datatype restype = MPI::DATATYPE_NULL;
	//MPI::Aint doublelb;
	//MPI::Aint doubleex;
	MPI::Init(argc, argv);
	//datatypes[1].Get_extent(doublelb, doubleex);
	displacements[0] = MPI::Get_address(&(a[0])) - MPI::Get_address(&(a[0]));
	displacements[1] = MPI::Get_address(&(a[0].a[0])) - MPI::Get_address(&(a[0]));
	displacements[2] = MPI::Get_address(&(a[0].b[0])) - MPI::Get_address(&(a[0]));
	displacements[3] = MPI::Get_address(&(a[0].leap[0])) - MPI::Get_address(&(a[0]));
	displacements[4] = MPI::Get_address(&(a[0].c)) - MPI::Get_address(&(a[0]));
	displacements[5] = MPI::Get_address(&(a[0].d[0])) - MPI::Get_address(&(a[0]));
	displacements[6] = MPI::Get_address(&(a[1])) - MPI::Get_address(&(a[0]));
	restype = restype.Create_struct(7, blocklengths, displacements, datatypes);
	restype.Commit();
	srandom(1234);
	if (MPI::COMM_WORLD.Get_rank() == 0) {
		for (int j = 0; j < 4; j++) {
			for (int i = 0; i < 4; i++) {
				a[j].a[i] = (float) random() / (float) random();
				a[j].b[i] = (float) random() / (float) random();
			a[j].c = (float) random() / (float) random();
		for (int j = 0; j < 4; j++) {
			cout << "0: ";
			for (int i = 0; i < 4; i++) {
				cout << a[j].a[i] << " ";
			}
			cout << "| ";
			for (int i = 0; i < 4; i++) {
				cout << a[j].b[i] << " ";
			cout << "| ";
			cout << a[j].c << endl;
		MPI::COMM_WORLD.Send(&a[0], 4, restype, 1, 0);
	} else if (MPI::COMM_WORLD.Get_rank() == 1) {
		MPI::COMM_WORLD.Recv(&a[0], 4, restype, 0, 0);
		for (int j = 0; j < 4; j++) {
			cout << "1: ";
			for (int i = 0; i < 4; i++) {
				cout << a[j].a[i] << " ";
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			}
			cout << "| ";
			for (int i = 0; i < 4; i++) {
				cout << a[j].b[i] << " ";
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			}
			cout << "| ";
			cout << a[j].c << endl;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		}
	restype.Free();
	MPI::Finalize();
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	return 0;