!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SOLVTKE ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE solvtke(nx,ny,nz,dtbig1,u,v,wcont, & 1,20
ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,ptbari,rhostr,rhostri,qvbar, &
x,y,z,zp, mapfct, j1,j2,j3,aj3x,aj3y,j3inv, &
kmh,kmv,rprntl,lenscl,defsq, &
ptsflx,qvsflx, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem9,tem10,tem11,tkeforce, tem1_0,tem2_0,tem3_0)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Compute the forcing terms in the turbulence kinetic energy (TKE)
! equation and integrate the TKE equation one time step forward.
!
!-----------------------------------------------------------------------
!
! AUTHOR: V.Wong, Y.Tang and X. Song
! 10/1993
!
! MODIFICATION HISTORY:
!
! 04/1994
! V.Wong, M.Xue and X. Song
!
! 9/1/94 (Y. Lu)
! Cleaned up documentation.
!
! 1/23/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor.
!
! 2/26/96 (M.Xue, X. Song and V. Wong)
! Reganized the call to SOLVTKE. TKE equation is now solved at the
! same time level as the other scalar equations.
!
! 3/8/96 (M. Xue, X. Song and V. Wong)
! Add parameter tkeopt for three versions of 1.5 order TKE schemes.
! The differ mainly in the specification of turbulence mixing length.
!
! 3/11/96 (M. Xue)
! Corrected time level error for tke mixing and dissipation
! terms. They should be evaluated at tpast for loapfrog step.
! Also all three time levels of scalars are now passed into
! this subroutine.
!
! 4/1/96 (Donghai Wang, X. Song and M. Xue)
! Added the implicit treatment of the vertical diffusion term
! in TKE equation.
!
! 7/10/1997 (Fanyou Kong - CMRP)
! Fixed a bug in FCT advection mode with the tem1_0(),tem2_0(),
! and tem3_0() corrected
! Added MPDCD positive advection option (sadvopt = 5)
!
! 7/17/1998 (M. Xue)
! Changed call to ADVQFCT.
!
! 9/18/1998 (D. Weber)
! Added aj3x,y rhostri arrays.
!
! 1/18/1999 (W. Martin and M. Xue)
! Changed the coefficient in the dissipation term from 3.9
! to 0.41 for the lowest two levels from 3.9 for Sun and Chang
! scheme (tkeopt=3).
!
!-----------------------------------------------------------------------
!
! 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
!
! dtbig1 Time step. If frstep=1 ,dtbig1=dtbig/2, otherwise,
! dtbig1=dtbig.
!
! u x component of velocity at time tpast (m/s)
! v y component of velocity at time tpast (m/s)
! wcont Vertical component of Cartesian velocity at time
! tpast (m/s)
! computational coordinates (m/s)
! ptprt Perturbation potential temperature at times tpast and
! tpresent (K)
! pprt Perturbation pressure at times tpast and tpresent
! (Pascal)
! qv Water vapor specific humidity at times tpast and
! tpresent (kg/kg)
! qc Cloud water mixing ratio at times tpast and tpresent
! (kg/kg)
! qr Rainwater mixing ratio at times tpast and tpresent
! (kg/kg)
! qi Cloud ice mixing ratio at times tpast and tpresent
! (kg/kg)
! qs Snow mixing ratio at times tpast and tpresent (kg/kg)
! qh Hail mixing ratio at times tpast and tpresent (kg/kg)
! tke Turbulent kinetic energy at times tpast and tpresent.
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! ptbari Inverse base state potential temperature (K)
! rhostr Base state density rhobar times j3 (kg/m**3)
! rhostri Inverse base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space (m)
!
! mapfct Map factors at scalar points
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
! aj3x Avgx of the coordinate transformation Jacobian d(zp)/dz
! aj3y Avgy of the coordinate transformation Jacobian d(zp)/dz
! j3inv Inverse of j3
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
! rprntl Reciprocal of Prandtl number
! lenscl Turbulent mixing length scale (m)
! defsq Deformation squared (1/s**2)
! ptsflx Surface heat flux
! qvsflx Surface moisture flux
!
! OUTPUT:
!
! tke Updated (by dtbig) Turbulent Kinetic Energy at time
! tfuture.
!
! WORK ARRAYS:
!
! tem1 Temporary work array
! tem2 Temporary work array
! tem3 Temporary work array
! tem4 Temporary work array
! tem5 Temporary work array
! tem6 Temporary work array
! tem7 Temporary work array
! tem8 Temporary work array
! tem9 Temporary work array
! tkeforce Temporary work array
!
! tem1_0 Temporary work array
! tem2_0 Temporary work array
! tem3_0 Temporary work array
!
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
REAL :: dtbig1 ! Local value of big timestep
INCLUDE 'timelvls.inc'
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
REAL :: u (nx,ny,nz,nt) ! Total u-velocity at time tpast (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity at time tpast (m/s)
REAL :: wcont (nx,ny,nz) ! Vertical component of Cartesian
! velocity at
! time tpast (m/s)
REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz,nt) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz,nt) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz,nt) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz,nt) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz,nt) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz,nt) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz,nt) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: ptbari(nx,ny,nz) ! Inverse base state pot. temperature (K)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times
! j3 (kg/m**3)
REAL :: rhostri(nx,ny,nz) ! Inverse base state density rhobar times
! j3 (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity
! (kg/kg)
REAL :: x (nx) ! x-coord. of the physical and
! computational grid.
! Defined at u-point.
REAL :: y (ny) ! y-coord. of the physical and
! computational grid.
! Defined at v-point.
REAL :: z (nz) ! z-coord. of the
! computational grid.
! Defined at w-point on the
! staggered grid.
REAL :: zp (nx,ny,nz) ! Physical height coordinate
! defined at
! w-point of the staggered grid.
REAL :: mapfct(nx,ny,8) ! Map factors at scalar points
REAL :: j1 (nx,ny,nz) ! Coordinate transformation
! Jacobian defined as
! - d( zp )/d( x ).
REAL :: j2 (nx,ny,nz) ! Coordinate transformation
! Jacobian defined as
! - d( zp )/d( y ).
REAL :: j3 (nx,ny,nz) ! Coordinate transformation
! Jacobian defined as
! d( zp )/d( z ).
REAL :: aj3x (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE X-DIR.
REAL :: aj3y (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Y-DIR.
REAL :: j3inv (nx,ny,nz) ! Inverse of j3
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: rprntl(nx,ny,nz) ! Reciprocal of Prandtl number
REAL :: lenscl(nx,ny,nz) ! Turbulent mixing length scale (m)
REAL :: defsq (nx,ny,nz) ! Deformation squared (1/s**2)
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*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
REAL :: tem5 (nx,ny,nz) ! Temporary work array
REAL :: tem6 (nx,ny,nz) ! Temporary work array
REAL :: tem7 (nx,ny,nz) ! Temporary work array
REAL :: tem8 (nx,ny,nz) ! Temporary work array
REAL :: tem9 (nx,ny,nz) ! Temporary work array
REAL :: tem10 (nx,ny,nz) ! Temporary work array
REAL :: tem11 (nx,ny,nz) ! Temporary work array
REAL :: tkeforce(nx,ny,nz) ! Work array for the forcing term.
REAL :: tem1_0(0:nx,0:ny,0:nz) ! Temporary work array
REAL :: tem2_0(0:nx,0:ny,0:nz) ! Temporary work array
REAL :: tem3_0(0:nx,0:ny,0:nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k, it
REAL :: eps
REAL :: dt2
INTEGER :: tstrtlvl
REAL :: deltat
INTEGER :: mptag
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
INCLUDE 'globcst.inc'
INCLUDE 'bndry.inc' ! Boundary condition control parameters
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
eps=1.e-20
!
!-----------------------------------------------------------------------
!
! Compute the advection term for TKE and store the result in tem1
!
!-----------------------------------------------------------------------
!
!call test_dump (tkeforce,"XXX8tke_tkeforce",nx,ny,nz,0,0)
CALL set_acct
(advs_acct)
IF(sadvopt == 4) THEN ! Forward-based FCT scheme
deltat = dtbig1
tstrtlvl = tpresent
ELSE
deltat = dtbig1*2
tstrtlvl = tpast
END IF
IF (sadvopt == 1 .OR. sadvopt == 2 .OR. sadvopt == 3 ) THEN
! 2nd or 4th order advection
CALL rhouvw
(nx,ny,nz,rhostr,tem1,tem2,tem3)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem4(i,j,k)=u(i,j,k,2)*tem1(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem5(i,j,k)=v(i,j,k,2)*tem2(i,j,k)
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
tem6(i,j,k)=wcont(i,j,k)*tem3(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)= 0.0
END DO
END DO
END DO
CALL advq
(nx,ny,nz,tke,u,v,wcont,tem4,tem5,tem6, &
rhostr,tem2,mapfct, &
tkeforce, &
tem3,tem7,tem8,tem9)
!call test_dump (tkeforce,"XXX7tke_tkeforce",nx,ny,nz,0,0)
ELSE IF( sadvopt == 4.OR.sadvopt == 5) THEN ! FCT advection
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3_0(i,j,k)=rhostr(i,j,k)
END DO
END DO
END DO
CALL extndsbc
(tem3_0,nx,ny,nz,0,ebc,wbc,nbc,sbc,tbc,bbc)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem9(i,j,k)=u(i,j,k,2)*(tem3_0(i-1,j,k)+tem3_0(i,j,k)) &
*mapfct(i,j,5)*0.5
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem10(i,j,k)=v(i,j,k,2)*(tem3_0(i,j-1,k)+tem3_0(i,j,k)) &
*mapfct(i,j,6)*0.5
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
tem11(i,j,k)=wcont(i,j,k) &
*(tem3_0(i,j,k-1)+tem3_0(i,j,k))*0.5
END DO
END DO
END DO
CALL advqfct
(nx,ny,nz,dtbig1,tke,u,v,wcont,tem9,tem10,tem11, &
rhostr,rhostri,mapfct,j3,tkeforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem1_0,tem2_0,tem3_0)
!call test_dump (tkeforce,"XXX6tke_tkeforce",nx,ny,nz,0,0)
END IF
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tkeforce(i,j,k)=-tkeforce(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate the TKE diffusion term and store the result in the array
! tkeforce.
!
! 2*[d( rhobar*km*d(tke) /dx )/dx +d( rhobar*km*d(tke) /dy )/dy +
! d( rhobar*km*d(tke) /dz )/dz) ]
! + computational mixing
!
!-----------------------------------------------------------------------
!
CALL mixtke
(nx,ny,nz,tke(1,1,1,tstrtlvl),rhostr,kmh,kmv, &
x,y,z,zp,mapfct,j1,j2,j3,aj3x,aj3y,j3inv,tem8, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7)
CALL set_acct
(tkesrc_acct)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tkeforce(i,j,k)=tkeforce(i,j,k)+tem8(i,j,k)
END DO
END DO
END DO
!call test_dump (tkeforce,"XXX5tke_tkeforce",nx,ny,nz,0,0)
!
!-----------------------------------------------------------------------
!
! Calculate the TKE dissipation term and add the result to array
! tkeforce.
!
!-----------------------------------------------------------------------
!
CALL stgrdscl
(nx,ny,nz, zp, tem1)
!
IF (tkeopt == 1) THEN ! Wyngaard formulation
DO k=3,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem6(i,j,k)=0.93/tem1(i,j,k)
END DO
END DO
END DO
DO k=1,2
DO j=1,ny-1
DO i=1,nx-1
tem6(i,j,k)=3.9/tem1(i,j,k)
END DO
END DO
END DO
ELSE IF (tkeopt == 2) THEN ! Deardroff formulation
DO k=3,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem6(i,j,k)=(0.19+0.51*lenscl(i,j,k)/tem1(i,j,k)) &
/MAX(lenscl(i,j,k),0.1*tem1(i,j,k))
END DO
END DO
END DO
DO k=1,2
DO j=1,ny-1
DO i=1,nx-1
tem6(i,j,k)=3.9/MAX(lenscl(i,j,k),0.1*tem1(i,j,k))
END DO
END DO
END DO
ELSE IF (tkeopt == 3) THEN ! Sun and Chang formulation
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem6(i,j,k)=0.41/MAX(lenscl(i,j,k),0.1*tem1(i,j,k))
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Added the TKE dissipation term Ce*tke**(3/2)/lenscl to tkeforce.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tkeforce(i,j,k)=tkeforce(i,j,k) -rhostr(i,j,k)*tem6(i,j,k)* &
tke(i,j,k,tstrtlvl)*SQRT(tke(i,j,k,tstrtlvl))
END DO
END DO
END DO
!call test_dump (tkeforce,"XXX4tke_tkeforce",nx,ny,nz,0,0)
!
!-----------------------------------------------------------------------
!
! Add the shear production term into tkeforce. Note that the
! divergence term is ignored.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tkeforce(i,j,k)=tkeforce(i,j,k) + &
rhostr(i,j,k)*kmv(i,j,k)*defsq(i,j,k)
END DO
END DO
END DO
!call test_dump (tkeforce,"XXX3tke_tkeforce",nx,ny,nz,0,0)
!
!-----------------------------------------------------------------------
!
! Calculate the buoyancy production term in the TKE equation and
! store the result in tem1, which is then added to tkeforce.
!
! Note: The following lendel (the length scale normalized by
! (dx*dy*dz)**(1/3)) is at time, tpresent.
!
!-----------------------------------------------------------------------
!
it = tpresent
CALL buoytke
(nx,ny,nz,ptprt(1,1,1,it),pprt(1,1,1,it), &
qv(1,1,1,it),qc(1,1,1,it),qr(1,1,1,it), &
qi(1,1,1,it),qs(1,1,1,it),qh(1,1,1,it), &
ptbar,pbar,ptbari,rhostr,zp,j3,j3inv,kmv, &
rprntl,ptsflx,qvsflx, &
tem1, &
tem2,tem3,tem4,tem5,tem6)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tkeforce(i,j,k)=tkeforce(i,j,k) + tem1(i,j,k)
END DO
END DO
END DO
!call test_dump (tkeforce,"XXX2tke_tkeforce",nx,ny,nz,0,0)
dt2 = dtbig1*2.0
!
!-----------------------------------------------------------------------
!
! Treat the vertically implicit diffusion term
!
!-----------------------------------------------------------------------
!
IF (trbvimp == 1) THEN ! Vertical implicit application
CALL set_acct
(tmix_acct)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=2.0*rhostr(i,j,k)*kmv(i,j,k) &
*j3inv(i,j,k)*j3inv(i,j,k)
END DO
END DO
END DO
CALL vmiximps
(nx,ny,nz,deltat*0.5,tke(1,1,1,tstrtlvl),rhostr, &
tem1,tkeforce,tem2,tem3,tem4,tem5)
!call test_dump (tke(1,1,1,tstrtlvl),"XXXtke_tkestrt",nx,ny,nz,0,0)
END IF
!
!-----------------------------------------------------------------------
!
! Integrate the TKE equation forward by one timestep,
! yielding TKE at time = tfuture.
!
!-----------------------------------------------------------------------
!
CALL set_acct
(misc_acct)
!call test_dump (tke(1,1,1,tfuture),"XXX1tke_tke",nx,ny,nz,0,0)
!call test_dump (tkeforce,"XXX1tke_tkeforce",nx,ny,nz,0,0)
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
tke(i,j,k,tfuture)=tke(i,j,k,tstrtlvl) + &
deltat*tkeforce(i,j,k)*rhostri(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Update B.C.'s for TKE.
!
!-----------------------------------------------------------------------
!
!call test_dump (tke(1,1,1,tfuture),"XXXtke_tke",nx,ny,nz,0,0)
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsend2dew
(tke(1,1,1,tfuture),nx,ny,nz,ebc,wbc,0,mptag,tem1)
CALL mprecv2dew
(tke(1,1,1,tfuture),nx,ny,nz,ebc,wbc,0,mptag,tem1)
CALL mpsend2dns
(tke(1,1,1,tfuture),nx,ny,nz,nbc,sbc,0,mptag,tem1)
CALL mprecv2dns
(tke(1,1,1,tfuture),nx,ny,nz,nbc,sbc,0,mptag,tem1)
END IF
!call test_dump (tke(1,1,1,tfuture),"XXXBtke_tke",nx,ny,nz,0,1)
CALL acct_interrupt
(bc_acct)
CALL bckmkh
(nx,ny,nz,tke(1,1,1,tfuture))
CALL acct_stop_inter
!call test_dump (tke(1,1,1,tfuture),"XXXAtke_tke",nx,ny,nz,0,1)
!
!-----------------------------------------------------------------------
!
! Cut off the potentially negative values of TKE.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tke(i,j,k,tfuture)=MAX(0.0,tke(i,j,k,tfuture))
END DO
END DO
END DO
RETURN
END SUBROUTINE solvtke
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BUOYTKE ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE buoytke(nx,ny,nz,ptprt,pprt,qv,qc,qr,qi,qs,qh, & 1,1
ptbar,pbar,ptbari,rhostr,zp,j3,j3inv,kmv,rprntl, &
ptsflx,qvsflx, &
tkebuoy, &
tem1,tem2,tem3,tem4,tem5)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Compute the buoyancy production term in the TKE equation.
!
!-----------------------------------------------------------------------
!
! AUTHOR: V.Wong, Y. Tang and X. Song
! 10/1993
!
! MODIFICATION HISTORY:
!
! 9/1/94 (Y. Lu)
! Cleaned up documentation.
!
! 11/17/1995 (Ming Xue)
! Fixed an important bug in the loop 10, where J3 should be
! divided not multiplied.
!
! 05/29/1999 (Ming Xue)
! Re-written to incooperate the surface heat and moisture fluxes.
!
!-----------------------------------------------------------------------
!
! 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
!
! ptprt Perturbation potential temperature at times tpast and
! tpresent (K)
! pprt Perturbation pressure at times tpast and
! tpresent (Pascal)
!
! qv Water vapor specific humidity at times tpast
! and tpresent (kg /kg)
! qc Cloud water mixing ratio at times tpast and
! tpresent (kg/kg)
! qr Rainwater mixing ratio at times tpast and
! tpresent (kg/kg)
! qi Cloud ice mixing ratio at times tpast and
! tpresent (kg/kg)
! qs Snow mixing ratio at times tpast and tpresent (kg/kg)
! qh Hail mixing ratio at times tpast and tpresent (kg/kg)
!
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! ptbari Inverse base state potential temperature (K)
!
! rhostr Base state density rhobar times j3 (kg/m**3)
! zp Vertical coordinate of grid points
! in physical space (m)
! j3 Coordinate transformation Jacobian d(zp)/dz
! j3inv Inverse of j3
!
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
! rprntl Reciprocal of Prandtl number
! ptsflx Surface heat flux
! qvsflx Surface moisture flux
!
! OUTPUT:
!
! tkebuoy Temporary work array for buoyancy production term
!
! 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 ! Force explicit declarations
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: ptbari(nx,ny,nz) ! Inverse base state pot. temperature (K)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: zp (nx,ny,nz) ! Physical height
! coordinate defined at
! w-point of the staggered grid.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined d( zp )/d( z ).
REAL :: j3inv (nx,ny,nz) ! Inverse of j3
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: rprntl(nx,ny,nz) ! Reciprocal of Prandtl number
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tkebuoy (nx,ny,nz) ! Temporary work array for buoyancy
! production term
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
INTEGER :: onvf
REAL :: lcp,eps,tema
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
!
!-----------------------------------------------------------------------
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
eps=1.e-6
!
!-----------------------------------------------------------------------
!
! Calculate avgz(rhobar*kh/j3)
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem5(i,j,k) = rhostr(i,j,k)*kmv(i,j,k)*rprntl(i,j,k) &
* (j3inv(i,j,k)*j3inv(i,j,k))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rhobar*Khv/J3 * difz( pt ).
!
!-----------------------------------------------------------------------
!
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=dzinv*((ptprt(i,j,k)+ptbar(i,j,k))- &
(ptprt(i,j,k-1)+ptbar(i,j,k-1)))
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=tem1(i,j,k) *(tem5(i,j,k)+tem5(i,j,k-1))*0.5
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate rhobar*Khv/J3 * difz( qv ).
!
!-----------------------------------------------------------------------
tema = 0.5*dzinv
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=tema*(qv(i,j,k)-qv(i,j,k-1)) &
*(tem5(i,j,k)+tem5(i,j,k-1))
END DO
END DO
END DO
IF( sfcphy /= 0 ) THEN
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,2)=ptsflx(i,j)
tem2(i,j,2)=qvsflx(i,j)
END DO
END DO
END IF
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=0.5*(tem1(i,j,k+1)+tem1(i,j,k))
tem4(i,j,k)=0.5*(tem2(i,j,k+1)+tem2(i,j,k))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate the buoyancy production term for the unsaturated case
! in the TKE equation.
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tkebuoy(i,j,k)=-g*j3(i,j,k)* &
(tem3(i,j,k)*ptbari(i,j,k)+0.61*tem4(i,j,k))
END DO
END DO
END DO
IF( moist /= 0) THEN
!
!-----------------------------------------------------------------------
!
! Compute the buoyancy production term in the saturated case where
! Qv >= Qs (or Qc>0).
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! Calculate tem1 = d(eqivalent potential temperature)/dz
! tem2 = total temperature,
! tem3=(0.622*L*qv)/(R*T) is the equivalent potential temperature.
!
!-----------------------------------------------------------------------
!
lcp=lathv/cp
tema = 1.0/p0
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=(ptbar(i,j,k)+ptprt(i,j,k))* &
((pbar(i,j,k)+pprt(i,j,k))*tema)**rddcp
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=(3.376/tem2(i,j,k)-0.00254)*1000*qv(i,j,k)* &
(1+0.81*qv(i,j,k))
tem3(i,j,k)=(ptprt(i,j,k)+ptbar(i,j,k))*EXP(tem3(i,j,k))
END DO
END DO
END DO
onvf = 1
CALL difz
(tem3, onvf, &
nx,ny,nz, 1,nx-1, 1,ny-1, 2,nz-1, dz, tem1)
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=0.622*lathv*qv(i,j,k)/(rd*tem2(i,j,k))
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem4(i,j,k)=(1.0+lcp*tem3(i,j,k)/tem2(i,j,k))
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=tem1(i,j,k)*(tem5(i,j,k)+tem5(i,j,k-1)) &
/(tem4(i,j,k-1)+tem4(i,j,k))
END DO
END DO
END DO
IF( sfcphy /= 0 ) THEN
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,2)=ptsflx(i,j)
END DO
END DO
END IF
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=(1.0+0.61*tem3(i,j,k))*ptbari(i,j,k) ! testing
END DO
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)=tem2(i,j,k)*(tem1(i,j,k)+tem1(i,j,k+1))*0.5
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate qls=(qv+qc+qr+qi+qs+qg), and store the result in tem2,
! which is the sum of all liquid and solid water. Then compute
! the saturated part of the buoyancy production term.
!
!-----------------------------------------------------------------------
!
IF( ice == 0) THEN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=qc(i,j,k)+qr(i,j,k)
END DO
END DO
END DO
ELSE
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k)=qc(i,j,k)+qr(i,j,k)+qi(i,j,k)+qs(i,j,k)+qh(i,j,k)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Reset the buoyancy production term for saturated points.
!
!-----------------------------------------------------------------------
!
tema = 0.5*dzinv
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
IF( qc(i,j,k) > eps) THEN
tkebuoy(i,j,k)=-g*j3(i,j,k)* &
(tem2(i,j,k)-tem5(i,j,k)*tema*(tem3(i,j,k+1)-tem3(i,j,k-1)))
END IF
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE buoytke
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BCKMKH ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE bckmkh(nx,ny,nz,s) 4
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Set the boundary conditions for scalar, s (which may be TKE). Zero
! gradient is assumed except for the periodic boundary condition
! case.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Vince Wong and X. Song
! 010/08/93
!
! MODIFICATION HISTORY:
!
! 9/1/94 (Y. Lu)
! Cleaned up documentation.
!
!
!-----------------------------------------------------------------------
!
! 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 Array of any scalar.
!
! OUTPUT:
!
! s Including boundary values
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: s (nx,ny,nz) ! Scalar array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc'
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (wbc == 2) THEN
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=1,ny-1
s(1,j,k)=s(nx-2,j,k)
END DO
END DO
END IF
ELSE IF (wbc /= 0) THEN
DO k=2,nz-2
DO j=1,ny-1
s(1,j,k)=s(2,j,k)
END DO
END DO
END IF
IF (ebc == 2) THEN
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO j=1,ny-1
s(nx-1,j,k)=s(2,j,k)
END DO
END DO
END IF
ELSE IF (ebc /= 0) THEN
DO k=2,nz-2
DO j=1,ny-1
s(nx-1,j,k)=s(nx-2,j,k)
END DO
END DO
END IF
IF (nbc == 2) THEN
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=1,nx-1
s(i,ny-1,k)=s(i,2,k)
END DO
END DO
END IF
ELSE IF (nbc /= 0) THEN
DO k=2,nz-2
DO i=1,nx-1
s(i,ny-1,k)=s(i,ny-2,k)
END DO
END DO
END IF
IF (sbc == 2) THEN
IF (mp_opt == 0) THEN
DO k=2,nz-2
DO i=1,nx-1
s(i,1,k)=s(i,ny-2,k)
END DO
END DO
END IF
ELSE IF (sbc /= 0) THEN
DO k=2,nz-2
DO i=1,nx-1
s(i,1,k)=s(i,2,k)
END DO
END DO
END IF
IF (bbc == 2) THEN
DO i=1,nx-1
DO j=1,ny-1
s(i,j,1)=s(i,j,nz-2)
END DO
END DO
ELSE
DO i=1,nx-1
DO j=1,ny-1
s(i,j,1)=s(i,j,2)
END DO
END DO
END IF
IF (tbc == 2) THEN
DO i=1,nx-1
DO j=1,ny-1
s(i,j,nz-1)=s(i,j,2)
END DO
END DO
ELSE
DO i=1,nx-1
DO j=1,ny-1
s(i,j,nz-1)=s(i,j,nz-2)
END DO
END DO
END IF
RETURN
END SUBROUTINE bckmkh