void sg_route(struct Domain *theDomain,struct poisson *thePoisson){ // struct Tridiagsys* thetridiag=alloc_tridiagsys(thePoisson); tridiag_setup(thePoisson); int N_r=thePoisson->N_r; int N_z=thePoisson->N_z; int N_p=thePoisson->N_p; int N_k=thePoisson->N_k; int i,j,k; int size=thePoisson->size; int rank=theDomain->rank; cylinder_interp(theDomain,thePoisson); set_bndry(theDomain,thePoisson); density_fft(thePoisson); mpi_arrange(thePoisson->density,thePoisson->buffer,thePoisson); double *buffersend=thePoisson->buffer; double *bufferstore=thePoisson->density; int *sendcnts=thePoisson->sendcnts; int *sdispls=thePoisson->sdispls; int *recvcnts=thePoisson->recvcnts; int *rdispls=thePoisson->rdispls; MPI_Alltoallv(buffersend,sendcnts,sdispls,MPI_DOUBLE,bufferstore,recvcnts,rdispls,MPI_DOUBLE,MPI_COMM_WORLD); sinefft(thePoisson); solveVp(rank,thePoisson); sinefft(thePoisson); /* if(rank==0){ int i,j,k; i=0;j=0;k=0; FILE *f; f=fopen("poten.dat","w"); for(i=0;i<thePoisson->N_r_glob;i++) for(k=0;k<thePoisson->N_z_glob;k++) fprintf(f,"%f %d %f\n",i+0.5,k,thePoisson->density[in_lookup(thePoisson,k,i,0)]); fclose(f); } */ buffersend=thePoisson->density; bufferstore=thePoisson->buffer; //this is the inverse MPI comm.SO the sendcnts and recvcnts are exchanged MPI_Alltoallv(buffersend,recvcnts,rdispls,MPI_DOUBLE,bufferstore,sendcnts,sdispls,MPI_DOUBLE,MPI_COMM_WORLD); inverse_mpi_arrange(thePoisson->buffer,thePoisson->density,thePoisson); inverse_fft(thePoisson); int direction=0; for(direction=0;direction<3;direction++){ cal_force(thePoisson,direction); disco_force_interp(theDomain,thePoisson,direction); } // disco_interp(theSim,theCells,thePoisson); // destroy_tridiagsys(thetridiag); }
int All_Pair(Body* galaxy, int size){ int i, j; double result[2]; //start_csv("all_pair.csv"); for (i = 0; i < size; i++){ galaxy[i].forceX = 0; galaxy[i].forceY = 0; for (j = 0; j < size; j++){ if (i != j){ cal_force(galaxy[i], galaxy[j], result); galaxy[i].forceX += result[0]; galaxy[i].forceY += result[1]; } } //printf("**********force %d : (%f, %f) \n", i, galaxy[i].forceX, galaxy[i].forceY); //write_csv(galaxy[i].forceX, galaxy[i].forceY); } //end_csv(); }
int main(int argc,char *argv[]) { int size, rank, i, j, k,right, left, rounds, gran; static float dt = 1.0; float mass, vx, vy; float fx, fy; char* file_name; rounds = atoi(argv[1]); gran = atoi(argv[2]); file_name = argv[3]; //initilize the MPI environment MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Status recv_status; int bodies = size * gran; float data[bodies * 3]; float temp[gran * 3]; right=rank+1; if(right == size) right=0; left=rank-1; if(left == -1) left = size-1; FILE *fp; float *p = data; //Initialization Part if(rank == 0){ //Store each value in data[] fp = fopen(file_name, "r"); for (i = 0; i < bodies * 3 ; i++) { fscanf(fp, "%f", p); p++; } p = data; double timestamp1 = MPI_Wtime(); printf("Scatter start time: %lf\n", timestamp1); MPI_Send(p + 3 * gran, (bodies - gran) * 3, MPI_FLOAT, right, tag_code, MPI_COMM_WORLD); } else if(rank == size -1){ MPI_Recv(data, gran * 3, MPI_FLOAT, left, tag_code, MPI_COMM_WORLD, &recv_status); double timestamp1 = MPI_Wtime(); printf("Scatter end time: %lf\n", timestamp1); } else{ MPI_Recv(data,(size - rank) * gran * 3, MPI_FLOAT, left, tag_code, MPI_COMM_WORLD, &recv_status); MPI_Send(p + 3 * gran, (size - rank - 1) * gran * 3, MPI_FLOAT, right, tag_code, MPI_COMM_WORLD); } //Simulation Part for(k = 0; k < gran*3; k++){ temp[k] = data[k]; } for(j = 0; j < rounds; j++){ p = data; for(i = 0; i < size - 1; i++){ MPI_Send(p, gran * 3, MPI_FLOAT, right, tag_code, MPI_COMM_WORLD); p += gran * 3; MPI_Recv(p, gran * 3, MPI_FLOAT, left, tag_code, MPI_COMM_WORLD, &recv_status); printf("%dttt%d\n", gran, rank); } for(k = 0; k < gran; k++){ mass = *(p + k*3 + 2); cal_force(data, size, gran, k, &fx, &fy, mass); vx += fx*dt/mass; vy += fy*dt/mass; temp[k*3] = data[k*3] + vx*dt; temp[1 + k*3] = data[k*3 +1] + vy*dt; } for(k = 0; k < gran; k++){ data[k*3] = temp[k*3]; data[k*3 + 1] = temp[k*3+1]; } } //Gathering Part p = data; if(rank == 0){ double timestamp2 = MPI_Wtime(); printf("Gathering start time: %lf\n", timestamp2); for (i = 0; i < size-1; i++){ MPI_Send(p, gran*3, MPI_FLOAT, left, tag_code, MPI_COMM_WORLD); p += gran*3; MPI_Recv(p, gran*3, MPI_FLOAT, right, tag_code, MPI_COMM_WORLD, &recv_status); } double timestamp3 = MPI_Wtime(); printf("Gathering end time: %lf\n", timestamp3); } else { for (i = 0; i < size-1; i++){ MPI_Send(p, gran*3, MPI_FLOAT, left, tag_code, MPI_COMM_WORLD); p += gran*3; MPI_Recv(p, gran*3, MPI_FLOAT, right, tag_code, MPI_COMM_WORLD, &recv_status); } } //printf("%f\t%f\t%f\n", data[0], data[1], data[2]); p = data; if(rank == 0){ for(j = 0; j < bodies; j++){ printf("%f\t%f\t%f\n", *p, *(p+1), *(p+2)); p+=3; } } MPI_FINALIZE(); }