原帖子如下
链接: link
帖子中用Fortran编写了一个程序,我自己写了一个没有用帖子中的MPI_SENDRECV,因为对Fortran语言没有了解,所以没有完全看源代码,自己写的可能编程风格比较乱,请见谅。
代码如下
// A code block
var foo = 'bar';
// An highlighted block
#include "mpi.h"
#include <stdio.h>
double f(double);
double f(double x)
{
return (4.0/(1.0+x*x));
}
int main(int argc,char *argv[])
{
//这里之前用自动生成的总是有规律,导致迭代生成的数据和自动生成的一样,所以就随便敲了点数据
double array[16][16] ={{1,5,6,79,5,41,3,6,56,41,52,4,9,87,8,1},
{6,5,56,5,6,56,4,1,3,54,8,6,1,5,54,23},
{1,1,5,45,1,645,456,56,5,654,546,65,4,5654,65,4},
{145,41,415,45,45,45,45,32,32,32,13,32,32,32,2,1},
{1,12,45,5,45,5,5,45,45,45,5,456,6,6,4,45},
{45,456,6,56,65,65,45,6,456,4,64,564,56,456,654,6},
{546,64,56,465,456,4,54,56,4,5641,5,456,4,65,5,456},
{21,12,3,123,123,1,31,1,3,3,1,5,36,1,1,3},
{1,123,1,1,32,15,46,6,6,4,54,6,45,4,6,6},
{1,1,5,56,132,1,54,56,2,3,5,48,78,46,46,7},
{8,78,97,8,78,9,7,78,45,5,45,4,564,4,65,6},
{4,5,4,54,54,56,6,5,56,4,56,65,4,65,45,4},
{2,3,1,56,6,54,6,454,56,56,456,54,6,664,1,1},
{1,2,12,12,123,1,1,2,1231,2,3,1,321,2,1,32},
{1,3,12,12,1,1,3,12,1,1,2,3,3,56,5,6},
{21,1,2,12,1,1,1,21,23,12,1,21,23,1,1,51}};
int myid, numprocs;
int n, i;
double mypi, pi;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
for(int step=0;step<10;step++){
double b[4][16];//主要用二维数据进行传送
for(int i=myid*4;i<(myid+1)*4;i++)
for(int j=1;j<15;j++)
{
if(myid==0){
if(i!=0)
{ b[i][j]=0.25*(array[i-1][j]+array[i+1][j]+array[i][j-1]+array[i][j+1]);}}
else{
if(i!=15){
b[i%4][j]=0.25*(array[i-1][j]+array[i+1][j]+array[i][j-1]+array[i][j+1]);}}
}
if(myid==0){
for(int i=1;i<4;i++)
{
for(int j=1;j<15;j++){
array[i][j]=b[i][j];
}
}
for(int i=1;i<4;i++){
MPI_Recv(b,4*16,MPI_DOUBLE,i,99,MPI_COMM_WORLD, MPI_STATUS_IGNORE);
for(int j=0;j<4;j++){
for(int k=1;k<15;k++){
if(i==3&&j==3){
break;
}
array[i*4+j][k]=b[j][k];
}
}
}
printf("第%d次迭代结果:\n",step+1);
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++){
printf("%.1f ",array[i][j]);}
printf("\n");
}
}else{
MPI_Send(b,4*16,MPI_DOUBLE,0,99,MPI_COMM_WORLD);
}}
MPI_Finalize();
}