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


SUBROUTINE aamult(a,b,nx,ny,nz,                                         & 6
           ibgn,iend,jbgn,jend,kbgn,kend, ab)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Calculate the element-wise product of arrays a and b.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        First multiplier array
!    b        Second multiplier array
!
!    nx       First dimension of arrays a, b and ab
!    ny       Second dimension of arrays a, b and ab
!    nz       Third dimension of arrays a, b and ab
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!  OUTPUT:
!
!    ab       Element-wise product (a*b) over range specified by
!             the starting and ending indices given above.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a (nx,ny,nz)         ! Input array 1
  REAL :: b (nx,ny,nz)         ! Input array 2

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend

  REAL :: ab(nx,ny,nz)         ! Product array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        ab(i,j,k)=a(i,j,k)*b(i,j,k)

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE aamult

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


SUBROUTINE avgx(a, onvf, nx,ny,nz,                                      & 4
           ibgn,iend,jbgn,jend,kbgn,kend,                               &
           aavg)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a spatial average operation on array (a) in the x direction.
!  The average for the two input values is defined at the midpoint
!  between the two values.
!  If the averaged variable aavg is on the grid volume face, onvf =1
!  otherwise, onvf = 0
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    onvf     Integer grid point indicator
!             If the averaged variable aavg is on the grid volume face,
!             onvf =1; otherwise, onvf = 0
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!  OUTPUT:
!
!    aavg     Result of average operation on array
!             (a) in the x direction
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array
  INTEGER :: onvf              ! Integer grid point indicator

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: aavg(nx,ny,nz)       ! Averaged array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k,iright,ileft
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!

  IF ( onvf == 1) THEN

    iright = 0
    ileft = -1

  ELSE

    iright = 1
    ileft = 0

  END IF

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        aavg(i,j,k)=(a(i+iright,j,k)                                    &
                    +a(i+ileft ,j,k))*0.5

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE avgx

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


SUBROUTINE avg2x(a, nx,ny,nz,                                           &
           ibgn,iend,jbgn,jend,kbgn,kend, aavg)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a spatial average operation on array a in the x direction.
!  Averaging is over the interval 2*deltax.
!  The averaged variable is defined at the midpoint between the two
!  points for the two input values.
!
!-----------------------------------------------------------------------
!
!  AUTHOR:  David E. Jahn
!  9/30/93
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    ibgn     Index in first dimension to begin multiplication
!    iend     Index in first dimension to end multiplication
!    jbgn     Index in second dimension to begin multiplication
!    jend     Index in second dimension to end multiplication
!    kbgn     Index in third dimension to begin multiplication
!    kend     Index in third dimension to end multiplication
!
!  OUTPUT:
!
!    aavg     Result of average operation on array a in x direction
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication

  REAL :: aavg(nx,ny,nz)       ! Averaged array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        aavg(i,j,k)=(a(i-1,j,k)                                         &
                    +a(i+1,j,k))*0.5

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE avg2x

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


SUBROUTINE avgy(a, onvf, nx,ny,nz,                                      & 4
           ibgn,iend,jbgn,jend,kbgn,kend, aavg)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a spatial average operation on array a in the y direction.
!  The average for the two input values is defined at the midpoint
!  between the two values.
!  If the averaged variable aavg is on the grid volume face, onvf =1
!  otherwise, onvf = 0
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    onvf     Integer grid point indicator
!             If the averaged variable aavg is on the grid volume face,
!             onvf =1; otherwise, onvf = 0
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!  OUTPUT:
!
!    aavg     Result of average operation on array (a) in the
!             y direction
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array
  INTEGER :: onvf              ! Integer grid point indicator

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: aavg(nx,ny,nz)       ! Average array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k,jright,jleft
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  IF ( onvf == 1) THEN

    jright = 0
    jleft = -1

  ELSE

    jright = 1
    jleft = 0

  END IF

  DO k=kbgn,kend
    DO i=ibgn,iend
      DO j=jbgn,jend

        aavg(i,j,k)=(a(i,j+jright,k)+a(i,j+jleft,k))*0.5

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE avgy

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


SUBROUTINE avg2y(a, nx,ny,nz,                                           &
           ibgn,iend,jbgn,jend,kbgn,kend, aavg)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a spatial average operation on array a in the y direction.
!  Averaging is over a distance 2y*delta-y.
!  The averaged variable is defined at the midpoint between the two
!  points for the two input values.
!
!-----------------------------------------------------------------------
!
!  AUTHOR:  David E. Jahn
!  9/30/93
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    ibgn     Index in first dimension to begin operation
!    iend     Index in first dimension to end operation
!    jbgn     Index in second dimension to begin operation
!    jend     Index in second dimension to end operation
!    kbgn     Index in third dimension to begin operation
!    kend     Index in third dimension to end operation
!
!  OUTPUT:
!
!    aavg     Result of average operation on array a in y direction
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: aavg(nx,ny,nz)       ! Average array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  DO k=kbgn,kend
    DO i=ibgn,iend
      DO j=jbgn,jend

        aavg(i,j,k)=(a(i,j+1,k)+a(i,j-1,k))*0.5

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE avg2y


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


SUBROUTINE avgz(a, onvf, nx,ny,nz,                                      & 16
           ibgn,iend,jbgn,jend,kbgn,kend, aavg)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a spatial average operation on array (a) in the z direction.
!  The average of the two input values is defined at the midpoint
!  between the two values.
!  If the averaged variable aavg is on the grid volume face, onvf =1
!  otherwise, onvf = 0
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    onvf     Integer grid point indicator
!             If the averaged variable aavg is on the grid volume
!             face,onvf =1; otherwise, onvf = 0
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!  OUTPUT:
!
!    aavg     Result of average operation on array (a) in the z direction
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array
  INTEGER :: onvf              ! Integer grid point indicator

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: aavg(nx,ny,nz)       ! Average array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k,kup,kdown
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  IF ( onvf == 1) THEN

    kup = 0
    kdown = -1

  ELSE

    kup = 1
    kdown = 0

  END IF

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        aavg(i,j,k)=(a(i,j,k+kup)+a(i,j,k+kdown ))*0.5

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE avgz

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


SUBROUTINE avg2z(a, nx,ny,nz,                                           &
           ibgn,iend,jbgn,jend,kbgn,kend, aavg)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a spatial average operation on array a in the z direction.
!  Averaging is over interval 2*deltaz.
!  The averaged variable is defined at the midpoint between the two
!  points for the two input values.
!
!-----------------------------------------------------------------------
!
!  AUTHOR:  David E. Jahn
!  9/30/93
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    ibgn     Index in first dimension to begin operation
!    iend     Index in first dimension to end operation
!    jbgn     Index in second dimension to begin operation
!    jend     Index in second dimension to end operation
!    kbgn     Index in third dimension to begin operation
!    kend     Index in third dimension to end operation
!
!  OUTPUT:
!
!    aavg     Result of average operation on array a in z direction
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: aavg(nx,ny,nz)       ! Average array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        aavg(i,j,k)=(a(i,j,k+1)+a(i,j,k-1))*0.5

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE avg2z



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


SUBROUTINE difx(a, onvf, nx,ny,nz,                                      &
           ibgn,iend,jbgn,jend,kbgn,kend, dx, adifx)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a finite difference operation on an array (a) in the x
!  direction: adifx = d( a ) / dx. The output variable is defined at
!  the midpoint between the two points whose values are differenced
!  (i.e., the output and input arrays are staggered). The output
!  variable adifx is defined on the grid volume face when onvf =1;
!  otherwise, onvf = 0.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    onvf     Integer grid point indicator
!             If the averaged variable aavg is on the grid volume
!             face, onvf =1; otherwise, onvf = 0
!
!    nx       First dimension of arrays a and adifx
!    ny       Second dimension of arrays a and adifx
!    nz       Third dimension of arrays a and adfix
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!    dx       Grid spacing in x direction (m)
!
!  OUTPUT:
!
!    adifx    Differenced array del(a)/delx
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a    (nx,ny,nz)      ! Input array
  INTEGER :: onvf              ! Integer grid point indicator

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: dx                   ! Grid spacing in x direction (m)
  REAL :: adifx(nx,ny,nz)      ! Differenced array del(a)/delx
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k,iright,ileft
  REAL :: dxinv
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  IF ( onvf == 1) THEN

    iright = 0
    ileft = -1

  ELSE

    iright = 1
    ileft = 0

  END IF

  dxinv = 1.0/dx

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        adifx(i,j,k)=(a(i+iright,j,k)-a(i+ileft ,j,k))*dxinv

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE difx

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


SUBROUTINE dif2x(a, nx,ny,nz,                                           &
           ibgn,iend,jbgn,jend,kbgn,kend, dx, adifx)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a centered finite difference operation on an array a over
!  2 grid distance in the x direction: adifx = d( a ) / dx.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: David E. Jahn
!  4/19/93
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and adifx
!    ny       Second dimension of arrays a and adifx
!    nz       Third dimension of arrays a and adfix
!
!    ibgn     Index in first dimension to begin operation
!    iend     Index in first dimension to end operation
!    jbgn     Index in second dimension to begin operation
!    jend     Index in second dimension to end operation
!    kbgn     Index in third dimension to begin operation
!    kend     Index in third dimension to end operation
!
!    dx       Grid spacing in x direction (m)
!
!  OUTPUT:
!
!    adifx    Differenced array del(a)/delx
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a    (nx,ny,nz)      ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: dx                   ! Grid spacing in x direction (m)
  REAL :: adifx(nx,ny,nz)      ! Differenced array del(a)/delx

!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
  REAL :: dxinv
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  dxinv = 0.5/dx

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        adifx(i,j,k)=(a(i+1,j,k)-a(i-1,j,k))*dxinv

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE dif2x



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


SUBROUTINE dify(a, onvf, nx,ny,nz,                                      &
           ibgn,iend,jbgn,jend,kbgn,kend, dy, adify)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a finite difference operation on an array (a) in the y
!  direction: adify = d( a ) / dy. The output variable is defined at
!  the midpoint between the two points whose values are differenced
!  (i.e., the output and input arrays are staggered). The output
!  variable adifx is defined on the grid volume face when onvf =1;
!  otherwise, onvf = 0.

!  direction. adify = d( a ) / dy. The output variable is defined at
!  the midpoint between the two points whose values are differenced.
!  The output variable adify is defined on the grid volume face when
!  onvf =1; otherwise, onvf = 0.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    onvf     Integer grid point indicator
!             If the averaged variable aavg is on the grid volume
!             face, onvf =1; otherwise, onvf = 0
!
!    nx       First dimension of arrays a and adify
!    ny       Second dimension of arrays a and adify
!    nz       Third dimension of arrays a and adify
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!    dy       Grid spacing in y direction (m)
!
!  OUTPUT:
!
!    adify    Differenced array del(a)/dely
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array
  INTEGER :: onvf              ! Integer grid point indicator

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: dy                   ! Grid spacing in y direction (m)
  REAL :: adify(nx,ny,nz)      ! Differenced array del(a)/dely
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k,jright,jleft
  REAL :: dyinv
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  IF ( onvf == 1) THEN

    jright = 0
    jleft = -1

  ELSE

    jright = 1
    jleft = 0

  END IF

  dyinv = 1.0/dy

  DO k=kbgn,kend
    DO i=ibgn,iend
      DO j=jbgn,jend

        adify(i,j,k)=(a(i,j+jright,k)-a(i,j+jleft,k))*dyinv

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE dify

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


SUBROUTINE dif2y(a, nx,ny,nz,                                           &
           ibgn,iend,jbgn,jend,kbgn,kend, dy, adify)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a centered finite difference operation on an array a over
!  2 grid distance in the y direction: adify = d( a ) / dy.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: David E. Jahn
!  4\19\93
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and adify
!    ny       Second dimension of arrays a and adify
!    nz       Third dimension of arrays a and adify
!
!    ibgn     Index in first dimension to begin operation
!    iend     Index in first dimension to end operation
!    jbgn     Index in second dimension to begin operation
!    jend     Index in second dimension to end operation
!    kbgn     Index in third dimension to begin operation
!    kend     Index in third dimension to end operation
!
!    dy       Grid spacing in y direction (m)
!
!  OUTPUT:
!
!    adify    Differenced array del(a)/dely
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a   (nx,ny,nz)       ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: dy                   ! Grid spacing in y direction (m)
  REAL :: adify(nx,ny,nz)      ! Differenced array del(a)/dely
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
  REAL :: dyinv
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  dyinv = 0.5/dy

  DO k=kbgn,kend
    DO i=ibgn,iend
      DO j=jbgn,jend

        adify(i,j,k)=(a(i,j+1,k)-a(i,j-1,k))*dyinv

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE dif2y


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


SUBROUTINE difz(a, onvf, nx,ny,nz,                                      & 1
           ibgn,iend,jbgn,jend,kbgn,kend, dz, adifz)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a finite difference operation on an array (a) in the z
!  direction: adifz = d( a ) / dz. The output variable is defined at
!  the midpoint between the two points whose values are differenced
!  (i.e., the output and input arrays are staggered). The output
!  variable adifx is defined on the grid volume face when onvf =1;
!  otherwise, onvf = 0.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and adifz
!    ny       Second dimension of arrays a and adifz
!    nz       Third dimension of arrays a and adifz
!
!    onvf     Integer grid point indicator
!             If the averaged variable aavg is on the grid volume
!             face, onvf =1; otherwise, onvf = 0
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!    dz       Grid spacing in z direction (m)
!
!  OUTPUT:
!
!    adifz    Differenced array del(a)/delz
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a    (nx,ny,nz)      ! Input array
  INTEGER :: onvf              ! Integer grid point indicator

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: dz                   ! Grid spacing in z direction (m)
  REAL :: adifz(nx,ny,nz)      ! Differenced array del(a)/delz
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k,kup,kdown
  REAL :: dzinv
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  IF ( onvf == 1) THEN

    kup = 0
    kdown = -1

  ELSE

    kup = 1
    kdown = 0

  END IF

  dzinv = 1.0/dz

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        adifz(i,j,k)=(a(i ,j,k+kup)-a(i ,j,k+kdown ))*dzinv

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE difz
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE DIF2Z                      ######
!######                                                      ######
!######                     Developed by                     ######
!######  Center for the Analysis and Prediction of Storms    ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE dif2z(a, nx,ny,nz,                                           &
           ibgn,iend,jbgn,jend,kbgn,kend, dz, adifz)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Perform a centered finite difference operation on an array a over
!  2 grid distance in the z direction: adifz = d( a ) / dz.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  11/6/95
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and adifz
!    ny       Second dimension of arrays a and adifz
!    nz       Third dimension of arrays a and adfiz
!
!    ibgn     Index in first dimension to begin operation
!    iend     Index in first dimension to end operation
!    jbgn     Index in second dimension to begin operation
!    jend     Index in second dimension to end operation
!    kbgn     Index in third dimension to begin operation
!    kend     Index in third dimension to end operation
!
!    dz       Grid spacing in z direction (m)
!
!  OUTPUT:
!
!    adifz    Differenced array del(a)/delz
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a    (nx,ny,nz)      ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: dz                   ! Grid spacing in z direction (m)
  REAL :: adifz(nx,ny,nz)      ! Differenced array del(a)/delz

!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
  REAL :: dzinv
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  dzinv = 0.5/dz

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        adifz(i,j,k)=(a(i,j,k+1)-a(i,j,k-1))*dzinv

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE dif2z

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


SUBROUTINE difxx(a, nx,ny,nz,                                           & 3
           ibgn,iend,jbgn,jend,kbgn,kend, dx, adifxx)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Calculate the second order difference of an array (a) in the
!  x direction.  The operator is defined as del**2(a)/delx**2.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and adifxx
!    ny       Second dimension of arrays a and adifxx
!    nz       Third dimension of arrays a and adifxx
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!    dx       Grid spacing in x direction (m)
!
!  OUTPUT:
!
!    adifxx   Differenced array del**2(a)/delx**2
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  REAL :: a    (nx,ny,nz)      ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                ! Integer indicator of multiplication
  REAL :: dx                   ! Grid spacing in x direction (m)
  REAL :: adifxx(nx,ny,nz)     ! Differenced array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
  REAL :: dxinv2
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
!  NOTE:
!
!  The order of calculation in the following formula should not
!  be changed. The order affects the machine trunction error
!  in the result.
!
!-----------------------------------------------------------------------
!
  dxinv2 = 1.0/(dx*dx)

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend
        adifxx(i,j,k)=((a(i+1,j,k)-a(i,j,k))-(a(i,j,k)-a(i-1,j,k)))     &
                     *dxinv2

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE difxx

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


SUBROUTINE difyy(a, nx,ny,nz,                                           & 3
           ibgn,iend,jbgn,jend,kbgn,kend, dy, adifyy)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Calculate the second order finite difference of an array (a) in the
!  y direction.  The operator is defined as del**2(a)/dely**2.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        input array
!
!    nx       First dimension of arrays a and adifyy
!    ny       Second dimension of arrays a and adifyy
!    nz       Third dimension of arrays a and adifyy
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!    dy       grid spacing in y direction (m)
!
!  OUTPUT:
!
!    adifyy   difference array del**2(a)/dely**2
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz         ! Number of grid points in 3 directions

  REAL :: a     (nx,ny,nz)      ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                 ! Integer indicator of multiplication
  REAL :: dy                    ! Grid spacing in y direction (m)
  REAL :: adifyy(nx,ny,nz)      ! Differenced array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
  REAL :: dyinv2
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  dyinv2 = 1.0/(dy*dy)

  DO k=kbgn,kend
    DO i=ibgn,iend
      DO j=jbgn,jend
!
!-----------------------------------------------------------------------
!
!  NOTE:
!
!  The order of calculation in the following formula should not
!  be changed. The order affects the machine trunction error
!  in the result.
!
!-----------------------------------------------------------------------
!
        adifyy(i,j,k)=((a(i,j+1,k)-a(i,j,k))-(a(i,j,k)-a(i,j-1,k)))     &
                     *dyinv2

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE difyy

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


SUBROUTINE difzz(a, nx,ny,nz,                                           &
           ibgn,iend,jbgn,jend,kbgn,kend, dz, adifzz)

!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Calculate the second order finite difference of an array (a) in the
!  z direction.  The operator is defined as del**2(a)/delz**2.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Ming Xue
!  10/10/91
!
!  MODIFICATION HISTORY:
!
!  5/05/92 (M. Xue)
!  Added full documentation.
!
!  6/01/2 (K. Brewster)
!  Further facelift.
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    a        Input array
!
!    nx       First dimension of arrays a and adifzz
!    ny       Second dimension of arrays a and adifzz
!    nz       Third dimension of arrays a and adifzz
!
!    ibgn     i-index where multiplication begins.
!    iend     i-index where multiplication ends.
!    jbgn     j-index where multiplication begins.
!    jend     j-index where multiplication ends.
!    kbgn     k-index where multiplication begins.
!    kend     k-index where multiplication ends.
!
!    dz       Grid spacing in the vertical direction (m)
!
!  OUTPUT:
!
!    adifzz   Differenced array del**2(a)/delz**2
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz         ! Number of grid points in 3 directions

  REAL :: a     (nx,ny,nz)      ! Input array

  INTEGER :: ibgn,iend,jbgn,jend,kbgn,kend
                                 ! Integer indicator of multiplication
  REAL :: dz                    ! Grid spacing in the vertical
                                ! direction (m)
  REAL :: adifzz(nx,ny,nz)      ! Output difference array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,k
  REAL :: dzinv2
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
!  NOTE:
!
!  The order of calculation in the following formula should not
!  be changed. The order affects the machine trunction error
!  in the result.
!
!-----------------------------------------------------------------------
!
  dzinv2 = 1.0/(dz*dz)

  DO k=kbgn,kend
    DO j=jbgn,jend
      DO i=ibgn,iend

        adifzz(i,j,k)=((a(i,j,k+1)-a(i,j,k))-(a(i,j,k)-a(i,j,k-1)))     &
                     *dzinv2

      END DO
    END DO
  END DO

  RETURN
END SUBROUTINE difzz

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


SUBROUTINE avgsu(s,nx,ny,nz,jbgn,jend,kbgn,kend,su,tem) 12,7
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Average scalar array s to u points, up to the x boundary.
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR:
!  2/15/93 (M. Xue and H. Jin)
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!  2000/09/15 (Gene Bassett)
!  Added extra temporary array to argument list for MP option.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    s        An array defined at the scalar point.
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    jbgn     Starting point for j computation
!    jend     Ending point for j computation
!    kbgn     Starting point for k computation
!    kend     Ending point for k computation
!
!  OUTPUT:
!
!    su       An array averaged from array 's' defined at the
!             scalar point to the u-point.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  INTEGER :: jbgn,jend         ! Domain of j computations
  INTEGER :: kbgn,kend         ! Domain of k computations

  REAL :: s (nx,ny,nz)         ! Input array
  REAL :: su(nx,ny,nz)         ! Averaged array

  REAL :: tem((nx+ny)*nz)      ! Temporary work array for MP option
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: onvf

  INTEGER :: mptag, astat
!
!-----------------------------------------------------------------------
!
!  Include files:
!
!-----------------------------------------------------------------------
!
  INCLUDE 'bndry.inc'
  INCLUDE 'globcst.inc'
  INCLUDE 'mp.inc'            ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  onvf = 1
  CALL avgx(s, onvf,                                                    &
            nx,ny,nz, 2,nx-1, jbgn,jend, kbgn,kend, su)

!call test_dump (su,"XXXoperat_su",nx,ny,nz,1,0)
  IF (mp_opt > 0) THEN
    CALL acct_interrupt(mp_acct)
    CALL mpsend2dew(su,nx,ny,nz,ebc,wbc,1,mptag,tem)
    CALL mprecv2dew(su,nx,ny,nz,ebc,wbc,1,mptag,tem)
!    CALL mpsend2dns(su,nx,ny,nz,1,mptag,tem)
!    CALL mprecv2dns(su,nx,ny,nz,1,mptag,tem)
  END IF
  CALL acct_interrupt(bc_acct)
  CALL bcsu(nx,ny,nz,jbgn,jend,kbgn,kend,ebc,wbc,su)
  CALL acct_stop_inter
!call test_dump (su,"XXXAoperat_su",nx,ny,nz,1,1)

  RETURN
END SUBROUTINE avgsu
!
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE AVGSV                      ######
!######                                                      ######
!######                     Developed by                     ######
!######  Center for the Analysis and Prediction of Storms    ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE avgsv(s,nx,ny,nz,ibgn,iend,kbgn,kend,sv,tem) 12,7
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Average scalar array s to v points, up to the y boundary.
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR:
!  2/15/93 (M. Xue and H. Jin)
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!  2000/09/15 (Gene Bassett)
!  Added extra temporary array to argument list for MP option.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    s        An array defined at the scalar point.
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    ibgn     Starting point for i computation
!    iend     Ending point for i computation
!    kbgn     Starting point for k computation
!    kend     Ending point for k computation
!
!  OUTPUT:
!
!    su       An array averaged from array 's' defined at the
!             scalar point to the v-point.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  INTEGER :: ibgn,iend         ! Domain of i computations
  INTEGER :: kbgn,kend         ! Domain of k computations

  REAL :: s (nx,ny,nz)         ! Input array
  REAL :: sv(nx,ny,nz)         ! Averaged array
  REAL :: tem((nx+ny)*nz)      ! Temporary work array for MP option
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: onvf

  INTEGER :: mptag, astat
!
!-----------------------------------------------------------------------
!
!  Include files:
!
!-----------------------------------------------------------------------
!
  INCLUDE 'bndry.inc'
  INCLUDE 'globcst.inc'
  INCLUDE 'mp.inc'            ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  onvf = 1
  CALL avgy(s, onvf,                                                    &
            nx,ny,nz, ibgn,iend, 2,ny-1, kbgn,kend, sv)

!call test_dump (sv,"XXXoperat_sv",nx,ny,nz,2,0)
  IF (mp_opt > 0) THEN
    CALL acct_interrupt(mp_acct)
!    CALL mpsend2dew(sv,nx,ny,nz,2,mptag,tem)
!    CALL mprecv2dew(sv,nx,ny,nz,2,mptag,tem)
    CALL mpsend2dns(sv,nx,ny,nz,nbc,sbc,2,mptag,tem)
    CALL mprecv2dns(sv,nx,ny,nz,nbc,sbc,2,mptag,tem)
  END IF

  CALL acct_interrupt(bc_acct)
  CALL bcsv(nx,ny,nz,ibgn,iend,kbgn,kend,nbc,sbc,sv)
  CALL acct_stop_inter
!call test_dump (sv,"XXXAoperat_sv",nx,ny,nz,2,1)

  RETURN
END SUBROUTINE avgsv
!
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE AVGSW                      ######
!######                                                      ######
!######                     Developed by                     ######
!######  Center for the Analysis and Prediction of Storms    ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE avgsw(s,nx,ny,nz,ibgn,iend,jbgn,jend,sw) 11,4
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Average scalar array s to w points, up to k=1, and nz.
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR:
!  2/15/93 (M. Xue and H. Jin)
!
!  MODIFICATION HISTORY:
!
!  9/10/94 (Weygandt & Y. Lu)
!  Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!
!    s        An array defined at the scalar point.
!
!    nx       First dimension of arrays a and aavg
!    ny       Second dimension of arrays a and aavg
!    nz       Third dimension of arrays a and aavg
!
!    ibgn     Starting point for i computation
!    iend     Ending point for i computation
!    jbgn     Starting point for j computation
!    jend     Ending point for j computation
!
!  OUTPUT:
!
!    sw       An array averaged from array 's' defined at the
!             scalar point to the w-point.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER :: nx, ny, nz        ! Number of grid points in 3 directions

  INTEGER :: ibgn,iend         ! Domain of i computation
  INTEGER :: jbgn,jend         ! Domain of j computation

  REAL :: s (nx,ny,nz)         ! Input array
  REAL :: sw(nx,ny,nz)         ! Averaged array
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: onvf
!
!-----------------------------------------------------------------------
!
!  Include files:
!
!-----------------------------------------------------------------------
!
  INCLUDE 'bndry.inc'
  INCLUDE 'globcst.inc'
  INCLUDE 'mp.inc'            ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  onvf = 1
  CALL avgz(s, onvf,                                                    &
            nx,ny,nz, ibgn,iend, jbgn,jend, 2,nz-1, sw)

  CALL acct_interrupt(bc_acct)
  CALL bcsw(nx,ny,nz,ibgn,iend,jbgn,jend,tbc,bbc,sw)
  CALL acct_stop_inter

  RETURN
END SUBROUTINE avgsw