!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CMIX2UVW ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE cmix2uvw(nx,ny,nz, & 1
u,v,w, ubar,vbar,rhostr, &
umix,vmix,wmix, &
tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the second order computational mixing terms for the momentum
! equations. Computational mixing is applied to velocity perturbations
! only. These terms are placed in the arrays umix, vmix and wmix.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 6/3/92 (M. Xue and H. Jin)
! Further facelift.
!
! 4/2/92 (M. Xue and H. Jin)
! Modify to include terrain
!
! 5/19/1998 (M. Xue)
! Reformulated the computational mixing terms to move rhostr
! outside the inner-most derivative.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Verticle component of Cartesian velocity at a
! given time level (m/s)
!
! umix Array containing turbulent mixing on u
! vmix Array containing turbulent mixing on v
! wmix Array containing turbulent mixing on w
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! OUTPUT:
!
! umix Turbulent and computational mixing on u.
! vmix Turbulent and computational mixing on v.
! wmix Turbulent and computational mixing on w.
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: umix (nx,ny,nz) ! Total mixing in u-eq.
REAL :: vmix (nx,ny,nz) ! Total mixing in v-eq.
REAL :: wmix (nx,ny,nz) ! Total mixing in w-eq.
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: temx,temy,temz
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'globcst.inc'
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! IF the coefficients of computational mixing in both horizontal
! and vertical directions are zero, exit this subroutine.
!
!-----------------------------------------------------------------------
!
IF( cfcmh2 == 0.0 .AND. cfcmv2 == 0.0 ) RETURN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem3(i,j,k)=u(i,j,k)-ubar(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the second order
! horizontal computational mixing on u'
!
!-----------------------------------------------------------------------
!
IF( cfcmh2 /= 0.0) THEN
temx = cfcmh2/(dx*dx)
temy = cfcmh2/(4.0*dy*dy)
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(tem3(i+1,j,k)-tem3(i,j,k))*rhostr(i,j,k)*temx
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem2(i,j,k)=(tem3(i,j,k)-tem3(i,j-1,k))* &
(rhostr(i,j ,k)+rhostr(i-1,j ,k) &
+rhostr(i,j-1,k)+rhostr(i-1,j-1,k))*temy
END DO
END DO
END DO
!
DO k=2,nz-2
DO i=2,nx-1
tem2(i, 1,k) = 0.0
tem2(i,ny,k) = 0.0
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)+(tem1(i,j,k)-tem1(i-1,j,k) &
+tem2(i,j+1,k)-tem2(i,j,k))
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the second order
! vertical computational mixing on u'
!
!-----------------------------------------------------------------------
!
IF( cfcmv2 /= 0.0) THEN
!
temz = cfcmv2/(4.0*dz*dz)
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem2(i,j,k)=(tem3(i,j,k)-tem3(i,j,k-1))* &
(rhostr(i,j,k )+rhostr(i-1,j,k ) &
+rhostr(i,j,k-1)+rhostr(i-1,j,k-1))*temz
END DO
END DO
END DO
!
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)+(tem2(i,j,k+1)-tem2(i,j,k))
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the second order
! horizontal computational mixing on v'
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem3(i,j,k)=v(i,j,k)-vbar(i,j,k)
END DO
END DO
END DO
IF( cfcmh2 /= 0.0) THEN
temx = cfcmh2/(4.0*dx*dx)
temy = cfcmh2/(dy*dy)
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem1(i,j,k)=(tem3(i,j,k)-tem3(i-1,j,k))* &
(rhostr(i,j ,k)+rhostr(i ,j-1,k) &
+rhostr(i-1,j,k)+rhostr(i-1,j-1,k))*temx
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
tem1(1, j,k) = 0.0
tem1(nx,j,k) = 0.0
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=(tem3(i,j+1,k)-tem3(i,j,k))*rhostr(i,j,k)*temy
END DO
END DO
END DO
!
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vmix(i,j,k)=vmix(i,j,k)+(tem1(i+1,j,k)-tem1(i,j,k) &
+tem2(i,j,k)-tem2(i,j-1,k))
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the second order
! vertical computational mixing on v'
!
!-----------------------------------------------------------------------
!
IF( cfcmv2 /= 0.0) THEN
temz = cfcmv2/(4.0*dz*dz)
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=(tem3(i,j,k)-tem3(i,j,k-1))* &
(rhostr(i,j,k )+rhostr(i,j-1,k ) &
+rhostr(i,j,k-1)+rhostr(i,j-1,k-1))*temz
END DO
END DO
END DO
!
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vmix(i,j,k)=vmix(i,j,k)+(tem2(i,j,k+1)-tem2(i,j,k))
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Second order computational mixing on w
!
!-----------------------------------------------------------------------
!
IF( cfcmh2 /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the horizontal
! computational mixing on w.
!
!-----------------------------------------------------------------------
!
temx = cfcmh2/(4.0*dx*dx)
temy = cfcmh2/(4.0*dy*dy)
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem1(i,j,k)=(w(i,j,k)-w(i-1,j,k)) &
*(rhostr(i,j ,k)+rhostr(i-1,j ,k)+ &
rhostr(i,j,k-1)+rhostr(i-1,j,k-1))*temx
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
tem1(1 ,j,k)=0.0
tem1(nx,j,k)=0.0
END DO
END DO
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=(w(i,j,k)-w(i,j-1,k)) &
*(rhostr(i,j, k)+rhostr(i,j-1,k)+ &
rhostr(i,j,k-1)+rhostr(i,j-1,k-1))*temy
END DO
END DO
END DO
DO k=2,nz-1
DO i=1,nx-1
tem2(i,1 ,k)=0.0
tem2(i,ny,k)=0.0
END DO
END DO
!-----------------------------------------------------------------------
!
! Note that tem1 at i=1 and nx are zero, and tem2 at j=1,ny are zero,
! equivalent to assuming zero normal gradient of s at the boundaries.
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wmix(i,j,k)=wmix(i,j,k)+(tem1(i+1,j,k)-tem1(i,j,k)+ &
tem2(i,j+1,k)-tem2(i,j,k))
END DO
END DO
END DO
END IF
IF( cfcmv2 /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the vertical
! computational mixing on w.
!
!-----------------------------------------------------------------------
!
temz = cfcmv2/(dz*dz)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(w(i,j,k+1)-w(i,j,k))*rhostr(i,j,k)*temz
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wmix(i,j,k)=wmix(i,j,k)+(tem1(i,j,k)-tem1(i,j,k-1))
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE cmix2uvw
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CMIX2S ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE cmix2s(nx,ny,nz, s ,rhostr, smix, tem1,tem2,tem3) 4
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Generic routine to calculate the second order computational mixing
! for scalar s. The computational mixing is accumulated into array
! smix on exit.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 6/3/92 (M. Xue and H. Jin)
! Further facelift.
!
! 10/17/93 (M. Xue)
! Bug fixes fix in line 3 of loop 111 and 112.
!
! 10/17/94 (M. Xue)
! Subroutines CMIX2PT and CMIX2Q combined into a single generic
! routine CMIX2S.
!
! 5/19/1998 (M. Xue)
! Reformulated the computational mixing terms to move rhostr
! outside the inner-most derivative.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Verticle component of Cartesian velocity at a
! given time level (m/s)
!
! s scalar field to which the compuational mixing is to
! be applied.
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! smix Array containing turbulent mixing s on input.
!
! OUTPUT:
!
! smix Turbulent mixing plus computational mixing on s.
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: s (nx,ny,nz) ! Scalar to be mixed.
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: smix (nx,ny,nz) ! Total mixing on s
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: cfcmh2s,cfcmv2s, temx,temy,temz
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'phycst.inc'
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!
!-----------------------------------------------------------------------
!
! If the coefficients of computational mixing in both the horizontal
! and vertical are zero, exit this subroutine.
!
!-----------------------------------------------------------------------
!
cfcmh2s = cfcmh2 * scmixfctr
cfcmv2s = cfcmv2 * scmixfctr
IF( cfcmh2s == 0.0 .AND. cfcmv2s == 0.0 ) RETURN
!
!-----------------------------------------------------------------------
!
! Second order computational mixing on s.
!
!-----------------------------------------------------------------------
!
IF( cfcmh2s /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the horizontal
! computational mixing.
!
!-----------------------------------------------------------------------
!
temx = cfcmh2s/(2.0*dx*dx)
temy = cfcmh2s/(2.0*dy*dy)
DO k=1,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem1(i,j,k)=(s(i,j,k)-s(i-1,j,k)) &
*(rhostr(i,j,k)+rhostr(i-1,j,k))*temx
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
tem1(1 ,j,k)=0.0
tem1(nx,j,k)=0.0
END DO
END DO
DO k=1,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=(s(i,j,k)-s(i,j-1,k)) &
*(rhostr(i,j,k)+rhostr(i,j-1,k))*temy
END DO
END DO
END DO
DO k=1,nz-1
DO i=1,nx-1
tem2(i,1 ,k)=0.0
tem2(i,ny,k)=0.0
END DO
END DO
!-----------------------------------------------------------------------
!
! Note that tem1 at i=1 and nx are zero, and tem2 at j=1,ny are zero,
! equivalent to assuming zero normal gradient of s at the boundaries.
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
smix(i,j,k)=smix(i,j,k)+(tem1(i+1,j,k)-tem1(i,j,k)+ &
tem2(i,j+1,k)-tem2(i,j,k))
END DO
END DO
END DO
END IF
IF( cfcmv2s /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the vertical
! computational mixing.
!
!-----------------------------------------------------------------------
!
temz = cfcmv2s/(2.0*dz*dz)
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(s(i,j,k)-s(i,j,k-1)) &
*(rhostr(i,j,k)+rhostr(i,j,k-1))*temz
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,1 )=0.0
tem1(i,j,nz)=0.0
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
smix(i,j,k)=smix(i,j,k)+(tem1(i,j,k+1)-tem1(i,j,k))
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE cmix2s
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CMIX4UVW ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE cmix4uvw(nx,ny,nz, & 1,60
u,v,w, ubar,vbar,rhostr, &
umix,vmix,wmix, &
tem1,tem2,tem3,tem4,tem5)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the fourth order computational mixing terms for the momentum
! equations. These terms are placed in the arrays umix, vmix and wmix
! and are applied to momentum perturbations only.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 6/3/92 (M. Xue and H. Jin)
! Further facelift.
!
! 4/2/92 (M. Xue and H. Jin)
! Modify to include terrain
!
! 5/25/1998 (M. Xue)
! Reformulated the computational mixing terms to move rhostr
! outside the inner-most derivative.
!
! 11/9/2001 (M. Xue, D. Weber, and X. Jin)
! Added monotonic computational mixing and 6-th order mixing option
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Verticle component of Cartesian velocity at a
! given time level (m/s)
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! umix Array containing turbulent mixing on u (kg/(m*s)**2)
! vmix Array containing turbulent mixing on v (kg/(m*s)**2)
! wmix Array containing turbulent mixing on w (kg/(m*s)**2)
!
! OUTPUT:
!
! umix Turbulent and computational mixing on u (kg/(m*s)**2)
! vmix Turbulent and computational mixing on v (kg/(m*s)**2)
! wmix Turbulent and computational mixing on w (kg/(m*s)**2)
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! tem5 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: umix (nx,ny,nz) ! Total mixing in u-eq. (kg/(m*s)**2)
REAL :: vmix (nx,ny,nz) ! Total mixing in v-eq. (kg/(m*s)**2)
REAL :: wmix (nx,ny,nz) ! Total mixing in w-eq. (kg/(m*s)**2)
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
REAL :: tem4 (nx,ny,nz) ! Temporary work array
REAL :: tem5 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: temx, temy, temz
INTEGER :: kount
INTEGER :: mptag1,mptag2
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'phycst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! If the coefficients of computational mixing in both the horizontal
! and vertical are zero, exit this subroutine.
!
!-----------------------------------------------------------------------
!
IF( cfcmh4 == 0.0 .AND. cfcmv4 == 0.0 ) RETURN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem5(i,j,k)=u(i,j,k)-ubar(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate ustr=rhostr*u', vstr=rhostr*v', wstr=rhostr*w'
!
!-----------------------------------------------------------------------
!
IF( cfcmh4 /= 0.0 ) THEN
temx = cfcmh4/( dx**4)
temy = cfcmh4/(4.0*dy**4)
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(tem5(i+1,j,k)-tem5(i,j,k))*rhostr(i,j,k)*temx
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem2(i,j,k)=(tem5(i,j,k)-tem5(i,j-1,k))* &
(rhostr(i,j ,k)+rhostr(i-1,j ,k) &
+rhostr(i,j-1,k)+rhostr(i-1,j-1,k))*temy
END DO
END DO
END DO
!
DO k=2,nz-2
DO i=2,nx-1
tem2(i, 1,k) = 0.0
tem2(i,ny,k) = 0.0
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
tem3(i,j,k)=tem1(i,j,k)-tem1(i-1,j,k)
tem4(i,j,k)=tem2(i,j+1,k)-tem2(i,j,k)
END DO
END DO
END DO
!call test_dump (tem3,"XXXcmix_tem3",nx,ny,nz,1,0)
!call test_dump (tem4,"XXXcmix_tem4",nx,ny,nz,1,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem3,nx,ny,nz,ebc,wbc,1,mptag1,tem1)
CALL mpsend2dns
(tem4,nx,ny,nz,nbc,sbc,1,mptag2,tem1)
CALL mprecv2dew
(tem3,nx,ny,nz,ebc,wbc,1,mptag1,tem1)
CALL mprecv2dns
(tem4,nx,ny,nz,nbc,sbc,1,mptag2,tem1)
END IF
CALL acct_interrupt
(bc_acct)
CALL budifxx
(tem3, nx,ny,nz,1,ny-1,2,nz-2,ebc,wbc)
CALL budifyy
(tem4, nx,ny,nz,2,nx-1,2,nz-2,nbc,sbc)
CALL acct_stop_inter
!call test_dump2(tem3,"XXXAcmix_tem3",nx,ny,nz,1,nx,2,ny-2,2,nz-2)
!call test_dump2(tem4,"XXXAcmix_tem4",nx,ny,nz,2,nx-1,1,ny-1,2,nz-2)
IF(cmix_opt == 0) THEN ! non-monotonic 4th order comp. mixing
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)))
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! 4th order monotonic computational mixing
DO k=2,nz-2
DO j=2,ny-2
DO i=1,nx-1
tem1(i,j,k)=(tem3(i+1,j,k)-tem3(i,j,k))
IF(-tem1(i,j,k)*(tem5(i+1,j,k)-tem5(i,j,k)) < 0.0) tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem2(i,j,k)=(tem4(i,j,k)-tem4(i,j-1,k))
IF(-tem2(i,j,k)*(tem5(i,j,k)-tem5(i,j-1,k)) < 0.0) tem2(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)- &
(tem1(i,j,k)-tem1(i-1,j,k)+tem2(i,j+1,k)-tem2(i,j,k))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
tem1(i,j,k)=(tem3(i+1,j,k)-tem3(i,j,k)) &
-(tem3(i,j,k)-tem3(i-1,j,k))
tem2(i,j,k)=(tem4(i,j+1,k)-tem4(i,j,k)) &
-(tem4(i,j,k)-tem4(i,j-1,k))
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem1,nx,ny,nz,ebc,wbc,1,mptag1,tem3)
CALL mpsend2dns
(tem2,nx,ny,nz,nbc,sbc,1,mptag2,tem3)
CALL mprecv2dew
(tem1,nx,ny,nz,ebc,wbc,1,mptag1,tem3)
CALL mprecv2dns
(tem2,nx,ny,nz,nbc,sbc,1,mptag2,tem3)
END IF
CALL acct_interrupt
(bc_acct)
CALL budifxx
(tem1, nx,ny,nz,1,ny-1,2,nz-2,ebc,wbc)
CALL budifyy
(tem2, nx,ny,nz,2,nx-1,2,nz-2,nbc,sbc)
CALL acct_stop_inter
kount = 0
DO k=2,nz-2
DO j=2,ny-2
DO i=1,nx-1
tem3(i,j,k)=(tem1(i+1,j,k)-tem1(i,j,k))
IF(cmix_opt == 3.AND. &
tem3(i,j,k)*(tem5(i+1,j,k)-tem5(i,j,k)) < 0.0)THEN
tem3(i,j,k)=0.0
IF(j == 2) kount = kount + 1
END IF
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem4(i,j,k)=(tem2(i,j,k)-tem2(i,j-1,k))
IF(cmix_opt == 3.AND. &
tem4(i,j,k)*(tem5(i,j,k)-tem5(i,j-1,k)) < 0.0) &
tem4(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)+ &
(tem3(i,j,k)-tem3(i-1,j,k)+tem4(i,j+1,k)-tem4(i,j,k))
END DO
END DO
END DO
END IF
!wdt update
IF (sbc == 4) THEN ! do them for open BC only
j = 1
DO k=2,nz-2
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))- tem4(i,j,k))
END DO
END DO
END IF
IF (nbc == 4) THEN ! do them for open BC only
j = ny-1
DO k=2,nz-2
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+( -tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)))
END DO
END DO
END IF
END IF
IF( cfcmv4 /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the vertical
! computational mixing on u'
!
!-----------------------------------------------------------------------
!
temz = cfcmv4/(4.0*dz**4)
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem1(i,j,k)=(tem5(i,j,k)-tem5(i,j,k-1))* &
(rhostr(i,j,k )+rhostr(i-1,j,k ) &
+rhostr(i,j,k-1)+rhostr(i-1,j,k-1))*temz
END DO
END DO
END DO
!
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
tem2(i,j,k)=tem1(i,j,k+1)-tem1(i,j,k)
END DO
END DO
END DO
CALL budifzz
(tem2, nx,ny,nz,2,nx-1,1,ny-1, tbc, bbc)
IF( cmix_opt == 0) THEN ! no monotonic application.
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k) &
-((tem2(i,j,k+1)-tem2(i,j,k))-(tem2(i,j,k)-tem2(i,j,k-1)))
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! fourth order monotonic
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem1(i,j,k)=tem2(i,j,k)-tem2(i,j,k-1)
IF(-tem1(i,j,k)*(tem5(i,j,k)-tem5(i,j,k-1)) < 0.0) tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)-(tem1(i,j,k+1)-tem1(i,j,k))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
tem3(i,j,k)= (tem2(i,j,k+1)-tem2(i,j,k)) &
-(tem2(i,j,k)-tem2(i,j,k-1))
END DO
END DO
END DO
CALL budifzz
(tem3, nx,ny,nz,2,nx-1,1,ny-1, tbc, bbc)
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem1(i,j,k)=tem3(i,j,k)-tem3(i,j,k-1)
IF(cmix_opt == 3.AND. &
tem1(i,j,k)*(tem5(i,j,k)-tem5(i,j,k-1)) < 0.0)THEN
tem1(i,j,k)=0.0
IF(j == 2)kount = kount+1
END IF
END DO
END DO
END DO
PRINT*,'On-off switch active for u at ', &
FLOAT(kount)/(2*(nx-2)*(nz-2)) &
,' percent of times at t=', curtim
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
umix(i,j,k)=umix(i,j,k)+(tem1(i,j,k+1)-tem1(i,j,k))
END DO
END DO
END DO
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Fourth-order computational mixing on v'.
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem5(i,j,k)=v(i,j,k)-vbar(i,j,k)
END DO
END DO
END DO
IF( cfcmh4 /= 0.0 ) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the horizontal
! computational mixing on v'
!
!-----------------------------------------------------------------------
!
temx = cfcmh4/(4.0*dx**4)
temy = cfcmh4/(dy**4)
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem1(i,j,k)=(tem5(i,j,k)-tem5(i-1,j,k))* &
(rhostr(i,j ,k)+rhostr(i ,j-1,k) &
+rhostr(i-1,j,k)+rhostr(i-1,j-1,k))*temx
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
tem1(1, j,k) = 0.0
tem1(nx,j,k) = 0.0
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=(tem5(i,j+1,k)-tem5(i,j,k))*rhostr(i,j,k)*temy
END DO
END DO
END DO
!
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
tem3(i,j,k)=tem1(i+1,j,k)-tem1(i,j,k)
tem4(i,j,k)=tem2(i,j,k)-tem2(i,j-1,k)
END DO
END DO
END DO
!call test_dump (tem3,"XXX1cmix_tem3",nx,ny,nz,2,0)
!call test_dump (tem4,"XXX1cmix_tem4",nx,ny,nz,2,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem3,nx,ny,nz,ebc,wbc,2,mptag1,tem1)
CALL mpsend2dns
(tem4,nx,ny,nz,nbc,sbc,2,mptag2,tem1)
CALL mprecv2dew
(tem3,nx,ny,nz,ebc,wbc,2,mptag1,tem1)
CALL mprecv2dns
(tem4,nx,ny,nz,nbc,sbc,2,mptag2,tem1)
END IF
CALL acct_interrupt
(bc_acct)
CALL bvdifxx
(tem3, nx,ny,nz,2,ny-1,2,nz-2,ebc, wbc)
CALL bvdifyy
(tem4, nx,ny,nz,1,nx-1,2,nz-2,nbc, sbc)
CALL acct_stop_inter
IF( cmix_opt == 0) THEN ! 4th order non-monotonic computational mixing
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-2
vmix(i,j,k)=vmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)))
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! 4th order monotonic
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem1(i,j,k)=(tem3(i,j,k)-tem3(i-1,j,k))
IF(-tem1(i,j,k)*(tem5(i,j,k)-tem5(i-1,j,k)) < 0.0) tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-2
tem2(i,j,k)=(tem4(i,j+1,k)-tem4(i,j,k))
IF(-tem2(i,j,k)*(tem5(i,j+1,k)-tem5(i,j,k)) < 0.0) tem2(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-2
vmix(i,j,k)=vmix(i,j,k)- &
(tem1(i+1,j,k)-tem1(i,j,k)+tem2(i,j,k)-tem2(i,j-1,k))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-2
tem1(i,j,k)=(tem3(i+1,j,k)-tem3(i,j,k)) &
-(tem3(i,j,k)-tem3(i-1,j,k))
tem2(i,j,k)=(tem4(i,j+1,k)-tem4(i,j,k)) &
-(tem4(i,j,k)-tem4(i,j-1,k))
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem1,nx,ny,nz,ebc,wbc,2,mptag1,tem3)
CALL mpsend2dns
(tem2,nx,ny,nz,nbc,sbc,2,mptag2,tem3)
CALL mprecv2dew
(tem1,nx,ny,nz,ebc,wbc,2,mptag1,tem3)
CALL mprecv2dns
(tem2,nx,ny,nz,nbc,sbc,2,mptag2,tem3)
END IF
CALL acct_interrupt
(bc_acct)
CALL bvdifxx
(tem1, nx,ny,nz,2,ny-1,2,nz-2,ebc, wbc)
CALL bvdifyy
(tem2, nx,ny,nz,1,nx-1,2,nz-2,nbc, sbc)
CALL acct_stop_inter
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-1
tem3(i,j,k)=(tem1(i,j,k)-tem1(i-1,j,k))
IF(cmix_opt == 3.AND. &
tem3(i,j,k)*(tem5(i,j,k)-tem5(i-1,j,k)) < 0.0) &
tem3(i,j,k)=0.0
END DO
END DO
END DO
! kount = 0
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-2
tem4(i,j,k)=(tem2(i,j+1,k)-tem2(i,j,k))
IF(cmix_opt == 3.AND. &
tem4(i,j,k)*(tem5(i,j+1,k)-tem5(i,j,k)) < 0.0)THEN
tem4(i,j,k)=0.0
! if(j.eq.2) kount = kount + 1
END IF
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-2
vmix(i,j,k)=vmix(i,j,k)+ &
(tem3(i+1,j,k)-tem3(i,j,k)+tem4(i,j,k)-tem4(i,j-1,k))
END DO
END DO
END DO
END IF
!wdt update
IF (ebc == 4) THEN ! Do them for open BC only
i = nx-1
DO k=2,nz-2
DO j=2,ny-1
vmix(i,j,k)=vmix(i,j,k)-( &
( -tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)))
END DO
END DO
END IF
IF (wbc == 4) THEN ! Do them for open BC only
i = 1
DO k=2,nz-2
DO j=2,ny-1
vmix(i,j,k)=vmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)))
END DO
END DO
END IF
END IF
!
IF( cfcmv4 /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the vertical
! computational mixing on v'
!
!-----------------------------------------------------------------------
!
temz = cfcmv4/(4.0*dz**4)
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem1(i,j,k)=(tem5(i,j,k)-tem5(i,j,k-1))* &
(rhostr(i,j,k )+rhostr(i,j-1,k ) &
+rhostr(i,j,k-1)+rhostr(i,j-1,k-1))*temz
END DO
END DO
END DO
!
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=tem1(i,j,k+1)-tem1(i,j,k)
END DO
END DO
END DO
CALL bvdifzz
(tem2, nx,ny,nz,1,nx-1,2,ny-1,tbc, bbc)
IF( cmix_opt == 0) THEN ! no monotonic application
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vmix(i,j,k)=vmix(i,j,k) &
-((tem2(i,j,k+1)-tem2(i,j,k))-(tem2(i,j,k)-tem2(i,j,k-1)))
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! 4th order mono...
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem1(i,j,k)=tem2(i,j,k)-tem2(i,j,k-1)
IF(-tem1(i,j,k)*(tem5(i,j,k)-tem5(i,j,k-1)) < 0.0) tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vmix(i,j,k)=vmix(i,j,k)-(tem1(i,j,k+1)-tem1(i,j,k))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
tem3(i,j,k)=(tem2(i,j,k+1)-tem2(i,j,k)) &
-(tem2(i,j,k)-tem2(i,j,k-1))
END DO
END DO
END DO
CALL bvdifzz
(tem3, nx,ny,nz,1,nx-1,2,ny-1,tbc, bbc)
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem1(i,j,k)=tem3(i,j,k)-tem3(i,j,k-1)
IF(cmix_opt == 3.AND. &
tem1(i,j,k)*(tem5(i,j,k)-tem5(i,j,k-1)) < 0.0)THEN
tem1(i,j,k)=0.0
! if(j.eq.2) kount = kount + 1
END IF
END DO
END DO
END DO
! print*,'On-off switch active for v at ',
! : float(kount)/(2*(nx-1)*(nz-2))
! : ,' percent of times at t=', curtim
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vmix(i,j,k)=vmix(i,j,k)+(tem1(i,j,k+1)-tem1(i,j,k))
END DO
END DO
END DO
END IF
END IF
IF( cfcmh4 /= 0.0 ) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the horizontal
! computational mixing on w
!
!-----------------------------------------------------------------------
!
temx = cfcmh4/(4.0*dx**4)
temy = cfcmh4/(4.0*dy**4)
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem1(i,j,k)=(w(i,j,k)-w(i-1,j,k)) &
*(rhostr(i,j ,k)+rhostr(i-1,j ,k)+ &
rhostr(i,j,k-1)+rhostr(i-1,j,k-1))*temx
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
tem1(1 ,j,k)=0.0
tem1(nx,j,k)=0.0
END DO
END DO
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=(w(i,j,k)-w(i,j-1,k)) &
*(rhostr(i,j, k)+rhostr(i,j-1,k)+ &
rhostr(i,j,k-1)+rhostr(i,j-1,k-1))*temy
END DO
END DO
END DO
DO k=2,nz-1
DO i=1,nx-1
tem2(i,1 ,k)=0.0
tem2(i,ny,k)=0.0
END DO
END DO
!-----------------------------------------------------------------------
!
! Note that tem1 at i=1 and nx are zero, and tem2 at j=1,ny are zero,
! equivalent to assuming zero normal gradient of s at the boundaries.
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=tem1(i+1,j,k)-tem1(i,j,k)
tem4(i,j,k)=tem2(i,j+1,k)-tem2(i,j,k)
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem3,nx,ny,nz,ebc,wbc,0,mptag1,tem1)
CALL mpsend2dns
(tem4,nx,ny,nz,nbc,sbc,0,mptag2,tem1)
CALL mprecv2dew
(tem3,nx,ny,nz,ebc,wbc,0,mptag1,tem1)
CALL mprecv2dns
(tem4,nx,ny,nz,nbc,sbc,0,mptag2,tem1)
END IF
CALL acct_interrupt
(bc_acct)
CALL bwdifxx
(tem3, nx,ny,nz,1,ny-1,2,nz-1,ebc, wbc)
CALL bwdifyy
(tem4, nx,ny,nz,1,nx-1,2,nz-1,nbc, sbc)
CALL acct_stop_inter
IF( cmix_opt == 0) THEN ! no monotonic application
DO k=2,nz-1
DO j=2,ny-2
DO i=2,nx-2
wmix(i,j,k)=wmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! 4th order monotonic comp. mixing
DO k=2,nz-1
DO j=2,ny-2
DO i=2,nx-1
tem1(i,j,k)= tem3(i,j,k)-tem3(i-1,j,k)
IF(-tem1(i,j,k)*(w(i,j,k)-w(i-1,j,k)) < 0.0) tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-1
DO j=2,ny-1
DO i=2,nx-2
tem2(i,j,k)= tem4(i,j,k)-tem4(i,j-1,k)
IF(-tem2(i,j,k)*(w(i,j,k)-w(i,j-1,k)) < 0.0) tem2(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-1
DO j=2,ny-2
DO i=2,nx-2
wmix(i,j,k)=wmix(i,j,k)- &
(tem1(i+1,j,k)-tem1(i,j,k)+tem2(i,j+1,k)-tem2(i,j,k))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-1
DO j=2,ny-2
DO i=2,nx-2
tem1(i,j,k)=(tem3(i+1,j,k)-tem3(i,j,k)) &
-(tem3(i,j,k)-tem3(i-1,j,k))
tem2(i,j,k)=(tem4(i,j+1,k)-tem4(i,j,k)) &
-(tem4(i,j,k)-tem4(i,j-1,k))
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem1,nx,ny,nz,ebc,wbc,0,mptag1,tem3)
CALL mpsend2dns
(tem2,nx,ny,nz,nbc,sbc,0,mptag2,tem3)
CALL mprecv2dew
(tem1,nx,ny,nz,ebc,wbc,0,mptag1,tem3)
CALL mprecv2dns
(tem2,nx,ny,nz,nbc,sbc,0,mptag2,tem3)
END IF
CALL acct_interrupt
(bc_acct)
CALL bwdifxx
(tem1, nx,ny,nz,1,ny-1,2,nz-1,ebc, wbc)
CALL bwdifyy
(tem2, nx,ny,nz,1,nx-1,2,nz-1,nbc, sbc)
CALL acct_stop_inter
kount =0
DO k=2,nz-1
DO j=2,ny-2
DO i=2,nx-1
tem3(i,j,k)= tem1(i,j,k)-tem1(i-1,j,k)
IF(cmix_opt == 3.AND. tem3(i,j,k)*(w(i,j,k)-w(i-1,j,k)) < 0.0) THEN
tem3(i,j,k)=0.0
IF(j == 2) kount = kount+1
END IF
END DO
END DO
END DO
DO k=2,nz-1
DO j=2,ny-1
DO i=2,nx-2
tem4(i,j,k)= tem2(i,j,k)-tem2(i,j-1,k)
IF(cmix_opt == 3.AND. tem4(i,j,k)*(w(i,j,k)-w(i,j-1,k)) < 0.0) &
tem4(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-1
DO j=2,ny-2
DO i=2,nx-2
wmix(i,j,k)=wmix(i,j,k)+ &
(tem3(i+1,j,k)-tem3(i,j,k)+tem4(i,j+1,k)-tem4(i,j,k))
END DO
END DO
END DO
END IF
!wdt update
IF (ebc == 4) THEN
i = nx-1
DO k=2,nz-1
DO j=2,ny-2
wmix(i,j,k)=wmix(i,j,k)-( &
( -tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END IF
IF (wbc == 4) THEN
i = 1
DO k=2,nz-1
DO j=2,ny-2
wmix(i,j,k)=wmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-tem3(i,j,k) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END IF
IF (nbc == 4) THEN
j = ny - 1
DO k=2,nz-1
DO i=2,nx-2
wmix(i,j,k)=wmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+( -tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END IF
IF (sbc == 4) THEN
j = 1
DO k=2,nz-1
DO i=2,nx-2
wmix(i,j,k)=wmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k) ) )
END DO
END DO
END IF
IF (wbc == 4.AND.sbc == 4) THEN
i = 1
j = 1
DO k=2,nz-1
wmix(i,j,k)=wmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)) )
END DO
END IF
IF (ebc == 4.AND.sbc == 4) THEN
i = nx-1
j = 1
DO k=2,nz-1
wmix(i,j,k)=wmix(i,j,k)-( &
( -tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)) )
END DO
END IF
IF (wbc == 4.AND.nbc == 4) THEN
i = 1
j = ny-1
DO k=2,nz-1
wmix(i,j,k)=wmix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)) &
+( -tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END IF
IF (ebc == 4.AND.nbc == 4) THEN
i = nx-1
j = ny-1
DO k=2,nz-1
wmix(i,j,k)=wmix(i,j,k)-( &
( -tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+( -tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END IF
END IF
IF( cfcmv4 /= 0.0 ) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the vertical
! computational mixing on w
!
!-----------------------------------------------------------------------
!
temz = cfcmv4/(dz**4)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(w(i,j,k+1)-w(i,j,k))*rhostr(i,j,k)*temz
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=tem1(i,j,k)-tem1(i,j,k-1)
END DO
END DO
END DO
CALL bwdifzz
(tem2, nx,ny,nz,1,nx-1,1,ny-1,tbc, bbc)
IF(cmix_opt == 0) THEN ! no monotonic application
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wmix(i,j,k)=wmix(i,j,k)-( &
(tem2(i,j,k+1)-tem2(i,j,k))-(tem2(i,j,k)-tem2(i,j,k-1)))
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! 4th order monotonic
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(tem2(i,j,k+1)-tem2(i,j,k))
IF(-tem1(i,j,k)*(w(i,j,k+1)-w(i,j,k)) < 0.0) tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wmix(i,j,k)=wmix(i,j,k)-(tem1(i,j,k)-tem1(i,j,k-1))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=(tem2(i,j,k+1)-tem2(i,j,k)) &
-(tem2(i,j,k)-tem2(i,j,k-1))
END DO
END DO
END DO
CALL bwdifzz
(tem3, nx,ny,nz,1,nx-1,1,ny-1,tbc, bbc)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(tem3(i,j,k+1)-tem3(i,j,k))
IF(cmix_opt == 3.AND. tem1(i,j,k)*(w(i,j,k+1)-w(i,j,k)) < 0.0)THEN
tem1(i,j,k)=0.0
IF(j == 2) kount=kount+1
END IF
END DO
END DO
END DO
PRINT*,'On-off switch active for w at ', &
FLOAT(kount)/(2*(nx-1)*(nz-2)) &
,' percent of times at t=', curtim
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wmix(i,j,k)=wmix(i,j,k)+(tem1(i,j,k)-tem1(i,j,k-1))
END DO
END DO
END DO
END IF
END IF
RETURN
END SUBROUTINE cmix4uvw
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CMIX4S ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE cmix4s(nx,ny,nz, s ,rhostr, smix, tem1,tem2,tem3,tem4) 4,20
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Generic routine to calculate the fourth order computational mixing
! for scalar s. The computational mixing is accumulated into array
! smix on exit.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 6/3/92 (M. Xue and H. Jin)
! Further facelift.
!
! 10/17/94 (M. Xue)
! Subroutines CMIX4PT and CMIX4Q combined into a single generic
! routine CMIX2S.
!
! 5/25/1998 (M. Xue)
! Reformulated the computational mixing terms to move rhostr
! outside the inner-most derivative.
!
! 11/9/2001 (M. Xue, D. Weber, and X. Jin)
! Added monotonic computational mixing and 6-th order mixing option
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! s scalar field to which the compuational mixing is to
! be applied.
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! smix Array containing turbulent mixing on s.
!
! OUTPUT:
!
! smix Turbulent mixing plus computational mixing on s.
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: s (nx,ny,nz) ! Scalar to be mixed.
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: smix (nx,ny,nz) ! Total mixing on s
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
REAL :: tem4 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j,k
REAL :: dxinv4, dyinv4
REAL :: cfcmh4s,cfcmv4s, temx,temy,temz
INTEGER :: kount
INTEGER :: mptag1,mptag2
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'phycst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! If the coefficients of computational mixing in both the horizontal
! and vertical are zero, exit this subroutine.
!
!-----------------------------------------------------------------------
!
cfcmh4s = cfcmh4 * scmixfctr
cfcmv4s = cfcmv4 * scmixfctr
IF( cfcmh4s == 0.0 .AND. cfcmv4s == 0.0 ) RETURN
dxinv4 = dxinv**4
dyinv4 = dyinv**4
IF( cfcmh4s /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the 4th order horizontal
! computational mixing on s.
!
!-----------------------------------------------------------------------
!
temx = cfcmh4s/(2.0*dx**4)
temy = cfcmh4s/(2.0*dy**4)
DO k=1,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem1(i,j,k)=(s(i,j,k)-s(i-1,j,k)) &
*(rhostr(i,j,k)+rhostr(i-1,j,k))*temx
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
tem1(1 ,j,k)=0.0
tem1(nx,j,k)=0.0
END DO
END DO
DO k=1,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)=(s(i,j,k)-s(i,j-1,k)) &
*(rhostr(i,j,k)+rhostr(i,j-1,k))*temy
END DO
END DO
END DO
DO k=1,nz-1
DO i=1,nx-1
tem2(i,1 ,k)=0.0
tem2(i,ny,k)=0.0
END DO
END DO
!-----------------------------------------------------------------------
!
! Note that tem1 at i=1 and nx are zero, and tem2 at j=1,ny are zero,
! equivalent to assuming zero normal gradient of s at the boundaries.
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=tem1(i+1,j,k)-tem1(i,j,k)
tem4(i,j,k)=tem2(i,j+1,k)-tem2(i,j,k)
END DO
END DO
END DO
!call test_dump (tem3,"XXX3cmix_tem3",nx,ny,nz,0,0)
!call test_dump (tem4,"XXX3cmix_tem4",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem3,nx,ny,nz,ebc,wbc,0,mptag1,tem1)
CALL mpsend2dns
(tem4,nx,ny,nz,nbc,sbc,0,mptag2,tem1)
CALL mprecv2dew
(tem3,nx,ny,nz,ebc,wbc,0,mptag1,tem1)
CALL mprecv2dns
(tem4,nx,ny,nz,nbc,sbc,0,mptag2,tem1)
END IF
CALL acct_interrupt
(bc_acct)
CALL bsdifxx
(tem3, nx,ny,nz,1,ny-1,2,nz-2,ebc, wbc)
CALL bsdifyy
(tem4, nx,ny,nz,1,nx-1,2,nz-2,nbc, sbc)
CALL acct_stop_inter
!call test_dump2(tem3,"XXXA3cmix_tem3",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(tem4,"XXXA3cmix_tem4",nx,ny,nz,2,nx-2,1,ny-1,2,nz-2)
IF( cmix_opt == 0) THEN ! no monotonic application
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
smix(i,j,k)=smix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! 4th order monotonic.
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
tem1(i,j,k)= tem3(i,j,k)-tem3(i-1,j,k)
IF(-tem1(i,j,k)*(s(i,j,k)-s(i-1,j,k)) < 0.0) tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-2
tem2(i,j,k)= tem4(i,j,k)-tem4(i,j-1,k)
IF(-tem2(i,j,k)*(s(i,j,k)-s(i,j-1,k)) < 0.0) tem2(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
smix(i,j,k)=smix(i,j,k)- &
(tem1(i+1,j,k)-tem1(i,j,k)+tem2(i,j+1,k)-tem2(i,j,k))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
tem1(i,j,k)=(tem3(i+1,j,k)-tem3(i,j,k)) &
-(tem3(i,j,k)-tem3(i-1,j,k))
tem2(i,j,k)=(tem4(i,j+1,k)-tem4(i,j,k)) &
-(tem4(i,j,k)-tem4(i,j-1,k))
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tem1,nx,ny,nz,ebc,wbc,0,mptag1,tem3)
CALL mpsend2dns
(tem2,nx,ny,nz,nbc,sbc,0,mptag2,tem3)
CALL mprecv2dew
(tem1,nx,ny,nz,ebc,wbc,0,mptag1,tem3)
CALL mprecv2dns
(tem2,nx,ny,nz,nbc,sbc,0,mptag2,tem3)
END IF
CALL acct_interrupt
(bc_acct)
CALL bsdifxx
(tem1, nx,ny,nz,1,ny-1,2,nz-2,ebc, wbc)
CALL bsdifyy
(tem2, nx,ny,nz,1,nx-1,2,nz-2,nbc, sbc)
CALL acct_stop_inter
kount= 0
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-1
tem3(i,j,k)= tem1(i,j,k)-tem1(i-1,j,k)
! IF(scmix_opt == 1.AND.cmix_opt == 3.AND. &
IF(cmix_opt == 3.AND. &
tem3(i,j,k)*(s(i,j,k)-s(i-1,j,k)) < 0.0)THEN
tem3(i,j,k)=0.0
IF(j == 2) kount=kount+1
END IF
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=2,nx-2
tem4(i,j,k)= tem2(i,j,k)-tem2(i,j-1,k)
! IF(scmix_opt == 1.AND.cmix_opt == 3.AND. &
IF(cmix_opt == 3.AND. &
tem4(i,j,k)*(s(i,j,k)-s(i,j-1,k)) < 0.0) &
tem4(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
smix(i,j,k)=smix(i,j,k)+ &
(tem3(i+1,j,k)-tem3(i,j,k)+tem4(i,j+1,k)-tem4(i,j,k))
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Calculate the mixing term on the boundary assuming that mixed
! field has zero gradient outside the boundary.
! The boundary values of smix are needed only for open boundary option.
!
!-----------------------------------------------------------------------
!
!wdt update
IF (wbc == 4) THEN
i = 1
DO k=2,nz-2
DO j=2,ny-2
smix(i,j,k)=smix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-tem3(i,j,k) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END IF
IF (ebc == 4) THEN
i = nx-1
DO k=2,nz-2
DO j=2,ny-2
smix(i,j,k)=smix(i,j,k)-( &
( -tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END IF
IF (sbc == 4) THEN
j = 1
DO k=2,nz-2
DO i=2,nx-2
smix(i,j,k)=smix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k) ) )
END DO
END DO
END IF
IF (nbc == 4) THEN
j = ny - 1
DO k=2,nz-2
DO i=2,nx-2
smix(i,j,k)=smix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+( -tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END DO
END IF
IF (wbc == 4.AND.sbc == 4) THEN
i = 1
j = 1
DO k=2,nz-2
smix(i,j,k)=smix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)) )
END DO
END IF
IF (ebc == 4.AND.sbc == 4) THEN
i = nx-1
j = 1
DO k=2,nz-2
smix(i,j,k)=smix(i,j,k)-( &
( -tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+(tem4(i,j+1,k)-tem4(i,j,k))-(tem4(i,j,k)) )
END DO
END IF
IF (wbc == 4.AND.nbc == 4) THEN
i = 1
j = ny-1
DO k=2,nz-2
smix(i,j,k)=smix(i,j,k)-( &
(tem3(i+1,j,k)-tem3(i,j,k))-(tem3(i,j,k)) &
+( -tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END IF
IF (ebc == 4.AND.nbc == 4) THEN
i = nx-1
j = ny-1
DO k=2,nz-2
smix(i,j,k)=smix(i,j,k)-( &
( -tem3(i,j,k))-(tem3(i,j,k)-tem3(i-1,j,k)) &
+( -tem4(i,j,k))-(tem4(i,j,k)-tem4(i,j-1,k)) )
END DO
END IF
END IF
IF( cfcmv4s /= 0.0) THEN
!
!-----------------------------------------------------------------------
!
! If the coefficient is not zero, calculate the vertical
! computational mixing on s.
!
!-----------------------------------------------------------------------
temz = cfcmv4s/(2.0*dz**4)
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=(s(i,j,k)-s(i,j,k-1)) &
*(rhostr(i,j,k)+rhostr(i,j,k-1))*temz
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,1 )=0.0
tem1(i,j,nz)=0.0
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=tem1(i,j,k+1)-tem1(i,j,k)
END DO
END DO
END DO
CALL bsdifzz
(tem2, nx,ny,nz,1,nx-1,1,ny-1,tbc, bbc)
IF( cmix_opt == 0) THEN ! no mono applied
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
smix(i,j,k)=smix(i,j,k) &
-((tem2(i,j,k+1)-tem2(i,j,k))-(tem2(i,j,k)-tem2(i,j,k-1)))
END DO
END DO
END DO
ELSE IF( cmix_opt == 1) THEN ! 4th order mono
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=tem2(i,j,k)-tem2(i,j,k-1)
IF(-tem1(i,j,k)*(s(i,j,k)-s(i,j,k-1)) < 0.)tem1(i,j,k)=0.0
END DO
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
smix(i,j,k)=smix(i,j,k)-(tem1(i,j,k+1)-tem1(i,j,k))
END DO
END DO
END DO
ELSE IF( cmix_opt == 2 .OR.cmix_opt == 3 ) THEN ! 6th order
! = 2 6th order no mono...
! = 3 6th order mono...
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=(tem2(i,j,k+1)-tem2(i,j,k)) &
-(tem2(i,j,k)-tem2(i,j,k-1))
END DO
END DO
END DO
CALL bsdifzz
(tem3, nx,ny,nz,1,nx-1,1,ny-1,tbc, bbc)
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=tem3(i,j,k)-tem3(i,j,k-1)
! IF(scmix_opt == 1.AND.cmix_opt == 3.AND. &
IF(cmix_opt == 3.AND. &
tem1(i,j,k)*(s(i,j,k)-s(i,j,k-1)) < 0.)THEN
tem1(i,j,k)=0.0
IF(j == 2) kount=kount+1
END IF
END DO
END DO
END DO
PRINT*,'On-off switch active for pt at ', &
FLOAT(kount)/(2*(nx-1)*(nz-2)) &
,' percent of times at t=', curtim
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
smix(i,j,k)=smix(i,j,k)+(tem1(i,j,k+1)-tem1(i,j,k))
END DO
END DO
END DO
END IF
END IF
RETURN
END SUBROUTINE cmix4s