#include "wave.h" void init_comm(Array2_dbl &u, MPI_Comm proc_grid, int &nreq, MPI_Request *reqarr) { int Nx,Ny; int myid,ndim,dims[2],coords[2],periods[2]; int p_left,p_right,p_up,p_down,tagx1=1,tagx2=2,tagy1=3,tagy2=4; Nx=u.storleken1(); Ny=u.storleken2(); // Topology information ndim=2; MPI_Comm_rank(proc_grid,&myid); MPI_Cart_get(proc_grid,ndim,dims,periods,coords); MPI_Cart_shift(proc_grid,0,1,&p_left,&p_right); MPI_Cart_shift(proc_grid,1,1,&p_up,&p_down); // Non-contigious data MPI_Datatype STRIDED; MPI_Type_vector(Nx-2,1,Ny,MPI_DOUBLE,&STRIDED); MPI_Type_commit(&STRIDED); nreq=0; // Initiate send to left neighbor if (coords[0]>0) { MPI_Send_init(&u(1,1),Ny-2,MPI_DOUBLE,p_left,tagx1,proc_grid, &reqarr[nreq]); nreq++; } // initiate recieve from right and initiate send to right neighbor if (coords[0]<(dims[0]-1)) { MPI_Recv_init(&u(Nx-1,1),Ny-2,MPI_DOUBLE,p_right,tagx1,proc_grid, &reqarr[nreq]); nreq++; MPI_Send_init(&u(Nx-2,1),Ny-2,MPI_DOUBLE,p_right,tagx2,proc_grid, &reqarr[nreq]); nreq++; } // Initiate recieve from left if (coords[0]>0) { MPI_Recv_init(&u(0,1),Ny-2,MPI_DOUBLE,p_left,tagx2,proc_grid, &reqarr[nreq]); nreq++; } // Initiate send to up neighbor if (coords[1]>0) { MPI_Send_init(&u(1,1),1,STRIDED,p_up,tagy1,proc_grid, &reqarr[nreq]); nreq++; } // initiate recieve from down and initiate send to down neighbor if (coords[1]<(dims[1]-1)) { MPI_Recv_init(&u(1,Ny-1),1,STRIDED,p_down,tagy1,proc_grid, &reqarr[nreq]); nreq++; MPI_Send_init(&u(1,Ny-2),1,STRIDED,p_down,tagy2,proc_grid, &reqarr[nreq]); nreq++; } // Initiate recieve from up if (coords[1]>0) { MPI_Recv_init(&u(1,0),1,STRIDED,p_up,tagy2,proc_grid, &reqarr[nreq]); nreq++; } }