Exemplo n.º 1
0
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);

}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
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();
	
}