       subroutine exchng2( a, sx, ex, sy, ey, 
     &                     comm2d, stridetype,
     &                     nbrleft, nbrright, nbrtop, nbrbottom  )
       include 'mpif.h'
       integer sx, ex, sy, ey, stridetype
       double precision a(sx-1:ex+1, sy-1:ey+1)
       integer nbrleft, nbrright, nbrtop, nbrbottom, comm2d
       integer status(MPI_STATUS_SIZE), ierr, nx
c
       nx = ex - sx + 1
c  These are just like the 1-d versions, except for less data
	call MPI_SENDRECV( a(sx,ey),  nx, MPI_DOUBLE_PRECISION, 
     &                    nbrtop, 0, 
     &                    a(sx,sy-1), nx, MPI_DOUBLE_PRECISION, 
     &                    nbrbottom, 0, comm2d, status, ierr )
	call MPI_SENDRECV( a(sx,sy),  nx, MPI_DOUBLE_PRECISION,
     &                    nbrbottom, 1, 
     &                    a(sx,ey+1), nx, MPI_DOUBLE_PRECISION, 
     &                    nbrtop, 1, comm2d, status, ierr )
c
c This uses the vector datatype stridetype
	call MPI_SENDRECV( a(ex,sy),  1, stridetype, nbrright, 0, 
     &                     a(sx-1,sy), 1, stridetype, nbrleft, 0,
     &                     comm2d, status, ierr )
	call MPI_SENDRECV( a(sx,sy),  1, stridetype, nbrleft,   1,
     &                     a(ex+1,sy), 1, stridetype, nbrright, 1,
     &                     comm2d, status, ierr )
	return
	end
