 call MPI_WIN_FENCE( 0, winbuf, ierr )
 ! Put bottom edge into bottom neighbor's ghost cells
 nx = ex - sx + 1
 call MPI_PUT( a(sx,sy), nx, MPI_DOUBLE_PRECISION, &
               bottom_nbr, 0, nx, MPI_DOUBLE_PRECISION, winbuf, ierr )
 ! Put top edge into top neighbor's ghost cells
 call MPI_PUT( a(sx,ey), nx, MPI_DOUBLE_PRECISION, &
               top_nbr, nx, nx, MPI_DOUBLE_PRECISION, winbuf, ierr  )
 ! Put left edge into left neighbor's ghost cells
 ny = ey - sy + 1
 do i=sy,ey
     buf1(i-sy+1) = a(sx,i)
 enddo
 call MPI_PUT( buf1, ny, MPI_DOUBLE_PRECISION, &
               left_nbr, 2*nx, ny, MPI_DOUBLE_PRECISION, &
               winbuf, ierr )
 ! Put right edge into right neighbor's ghost cells
 do i=sy,ey
     buf2(i-sy+1) = a(ex,i)
 enddo
 call MPI_PUT( buf2, ny, MPI_DOUBLE_PRECISION, &
               right_nbr, 2*nx+ny, ny, MPI_DOUBLE_PRECISION, &
               winbuf, ierr )
 call MPI_WIN_FENCE( 0, winbuf, ierr )
 ... use data in aghost ...
