subroutine rmasetup( a, sx, ex, sy, ey, win )
integer win, sizedouble, ierr
integer (kind=MPI_ADDRESS_KIND) right_ghost_disp,
* left_ghost_disp, top_ghost_disp
integer my_right_ghost_disp, my_left_ghost_disp,
* my_top_ghost_disp, right_ghost_disp_int,
* left_ghost_disp_int, top_ghost_disp_int
double precision a(sx-1:ex+1,sy-1:ey+1)
C nx is the number of (non-ghost) values in x, ny in y
nx = ex - sx + 1
ny = ey - sy + 1
call MPI_TYPE_SIZE( MPI_DOUBLE_PRECISION, sizedouble, ierr )
call MPI_WIN_CREATE( a, (ex-sx+3)*(ey-sy+3)*sizedouble,
* sizedouble, MPI_INFO_NULL, MPI_COMM_WORLD,
* win, ierr )
C Exchange information on the offsets
C Compute the displacement into my right ghost cells
my_right_ghost_disp = 2*(nx+2)-1
call MPI_SEND( my_right_ghost_disp, 1, MPI_INTEGER, right_nbr,
* 0, MPI_COMM_WORLD, ierr )
call MPI_RECV( right_ghost_disp_int, 1, MPI_INTEGER, left_nbr,
* 0, MPI_COMM_WORLD, status, ierr )
C! Compute the displacement into my top ghost cells
my_top_ghost_disp = (nx + 2)*(ny + 1) + 1
call MPI_SEND( my_top_ghost_disp, 1, MPI_INTEGER, top_nbr,
* 0, MPI_COMM_WORLD, ierr )
call MPI_RECV( top_ghost_disp_int, 1, MPI_INTEGER, bottom_nbr,
* 0, MPI_COMM_WORLD, status, ierr )
C Compute the displacement into my left ghost cells
my_left_ghost_disp = nx + 2
call MPI_SEND( my_left_ghost_disp, 1, MPI_INTEGER, left_nbr,
* 0, MPI_COMM_WORLD, ierr )
call MPI_RECV( left_ghost_disp_int, 1, MPI_INTEGER, right_nbr,
* 0, MPI_COMM_WORLD, status, ierr )
C Just in case INTEGER is not the same as MPI_ADDRESS_KIND integer
right_ghost_disp = right_ghost_disp_int
top_ghost_disp = top_ghost_disp_int
left_ghost_disp = left_ghost_disp_int
return
end