SUBROUTINE refresh_grid(ARR,nx,ny,np,igrid)

!   update halo rows on analysis computational grid
!       patterned after EXCH.F from eta model

!   <--> arr:      array to have halo points updated
!    --> nx,ny,np: dimensions of arr
!    --> igrid:    which grid is being used
!                =1 -- fine grid
!                =2 -- coarse grid

         include 'types.h'
         INCLUDE "PARMETA.comm"
         INCLUDE "mpif.h"
      include "my_comm.h"
         INCLUDE "mpp.h"
         include "r3dv_data.comm"

         real arr(nx,ny,np)

         INTEGER ISTAT(MPI_STATUS_SIZE),STATUS_ARRAY(MPI_STATUS_SIZE,4)
         INTEGER IHANDLE(4)
         REAL(4),ALLOCATABLE,DIMENSION(:,:,:) :: BUF0,BUF1,BUF2,BUF3

         ITYPE=MPI_REAL
C
C--------------------------------------------------------------------
C--------------------------------------------------------------------
C***
C***  NORTH/SOUTH
C***
C--------------------------------------------------------------------
C--------------------------------------------------------------------
C
C--------------------------------------------------------------------
C     RECEIVE FROM NORTH
C--------------------------------------------------------------------
C
      IF(MY_NEB(1).GE.0)THEN
        NEBPE=MY_NEB(1)
        jhalo=ky10_loc(mype,igrid)-ky9_loc(mype,igrid)+1
        nxint=kx8_loc(mype,igrid)-kx3_loc(mype,igrid)+1
        ISIZE=nxint*jhalo*np
        ALLOCATE(BUF0(nxint,jhalo,np),STAT=I)
        CALL MPI_IRECV(BUF0,ISIZE,ITYPE,NEBPE,NEBPE
     1,               my_comm,IHANDLE(1),IRECV)
      ENDIF
C
C--------------------------------------------------------------------
C     RECEIVE FROM SOUTH
C--------------------------------------------------------------------
C
      IF(MY_NEB(3).GE.0)THEN
        NEBPE=MY_NEB(3)
        jhalo=ky2_loc(mype,igrid)-ky1_loc(mype,igrid)+1
        nxint=kx8_loc(mype,igrid)-kx3_loc(mype,igrid)+1
        ISIZE=nxint*JHALO*np
        ALLOCATE(BUF1(nxint,jhalo,np),STAT=I)
        CALL MPI_IRECV(BUF1,ISIZE,ITYPE,NEBPE,NEBPE
     1,               my_comm,IHANDLE(2),IRECV)
      ENDIF
C
C--------------------------------------------------------------------
C     SEND TO NORTH
C--------------------------------------------------------------------
C     
      IF(MY_NEB(1).GE.0)THEN
        NEBPE=MY_NEB(1)
        jhalo=ky8_loc(mype,igrid)-ky7_loc(mype,igrid)+1
        nxint=kx8_loc(mype,igrid)-kx3_loc(mype,igrid)+1
        ALLOCATE(BUF2(nxint,jhalo,np),STAT=I)
        KNT=nxint*jhalo*np
!$omp parallel do 
        DO K=1,np
         jj=0
         DO J=ky7_loc(mype,igrid),ky8_loc(mype,igrid)
          jj=jj+1
          ii=0
          DO I=kx3_loc(mype,igrid),kx8_loc(mype,igrid)
           ii=ii+1
           BUF2(Ii,jj,K)=ARR(I,J,K)
          ENDDO
         ENDDO
        ENDDO
        CALL MPI_ISEND(BUF2,KNT,ITYPE,NEBPE,MYPE
     1,               my_comm,IHANDLE(3),ISEND)
      ENDIF
C
C--------------------------------------------------------------------
C     SEND TO SOUTH
C--------------------------------------------------------------------
C    
      IF(MY_NEB(3).GE.0)THEN
        NEBPE=MY_NEB(3)
        jhalo=ky4_loc(mype,igrid)-ky3_loc(mype,igrid)+1
        nxint=kx8_loc(mype,igrid)-kx3_loc(mype,igrid)+1
        ALLOCATE(BUF3(nxint,jhalo,np),STAT=I)
        KNT=nxint*jhalo*np
!$omp parallel do 
        DO K=1,np
         jj=0
         DO J=ky3_loc(mype,igrid),ky4_loc(mype,igrid)
          jj=jj+1
          ii=0
          DO I=kx3_loc(mype,igrid),kx8_loc(mype,igrid)
           ii=ii+1
           BUF3(Ii,jj,K)=ARR(I,J,K)
          ENDDO
         ENDDO
        ENDDO
        CALL MPI_ISEND(BUF3,KNT,ITYPE,NEBPE,MYPE
     1,               my_comm,IHANDLE(4),ISEND)
      ENDIF
C    
C--------------------------------------------------------------------
C     STORE RESULTS FROM SOUTH
C--------------------------------------------------------------------
C
      IF(MY_NEB(3).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(2),ISTAT,IERR)
!$omp parallel do 
        DO K=1,np
         jj=0
         DO J=ky1_loc(mype,igrid),ky2_loc(mype,igrid)
          jj=jj+1
          ii=0
          DO I=kx3_loc(mype,igrid),kx8_loc(mype,igrid)
           ii=ii+1
           ARR(I,J,K)=BUF1(Ii,jj,K)
          ENDDO
         ENDDO
        ENDDO
        DEALLOCATE(BUF1,STAT=IER)
      ENDIF
C
C--------------------------------------------------------------------
C     STORE FROM NORTH
C--------------------------------------------------------------------
C
      IF(MY_NEB(1).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(1),ISTAT,IERR)
!$omp parallel do 
        DO K=1,np
         jj=0
         DO J=ky9_loc(mype,igrid),ky10_loc(mype,igrid)
          jj=jj+1
          ii=0
          DO I=kx3_loc(mype,igrid),kx8_loc(mype,igrid)
           ii=ii+1
           ARR(I,J,K)=BUF0(Ii,jj,K)
          ENDDO
         ENDDO
        ENDDO
        DEALLOCATE(BUF0,STAT=IER)
      ENDIF
C
      IF(MY_NEB(1).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(3),ISTAT,IERR)
        DEALLOCATE(BUF2,STAT=IER)
      ENDIF
C
      IF(MY_NEB(3).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(4),ISTAT,IERR)
        DEALLOCATE(BUF3,STAT=IER)
      ENDIF
C
C--------------------------------------------------------------------
C--------------------------------------------------------------------
C***
C***  EAST/WEST
C***
C--------------------------------------------------------------------
C--------------------------------------------------------------------
C
C--------------------------------------------------------------------
C     RECEIVE FROM WEST
C--------------------------------------------------------------------
C    
      IF(MY_NEB(4).GE.0)THEN
        NEBPE=MY_NEB(4)
        ihalo=kx2_loc(mype,igrid)-kx1_loc(mype,igrid)+1
        ISIZE=ihalo*ny*np
        ALLOCATE(BUF0(ihalo,ny,np),STAT=I)
        CALL MPI_IRECV(BUF0,ISIZE,ITYPE,NEBPE,NEBPE
     1,               my_comm,IHANDLE(1),IRECV)
      ENDIF
C
C--------------------------------------------------------------------
C     RECEIVE FROM EAST
C--------------------------------------------------------------------
C    
      IF(MY_NEB(2).GE.0)THEN
        NEBPE=MY_NEB(2)
        ihalo=kx10_loc(mype,igrid)-kx9_loc(mype,igrid)+1
        ISIZE=ihalo*ny*np
        ALLOCATE(BUF1(ihalo,ny,np),STAT=I)
        CALL MPI_IRECV(BUF1,ISIZE,ITYPE,NEBPE,NEBPE
     1,               my_comm,IHANDLE(2),IRECV)
      ENDIF
C
C--------------------------------------------------------------------
C     SEND TO EAST
C--------------------------------------------------------------------
C      
      IF(MY_NEB(2).GE.0)THEN
        NEBPE=MY_NEB(2)
        ihalo=kx8_loc(mype,igrid)-kx7_loc(mype,igrid)+1
        KNT=ihalo*ny*np
        ALLOCATE(BUF2(ihalo,ny,np),STAT=I)
!$omp parallel do 
        DO K=1,np
         DO j=1,ny
          ii=0
          DO i=kx7_loc(mype,igrid),kx8_loc(mype,igrid)
           ii=ii+1
           BUF2(ii,J,K)=ARR(I,J,K)
          ENDDO
         ENDDO
        ENDDO
        CALL MPI_ISEND(BUF2,KNT,ITYPE,NEBPE,MYPE
     1,               my_comm,IHANDLE(3),ISEND)
      ENDIF
C
C--------------------------------------------------------------------
C     SEND TO WEST
C--------------------------------------------------------------------
C       
      IF(MY_NEB(4).GE.0)THEN
        NEBPE=MY_NEB(4)
        ihalo=kx4_loc(mype,igrid)-kx3_loc(mype,igrid)+1
        KNT=ihalo*ny*np
        ALLOCATE(BUF3(ihalo,ny,np),STAT=I)
!$omp parallel do 
        DO K=1,np
         DO j=1,ny
          ii=0
          do i=kx3_loc(mype,igrid),kx4_loc(mype,igrid)
           ii=ii+1
           BUF3(ii,J,K)=ARR(I,J,K)
          ENDDO
         ENDDO
        ENDDO
       CALL MPI_ISEND(BUF3,KNT,ITYPE,NEBPE,MYPE
     1,               my_comm,IHANDLE(4),ISEND)
      ENDIF
C
C--------------------------------------------------------------------
C     STORE FROM WEST
C--------------------------------------------------------------------
C
      IF(MY_NEB(4).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(1),ISTAT,IERR)
!$omp parallel do 
        DO K=1,np
         DO J=1,ny
          ii=0
          DO I=kx1_loc(mype,igrid),kx2_loc(mype,igrid)
           ii=ii+1
           ARR(I,J,K)=BUF0(ii,J,K)
          ENDDO
         ENDDO
        ENDDO
        DEALLOCATE(BUF0,STAT=IER)
      ENDIF
C
C--------------------------------------------------------------------
C     STORE FROM EAST
C--------------------------------------------------------------------
C    
      IF(MY_NEB(2).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(2),ISTAT,IERR)
!$omp parallel do 
        DO K=1,np
         DO J=1,ny
          ii=0
          DO I=kx9_loc(mype,igrid),kx10_loc(mype,igrid)
           ii=ii+1
           ARR(I,J,K)=BUF1(ii,J,K)
          ENDDO
         ENDDO
        ENDDO
        DEALLOCATE(BUF1,STAT=IER)
      ENDIF
C
      IF(MY_NEB(4).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(4),ISTAT,IERR)
        DEALLOCATE(BUF3,STAT=IER)
      ENDIF
C
      IF(MY_NEB(2).GE.0)THEN
        CALL MPI_WAIT(IHANDLE(3),ISTAT,IERR)
        DEALLOCATE(BUF2,STAT=IER)
      ENDIF
C
C--------------------------------------------------------------------
      RETURN
      END