
c---------------------------------------------------------------------
c---------------------------------------------------------------------

      subroutine exchange_1( g,k,iex )

c---------------------------------------------------------------------
c---------------------------------------------------------------------


      implicit none

      include 'mpinpb.h'
      include 'applu.incl'

      integer profiler(2)
      save profiler
      double precision  g(5,-1:isiz1+2,-1:isiz2+2,isiz3)
      integer k
      integer iex
      integer i, j
      double precision dum(5,isiz1+isiz2), dum1(5,isiz1+isiz2)

      integer STATUS(MPI_STATUS_SIZE)
      integer IERROR



      call TAU_PROFILE_TIMER(profiler, 'exchange_1');
      call TAU_PROFILE_START(profiler);
      if( iex .eq. 0 ) then

          if( north .ne. -1 ) then
              call MPI_RECV( dum1(1,jst),
     >                       5*(jend-jst+1),
     >                       dp_type,
     >                       north,
     >                       from_n,
     >                       MPI_COMM_WORLD,
     >                       status,
     >                       IERROR )
              do j=jst,jend
                  g(1,0,j,k) = dum1(1,j)
                  g(2,0,j,k) = dum1(2,j)
                  g(3,0,j,k) = dum1(3,j)
                  g(4,0,j,k) = dum1(4,j)
                  g(5,0,j,k) = dum1(5,j)
              enddo
          endif

          if( west .ne. -1 ) then
              call MPI_RECV( dum1(1,ist),
     >                       5*(iend-ist+1),
     >                       dp_type,
     >                       west,
     >                       from_w,
     >                       MPI_COMM_WORLD,
     >                       status,
     >                       IERROR )
              do i=ist,iend
                  g(1,i,0,k) = dum1(1,i)
                  g(2,i,0,k) = dum1(2,i)
                  g(3,i,0,k) = dum1(3,i)
                  g(4,i,0,k) = dum1(4,i)
                  g(5,i,0,k) = dum1(5,i)
              enddo
          endif

      else if( iex .eq. 1 ) then

          if( south .ne. -1 ) then
              call MPI_RECV( dum1(1,jst),
     >                       5*(jend-jst+1),
     >                       dp_type,
     >                       south,
     >                       from_s,
     >                       MPI_COMM_WORLD,
     >                       status,
     >                       IERROR )
              do j=jst,jend
                  g(1,nx+1,j,k) = dum1(1,j)
                  g(2,nx+1,j,k) = dum1(2,j)
                  g(3,nx+1,j,k) = dum1(3,j)
                  g(4,nx+1,j,k) = dum1(4,j)
                  g(5,nx+1,j,k) = dum1(5,j)
              enddo
          endif

          if( east .ne. -1 ) then
              call MPI_RECV( dum1(1,ist),
     >                       5*(iend-ist+1),
     >                       dp_type,
     >                       east,
     >                       from_e,
     >                       MPI_COMM_WORLD,
     >                       status,
     >                       IERROR )
              do i=ist,iend
                  g(1,i,ny+1,k) = dum1(1,i)
                  g(2,i,ny+1,k) = dum1(2,i)
                  g(3,i,ny+1,k) = dum1(3,i)
                  g(4,i,ny+1,k) = dum1(4,i)
                  g(5,i,ny+1,k) = dum1(5,i)
              enddo
          endif

      else if( iex .eq. 2 ) then

          if( south .ne. -1 ) then
              do j=jst,jend
                  dum(1,j) = g(1,nx,j,k) 
                  dum(2,j) = g(2,nx,j,k) 
                  dum(3,j) = g(3,nx,j,k) 
                  dum(4,j) = g(4,nx,j,k) 
                  dum(5,j) = g(5,nx,j,k) 
              enddo
              call MPI_SEND( dum(1,jst), 
     >                       5*(jend-jst+1), 
     >                       dp_type, 
     >                       south, 
     >                       from_n, 
     >                       MPI_COMM_WORLD, 
     >                       IERROR )
          endif

          if( east .ne. -1 ) then
              do i=ist,iend
                  dum(1,i) = g(1,i,ny,k)
                  dum(2,i) = g(2,i,ny,k)
                  dum(3,i) = g(3,i,ny,k)
                  dum(4,i) = g(4,i,ny,k)
                  dum(5,i) = g(5,i,ny,k)
              enddo
              call MPI_SEND( dum(1,ist), 
     >                       5*(iend-ist+1), 
     >                       dp_type, 
     >                       east, 
     >                       from_w, 
     >                       MPI_COMM_WORLD, 
     >                       IERROR )
          endif

      else

          if( north .ne. -1 ) then
              do j=jst,jend
                  dum(1,j) = g(1,1,j,k)
                  dum(2,j) = g(2,1,j,k)
                  dum(3,j) = g(3,1,j,k)
                  dum(4,j) = g(4,1,j,k)
                  dum(5,j) = g(5,1,j,k)
              enddo
              call MPI_SEND( dum(1,jst), 
     >                       5*(jend-jst+1), 
     >                       dp_type, 
     >                       north, 
     >                       from_s, 
     >                       MPI_COMM_WORLD, 
     >                       IERROR )
          endif

          if( west .ne. -1 ) then
              do i=ist,iend
                  dum(1,i) = g(1,i,1,k)
                  dum(2,i) = g(2,i,1,k)
                  dum(3,i) = g(3,i,1,k)
                  dum(4,i) = g(4,i,1,k)
                  dum(5,i) = g(5,i,1,k)
              enddo
              call MPI_SEND( dum(1,ist), 
     >                       5*(iend-ist+1), 
     >                       dp_type, 
     >                       west, 
     >                       from_e, 
     >                       MPI_COMM_WORLD, 
     >                       IERROR )
          endif

      endif

      call TAU_PROFILE_STOP(profiler);
      end



