#include #include #include #include #define G 6.673e-11 // GRAVITATIONAL CONSTANT #define PI 3.1415926535898 // CONSTANT PI typedef struct ParticleStruct { double px, py; double vx, vy; double Mass; double ForceAccumX, ForceAccumY; } Particle; int NumProcs; int MyID; MPI_Datatype MPI_PARTICLE; void ComputeGravForce(Particle A, Particle B, double *ForceX, double *ForceY) { double ABx = B.px - A.px; double ABy = B.py - A.py; double DistAB2 = ABx*ABx+ABy*ABy; double DistAB = sqrt(DistAB2); double DistAB3 = DistAB2 * DistAB; double Scale = (G * A.Mass * B.Mass) / DistAB3; *ForceX = Scale * ABx; *ForceY = Scale * ABy; } void ComputeGravForces(Particle *Particles, int NumParticles) { int i,j, k; double ForceX, ForceY; int DestProc, SourceProc; int LeftProc, RightProc; MPI_Status Status; // ALLOCATE SPACE FOR RECEIVED PARTICLES Particle *CommParticles = (Particle *)malloc(sizeof(Particle)*NumParticles); for (i=0; i0) MPI_Send(CommParticles,NumParticles,MPI_PARTICLE,RightProc,0,MPI_COMM_WORLD); // RECEIVE PARTICLES FROM PREV PROCESSOR (LEFT) MPI_Recv(CommParticles,NumParticles,MPI_PARTICLE,LeftProc,0,MPI_COMM_WORLD,&Status); // COMPUTE FORCES BETWEEN RECEIVED AND LOCAL PARTICLES // (UPDATE LOCAL AND RECEIVED PARTICLES) for (i=0; i