/* poisson2d.c * * Solve 2D Poisson equation u_{xx} + u_{yy} = f(x,y) using * point-Jacobi iteration method with Dirichlet boundary conditions. * Currently we assume f=0 for simplicity. * * Note: This code is written to show basic MPI usage. It is *not* * suitable for production runs. * */ #include #include #include #include "mpi.h" void init_poisson(int, int, double *, double); void swap_ptr(double **, double **); void setbc_poisson(int, int, double *, int, int); void poisson_ghost_exch(int, int, double *, int, int); void print_array(int, int, double *, int, int); void print_one(int, int, double, int); void write_array(int, int, double *, int, int, double, double); double poisson_jacobi(int, int, double *, double *, int, int); /* problem size etc. */ #define M1 40 /* global size in x */ #define M2 40 /* global size in y */ #define ITMAX 5000 /* max iteration no. */ int main(int argc, char *argv[]) { double *phi[2]; int n1, n2, rank, nproc, it, i; double residual,t1,t2; /* MPI initialization */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nproc); /* local problem size */ n1 = M1; n2 = M2/nproc; /* allocate some arrays */ phi[0] = (double *) malloc(sizeof(double)*n1*(n2+2)); phi[1] = (double *) malloc(sizeof(double)*n1*(n2+2)); /* set start-up condition for iterations */ init_poisson(n1,n2+2,phi[0],0.0); setbc_poisson(n1,n2,phi[0],rank,nproc); /* main loop starts here */ for (it=1; it nproc-1) north = MPI_PROC_NULL; /* send to north */ MPI_Sendrecv(pn,n1,MPI_DOUBLE,north,0, gs,n1,MPI_DOUBLE,south,0,MPI_COMM_WORLD,&status); /* send to south */ MPI_Sendrecv(ps,n1,MPI_DOUBLE,south,0, gn,n1,MPI_DOUBLE,north,0,MPI_COMM_WORLD,&status); } /* set boundary values along boundaries */ void setbc_poisson(int n1, int n2, double *p, int rank, int nproc) { int i,j,offset; /* west */ i=0; for (j=0; j