⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 domain.c

📁 在linux系统下G-S算法
💻 C
字号:
#include"mpi.h"
#include<stdio.h>
#include<math.h>
#include"time.h"

#define DATA_SIZE 500000
#define ITER	 100000
#define INIT_DATA 10000
#define CONV 	 0.1
#define CPU      4 
#define p DATA_SIZE/CPU

int main(int argc,char * argv[])
{
   double data[p+2]={0.0},new_data[p+2]={0.0};
	double a1,a2,a3,a4,time;
	double starttime,endtime;
	int i,restart,allrestart,iter;
       double send_messp,send_mess1;
	double recv_messp,recv_mess1; 

	int myid,procs;	
       MPI_Status status;

  	
MPI_Init(& argc, & argv);
MPI_Comm_rank(MPI_COMM_WORLD, & myid);
MPI_Comm_size(MPI_COMM_WORLD, & procs);

	/*GS algorithm  go back!!!!!*/
	
	/*init the data*/	
	if(myid==CPU-1)
	{
	   data[p]=INIT_DATA;
	   new_data[p]=INIT_DATA;
	   
	}
      
       starttime=MPI_Wtime();
	
     for(iter=0; iter<ITER; iter++){
	     
            		restart=0;
		
		/*ji shu ci die dai*/
 	if((iter%2)==0){
                if(myid==0)
               	{
               	   new_data[p]=1.0/3*(2*data[p-1]+data[p+1]);
				  for(i=2; i<p; i++){
			
                        new_data[i]=0.5*(new_data[i-1]+data[i+1]);
                  
                
		          	}  
			}
		
			
	       else 
		   	if(myid==CPU-1)
               	{
               	   new_data[1]=1.0/3*(2*data[0]+data[2]);
	                	
	  	   for(i=p-1; i>1; i--){
	
			new_data[i]=0.5*(new_data[i+1]+data[i-1]);
		
                               }
			 }
                   else
          
		   if(myid%2==1)
		{
		     new_data[1]=1.0/3*(2*data[0]+data[2]);
		     new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);

		   for(i=p-1; i>1; i--){
	
			new_data[i]=0.5*(new_data[i+1]+data[i-1]);
		
                               } 
             	}
                     else
                     	{
                     	 new_data[1]=1.0/3*(2*data[0]+data[2]);
		     new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);

		    for(i=2; i<p; i++){
			
                        new_data[i]=0.5*(new_data[i-1]+data[i+1]);
                  
                
		   	}
                     	}

                // #pragma omp for
                for(i=1;i<=p;i++){
			a1=new_data[i]-data[i];
			if(a1>CONV)
			restart=1;
                   }//endfor

    
	  }//end if
	
	if(iter%2==1){
	
               if(myid==0)
               	{
               	   new_data[p]=1.0/3*(2*data[p-1]+data[p+1]);
				  for(i=p-1; i>1; i--){
			
                        new_data[i]=0.5*(new_data[i+1]+data[i-1]);
                  
                
		   	}   
			}
	       else
		   	if(myid==CPU-1)
               	{
               	   new_data[1]=1.0/3*(2*data[0]+data[2]);
			 for(i=2; i<p; i++){
	
			new_data[i]=0.5*(new_data[i-1]+data[i+1]);
		
                               }
			 }

	   else
	    	
			   if(myid%2==0)
		{
		     new_data[1]=1.0/3*(2*data[0]+data[2]);
		     new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);

		   for(i=p-1; i>1; i--){
	
			new_data[i]=0.5*(new_data[i+1]+data[i-1]);
		
                               } 
             	}
                     else
                     	{
                     	 new_data[1]=1.0/3*(2*data[0]+data[2]);
		     new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);

		    for(i=2; i<p; i++){
			
                        new_data[i]=0.5*(new_data[i-1]+data[i+1]);
                  
                
		   	}
                     	}
                     
                    
              //      #pragma omp for
                for(i=1;i<=p;i++){
			a1=new_data[i]-data[i];
			if(a1>CONV)
			restart=1;
                   }//endfor

		
	
	}//end for
 
			  allrestart=0;
           
			MPI_Reduce(&restart,&allrestart,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);	
                     MPI_Bcast(&allrestart,1,MPI_INT,0,MPI_COMM_WORLD);
		   
			if(allrestart==0)
			{
			//    if(myid==0)
			//	{
			         endtime=MPI_Wtime(); 
		                printf("\n====================iter  is over!!!!   iter==%d=============\n",iter);   
				  printf("\n====================time == %.6f===================\n",endtime-starttime);
		               
			//	}
		             break;
			}
				else
             {
                        for(i=1; i<=p ;i++)
                        data[i]= new_data[i];
               }//end else

	if(myid<CPU-1)
			{
			   send_messp=data[p-1];
			   MPI_Send(&send_messp,1,MPI_DOUBLE,myid+1,0,MPI_COMM_WORLD);
			   MPI_Recv(&recv_mess1,1,MPI_DOUBLE,myid+1,99,MPI_COMM_WORLD,&status);
			   data[p+1]=recv_mess1;
			}
		if(myid!=0)
			{
                         send_mess1=data[2];
			    MPI_Send(&send_mess1,1,MPI_DOUBLE,myid-1,99,MPI_COMM_WORLD);
			    MPI_Recv(&recv_messp,1,MPI_DOUBLE,myid-1,0,MPI_COMM_WORLD,&status);
				data[0]=recv_messp;
			}
	}


        printf("\n======================the points are:==========================\n");
	if(myid==CPU-1)
               
		for(i=p-100;i<=p;i++)
        {
                printf(" data[%d]=%f ",i,data[i]);
        }
        printf("\n=================the   end======================================\n");
   	 
   	MPI_Finalize();
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -