!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE FRCUVW ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE frcuvw( nx,ny,nz,exbcbufsz,dtbig1, & 1,43
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,pbldpth, &
ubar,vbar,ptbar,pbar,ptbari,pbari,rhostr,qvbar, &
usflx,vsflx, x,y,z,zp, mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, sinlat,ptsfc, &
uforce,vforce,wforce,kmh,kmv,rprntl,lenscl,defsq, &
exbcbuf, bcrlx,rhofct,phydro, &
tem1,tem2, &
tem3,tem4,tem5,tem6,tem7,tem8,tem9, &
tem10,tem11,tem12,tem13,tem14,tem15,tem16 )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the inactive acoustic forcing terms in the momentum
! equations. These forcing terms include the advection, mixing, Coriolis
! force and buoyancy terms, and are accumulated into one array for
! each equation, i.e.,
! uforce = - uadv + umix + ucorio.
! vforce = - vadv + vmix + vcorio.
! wforce = - wadv + wmix + wbuoy + wcorio.
! These forcing terms are held fixed during the small acoustic wave
! integration time steps. The turbulent mixing coefficient for
! momentum km is an output which will be used to calculate the
! turbulent mixing of heat and water substances.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 3/21/92.
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 01/28/95 (G. Bassett)
! Option added to turn off buoyancy terms (for buoyopt=0).
!
! 01/23/96 (Donghai Wang, Ming Xue and Yuhe Liu)
! Added the map factor to forcing terms.
!
! 4/1/96 (Donghai Wang, X. Song and M. Xue)
! Added the implicit treatment for the vertical mixing.
!
! 10/15/97 (Donghai Wang)
! Using total density (rho) in the calculation of the pressure
! gradient force terms (if rhofctopt=1).
!
! 11/05/97 (D. Weber)
! Added phydro array for use in the bottom boundary condition for
! pertrubation pressure (hydrostatic).
!
! 11/06/97 (D. Weber)
! Added three additional levels to the mapfct array. The three
! levels (4,5,6) represent the inverse of the first three in order.
! The inverse map factors are computed to improve efficiency.
!
! 11/06/97 (D. Weber)
! Added tem12 for use in turbulent mixing (optimizing tmix3d.f).
!
! 9/18/98 (D. Weber)
! Removed single operation do loops and placed the calculations
! into the subroutines that generate the forcing terms.
! Added arrays storing the average of j3 in the x,y, and z
! directions.
!
! 1999/11/24 (Limin Zhao and Alan Shapiro)
! Added the forward data assimilation package, which renews the
! the wind, temperature and pressure fields before the forcing terms
! are calculated when the assimilation mode is turned on
! (assimopt=1).
!
!-----------------------------------------------------------------------
!
! 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 Local large time step size.
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of velocity in Cartesian
! coordinates (m/s).
! wcont Contravariant vertical velocity (m/s)
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
! qv Water vapor specific humidity (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
! pbldpth Planetary boundary layer depth (m)
!
! ubar Base state x velocity component (m/s)
! vbar Base state y velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! ptbari Inverse Base state potential temperature (K)
! pbari Inverse Base state pressure (Pascal)
! rhostr Base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! usflx Surface flux of u-momentum
! vsflx Surface flux of v-momentum
!
! 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, u and v 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
! aj3z Avgz of the coordinate transformation Jacobian d(zp)/dz
! j3inv Inverse of the coordinate transformation j3 d(zp)/dz
!
! sinlat Sin of latitude at each grid point
! ptsfc Potential temperature at the ground level (K)
!
! OUTPUT:
!
! uforce Acoustically inactive forcing terms in u-momentum
! equation (kg/(m*s)**2). uforce= -uadv + umix + ucorio
! vforce Acoustically inactive forcing terms in v-momentum
! equation (kg/(m*s)**2). vforce= -vadv + vmix + vcorio
! wforce Acoustically inactive forcing terms in w-momentum
! equation (kg/(m*s)**2).
! wforce= -wadv + wmix + wbuoy + wcorio
!
! phydro Big time step forcing term for use in computing the
! hydrostatic pressure at k=1.
!
! 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)
!
! 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.
! tem10 Temporary work array.
! tem11 Temporary work array.
! tem12 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: dtbig1 ! Local large time step size.
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (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 :: pbldpth(nx,ny,nt) ! Planetary boundary layer depth (m)
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 :: pbari (nx,ny,nz) ! Inverse Base state pressure (Pascal).
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity(kg/kg)
REAL :: x (nx) ! x-coord. of the physical and compu-
! tational grid. Defined at u-point(m).
REAL :: y (ny) ! y-coord. of the physical and compu-
! tational grid. Defined at v-point(m).
REAL :: z (nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered
! grid(m).
REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid(m).
REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/d(x)
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/d(y)
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! 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 :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL :: j3inv (nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/d(z)
REAL :: sinlat(nx,ny) ! Sin of latitude at each grid point
REAL :: ptsfc (nx,ny) ! Potential temperature at the ground level (K)
REAL :: usflx (nx,ny) ! Surface flux of u-momentum
! (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum
! (kg/(m*s**2))
REAL :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in u-momentum equation (kg/(m*s)**2)
! uforce= -uadv + umix + ucorio
REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in v-momentum equation (kg/(m*s)**2)
! vforce= -vadv + vmix + vcorio
REAL :: wforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in w-momentum equation (kg/(m*s)**2)
! wforce= -wadv + wmix + wbuoy
REAL :: phydro(nx,ny) ! Big time step forcing for computing
! hydrostatic pprt at k=1.
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)
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
REAL :: rhofct(nx,ny,nz) ! rho-factor:rhobar/rho
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 :: tem12 (nx,ny,nz) ! Temporary work array.
REAL :: tem13 (nx,ny,nz) ! Temporary work array.
REAL :: tem14 (nx,ny,nz) ! Temporary work array.
REAL :: tem15 (nx,ny,nz) ! Temporary work array.
REAL :: tem16 (nx,ny,nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: tlevel
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model
! execution
INCLUDE 'bndry.inc'
INCLUDE 'exbc.inc'
INCLUDE 'assim.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Calculate the total mixing (which includes subgrid scale
! turbulent mixing and computational mixing) terms for u, v, w
! equations as well as the mixing coefficient kmh and kmv, and
! the inverse Prandtl number.
!
! These mixing terms are accumulated in the arrays
! uforce, vforce and wforce.
!
! Since all mixing terms are evaluated at the past time level,
! we pass only the variable fields at time tpast into the routine.
!
!-----------------------------------------------------------------------
!
IF ( assimopt == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! ASSIMCON is a driver for the whole data assimilation system, which
! determines the control parameters and switches in the assimilation
! system.
!
!------------------------------------------------------------------------
!
CALL assimcon
(nx,ny,nz,x,y,z,zp, &
ubar,vbar,pbar,ptbar,rhostr,qvbar, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
j1,j2,j3, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9, &
tem10,tem11)
! CALL assimcon
!
!------------------------------------------------------------------------
!
! ASSIMDRIV is a driver for the variational velocity adjustment,which
! controls the ways to perform the varaitional adjustment and the
! velocity blending.
!
! Note: the arrays uforce, vforce, wforce, defsq are used in ASSIMDRIV
! as working array. This will not effect any model results since
! these array will be specified after the data assimilation.
!
!------------------------------------------------------------------------
!
CALL assimdriv
(nx,ny,nz,x,y,z,zp, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
tke,kmh,kmv,mapfct, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,j1,j2,j3, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9, &
tem10,tem11,tem12, &
tem13,tem14,tem15,tem16)
! CALL assimdriv
END IF
!
!------------------------------------------------------------------------
!
! If the assim mode is on, the modified model variables will be used
! to calculate the force terms in the following subroutines.
!
!
! Calculate the total mixing (which includes subgrid scale
! turbulent mixing and computational mixing) terms for u, v, w
! equations as well as the mixing coefficient kmh and kmv, and
! the inverse Prandtl number.
!
! These mixing terms are accumulated in the arrays
! uforce, vforce and wforce.
!
! Since all mixing terms are evaluated at the past time level,
! we pass only the variable fields at time tpast into the routine.
!
!-----------------------------------------------------------------------
!
tlevel = tpast
!call test_dump (u(1,1,1,tlevel),"XXXBmixuvw_u",nx,ny,nz,1,1)
!call test_dump (v(1,1,1,tlevel),"XXXBmixuvw_v",nx,ny,nz,2,1)
!call test_dump (w(1,1,1,tlevel),"XXXBmixuvw_w",nx,ny,nz,3,1)
!call test_dump (ptprt(1,1,1,tlevel),"XXXBmixuvw_ptprt",nx,ny,nz,0,1)
!call test_dump (pprt(1,1,1,tlevel),"XXXBmixuvw_pprt",nx,ny,nz,0,1)
!call test_dump (qv(1,1,1,tlevel),"XXXBmixuvw_qv",nx,ny,nz,0,1)
!call test_dump (qc(1,1,1,tlevel),"XXXBmixuvw_qc",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tlevel),"XXXBmixuvw_qr",nx,ny,nz,0,1)
!call test_dump (qi(1,1,1,tlevel),"XXXBmixuvw_qi",nx,ny,nz,0,1)
!call test_dump (qs(1,1,1,tlevel),"XXXBmixuvw_qs",nx,ny,nz,0,1)
!call test_dump (qh(1,1,1,tlevel),"XXXBmixuvw_qh",nx,ny,nz,0,1)
!call test_dump (tke,"XXXBmixuvwtke",nx,ny,nz,0,0)
!call test_dump (uforce,"XXXBmixuvw_uforce",nx,ny,nz,1,0)
CALL mixuvw
(nx,ny,nz, exbcbufsz, &
u (1,1,1,tlevel),v (1,1,1,tlevel), &
w (1,1,1,tlevel), &
ptprt(1,1,1,tlevel),pprt(1,1,1,tlevel), &
qv (1,1,1,tlevel),qc (1,1,1,tlevel), &
qr (1,1,1,tlevel), &
qi (1,1,1,tlevel),qs (1,1,1,tlevel), &
qh (1,1,1,tlevel), &
tke, pbldpth(1,1,tpresent), &
ubar,vbar,ptbar, &
pbar,rhostr,qvbar, &
usflx,vsflx, x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, ptsfc, &
uforce,vforce,wforce,kmh,kmv,rprntl,lenscl,defsq, &
exbcbuf, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9,tem10, &
tem11,tem12)
!call test_dump (uforce,"XXXAmixuvw_uforce",nx,ny,nz,1,0)
IF( (tmixopt /= 0 .OR. cmix2nd /= 0 .OR. cmix4th /= 0 ) &
.AND. lvldbg >= 4 ) THEN
CALL set_acct
(misc_acct)
CALL checkuhx
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'umixx', tem1)
CALL checkuhy
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'umixy', tem1)
CALL checkvhx
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vmixx', tem1)
CALL checkvhy
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vmixy', tem1)
CALL checkwhx
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wmixx', tem1)
CALL checkwhy
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wmixy', tem1)
END IF
!
!
!-----------------------------------------------------------------------
!
! Calculate the advection terms in the momentum equations, using
! the equivalent advective formulation.
!
! On exit of advuvw, the advection terms are included in the
! forcing arrays which contain the turbulent mixing terms.
!
!-----------------------------------------------------------------------
!
!
CALL set_acct
(advuvw_acct)
CALL advuvw
(nx,ny,nz,u,v,w,wcont,rhostr,ubar,vbar, mapfct, &
uforce,vforce,wforce, &
tem1,tem2,tem3, &
tem4,tem5,tem6,tem7,tem8,tem9)
!call test_dump (uforce,"XXXAadvuvw_uforce",nx,ny,nz,1,0)
IF( lvldbg >= 4 ) THEN
CALL checkuhx
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'uforce after advu', tem9)
CALL checkuhy
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'uforce after advu', tem9)
CALL checkvhx
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vforce after advv', tem9)
CALL checkvhy
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vforce after advv', tem9)
CALL checkwhx
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wforce after advw', tem9)
CALL checkwhy
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wforce after advw', tem9)
END IF
!-----------------------------------------------------------------------
!
! Calculate the advection terms from inhomogeneous map factor for
! u and v, and store them into tem1 and tem2.
!
! Ustr and vstr were calculated by advuvw and stored in tem4 and
! tem5.
!
!-----------------------------------------------------------------------
IF ( mptrmopt /= 0 ) THEN
CALL maptrm
( nx,ny,nz, u,v, tem4,tem5, mapfct, &
uforce, vforce, tem7,tem8,tem9 )
!call test_dump (uforce,"XXXAmaptrm_uforce",nx,ny,nz,1,0)
IF ( lvldbg >= 5 ) THEN
CALL checkuhx
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'uforce after maptrm', tem9)
CALL checkuhy
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'uforce after maptrm', tem9)
CALL checkvhx
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vforce after maptrm', tem9)
CALL checkvhy
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vforce after maptrm', tem9)
END IF
END IF
!-----------------------------------------------------------------------
!
! Calculate the Coriolis terms in u, v and w equations and add
! to the forcing terms INSIDE the call to coriol.
!
!-----------------------------------------------------------------------
IF( coriopt /= 0 ) THEN
CALL set_acct
(coriol_acct)
tlevel = tpresent
CALL coriol
(nx,ny,nz, &
u(1,1,1,tlevel),v(1,1,1,tlevel),w(1,1,1,tlevel), &
ubar,vbar,rhostr, sinlat, &
uforce, vforce, wforce, tem4,tem5,tem6,tem7)
!call test_dump (uforce,"XXXAcoriol_uforce",nx,ny,nz,1,0)
IF( lvldbg >= 4 ) THEN
CALL checkuhx
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'uforce after ucorx', tem9)
CALL checkuhy
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'uforce after ucory', tem9)
CALL checkvhx
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vforce after vcorx', tem9)
CALL checkvhy
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vforce after vcory', tem9)
CALL checkwhx
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wforce after wcorx', tem9)
CALL checkwhy
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wforce after wcory', tem9)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! The temperature and pressure fields are modified by Gal-Chen's
! thermodynamic recovery method if the assim mode is turned on.
!
!-----------------------------------------------------------------------
!
IF ( assimopt == 1 ) THEN
CALL set_acct
(tinteg_acct)
CALL assimptpr
(nx,ny,nz,x,y,z,zp, &
u,v,w,ptprt,pprt,qv, &
qc,qr,qi,qs,qh, &
tke,kmh,kmv, &
ubar,vbar,ptbar,pbar,qvbar,rhostr, &
uforce,vforce,wforce,j1,j2,j3)
! CALL assimptpr
WRITE(6,*)'back from assimptpr'
END IF
!
!-----------------------------------------------------------------------
!
! Calculate the rho-factor: rhobar/rho, to correct the calculation
! for the pressure gradient terms
!
!-----------------------------------------------------------------------
!
CALL set_acct
(buoy_acct)
IF (rhofctopt /= 0) THEN
tlevel = tpresent
!call test_dump2(qr(1,1,1,tlevel),"XXXBrhofactor_qr",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
CALL rhofactor
(nx,ny,nz,ptprt(1,1,1,tlevel),pprt(1,1,1,tlevel), &
qv(1,1,1,tlevel),qc(1,1,1,tlevel),qr(1,1,1,tlevel), &
qi(1,1,1,tlevel),qs(1,1,1,tlevel),qh(1,1,1,tlevel), &
ptbar,pbar,ptbari,pbari,qvbar,rhofct,tem1)
!call test_dump2(rhofct,"XXXArhofactor_rhofct",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
rhofct(i,j,k) = 1.0
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Average rhofct at w points, stored in tem3
!
!-----------------------------------------------------------------------
!
CALL avgsw
(rhofct,nx,ny,nz, 1,nx-1, 1,ny-1,tem3)
!call test_dump2(rhofct,"XXXAavgsw_rhofct",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!
!-----------------------------------------------------------------------
!
! Calculate the buoyancy term for the w-equation.
! The buoyancy term is stored in tem1 then added to wforce.
!
! If buoyopt = 0 then buoyancy is turned off.
!
!-----------------------------------------------------------------------
!
tlevel = tpresent
IF ( buoyopt /= 0 ) THEN
CALL buoycy
(nx,ny,nz, ptprt(1,1,1,tlevel),pprt(1,1,1,tlevel), &
qv(1,1,1,tlevel),qc(1,1,1,tlevel),qr(1,1,1,tlevel), &
qi(1,1,1,tlevel),qs(1,1,1,tlevel),qh(1,1,1,tlevel), &
ptbar,pbar,ptbari,pbari,rhostr,qvbar, &
tem1, & ! wbuoy
tem2)
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wforce(i,j,k)=wforce(i,j,k)+tem3(i,j,k)*tem1(i,j,k)
END DO
END DO
END DO
DO j=1,ny-1 ! store buoyancy at k=2 into phydro.
DO i=1,nx-1 ! for use in pprt(i,j,1) boundary condition
phydro(i,j)=tem1(i,j,2)
END DO
END DO
END IF
IF( lvldbg >= 4 ) THEN
CALL checkwhx
(tem1, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wbuox', tem9)
CALL checkwhy
(tem1, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wbuoy', tem9)
END IF
!
!-----------------------------------------------------------------------
!
! To calculate additional boundary relaxation and mixing terms for
! the wind fields in the case of externally forced boundary condition.
!
!-----------------------------------------------------------------------
!
IF ( lbcopt == 2 .AND. mgrid == 1 ) THEN
CALL set_acct
(cmix_acct)
CALL brlxuvw
( nx,ny,nz, dtbig1, &
u(1,1,1,1),v(1,1,1,1),w(1,1,1,1),rhostr, &
uforce,vforce,wforce, &
exbcbuf(nu0exb), exbcbuf(nv0exb), &
exbcbuf(nw0exb), exbcbuf(nudtexb), &
exbcbuf(nvdtexb),exbcbuf(nwdtexb),bcrlx, &
tem1,tem2,tem3,tem4,tem5,tem6 )
!call test_dump (uforce,"XXXAbrlxuvw_uforce",nx,ny,nz,1,0)
END IF
!
!-----------------------------------------------------------------------
!
! To calculate the vertically implicit mixing terms,
! and add to uforce, vforce, and wforce.
!
!-----------------------------------------------------------------------
!
IF (trbvimp == 1) THEN ! Vertical implicit application
CALL set_acct
(tmix_acct)
CALL vmiximpuvw
(nx,ny,nz,dtbig1,u(1,1,1,1),v(1,1,1,1),w(1,1,1,1), &
rhostr,kmv,j1,j2,j3inv, &
uforce,vforce,wforce, &
tem1,tem2,tem3,tem4, &
tem5,tem6,tem7,tem8,tem9,tem10,tem11)
!call test_dump (uforce,"XXXAvmiximp_uforce",nx,ny,nz,1,0)
END IF
RETURN
END SUBROUTINE frcuvw
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE FRCP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE frcp( nx,ny,nz,exbcbufsz, dtbig1, & 1,6
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
ptbar,pbar,rhostr,qvbar,mapfct,j1,j2,j3,aj3x,aj3y,aj3z, &
pforce, &
exbcbuf, bcrlx, &
padv,tem1,tem2,tem3,tem4,tem5,tem6,tem7,mp_tem)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the total acoustically inactive forcing terms in
! the pressure equation (advection and other source/sink terms).
!
! These terms are invariant during the small time-step integration.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 3/21/92.
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 01/23/96 (Donghai Wang, Yuhe Liu and Ming Xue)
! Added the map factor to forcing terms.
!
! 9/18/98 (D. Weber)
! Added arrays aj3x,aj3y,aj3z.
!
!-----------------------------------------------------------------------
!
! 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 direction.
! dtbig1 Local large time step size.
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of velocity in Cartesian
! coordinates (m/s).
! wcont Contravariant vertical velocity (m/s)
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
! qv Water vapor specific humidity (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
!
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhostr Base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! 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
! aj3z Avgz of the coordinate transformation Jacobian d(zp)/dz
!
! OUTPUT:
!
! pforce Acoustically inactive forcing terms in pressure
! equation (Pascal/s). pforce= -padv
!
! WORK ARRAYS:
!
! padv Advection of pressure
! 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.
! mp_tem Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: dtbig1 ! Local large time step size.
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature
! from that of base state atmosphere
! (Kelvin)
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure from that
! of base state atmosphere (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 :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity(kg/kg)
REAL :: mapfct(nx,ny) ! Map factors at scalar points
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dx.
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dy.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/dz.
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 :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL :: pforce(nx,ny,nz) ! Sound-wave independent forcing terms
! in pressure equation (Pascal/s).
! pforce = -padv
REAL :: padv (nx,ny,nz) ! The advection term of pressure eq.
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
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 :: mp_tem(MAX(nx+1,ny+1)*(nz+1)) ! Temporary message passing array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k ! local varaibles.
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model
! execution
INCLUDE 'bndry.inc'
INCLUDE 'exbc.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Calculate the advection term in the pressure equation
! using the equivalent advective formulation
!
!-----------------------------------------------------------------------
!
!
CALL set_acct
(advs_acct)
IF( peqopt == 1 ) THEN
CALL advp
(nx,ny,nz,pprt,u,v,w,wcont,rhostr,mapfct, &
j3,aj3x,aj3y,aj3z, &
padv, tem1,tem2,tem3,tem4,tem5,tem6,tem7,mp_tem)
IF( lvldbg >= 4) THEN
CALL checkshx
(padv, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'padvx', tem3)
CALL checkshy
(padv, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'padvy', tem3)
END IF
!
!-----------------------------------------------------------------------
!
! Store the total forcing in array pforce.
!
!-----------------------------------------------------------------------
!
!
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
pforce(i,j,k)= -padv(i,j,k)
END DO
END DO
END DO
!call test_dump (pforce,"XXXIfrcp_padv_pforce",nx,ny,nz,0,0)
ELSE
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
pforce(i,j,k)= 0.0
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! To calculate additional boundary relaxation and mixing terms for
! pressure in the case of externally forced boundary condition.
!
!-----------------------------------------------------------------------
!
IF ( lbcopt == 2 .AND. mgrid == 1 ) THEN
CALL set_acct
(bc_acct)
CALL brlxp
(nx,ny,nz, dtbig1, pprt(1,1,1,1),rhostr, pforce, &
exbcbuf(npr0exb),exbcbuf(nprdtexb), bcrlx, &
tem1,tem2,tem3,tem4)
!call test_dump (pforce,"XXXAbrlxp_pforce",nx,ny,nz,0,0)
END IF
RETURN
END SUBROUTINE frcp
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE FRCPT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE frcpt(nx,ny,nz, exbcbufsz, dtbig1,ptprt,u,v,w,wcont, & 1,9
ptbar,rhostr,rhostri,kmh,kmv,rprntl, &
usflx,vsflx,ptsflx,pbldpth, &
x,y,z,zp,mapfct,j1,j2,j3,aj3x,aj3y,j3inv,ptsfc, &
ptforce, &
exbcbuf, bcrlx, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11, &
tem1_0,tem2_0,tem3_0,mp_tem)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate gravity wave or inactive acoustic wave terms in the
! potential temperature equation.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 9/17/94
!
! MODIFICATION HISTORY:
!
! 8/15/95 (Ming Xue)
! Corrected a bug related the calculation of addtional boundary zone
! relaxation. The ptmix term was effectively added twice to
! ptforce when lbcopt=2.
!
! 01/23/96 (Donghai Wang, Yuhe Liu and Ming Xue)
! Added the map factor to forcing terms.
!
! 4/1/96 (Donghai Wang, X. Song and M. Xue)
! Added the implicit treatment for the vertical mixing.
!
! 7/10/1997 (Fanyou Kong -- CMRP)
! Added the positive definite advection option (sadvopt = 5)
!
! 7/17/1998 (M. Xue)
! Changed call to ADVPTFCT.
!
! 9/18/1998 (D. Weber)
! Added arrays aj3x,y.
!
!-----------------------------------------------------------------------
!
! 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 The big time step size (s)
!
! ptprt Perturbation potential temperature at times tpast and
! tpresent (K)
!
! u x component of velocity at all time levels (m/s)
! v y component of velocity at all time levels (m/s)
! w Vertical component of Cartesian velocity at times
! tpast and tpresent (m/s)
! wcont Contravariant vertical velocity (m/s)
!
! ptbar Base state potential temperature (K)
! rhostr Base state density rhobar times j3 (kg/m**3)
! rhostri Inv. base state density rhobar times j3 (kg/m**3)
!
! 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
!
! ptsflx Surface flux of heat (K*kg/(m**2*s)).
! pbldpth Planetary boundary layer depth (m)
!
! 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
!
! OUTPUT:
!
! ptforce Gravity wave inactive forcing terms in pt-eq.
! (K*kg/(m**3*s))
!
! 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.
! tem10 Temporary work array.
! tem11 Temporary work array.
!
! tem1_0 Temporary work array.
! tem2_0 Temporary work array.
! tem3_0 Temporary work array.
!
! mp_tem Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
INCLUDE 'timelvls.inc'
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
REAL :: dtbig1 ! Local big time step size
REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K)
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: rhostri(nx,ny,nz) ! Inv. base state density rhobar times 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 :: usflx (nx,ny) ! Surface flux of u-momentum
! (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum
! (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface flux of heat (K*kg/(m**2*s))
REAL :: pbldpth(nx,ny,nt) ! Planetary boundary layer depth (m)
REAL :: x (nx) ! x-coord. of the physical and compu-
! tational grid. Defined at u-point.
REAL :: y (ny) ! y-coord. of the physical and compu-
! tational 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) ! Coordinate transformation Jacobian
! defined as d( zp )/d( z ).
REAL :: ptsfc (nx,ny) ! Ground surface potential temperature (K)
REAL :: ptforce(nx,ny,nz) ! Gravity wave inactive forcing terms
! in pressure equation (Pascal/s)
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
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 :: 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.
REAL :: mp_tem(MAX(nx+1,ny+1)*(nz+1)) ! Temporary message passing array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k, tstrtlvl
REAL :: deltat
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'exbc.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Compute the advection term of the potential temperature
! equation and store it in array ptadv.
!
!-----------------------------------------------------------------------
!
CALL set_acct
(advs_acct)
IF( sadvopt == 4 ) THEN ! FCT advection
CALL advptfct
(nx,ny,nz,dtbig1,ptprt,u,v,w,wcont, &
rhostr,rhostri,ptbar,mapfct,j3,j3inv, &
ptforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem9,tem10,tem11,tem1_0,tem2_0,tem3_0,mp_tem)
deltat = dtbig1
tstrtlvl = tpresent
ELSE
CALL advpt
(nx,ny,nz,ptprt,u,v,w,wcont, rhostr,ptbar,mapfct, &
j3,j3inv,ptforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8)
deltat = dtbig1*2
tstrtlvl = tpast
END IF
!
!-----------------------------------------------------------------------
!
! Compute the mixing terms in the potential temperature equation.
! This includes both physical and computational mixing.
! Store in array ptmix.
!
!-----------------------------------------------------------------------
!
CALL set_acct
(cmix_acct)
CALL mixpt
(nx,ny,nz, exbcbufsz, &
ptprt(1,1,1,tstrtlvl),ptbar,rhostr, &
kmh,kmv,rprntl, &
usflx,vsflx,ptsflx,pbldpth(1,1,tpresent), &
x,y,z,zp,mapfct,j1,j2,j3,aj3x,aj3y,j3inv,ptsfc, &
tem7, exbcbuf, &
tem1,tem2,tem3,tem4,tem5,tem6)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptforce(i,j,k)=-ptforce(i,j,k)+tem7(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate additional relaxation and mixing on ptprt for the
! base grid when external boundary forcing is used.
!
!-----------------------------------------------------------------------
!
IF ( lbcopt == 2 .AND. mgrid == 1 ) THEN
CALL set_acct
(bc_acct)
CALL brlxpt
(nx,ny,nz,deltat*0.5,ptprt(1,1,1,tstrtlvl), &
rhostr,ptforce, &
exbcbuf(npt0exb),exbcbuf(nptdtexb),bcrlx, &
tem1,tem2,tem3,tem4)
END IF
!
!-----------------------------------------------------------------------
!
! Treat the vertically implicit mixing
!
!-----------------------------------------------------------------------
!
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)=ptbar(i,j,k)+ptprt(i,j,k,tstrtlvl)
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)=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
CALL vmiximps
(nx,ny,nz,deltat*0.5,tem1,rhostr,tem2, &
ptforce,tem3,tem4,tem5,tem6)
END IF
RETURN
END SUBROUTINE frcpt
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CORIOL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE coriol(nx,ny,nz, & 1
u,v,w,ubar,vbar,rhostr, sinlat, uforce, vforce, wforce, &
fcorio1, fcorio2, tem1,tem2)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the Coriolis force terms in the u, v and w equations.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 4/20/92.
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 8/28/92 (M. Xue)
! Included the domain translation effect into the Coriolis force
! terms.
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 9/14/98 (D. Weber)
! Removed operators and merged loops and added coriolis terms
! to the forcing terms inside this subroutine.
!
!-----------------------------------------------------------------------
!
! 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 direction.
!
! 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 z component of velocity at a given time level (m/s)
! ubar Base state x velocity component (m/s)
! vbar Base state y velocity component (m/s)
! rhostr Base state density rhobar times j3 (kg/m**3)
! sinlat Sin of latitude at each grid point
!
! OUTPUT:
!
! uforce Acoustically inactive forcing terms in u-momentum
! equation (kg/(m*s)**2). uforce= -uadv + umix + ucorio
! vforce Acoustically inactive forcing terms in v-momentum
! equation (kg/(m*s)**2). vforce= -vadv + vmix + vcorio
! wforce Acoustically inactive forcing terms in w-momentum
! equation (kg/(m*s)**2).
!
! WORK ARRAYS:
!
! fcorio1 Temporary work array.
! fcorio2 Temporary work array.
! tem1 Temporary work array.
! tem2 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 at a time level (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity at a time level (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity at a time level (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 :: sinlat(nx,ny) ! Sin of latitude at each grid point
REAL :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in u-momentum equation (kg/(m*s)**2)
! uforce= -uadv + umix + ucorio
REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in v-momentum equation (kg/(m*s)**2)
! vforce= -vadv + vmix + vcorio
REAL :: wforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in w-momentum equation (kg/(m*s)**2)
! wforce= -wadv + wmix + wbuoy
REAL :: fcorio1 (nx,ny) ! Temporary work array.
REAL :: fcorio2 (nx,ny) ! Temporary work array.
REAL :: tem1 (nx,ny,nz) ! Temporary work array.
REAL :: tem2 (nx,ny,nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: onvf
REAL :: omega2,sinclat,cosclat
REAL :: gumove,gvmove
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
INCLUDE 'phycst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF ( grdtrns == 0 ) THEN
gumove = 0.0
gvmove = 0.0
ELSE
gumove = umove
gvmove = vmove
END IF
omega2 = 2.0* omega
IF( coriopt == 1 ) THEN
sinclat = SIN( ATAN(1.0)/45.0 * ctrlat )
DO j=1,ny
DO i=1,nx
fcorio1(i,j) = omega2* sinclat
fcorio2(i,j) = 0.0
END DO
END DO
ELSE IF( coriopt == 2 ) THEN
sinclat = SIN( ATAN(1.0)/45.0 * ctrlat )
cosclat = SQRT( 1.0 - sinclat*sinclat )
DO j=1,ny
DO i=1,nx
fcorio1(i,j) = omega2* sinclat
fcorio2(i,j) = omega2* cosclat
END DO
END DO
ELSE IF( coriopt == 3 ) THEN
DO j=1,ny-1
DO i=1,nx-1
fcorio1(i,j) = omega2*sinlat(i,j)
fcorio2(i,j) = 0.0
END DO
END DO
ELSE IF( coriopt == 4 ) THEN
DO j=1,ny-1
DO i=1,nx-1
fcorio1(i,j) = omega2* sinlat(i,j)
fcorio2(i,j) = omega2* SQRT( 1.0 - sinlat(i,j)**2 )
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Coriolis terms in u-eq. if coriotrm=1
!
! ucorio = avgx( rhostr * (fcorio1*avgy(v)-fcorio2*avgz(w)) )
!
! or if coriotrm=2,
!
! ucorio = avgx( rhostr * (fcorio1*avgy(v-vbar)-fcorio2*avgz(w)) )
!
! where fcorio1 = 2*omega*sinlat.
! and fcorio2 = 2*omega* sqrt(1-sinlat**2).
!
!-----------------------------------------------------------------------
IF( coriotrm == 1 ) THEN
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem2(i,j,k) = v(i,j,k) + gvmove
END DO
END DO
END DO
ELSE
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem2(i,j,k) = v(i,j,k) + gvmove - vbar(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = 0.5*rhostr(i,j,k)* &
(fcorio1(i,j)*(tem2(i,j+1,k)+tem2(i,j,k)) &
-fcorio2(i,j)*(w(i,j,k+1)+w(i,j,k)))
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=2,nx-1
uforce(i,j,k) = uforce(i,j,k) + 0.5*(tem1(i-1,j,k)+tem1(i,j,k))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Coriolis terms in v-eq. and w-eq. if coriotrm=1:
!
! vcorio = - avgy( rhostr * fcorio1 * avgx(u) )
! wcorio = avgz( rhostr * fcorio2 * avgx(u) )
!
! or if coriotrm=2:
!
! vcorio = - avgy( rhostr * fcorio1 * avgx(u-ubar) )
! wcorio = avgz( rhostr * fcorio2 * avgx(u) )
!
!
!-----------------------------------------------------------------------
IF( coriotrm == 1 ) THEN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem2(i,j,k) = u(i,j,k) + gumove
END DO
END DO
END DO
ELSE
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem2(i,j,k) = u(i,j,k) + gumove -ubar(i,j,k)
END DO
END DO
END DO
END IF
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = - rhostr(i,j,k)*fcorio1(i,j)* &
0.5*(tem2(i+1,j,k)+tem2(i,j,k))
END DO
END DO
END DO
DO k=1,nz-1
DO j=2,ny-1
DO i=1,nx-1
vforce(i,j,k) = vforce(i,j,k)+0.5*(tem1(i,j-1,k)+tem1(i,j,k))
END DO
END DO
END DO
IF( coriopt == 2 .OR. coriopt == 4 ) THEN ! compute the w term.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = fcorio2(i,j) * rhostr(i,j,k)* &
( 0.5*(u(i+1,j,k)+u(i,j,k)) + gumove )
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wforce(i,j,k) = wforce(i,j,k)+0.5*(tem1(i,j,k-1)+tem1(i,j,k))
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE coriol
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE BUOYCY ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE buoycy(nx,ny,nz,ptprt,pprt,qv,qc,qr,qi,qs,qh, & 1
ptbar,pbar,ptbari,pbari,rhostr,qvbar, wbuoy, tem1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the total buoyancy including liquid and solid water
! loading.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91.
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 3/10/93 (M. Xue)
! The buoyancy term is reformulated. The previous formula was
! in error. The water loading was calculated wrong, resulting in
! a value of the water loading that is typically an order of
! magnitude too small.
!
! 3/25/94 (G. Bassett & M. Xue)
! The buoyancy terms are reformulated for better numerical accuracy.
! Instead of storing numbers which had the form (1+eps)*(1+eps1)
! (eps << 1 and eps1 <<1), terms were expanded out, and most of the
! high order terms neglected, except for the second order terms
! in ptprt, pprt and qvbar.
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 6/21/95 (Alan Shapiro)
! Fixed bug involving missing qvpert term in buoyancy formulation.
!
! 10/15/97 (Donghai Wang)
! Added a new option for including the second order terms.
!
! 11/05/97 (D. Weber)
! Changed lower loop bounds in DO LOOP 400 for computing the
! buoyancy term from k=3,nz-2 to k=2,nz-1. Level k=2 data will be
! used in the hydrostatic pprt lower boundary condition (removed
! DO LOOP 410 used to set wbuoy = 0.0 for k= 2 and nz-1).
!
!-----------------------------------------------------------------------
!
! 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 direction.
!
! ptprt Perturbation potential temperature at a time level (K)
! pprt Perturbation pressure at a given time level (Pascal)
! qv Water vapor specific humidity at a given time level
! (kg/kg)
! qc Cloud water mixing ratio at a given time level (kg/kg)
! qr Rainwater mixing ratio at a given time level (kg/kg)
! qi Cloud ice mixing ratio at a given time level (kg/kg)
! qs Snow mixing ratio at a given time level (kg/kg)
! qh Hail mixing ratio at a given time level (kg/kg)
!
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! ptbari Inverse base state potontial temperature (K)
! pbari Inverse base state pressure (Pascal)
! rhostr Base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! OUTPUT:
!
! wbuoy The total buoyancy force (kg/(m*s)**2)
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature
! at a given time level (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure at a given time
! level (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 :: pbari (nx,ny,nz) ! Inverse base state pressure (Pascal).
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity(kg/kg)
REAL :: wbuoy(nx,ny,nz) ! Total buoyancy in w-eq. (kg/(m*s)**2)
REAL :: tem1 (nx,ny,nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
REAL :: g5
REAL :: pttem,tema
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global model control parameters
INCLUDE 'phycst.inc' ! Physical constants
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! The total buoyancy
!
! wbuoy = rhostr*g ( ptprt/ptbar-pprt/(rhobar*csndsq)+
! qvprt/(rddrv+qvbar)-(qvprt+qc+qr+qs+qi+qh)/(1+qvbar)
! -(ptprt*ptprt)/(ptbar*ptbar) !2nd-order
! +0.5*(ptprt*pprt)/(cpdcv*ptbar*pbar)) !2nd-order
!
! and rddrv=rd/rv, cp, cv, rd and rv are defined in phycst.inc.
!
! Here, the contribution from pprt (i.e., term pprt/(rhobar*csndsq))
! is evaluated inside the small time steps, therefore wbuoy
! does not include this part.
!
! The contribution from ptprt is calculated inside the small time
! steps if the potential temperature equation is solved inside
! small time steps, i.e., if ptsmlstp=1.
!
!-----------------------------------------------------------------------
!
IF( ptsmlstp == 1 ) THEN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = 0.0
END DO
END DO
END DO
ELSE
IF (buoy2nd == 0) THEN !1st-order
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = ptprt(i,j,k)*ptbari(i,j,k)
END DO
END DO
END DO
ELSE !2nd-order
IF ( bsnesq == 1 ) THEN
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
pttem = ptprt(i,j,k)*ptbari(i,j,k)
tem1(i,j,k) = pttem-pttem*pttem
END DO
END DO
END DO
ELSE
tema = 1.0/cpdcv
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
pttem = ptprt(i,j,k)*ptbari(i,j,k)
tem1(i,j,k) = pttem* &
(1.0-pttem+0.5*pprt(i,j,k)*(tema*pbari(i,j,k)))
END DO
END DO
END DO
END IF
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Add on the contributions to the buoyancy from the water vapor
! content and the liquid and ice water loading.
!
!-----------------------------------------------------------------------
!
IF( moist == 1 .AND. ice == 0 ) THEN ! Moist case, no ice.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = tem1(i,j,k) &
+ (qv(i,j,k) - qvbar(i,j,k))/(rddrv + qvbar(i,j,k)) &
- (qv(i,j,k) - qvbar(i,j,k) + qc(i,j,k) + qr(i,j,k)) &
/(1 + qvbar(i,j,k))
END DO
END DO
END DO
ELSE IF(moist == 1 .AND. ice == 1) THEN
! Full microphysics case, loading
! of liquid and ice water.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = tem1(i,j,k) &
+ (qv(i,j,k) - qvbar(i,j,k))/(rddrv + qvbar(i,j,k)) &
- (qv(i,j,k) - qvbar(i,j,k) + qc(i,j,k) + qr(i,j,k) + &
qs(i,j,k) + qi(i,j,k) + qh(i,j,k))/(1 + qvbar(i,j,k))
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Then the total buoyancy:
!
! wbuoy = tem1 * rhostr * g
!
! averged to the w-point on the staggered grid.
!
!-----------------------------------------------------------------------
!
g5 = g*0.5
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wbuoy(i,j,k)= (tem1(i,j, k )*rhostr(i,j, k ) &
+tem1(i,j,k-1)*rhostr(i,j,k-1))*g5
END DO
END DO
END DO
RETURN
END SUBROUTINE buoycy
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE PGRAD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE pgrad(nx,ny,nz, pprt, div, & 1,4
j1,j2,j3, upgrad,vpgrad,wpgrad,tem1,tem2)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the pressure gradient terms in the momentum equations.
! These terms are evaluated every small time step.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91.
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 5/25/93 (M. Xue & K. Brewster)
! Fixed and error in the vertical pressure gradient force term.
! The error is present in the finite differenced w equation
! of ARPS 3.0 User's guide. The equation in continuous form is
! correct.
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 01/23/96 (Donghai Wang, Yuhe Liu and Ming Xue)
! Added the map factor.
!
! 07/31/96 (Ming Xue and Yuhe Liu)
! Added the isotropic option for divergence damping
!
! 9/14/98 (D. Weber)
! Removed operators and merged loops.
!
!-----------------------------------------------------------------------
!
! 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 direction.
!
! pprt Perturbation pressure at a given time level (Pascal)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! OUTPUT:
!
! upgrad Pressure gradient force in u-eq. (kg/(m*s)**2)
! vpgrad Pressure gradient force in v-eq. (kg/(m*s)**2)
! wpgrad Pressure gradient force in w-eq. (kg/(m*s)**2)
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: pprt (nx,ny,nz) ! Perturbation pressure at a given time
! level (Pascal).
REAL :: div (nx,ny,nz) ! Mass weighted divergence
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dx.
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dy.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/dz.
REAL :: upgrad(nx,ny,nz) ! Pressure gradient force in u-eq.
! (kg/(m*s)**2)
REAL :: vpgrad(nx,ny,nz) ! Pressure gradient force in v-eq.
! (kg/(m*s)**2)
REAL :: wpgrad(nx,ny,nz) ! Pressure gradient force in w-eq.
REAL :: tem1 (nx,ny,nz) ! Temporary work array.
REAL :: tem2 (nx,ny,nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: onvf
INTEGER :: i,j,k
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! pprt - cdvdmpv*div(i,j,k) in vertical direction
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k)=pprt(i,j,k)-cdvdmpv*div(i,j,k)
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! d(pprt-cdvdmpv*div)/dz at w point - p grad. force in z-dir
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wpgrad(i,j,k)=dzinv*(tem1(i,j,k)-tem1(i,j,k-1))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Array div may be used only for horizontal now
!
! div = pprt - cdvdmph*div(i,j,k) in horizontal direction
!
!-----------------------------------------------------------------------
!call test_dump (div,"XXX1f_div",nx,ny,nz,1,0)
!call test_dump (pprt,"XXX1f_pprt",nx,ny,nz,1,0)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
div(i,j,k)=pprt(i,j,k)-cdvdmph*div(i,j,k)
tem1(i,j,k)=div(i,j,k)*j3(i,j,k)
END DO
END DO
END DO
!call test_dump (pprt,"XXXf_pprt",nx,ny,nz,1,0)
!call test_dump (div,"XXXf_div",nx,ny,nz,1,0)
!call test_dump (tem1,"XXXf_tem1",nx,ny,nz,1,0)
!-----------------------------------------------------------------------
!
! d(j3*pprt)/dx at u point - 1st component of p grad. force in x-dir
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=1,ny-1
DO i=2,nx-1
upgrad(i,j,k)=dxinv*(tem1(i,j,k)-tem1(i-1,j,k))
END DO
END DO
END DO
!call test_dump (upgrad,"XXXf_upgrad",nx,ny,nz,1,0)
!-----------------------------------------------------------------------
!
! d(j3*pprt)/dy at v point - 1st component of p grad. force in y-dir
!
!-----------------------------------------------------------------------
DO k=1,nz-1
DO j=2,ny-1
DO i=1,nx-1
vpgrad(i,j,k)=dyinv*(tem1(i,j,k)-tem1(i,j-1,k))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! If there is no terrain, i.e. the ground is flat, skip the
! following calculations.
!
!-----------------------------------------------------------------------
IF( ternopt /= 0 ) THEN
!-----------------------------------------------------------------------
!
! d(j1*pprt)/dz at u point - 2nd component of p grad. force in x-dir
! due to terrain
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem2(i,j,k)= j1(i,j,k)* &
0.25*((div(i-1,j,k-1)+div(i,j,k-1)) &
+(div(i-1,j,k) +div(i,j,k)))
END DO
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
upgrad(i,j,k)=upgrad(i,j,k)+ &
dzinv*(tem2(i,j,k+1)-tem2(i,j,k))
END DO
END DO
END DO
!call test_dump (upgrad,"XXX1f_upgrad",nx,ny,nz,1,0)
!-----------------------------------------------------------------------
!
! d(j2*pprt)/dz at v point - 2nd component of p grad. force in y-dir
! due to terrain
!
!-----------------------------------------------------------------------
DO k=2,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem2(i,j,k)= j2(i,j,k)* &
0.25*((div(i,j-1,k-1)+div(i,j,k-1)) &
+(div(i,j-1,k) +div(i,j,k)))
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vpgrad(i,j,k)=vpgrad(i,j,k)+ &
dzinv*(tem2(i,j,k+1)-tem2(i,j,k))
END DO
END DO
END DO
END IF
IF( lvldbg >= 5) THEN
CALL checkuhx
(upgrad, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'upgrdx', tem2)
CALL checkuhy
(upgrad, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'upgrdy', tem2)
CALL checkvhx
(vpgrad, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vpgrdx', tem2)
CALL checkvhy
(vpgrad, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vpgrdy', tem2)
END IF
RETURN
END SUBROUTINE pgrad
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE UVWRHO ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE uvwrho(nx,ny,nz,u,v,wcont,rhostr, & 3,1
ustr,vstr,wstr)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Compute ustr=u*rhostr, vstr=v*rhostr, wstr=wcont*rhostr.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91.
!
! MODIFICATION HISTORY:
!
! 5/05/92 (M. Xue)
! Added full documentation.
!
! 9/10/94 (D. Weber & 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
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! wcont Contravariant vertical velocity (m/s)
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! OUTPUT:
!
! ustr u * rhostr at u-point
! vstr v * rhostr at v-point
! wstr wcont * rhostr at w-point
!
! WORK ARRAYS:
!
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! 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 :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: ustr (nx,ny,nz) ! u * rhostr
REAL :: vstr (nx,ny,nz) ! v * rhostr
REAL :: wstr (nx,ny,nz) ! wcont * rhostr
INTEGER :: i,j,k
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Calculate ustr=rhostr*u, vstr=rhostr*v, wstr=rhostr*wcont
!
!-----------------------------------------------------------------------
!
CALL rhouvw
(nx,ny,nz,rhostr,ustr,vstr,wstr)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
ustr(i,j,k)=u(i,j,k)*ustr(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
vstr(i,j,k)=v(i,j,k)*vstr(i,j,k)
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
wstr(i,j,k)=wcont(i,j,k)*wstr(i,j,k)
END DO
END DO
END DO
RETURN
END SUBROUTINE uvwrho
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE RHOUVW ######
!###### ######
!###### Developed by ######
!###### Center for the Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE rhouvw(nx,ny,nz,rhostr,rhostru,rhostrv,rhostrw) 17,3
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate rhostr averaged to u, v, and w points.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue & Hao Jin
! 3/8/1993.
!
! MODIFICATION HISTORY:
!
! 9/10/94 (D. Weber & 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
!
! rhostr j3 times base state density rhobar(kg/m**3).
!
! OUTPUT:
!
! rhostru Average rhostr at u points (kg/m**3).
! rhostrv Average rhostr at v points (kg/m**3).
! rhostrw Average rhostr at w points (kg/m**3).
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! The number of grid points in 3
! directions
REAL :: rhostr(nx,ny,nz) ! j3 times base state density rhobar
! (kg/m**3).
REAL :: rhostru(nx,ny,nz) ! Average rhostr at u points (kg/m**3).
REAL :: rhostrv(nx,ny,nz) ! Average rhostr at v points (kg/m**3).
REAL :: rhostrw(nx,ny,nz) ! Average rhostr at w points (kg/m**3).
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
CALL avgsu
(rhostr,nx,ny,nz, 1,ny-1, 1,nz-1, rhostru, rhostrw)
! rhostrw used here as a temporary array
!call test_dump (rhostr,"XXXbavgsv_rhostr",nx,ny,nz,0,1)
CALL avgsv
(rhostr,nx,ny,nz, 1,nx-1, 1,nz-1, rhostrv, rhostrw)
! rhostrw used here as a temporary array
CALL avgsw
(rhostr,nx,ny,nz, 1,nx-1, 1,ny-1, rhostrw)
RETURN
END SUBROUTINE rhouvw
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MAPTRM ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE maptrm( nx,ny,nz, u, v, ustr,vstr, mapfct, & 1
uforce, vforce, tem1,tem2,tem3 )
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the term caused by inhomogeneous map factor in the
! advection terms of u and v.
!
! mpuadv = avgx( avgy(v*)
! * (avgy(v)*difx(mapfct_u)-avgx(u)*dify(mapfct_v)) )
!
! mpvadv = avgy( avgx(u*)
! * (avgy(v)*difx(mapfct_u)-avgx(u)*dify(mapfct_v)) )
!
! where mapfct_u is the mapfct at u points and mapfct_v at v points.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Donghai Wang, Yuhe Liu and Ming Xue
! 01/30/96
!
! MODIFICATION HISTORY:
!
! 11/06/97 (D. Weber)
! Added three additional levels to the mapfct array. The three
! levels (4,5,6) represent the inverse of the first three in order.
! The inverse map factors are computed to improve efficiency.
!
! 9/14/98 (D. Weber)
! Removed operators and merged loops and included the results into
! the forcing arrays.
!
!c#######################################################################
!
! 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
!
! mapfct Map factors at scalar, u and v points
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! ustr u*rhostr
! vstr v*rhostr
!
! OUTPUT:
!
! uforce Acoustically inactive forcing terms in u-momentum
! equation (kg/(m*s)**2).
! vforce Acoustically inactive forcing terms in v-momentum
! equation (kg/(m*s)**2).
!
! 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 :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: ustr (nx,ny,nz) ! u * rhostr
REAL :: vstr (nx,ny,nz) ! v * rhostr
REAL :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in u-momentum equation (kg/(m*s)**2)
REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in v-momentum equation (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
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: onvf
REAL :: tema
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid parameters
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Calculate avgy(v)*difx(mapfct_u) and store it to tem3
!
!-----------------------------------------------------------------------
tema = 0.5*dxinv
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k) = tema*(v(i,j+1,k)+v(i,j,k))* &
(mapfct(i+1,j,2)-mapfct(i,j,2))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem3 contains avgy(v)*difx(mapfct_u)
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Calculate avgx(u)*dify(mapfct_v) and substract it from tem3
!
!-----------------------------------------------------------------------
tema = 0.5*dyinv
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k) = tem3(i,j,k) - tema*(u(i+1,j,k)+u(i,j,k))* &
(mapfct(i,j+1,3)-mapfct(i,j,3))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! At this point tem3 contains
!
! avgy(v)*difx(mapfct_u) - avgx(u)*dify(mapfct_v)
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Calculate avgsu(avgy(v*))*tem3 and subtract from uforce.
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k) = tem3(i,j,k)*0.5*(vstr(i,j+1,k)+vstr(i,j,k))
END DO
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
uforce(i,j,k) = uforce(i,j,k) - 0.5*(tem2(i,j,k)+tem2(i-1,j,k))
END DO
END DO
END DO
!-----------------------------------------------------------------------
!
! Calculate avgsv(avgx(u*))*tem3 and add to vforce.
!
!-----------------------------------------------------------------------
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k) = tem3(i,j,k)*0.5*(ustr(i+1,j,k)+ustr(i,j,k))
END DO
END DO
END DO
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
vforce(i,j,k) = vforce(i,j,k)+0.5*(tem2(i,j-1,k)+tem2(i,j,k))
END DO
END DO
END DO
RETURN
END SUBROUTINE maptrm
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE RHOFACTOR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE rhofactor(nx,ny,nz,ptprt,pprt,qv,qc,qr,qi,qs,qh, & 1
ptbar,pbar,ptbari,pbari,qvbar,rhofct,tem1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the rho-factor term: rhobar/rho to correct the
! calculation of the pressure gradient force terms
!
!-----------------------------------------------------------------------
!
! AUTHOR: Donghai Wang
! 05/26/97.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! 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 direction.
!
! ptprt Perturbation potential temperature at a time level (K)
! pprt Perturbation pressure at a given time level (Pascal)
! qv Water vapor specific humidity at a given time level
! (kg/kg)
! qc Cloud water mixing ratio at a given time level (kg/kg)
! qr Rainwater mixing ratio at a given time level (kg/kg)
! qi Cloud ice mixing ratio at a given time level (kg/kg)
! qs Snow mixing ratio at a given time level (kg/kg)
! qh Hail mixing ratio at a given time level (kg/kg)
!
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! ptbari Inverse Base state pot. temperature (K)
! pbari Inverse Base state pressure (Pascal)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! OUTPUT:
!
! rhofct the factor at scalar point
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! rhofct Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature
! at a given time level (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure at a given time
! level (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 :: pbari (nx,ny,nz) ! Inverse Base state pressure (Pascal).
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity(kg/kg)
REAL :: rhofct(nx,ny,nz) !
REAL :: tem1 (nx,ny,nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: pttem,ptem,tema
INTEGER :: i,j,k
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global model control parameters
INCLUDE 'phycst.inc' ! Physical constants
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
!
! rhofct = rhobar/rho
! = 1.0/(1.0-B/g)
! = 1.0/(1.0-tem1)
!
! where B/g = ptprt/ptbar-pprt/(cpdcv*pbar)+ !1st-order
! qvprt/(rddrv+qvbar)-(qvprt+qc+qr+qs+qi+qh)/(1+qvbar(i,j,k)) !1st-order
! -(ptprt*ptprt)/(ptbar*ptbar)-1.0/(2.0*cpdcv)*(1.0/cpdcv-1.0)!2nd-order
! *(pprt*pprt)/(pbar*pbar)+(ptprt*pprt)/(2.0*cpdcv*ptbar*pbar)!2nd-order
!
! B is the buoyancy term,
! and rddrv=rd/rv,cpdcv=cp/cv, cp, cv, rd and rv are defined
! in phycst.inc.
!
!-----------------------------------------------------------------------
!
tema = 1.0/cpdcv
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
pttem = ptprt(i,j,k)*ptbari(i,j,k)
ptem = pprt(i,j,k)*tema*pbari(i,j,k)
tem1(i,j,k) = pttem-pttem*pttem &
-ptem-0.5*(1.0-cpdcv)*ptem*ptem &
+0.5*pttem*ptem
END DO
END DO
END DO
!call test_dump2(tem1,"XXX2rhofactor_tem1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(ptprt,"XXX2rhofactor_ptprt",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(ptbari,"XXX2rhofactor_ptbari",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(pprt,"XXX2rhofactor_pprt",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(pbari,"XXX2rhofactor_pbari",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!
!-----------------------------------------------------------------------
!
! Add on the contributions to the term from the water vapor
! content and the liquid and ice water loading.
!
!-----------------------------------------------------------------------
!
IF( moist == 1 .AND. ice == 0 ) THEN ! Moist case, no ice.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = tem1(i,j,k) &
+ (qv(i,j,k) - qvbar(i,j,k))/(rddrv + qvbar(i,j,k)) &
- (qv(i,j,k) - qvbar(i,j,k) + qc(i,j,k) + qr(i,j,k)) &
/(1 + qvbar(i,j,k))
END DO
END DO
END DO
!call test_dump2(tem1,"XXX1rhofactor_tem1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
ELSE IF(moist == 1 .AND. ice == 1) THEN
! Full microphysics case, loading
! of liquid and ice water.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = tem1(i,j,k) &
+ (qv(i,j,k) - qvbar(i,j,k))/(rddrv + qvbar(i,j,k)) &
- (qv(i,j,k) - qvbar(i,j,k) + qc(i,j,k) + qr(i,j,k) + &
qs(i,j,k) + qi(i,j,k) + qh(i,j,k))/(1 + qvbar(i,j,k))
END DO
END DO
END DO
!call test_dump2(tem1,"XXXrhofactor_tem1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qv,"XXXrhofactor_qv",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qvbar,"XXXrhofactor_qvbar",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qc,"XXXrhofactor_qc",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr,"XXXrhofactor_qr",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qs,"XXXrhofactor_qs",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qi,"XXXrhofactor_qi",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qh,"XXXrhofactor_qh",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
END IF
!
!-----------------------------------------------------------------------
!
!
! rhofct = 1.0/(1.0-B/g), B is the buoyancy, tem1=B/g
!
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rhofct(i,j,k)=1.0/(1.0-tem1(i,j,k))
END DO
END DO
END DO
RETURN
END SUBROUTINE rhofactor