!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE WRF_SPLIT2d                ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE wrf_split2d(globvar,nx,ny,fzone,var),4

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  For no-mp mode, just copy the array from globvar to var.
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR: Yunheng Wang
!  2002/08/20
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!  INPUT :
!
!    globvar  Global array passed in from processor 0.
!
!    nx       Number of grid points in the x-direction (east/west)
!    ny       Number of grid points in the y-direction (north/south)
!
!  OUTPUT:
!
!    var      Subdomain variable in each process.
!
!-----------------------------------------------------------------------

  IMPLICIT NONE

!-----------------------------------------------------------------------
!
!  Include files.
!
!-----------------------------------------------------------------------

  INCLUDE 'mp.inc'

!-----------------------------------------------------------------------
!
!  Variable declarations.
!
!-----------------------------------------------------------------------

  INTEGER, INTENT(IN)  :: nx,ny       ! Number of grid points in x and y
  INTEGER, INTENT(IN)  :: fzone       ! number of fake zone
                                      ! 1 for wrf
                                      ! 3 for arps
  REAL,    INTENT(IN)  :: globvar(nx,ny)

  REAL,    INTENT(OUT) :: var(nx,ny)


!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  var(:,:) = globvar(1:nx,1:ny)     

  RETURN
END SUBROUTINE wrf_split2d
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE WRF_SPLIT2DI               ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE wrf_split2di(globvar,nx,ny,fzone,var),4

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  For no-mp mode, just copy the array from globvar to var.
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR: Yunheng Wang
!  2002/08/20
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!  INPUT :
!
!    globvar  Global array passed in from processor 0.
!
!    nx       Number of grid points in the x-direction (east/west)
!    ny       Number of grid points in the y-direction (north/south)
!
!  OUTPUT:
!
!    var      Subdomain variable in each process.
!
!-----------------------------------------------------------------------

  IMPLICIT NONE

!-----------------------------------------------------------------------
!
!  Variable declarations.
!
!-----------------------------------------------------------------------

  INTEGER, INTENT(IN)  :: nx,ny       ! Number of grid points in x and y
  INTEGER, INTENT(IN)  :: fzone       ! number of fake zone
                                      ! 1 for wrf
                                      ! 3 for arps
  INTEGER, INTENT(IN)  :: globvar(nx,ny)
  INTEGER, INTENT(OUT) :: var(nx,ny)


!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  var(:,:) = globvar(1:nx,1:ny)     

  RETURN
END SUBROUTINE wrf_split2di
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE WRF_SPLIT3d                ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE wrf_split3d(globvar,nx,ny,nz,fzone,var),4

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  For no-mp mode, just copy the array from globvar to var.
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR: Yunheng Wang
!  2002/08/20
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!  INPUT :
!
!    globvar  Global array passed in from processor 0.
!
!    nx       Number of grid points in the x-direction (east/west)
!    ny       Number of grid points in the y-direction (north/south)
!    nz       3rd dimension of the subdomain array, possible value are
!             vertical grid points (nz in other subroutines), nzsoil,
!             nstyps+1, or 4 (prcrate) or 1 (for 2D arrays)
!
!  OUTPUT:
!
!    var      Subdomain variable in each process.
!
!-----------------------------------------------------------------------

  IMPLICIT NONE

!-----------------------------------------------------------------------
!
!  Variable declarations.
!
!-----------------------------------------------------------------------

  INTEGER, INTENT(IN)  :: nx,ny,nz    ! Number of grid points in x, y and z
  INTEGER, INTENT(IN)  :: fzone       ! number of fake zone
                                      ! 1 for wrf
                                      ! 3 for arps
  REAL,    INTENT(IN)  :: globvar(nx,ny,nz)

  REAL,    INTENT(OUT) :: var(nx,ny,nz)


!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  var(:,:,:) = globvar(1:nx,1:ny,1:nz)     

  RETURN
END SUBROUTINE wrf_split3d


SUBROUTINE mpext_wrf_u(var,nx,ny,nz,tem),1

  IMPLICIT NONE

  INTEGER, INTENT(IN) :: nx,ny,nz      ! Number of grid points in 
                                       ! x, y and z directions
  REAL, INTENT(INOUT) :: var(nx,ny,nz)
  REAL, INTENT(INOUT) :: tem(ny,nz,2)   ! Work array.

  RETURN
END SUBROUTINE mpext_wrf_u


SUBROUTINE mpext_wrf_v(var,nx,ny,nz,tem),1

  IMPLICIT NONE

  INTEGER, INTENT(IN) :: nx,ny,nz      ! Number of grid points in 
                                       ! x, y and z directions
  REAL, INTENT(INOUT) :: var(nx,ny,nz)
  REAL, INTENT(INOUT) :: tem(ny,nz,2)   ! Work array.

  RETURN
END SUBROUTINE mpext_wrf_v
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE EXTEND_U                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE extend_u(u,nx,ny,nz,uext,tem1,tem2) 1,1

  IMPLICIT NONE

!-----------------------------------------------------------------------
!
! PURPOSE:
!
!    Extended WRF variable staggered at U grid points in south boundary
!    and east boundary to facilitate the computation of its values
!    at V grid points.
!
!-----------------------------------------------------------------------

  INTEGER, INTENT(IN)  :: nx, ny, nz
  REAL,    INTENT(IN)  :: u(nx,ny,nz)
  REAL,    INTENT(OUT) :: uext(1:nx+1,0:ny,1:nz)
  REAL,    INTENT(INOUT) :: tem1(nx,nz,2), tem2(ny,nz,2)

  INTEGER  :: i,j,k

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Begin of executable code below
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  !
  ! Valid values at U grid points
  !
  DO k = 1,nz-1
    DO j = 1,ny-1
      DO i = 1,nx
        uext(i,j,k) = u(i,j,k)
      END DO
    END DO
  END DO

  !
  ! Top boundary
  !
  DO j = 1,ny-1
    DO i = 1,nx
      uext(i,j,nz) = u(i,j,nz-1)
    END DO
  END DO

  !
  ! South & north boundary
  !
  DO k = 1,nz
    DO i = 1,nx
      uext(i,0,k) = u(i,1,k)
      uext(i,ny,k) = u(i,ny-1,k)
    END DO
  END DO

  !
  ! East boundary
  !
  DO k = 1,nz
    DO j = 1,ny
      uext(nx+1,j,k) = u(nx,j,k)
    END DO
  END DO

  uext(nx+1,0,:) = u(nx,1,:)

  RETURN
END SUBROUTINE extend_u
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE EXTEND_V                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE extend_v(v,nx,ny,nz,vext,tem1,tem2) 1,1

  IMPLICIT NONE

!-----------------------------------------------------------------------
!
! PURPOSE:
!
!    Extended WRF variable staggered at V grid points in north boundary
!    and west boundary to facilitate the computation of its values
!    at U grid points.
!
!-----------------------------------------------------------------------

  INTEGER, INTENT(IN)  :: nx, ny, nz
  REAL,    INTENT(IN)  :: v(nx,ny,nz)
  REAL,    INTENT(OUT) :: vext(0:nx,1:ny+1,1:nz)
  REAL,    INTENT(INOUT) :: tem1(nx,nz,2), tem2(ny,nz,2)

  INTEGER  :: i,j,k

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Begin of executable code below
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  !
  ! Valid values at V grid points
  !
  DO k = 1,nz-1
    DO j = 1,ny
      DO i = 1,nx-1
        vext(i,j,k) = v(i,j,k)
      END DO
    END DO
  END DO

  !
  ! Top boundary
  !
  DO j = 1,ny
    DO i = 1,nx-1
      vext(i,j,nz) = v(i,j,nz-1)
    END DO
  END DO

  !
  ! West & east boundary
  !
  DO k = 1,nz
    DO j = 1,ny
      vext(0,j,k) = v(1,j,k)
      vext(nx,j,k) = v(nx-1,j,k)
    END DO
  END DO

  !
  ! North boundary
  !
  DO k = 1,nz
    DO i = 1,nx
      vext(i,ny+1,k) = v(i,ny,k)
    END DO
  END DO

  vext(0,ny+1,:) = v(1,ny,:)

  RETURN
END SUBROUTINE extend_v

!subroutine printwrf3d(unt,varname,var,stagger,nx,ny,nz)
!  
!  implicit none
!  integer      :: unt
!  character(*) :: varname
!  character(*) :: stagger
!  integer      :: nx, ny,nz
!  real         :: var(nx,ny,nz)
!
!  integer i,j,k
!
!  write(unt,'(3a)') '--- ',varname,' ---'
!
!  IF (stagger == 'X') THEN
!    DO k = 1,nz-1
!      DO j = 1,ny-1
!        WRITE(UNIT=unt,FMT='(2I3,a)') k,j,' --- '
!        WRITE(UNIT=unt,FMT='(5f16.5)') (var(i,j,k),i=1,nx)
!      END DO
!    END DO
!  ELSE IF (stagger == 'Y') THEN
!    DO k = 1,nz-1
!      DO j = 1,ny
!        WRITE(UNIT=unt,FMT='(2I3,a)') k,j,' --- '
!        WRITE(UNIT=unt,FMT='(5f16.5)') (var(i,j,k),i=1,nx-1)
!      END DO
!    END DO
!  ELSE IF (stagger == 'Z') THEN
!    DO k = 1,nz
!      DO j = 1,ny-1
!        WRITE(UNIT=unt,FMT='(2I3,a)') k,j,' --- '
!        WRITE(UNIT=unt,FMT='(5f16.5)') (var(i,j,k),i=1,nx-1)
!      END DO
!    END DO
!  ELSE
!    DO k = 1,nz-1
!      DO j = 1,ny-1
!        WRITE(UNIT=unt,FMT='(2I3,a)') k,j,' --- '
!        WRITE(UNIT=unt,FMT='(5f16.5)') (var(i,j,k),i=1,nx-1)
!      END DO
!    END DO
!  END IF
!
!  return
!end subroutine printwrf3d