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

📄 并行源程序.txt

📁 计算并行运算的代码,用mpI实现并行运算,
💻 TXT
📖 第 1 页 / 共 4 页
字号:
        y1=ez2[i1][j][k]-ez2[i][j][k]+ex2[i][j][k]-ex2[i][j][k1];
        hy2[i][j][k]=hy2[i][j][k]+dt/(u*dr)*y1;
        z1=ex2[i][j1][k]-ex2[i][j][k]+ey2[i][j][k]-ey2[i1][j][k];
        hz2[i][j][k]=hz2[i][j][k]+dt/(u*dr)*z1;  }
  }
///////////////////////////////////////////////////////////////////////////////////////
//计算大区域电场
void bigarea_e() {
  int i,j,k,i1,j1,k1;
  float e,x1,y1,z1;
    for(i=1;i<=X1-1;i++)
     for(j=1;j<=Y-1;j++)
      for(k=1;k<=Z1-1;k++)
       {if((i>30 && i<50)&&(j>32 && j<50)&&(k>2 && k<24)) e=E2;
        else e=E1;
        i1=i-1;
        j1=j-1;
        k1=k-1;
        x1=hz1[i][j][k]-hz1[i][j1][k]+hy1[i][j][k1]-hy1[i][j][k];
        ex1[i][j][k]=ex1[i][j][k]+dt/(e*dr)*x1;
        y1=hx1[i][j][k]-hx1[i][j][k1]+hz1[i1][j][k]-hz1[i][j][k];
        ey1[i][j][k]=ey1[i][j][k]+dt/(e*dr)*y1;
        z1=hy1[i][j][k]-hy1[i1][j][k]+hx1[i][j1][k]-hx1[i][j][k];
        ez1[i][j][k]=ez1[i][j][k]+dt/(e*dr)*z1;
        if ((i==30 || i==50) && k<=35 )
          {ey1[i][j][k]=0;
           ez1[i][j][k]=0; }
        if((i>30 && i<50)&&(j>=32 && j<=50)&&(k==2 || k==24))
            {ex1[i][j][k]=(ex1[i][j][k-1]+ex1[i][j][k+1])/2;
             ey1[i][j][k]=(ey1[i][j][k-1]+ey1[i][j][k+1])/2;
             ez1[i][j][k]=(ez1[i][j][k-1]+ez1[i][j][k+1])/2;}
        if((i>30 && i<50)&&(k>=2 && k<=24)&&(j==32 || j==50))
            {ex1[i][j][k]=(ex1[i][j-1][k]+ex1[i][j+1][k])/2;
             ey1[i][j][k]=(ey1[i][j-1][k]+ey1[i][j+1][k])/2;
             ez1[i][j][k]=(ez1[i][j-1][k]+ez1[i][j+1][k])/2;}
        if ((i>=31 && i<=34) && j==50 && k==13)
            { ex1[i][j][k]=0; }
       }
  }
///////////////////////////////////////////////////////////////////////////////////////////////
//计算小区域电场
void smallarea_e() {
  int i,j,k,i1,j1,k1;
  float e=E1,x1,y1,z1;
    for(j=0;j<=Y;j++)
     for(k=1;k<=Z2;k++)
        {ex2[X2][j][k]=0;
         ey2[X2][j][k]=0;
         ez2[X2][j][k]=0;}
    for(i=0;i<=X2-1;i++)
     for(j=1;j<=Y-1;j++)
      for(k=0;k<=Z2-1;k++)
       {if (i==0)
           {j1=j-1;
            k1=k+1;
            x1=hz2[i][j][k]-hz2[i][j1][k]+hy2[i][j][k1]-hy2[i][j][k];
	         ex2[i][j][k]=ex2[i][j][k]+dt/(e*dr)*x1;
	         ey2[0][j][k]=0;
            ez2[0][j][k]=0;}
        else {i1=i-1;
              j1=j-1;
              k1=k+1;
              x1=hz2[i][j][k]-hz2[i][j1][k]+hy2[i][j][k1]-hy2[i][j][k];
	           ex2[i][j][k]=ex2[i][j][k]+dt/(e*dr)*x1;
	           y1=hx2[i][j][k]-hx2[i][j][k1]+hz2[i1][j][k]-hz2[i][j][k];
              ey2[i][j][k]=ey2[i][j][k]+dt/(e*dr)*y1;
	           z1=hy2[i][j][k]-hy2[i1][j][k]+hx2[i][j1][k]-hx2[i][j][k];
              ez2[i][j][k]=ez2[i][j][k]+dt/(e*dr)*z1;}      }
  }
/////////////////////////////////////////////////////////////////////////////
 void Send_h1(){
 	int i,j;
 for(i=0;i<=X2;i++)
     for(j=0;j<=Y;j++)
     {   
     	   S_hx1[i][j]=hx1[i+30][j][0];
         S_hy1[i][j]=hy1[i+30][j][0];
         S_hz1[i][j]=hz1[i+30][j][0];
    }
    MPI_Send(&S_hx1[0][0],(X2+1)*(Y+1),MPI_FLOAT,1,1111,MPI_COMM_WORLD);
    MPI_Send(&S_hy1[0][0],(X2+1)*(Y+1),MPI_FLOAT,1,2222,MPI_COMM_WORLD);
    MPI_Send(&S_hz1[0][0],(X2+1)*(Y+1),MPI_FLOAT,1,3333,MPI_COMM_WORLD);
 }
 void Recv_h2() {
 	int i,j;
    MPI_Recv(&R_hx2[0][0], (X2+1)*(Y+1),MPI_FLOAT,0,1111,MPI_COMM_WORLD,&status);
    MPI_Recv(&R_hy2[0][0], (X2+1)*(Y+1),MPI_FLOAT,0,2222,MPI_COMM_WORLD,&status);
    MPI_Recv(&R_hz2[0][0], (X2+1)*(Y+1),MPI_FLOAT,0,3333,MPI_COMM_WORLD,&status);
    for(i=0;i<=X2;i++)
     for(j=0;j<=Y;j++)
     {   
     	   hx2[i][j][0]=R_hx2[i][j];
         hy2[i][j][0]=R_hy2[i][j];
         hz2[i][j][0]=R_hz2[i][j];
    } 
  } 
  
  void Recv_e1(){
  	int i,j;
    MPI_Recv(R_ex1, (X2+1)*(Y+1),MPI_FLOAT,1,4444,MPI_COMM_WORLD,&status);
    MPI_Recv(R_ey1, (X2+1)*(Y+1),MPI_FLOAT,1,5555,MPI_COMM_WORLD,&status);
    MPI_Recv(R_ez1, (X2+1)*(Y+1),MPI_FLOAT,1,6666,MPI_COMM_WORLD,&status);

    for(i=30;i<=50;i++)
     for(j=0;j<=Y;j++)
     { 
      ex1[i][j][0]=R_ex1[i-30][j];
      ey1[i][j][0]=R_ey1[i-30][j];
      ez1[i][j][0]=R_ez1[i-30][j];}
    }
    
 void Send_e2(){
	int i,j;
    for(i=0;i<=Z2;i++)
     for(j=0;j<=Y;j++)
      { S_ex2[i][j]=ex2[i][j][0];
      	S_ey2[i][j]=ey2[i][j][0];
        S_ez2[i][j]=ez2[i][j][0]; }
     MPI_Send(&S_ex2[0][0], (X2+1)*(Y+1),MPI_FLOAT,0,4444,MPI_COMM_WORLD);  
     MPI_Send(&S_ey2[0][0], (X2+1)*(Y+1),MPI_FLOAT,0,5555,MPI_COMM_WORLD);
     MPI_Send(&S_ez2[0][0], (X2+1)*(Y+1),MPI_FLOAT,0,6666,MPI_COMM_WORLD);   
   }
   
   
void Send_MY(){
	int i,k;	
    for(i=0;i<X2;i++)
     for(k=0;k<=Z2;k++)
     {
    	S_MY00_ex2[i][k]=ex2[i][1][k];
    	S_MY00_ez2[i][k]=ez2[i][1][k];
    	S_MY01_ex2[i][k]=ex2[i][0][k];
     	S_MY01_ez2[i][k]=ez2[i][0][k];
     	
     	S_MYY0_ex2[i][k]=ex2[i][Y-1][k];
     	S_MYY0_ez2[i][k]=ez2[i][Y-1][k];
     	S_MYY1_ex2[i][k]=ex2[i][Y][k];
     	S_MYY1_ez2[i][k]=ez2[i][Y][k];
    }  
    MPI_Send(S_MY00_ex2, (X2+1)*(Z2+1),MPI_FLOAT,0,9900,MPI_COMM_WORLD);
    MPI_Send(S_MY00_ez2, (X2+1)*(Z2+1),MPI_FLOAT,0,9901,MPI_COMM_WORLD);
    MPI_Send(S_MY01_ex2, (X2+1)*(Z2+1),MPI_FLOAT,0,9902,MPI_COMM_WORLD);
    MPI_Send(S_MY01_ez2, (X2+1)*(Z2+1),MPI_FLOAT,0,9903,MPI_COMM_WORLD);
    MPI_Send(S_MYY0_ex2, (X2+1)*(Z2+1),MPI_FLOAT,0,9904,MPI_COMM_WORLD);
    MPI_Send(S_MYY0_ez2, (X2+1)*(Z2+1),MPI_FLOAT,0,9905,MPI_COMM_WORLD);
    MPI_Send(S_MYY1_ex2, (X2+1)*(Z2+1),MPI_FLOAT,0,9906,MPI_COMM_WORLD);
    MPI_Send(S_MYY1_ez2, (X2+1)*(Z2+1),MPI_FLOAT,0,9907,MPI_COMM_WORLD);
   }
   
void Send_MZ(){
	int i,j;
   for(i=0;i<=X2;i++)
    for(j=0;j<=Y;j++)
     {
     S_MZ00_ex2[i][j]=ex2[i][j][Z2-1];
     S_MZ00_ey2[i][j]=ey2[i][j][Z2-1];
     S_MZ01_ex2[i][j]=ex2[i][j][Z2];
     S_MZ01_ey2[i][j]=ey2[i][j][Z2];
    }
   MPI_Send(S_MZ00_ex2, (X2+1)*(Y+1),MPI_FLOAT,0,9910,MPI_COMM_WORLD);
   MPI_Send(S_MZ00_ey2, (X2+1)*(Y+1),MPI_FLOAT,0,9911,MPI_COMM_WORLD);
   MPI_Send(S_MZ01_ex2, (X2+1)*(Y+1),MPI_FLOAT,0,9912,MPI_COMM_WORLD);
   MPI_Send(S_MZ01_ey2, (X2+1)*(Y+1),MPI_FLOAT,0,9913,MPI_COMM_WORLD);
  }
  void Send_LX(){
  int i;
  for(i=1;i<=X2-1;i++)
    {
    	S_LX00_ex2[i-1]=ex2[i][i][Z2];
    	S_LX00_ey2[i-1]=ey2[i][i][Z2];
    	S_LX00_ez2[i-1]=ez2[i][i][Z2];
    }
  for(i=1;i<=X2-1;i++)
    {
    	S_LX01_ex2[i-1]=ex2[i][Y-i][Z2];
    	S_LX01_ey2[i-1]=ey2[i][Y-i][Z2];
    	S_LX01_ez2[i-1]=ez2[i][Y-i][Z2];
    }
  MPI_Send(S_LX00_ex2,(X2-1),MPI_FLOAT,0,9920,MPI_COMM_WORLD);
  MPI_Send(S_LX00_ey2,(X2-1),MPI_FLOAT,0,9921,MPI_COMM_WORLD);
  MPI_Send(S_LX00_ez2,(X2-1),MPI_FLOAT,0,9922,MPI_COMM_WORLD);
  MPI_Send(S_LX01_ex2,(X2-1),MPI_FLOAT,0,9923,MPI_COMM_WORLD);
  MPI_Send(S_LX01_ey2,(X2-1),MPI_FLOAT,0,9924,MPI_COMM_WORLD);
  MPI_Send(S_LX01_ez2,(X2-1),MPI_FLOAT,0,9925,MPI_COMM_WORLD);
}  
    void Recv_MY(){
    	int i,k;
    MPI_Recv(R_MY00_ex2, (X2+1)*(Z2+1),MPI_FLOAT,1,9900,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MY00_ez2, (X2+1)*(Z2+1),MPI_FLOAT,1,9901,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MY01_ex2, (X2+1)*(Z2+1),MPI_FLOAT,1,9902,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MY01_ez2, (X2+1)*(Z2+1),MPI_FLOAT,1,9903,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MYY0_ex2, (X2+1)*(Z2+1),MPI_FLOAT,1,9904,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MYY0_ez2, (X2+1)*(Z2+1),MPI_FLOAT,1,9905,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MYY1_ex2, (X2+1)*(Z2+1),MPI_FLOAT,1,9906,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MYY1_ez2, (X2+1)*(Z2+1),MPI_FLOAT,1,9907,MPI_COMM_WORLD,&status);
   for(i=0;i<X2;i++)
     for(k=0;k<=Z2;k++)
     {
    	ex2[i][1][k]=R_MY00_ex2[i][k];
    	ez2[i][1][k]=R_MY00_ez2[i][k];
    	ex2[i][0][k]=R_MY01_ex2[i][k];
     	ez2[i][0][k]=R_MY01_ez2[i][k];
     	
     	ex2[i][Y-1][k]=R_MYY0_ex2[i][k];
     	ez2[i][Y-1][k]=R_MYY0_ez2[i][k];
     	ex2[i][Y][k]=R_MYY1_ex2[i][k];
     	ez2[i][Y][k]=R_MYY1_ez2[i][k];
    }  
  }
  void Recv_MZ(){
  	int i,j;
   MPI_Recv(R_MZ00_ex2, (X2+1)*(Y+1),MPI_FLOAT,1,9910,MPI_COMM_WORLD,&status);
   MPI_Recv(R_MZ00_ey2, (X2+1)*(Y+1),MPI_FLOAT,1,9911,MPI_COMM_WORLD,&status);
   MPI_Recv(R_MZ01_ex2, (X2+1)*(Y+1),MPI_FLOAT,1,9912,MPI_COMM_WORLD,&status);
   MPI_Recv(R_MZ01_ey2, (X2+1)*(Y+1),MPI_FLOAT,1,9913,MPI_COMM_WORLD,&status);
   for(i=0;i<=X2;i++)
    for(j=0;j<=Y;j++)
     {
    ex2[i][j][Z2-1]=R_MZ00_ex2[i][j];
     ey2[i][j][Z2-1]=R_MZ00_ey2[i][j];
     ex2[i][j][Z2]=R_MZ01_ex2[i][j];
     ey2[i][j][Z2]=R_MZ01_ey2[i][j];
    } 
  }
  
  void Recv_LX(){
  	int i;
  MPI_Recv(R_LX00_ex2,(X2-1),MPI_FLOAT,1,9920,MPI_COMM_WORLD,&status);
  MPI_Recv(R_LX00_ey2,(X2-1),MPI_FLOAT,1,9921,MPI_COMM_WORLD,&status);
  MPI_Recv(R_LX00_ez2,(X2-1),MPI_FLOAT,1,9922,MPI_COMM_WORLD,&status);
  MPI_Recv(R_LX01_ex2,(X2-1),MPI_FLOAT,1,9923,MPI_COMM_WORLD,&status);
  MPI_Recv(R_LX01_ey2,(X2-1),MPI_FLOAT,1,9924,MPI_COMM_WORLD,&status);
  MPI_Recv(R_LX01_ez2,(X2-1),MPI_FLOAT,1,9925,MPI_COMM_WORLD,&status);

 for(i=1;i<=X2-1;i++)

    {
    	ex2[i][i][Z2]=R_LX00_ex2[i-1];
    	ey2[i][i][Z2]=R_LX00_ey2[i-1];
    	ez2[i][i][Z2]=R_LX00_ez2[i-1];
    }
 for(i=1;i<=X2-1;i++)
    {
    	ex2[i][Y-i][Z2]=R_LX01_ex2[i-1];
    	ey2[i][Y-i][Z2]=R_LX01_ey2[i-1];
    	ez2[i][Y-i][Z2]=R_LX01_ez2[i-1];
    }  
  }
  
  void Send_MY1(){
   	int i,k;
  for(i=1;i<=X2-1;i++)
     for(k=0;k<=Z2-1;k++)
      {
        S_MY20_ex2[i-1][k]=ex2[i][0][k];
      	S_MY20_ez2[i-1][k]=ez2[i][0][k];
      	S_MY30_ex2[i-1][k]=ex2[i][Y][k];
      	S_MY30_ez2[i-1][k]=ez2[i][Y][k];
      }
   MPI_Send(S_MY20_ex2, (X2-1)*(Z2),MPI_FLOAT,1,9930,MPI_COMM_WORLD);
   MPI_Send(S_MY20_ez2, (X2-1)*(Z2),MPI_FLOAT,1,9931,MPI_COMM_WORLD);
   MPI_Send(S_MY30_ex2, (X2-1)*(Z2),MPI_FLOAT,1,9932,MPI_COMM_WORLD);
   MPI_Send(S_MY30_ez2, (X2-1)*(Z2),MPI_FLOAT,1,9933,MPI_COMM_WORLD); 
  }
void Send_MZ1(){
   int i,j;
   for(i=1;i<=X2-1;i++)
    for(j=1;j<=Y-1;j++)
     {
      S_MZ20_ex2[i-1][j-1]=ex2[i][j][Z2];
     	S_MZ20_ey2[i-1][j-1]=ey2[i][j][Z2];
    }
    MPI_Send(S_MZ20_ex2, (X2-1)*(Y-1),MPI_FLOAT,1,9940,MPI_COMM_WORLD);
    MPI_Send(S_MZ20_ey2, (X2-1)*(Y-1),MPI_FLOAT,1,9941,MPI_COMM_WORLD);
  }
   void Send_LX1(){
   	int i;
  for(i=1;i<=X2-1;i++)
   {
     S_LX20_ex2[i-1]=ex2[i][0][Z2];
     S_LX20_ey2[i-1]=ey2[i][0][Z2];
     S_LX20_ez2[i-1]=ez2[i][0][Z2];
     S_LX21_ex2[i-1]=ex2[i][Y][Z2];
     S_LX21_ey2[i-1]=ey2[i][Y][Z2];
     S_LX21_ez2[i-1]=ez2[i][Y][Z2];
    }
    MPI_Send(S_LX20_ex2, (X2-1),MPI_FLOAT,1,9950,MPI_COMM_WORLD);
    MPI_Send(S_LX20_ey2, (X2-1),MPI_FLOAT,1,9951,MPI_COMM_WORLD);
    MPI_Send(S_LX20_ez2, (X2-1),MPI_FLOAT,1,9952,MPI_COMM_WORLD);
    MPI_Send(S_LX21_ex2, (X2-1),MPI_FLOAT,1,9953,MPI_COMM_WORLD);
    MPI_Send(S_LX21_ey2, (X2-1),MPI_FLOAT,1,9954,MPI_COMM_WORLD);
    MPI_Send(S_LX21_ez2, (X2-1),MPI_FLOAT,1,9955,MPI_COMM_WORLD);
  }
  void Recv_MY1(){
  	int i,k;
   MPI_Recv(R_MY20_ex2, (X2-1)*(Z2),MPI_FLOAT,0,9930,MPI_COMM_WORLD,&status);
   MPI_Recv(R_MY20_ez2, (X2-1)*(Z2),MPI_FLOAT,0,9931,MPI_COMM_WORLD,&status);
   MPI_Recv(R_MY30_ex2, (X2-1)*(Z2),MPI_FLOAT,0,9932,MPI_COMM_WORLD,&status);
   MPI_Recv(R_MY30_ez2, (X2-1)*(Z2),MPI_FLOAT,0,9933,MPI_COMM_WORLD,&status);
   for(i=1;i<=X2-1;i++)
     for(k=0;k<=Z2-1;k++)
      {
      	ex2[i][0][k]=R_MY20_ex2[i-1][k];
      	ez2[i][0][k]=R_MY20_ez2[i-1][k];
      	ex2[i][Y][k]=R_MY30_ex2[i-1][k];
      	ez2[i][Y][k]=R_MY30_ez2[i-1][k];
      }  
  }
  
   void Recv_MZ1(){
   	int i,j;
    MPI_Recv(R_MZ20_ex2, (X2-1)*(Y-1),MPI_FLOAT,0,9940,MPI_COMM_WORLD,&status);
    MPI_Recv(R_MZ20_ey2, (X2-1)*(Y-1),MPI_FLOAT,0,9941,MPI_COMM_WORLD,&status);
  for(i=1;i<=X2-1;i++)
    for(j=1;j<=Y-1;j++)
     {
     	ex2[i][j][Z2]=R_MZ20_ex2[i-1][j-1];
     	ey2[i][j][Z2]=R_MZ20_ey2[i-1][j-1];
    }
  }
  
 void Recv_LX1(){
   int i;
    MPI_Recv(R_LX20_ex2, (X2-1),MPI_FLOAT,0,9950,MPI_COMM_WORLD,&status);
    MPI_Recv(R_LX20_ey2, (X2-1),MPI_FLOAT,0,9951,MPI_COMM_WORLD,&status);
    MPI_Recv(R_LX20_ez2, (X2-1),MPI_FLOAT,0,9952,MPI_COMM_WORLD,&status);
    MPI_Recv(R_LX21_ex2, (X2-1),MPI_FLOAT,0,9953,MPI_COMM_WORLD,&status);
    MPI_Recv(R_LX21_ey2, (X2-1),MPI_FLOAT,0,9954,MPI_COMM_WORLD,&status);
    MPI_Recv(R_LX21_ex2, (X2-1),MPI_FLOAT,0,9955,MPI_COMM_WORLD,&status);
    for(i=1;i<=X2-1;i++)
   {
     ex2[i][0][Z2]=R_LX20_ex2[i-1];
     ey2[i][0][Z2]=R_LX20_ey2[i-1];
     ez2[i][0][Z2]=R_LX20_ez2[i-1];
     ex2[i][Y][Z2]=R_LX21_ex2[i-1];
     ey2[i][Y][Z2]=R_LX21_ey2[i-1];
     ez2[i][Y][Z2]=R_LX21_ez2[i-1];
    }
  }
////////////////////////////////////////////////////////////////////////////////////////////////
//计算边界条件
 void murx(int g)
  { int gg,m,j,k;
    float w1,w2,w3,w4,w5;
    gg=abs(g-1);
    if (g==0) m=0;
    else m=5;
    for(j=0;j<=Y;j++)
     for(k=0;k<=Z1;k++)
      {xey[j][k][m+4]=ey1[gg][j][k];
       xez[j][k][m+4]=ez1[gg][j][k];}
    for(j=1;j<=Y-1;j++)
     for(k=1;k<=Z1-1;k++)
      {w1=xey[j][k][m+4]+xey[j][k][m+1];
       w2=xey[j][k][m+2]+xey[j][k][m];
       w3=xey[j+1][k][m+2]-4*xey[j][k][m]-4*xey[j][k][m+2];
       w4=xey[j-1][k][m+2]+xey[j+1][k][m]+xey[j-1][k][m];
       w5=xey[j][k+1][m+2]+xey[j][k-1][m+2]+xey[j][k+1][m]+xey[j][k-1][m];
       ey1[g][j][k]=-xey[j][k][m+3]+A*w1+B*w2+C*(w3+w4+w5); }
    for(j=1;j<=Y-1;j++)
     for(k=1;k<=Z1-1;k++)
      {w1=xez[j][k][m+4]+xez[j][k][m+1];
       w2=xez[j][k][m+2]+xez[j][k][m];
       w3=xez[j+1][k][m+2]-4*xez[j][k][m]-4*xez[j][k][m+2];
       w4=xez[j-1][k][m+2]+xez[j+1][k][m]+xez[j-1][k][m];
       w5=xez[j][k+1][m+2]+xez[j][k-1][m+2]+xez[j][k+1][m]+xez[j][k-1][m];
       ez1[g][j][k]=-xez[j][k][m+3]+A*w1+B*w2+C*(w3+w4+w5); }

⌨️ 快捷键说明

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