Newer
Older
} A;
using namespace nbody;
using namespace std;
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;
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);
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);
MPI::COMM_WORLD.Recv(b, 2, btype, 0, 0);
b[0].print();
b[1].print();
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;
//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();
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();
cout << "0: ";
for (int i = 0; i < 4; i++) {
cout << a[j].a[i] << " ";
}
cout << "| ";
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] << " ";
cout << "| ";
for (int i = 0; i < 4; i++) {
cout << a[j].b[i] << " ";