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