// Michael Chen, 9.27.2007 #include #include #include "mpi.h" const double theta = 45; const double v0 = 134.11200; const double rf= 0.0034; const double dt = 0.01; const double pi = 3.1415926; const double g = 9.80665; double ax; double ay; int main(int argc, char* argv[]) { int rank,size; MPI_Status status; int k,tag=0; double y; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); double angle; double maxangle=90.0; double wvel; double wmax=50.0; int flag=0; double args[3]; if(rank==0) // parent process { k=1; flag=1; for(angle=0.0;angle<=maxangle;angle+=0.5) for (wvel=-50.0;wvel<=wmax;wvel+=0.5) { //printf("flag:%d,k:%d,size:%d\n",flag,k,size); if (flag>=size) { MPI_Recv(args,3,MPI_DOUBLE,k,tag,MPI_COMM_WORLD,&status); printf("receiving! endx:%3.2f\n", args[2]); flag--; } args[0]=wvel; args[1]=angle; args[2]=1337.0; MPI_Send(args,3,MPI_DOUBLE,k,tag,MPI_COMM_WORLD); k++; flag++; if (k>=size) k=1; printf("sending! angle:%3.2f,wvel:%3.2f\n",angle,wvel); } int recall=0; int ori=k-1; if (ori<1) ori=size; //printf("here?\n"); while (recall==0) { if (size==2) { MPI_Recv(args,3,MPI_DOUBLE,k,tag,MPI_COMM_WORLD,&status); printf("%3.2f\n",args[2]); break; } MPI_Recv(args,3,MPI_DOUBLE,k,tag,MPI_COMM_WORLD,&status); printf("%3.2f\n",args[2]); k++; if (k>=size) k=1; if (k==ori) recall=1; } args[0]=0.0; args[1]=0.0; args[2]=666.0; int n; for (n=1;n=0) { ax = (vx-vw)*(vx-vw)*rf; if (vw0.0) ay=-g-rf*vy*vy; else ay=-g+rf*vy*vy; vx+=(ax*dt); vy+=(ay*dt); px+=vx; py+=vy; } args[2]=px; MPI_Send(args,3,MPI_DOUBLE,0,tag,MPI_COMM_WORLD); } } MPI_Finalize(); return 0; }