!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MICROPH_NEM ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE microph_nem(nx,ny,nz, dtbig1, & 1,27
t,p,qv,qc,qr,qi,qs,qh,raing,prcrate, &
rhostr,pbar,ptbar,ppi,j3,j3inv, &
rho,rsat,rliq,rice,x,t1, &
change,rate,maxmelt,rp_nuc, &
needi,needr,needs,tvq,tem15,tem16)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Paul Schultz's (FSL) Ice microphysics scheme. Contains
! equations for water vapor, cloud water, rain water, ice,
! snow, and hail. The scheme is based on:
!
! Schultz, P., 1995: An Explicit Cloud Physics Parameterization
! for Operational Numerical Weather Prediction. Monthly Weather
! Review, 123, 3331-3343.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Jason J. Levit
! 10/01/1996.
!
! MODIFICATION HISTORY:
!
! 02/19/97 (J. Levit)
! A major bug was found in the diffusional crystal growth
! equation. The conversion parameter 'c2p' should have been
! 'v2p'.
!
! 01/27/97 (J. Levit)
! Added a variable 'delt', which is equal to 2.0*dtbig1, to fix
! a bug associated with the temporal finite differencing in some of
! the subroutines. Also, uncommented out the code which allows
! riming to occur.
! Cleaned up some more of the code and documentation.
!
! 12/09/1996 (J. Levit)
! Added some extra code at the end of the subroutine to
! account for generation of negative values in the precipitation
! fields. The terminal velocity (tqv) was set equal to
! zero before calculation, and a DO LOOP was added to
! take only the positive values of the precipitation fields
! once the fallout was calculated.
!
! 11/15/1996 (J. Levit)
! Completed conversion from RAMS code into ARPS format.
! Cleaned up code and documentation.
!
! 07/10/1997 (Fanyou Kong)
! Include MPDCD advection option (sadvopt = 5)
!
!-----------------------------------------------------------------------
!
! 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 Big time step size (s)
! ptprt Perturbation potential temperature at all time levels (K)
! pprt Perturbation pressure at all time levels (Pascal)
! qv Water vapor specific humidity at all time levels (kg/kg)
! qc Cloud water mixing ratio at all time levels (kg/kg)
! qr Rainwater mixing ratio at all time levels (kg/kg)
! qi Cloud ice mixing ratio at all time levels (kg/kg)
! qs Snow mixing ratio at all time levels (kg/kg)
! qh Hail mixing ratio at all time levels (kg/kg)
! raing Accumulated grid-scale rainfall (mm)
!
! rhostr Base state air density times j3 (kg/m**3)
! pbar Base state pressure (Pascal)
! ptbar Base state potential temperature (K)
! ppi Exner function of pressure
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! OUTPUT:
!
! ptprt Perturbation potential temperature at time tfuture (K)
! pprt Perturbation pressure at time tfuture (Pascal)
! qv Water vapor specific humidity at time tfuture (kg/kg)
! qc Cloud water mixing ratio at time tfuture (kg/kg)
! qr Rainwater mixing ratio at time tfuture (kg/kg)
! qi Cloud ice mixing ratio at time tfuture (kg/kg)
! qs Snow mixing ratio at time tfuture (kg/kg)
! qh Hail mixing ratio at time tfuture (kg/kg)
! raing Accumulated grid-scale rainfall (mm)
! prcrate Precipitation rate (kg/(m**2*s))
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER :: nt ! The no. of t-levels of t-dependent arrays.
INTEGER :: tpast ! Index of time level for the past time.
INTEGER :: tpresent ! Index of time level for the present time.
INTEGER :: tfuture ! Index of time level for the future time.
PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3)
!
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
!
REAL :: dtbig1 ! Big time step size (s)
REAL :: t (nx,ny,nz,nt) ! Perturbation potential temperature (K)
REAL :: p (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) ! Rainwater 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 :: raing (nx,ny) ! Accumulated grid-scale rainfall (mm)
REAL :: prcrate(nx,ny) ! Precipitation rate (kg/(m**2*s))
REAL :: rhostr(nx,ny,nz) ! Base state air density times j3 (kg/m**3)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: ppi (nx,ny,nz) ! Exner function.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian defined as
! d( zp )/d( z ).
REAL :: j3inv (nx,ny,nz) ! Coordinate transformation Jacobian defined as
! d( zp )/d( z ).
!
!-----------------------------------------------------------------------
!
! Temporary arrays
!
!-----------------------------------------------------------------------
!
REAL :: rho(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: rsat (nx,ny,nz) ! Temporary work array
REAL :: rliq (nx,ny,nz) ! Temporary work array
REAL :: rice (nx,ny,nz) ! Temporary work array
REAL :: x (nx,ny,nz) ! Temporary work array
REAL :: t1 (nx,ny,nz) ! Temporary work array
REAL :: change (nx,ny,nz) ! Temporary work array
REAL :: rate (nx,ny,nz) ! Temporary work array
REAL :: maxmelt (nx,ny,nz) ! Temporary work array
REAL :: rp_nuc (nx,ny,nz) ! Temporary work array
REAL :: needi (nx,ny,nz) ! Temporary work array
REAL :: needr (nx,ny,nz) ! Temporary work array
REAL :: needs (nx,ny,nz) ! Temporary work array
REAL :: tvq (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 ! Temporary variable
REAL :: denwater,tema,tem ! Temporary variable
REAL :: delt ! Temporary variable
REAL :: eff ! Temporary variable
REAL :: err_num,err_den,dr ! Temporary variable
INTEGER :: lvlq ! Temporayr variable
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'nemcst.inc'
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
!
!-----------------------------------------------------------------------
!
! Function f_qvsatl, f_qvsati, f_desdtl, and f_desdti, and inline
! directive for Cray PVP
!
!-----------------------------------------------------------------------
!
REAL :: f_qvsatl, f_qvsati, f_desdtl, f_desdti
!fpp$ expand (f_qvsatl)
!fpp$ expand (f_qvsati)
!fpp$ expand (f_desdtl)
!fpp$ expand (f_desdti)
!dir$ inline always f_qvsatl, f_qvsati, f_desdtl, f_desdti
!*$* inline routine (f_qvsatl, f_qvsati, f_desdtl, f_desdti)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
lvlq=3
!C IF( sadvopt.ge.1.and.sadvopt.le.3) THEN ! Leapfrog scheme
IF( sadvopt /= 4) THEN ! Leapfrog scheme
delt = 2*dtbig1
ELSE ! Forward scheme
delt = dtbig1
END IF
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qv(i,j,k,lvlq)=MAX(0.0,qv(i,j,k,lvlq))
qc(i,j,k,lvlq)=MAX(0.0,qc(i,j,k,lvlq))
qr(i,j,k,lvlq)=MAX(0.0,qr(i,j,k,lvlq))
qi(i,j,k,lvlq)=MAX(0.0,qi(i,j,k,lvlq))
qs(i,j,k,lvlq)=MAX(0.0,qs(i,j,k,lvlq))
qh(i,j,k,lvlq)=MAX(0.0,qh(i,j,k,lvlq))
t(i,j,k,lvlq)=(t(i,j,k,lvlq)+ptbar(i,j,k))*ppi(i,j,k)
p(i,j,k,lvlq)=(p(i,j,k,lvlq)+pbar(i,j,k))
rho(i,j,k)=rhostr(i,j,k)*j3inv(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Nothing in this routine can change the quantities til, which is
! the temperature with corrections for latent heating by ice and
! liquid, and rtot. til is similar to theta-il of Tripoli and
! Cotton (1981 MWR). These are checked at the end.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rliq(i,j,k) = qc(i,j,k,lvlq) + qr(i,j,k,lvlq)
rice(i,j,k) = qi(i,j,k,lvlq) + qs(i,j,k,lvlq) + qh(i,j,k,lvlq)
END DO
END DO
END DO
! rtot0 = qv(i,j,k,lvlq) + rliq(i,j,k) + rice(i,j,k)
! til0 = t - (Lvl*rliq(i,j,k)+Lvi*rice(i,j,k))/cp
!
!-----------------------------------------------------------------------
!
! Condensation and evaporation of liquid. Cloud liquid is assumed
! to occur instantaneously. Evaporation of rain is as in Dudhia
! and Moncrieff (JAS 89). No condensational growth of rain.
!
! The evaporation process eats up liquid before ice, and small
! particles before large, so the order is cloud liquid, rain,
! pristine crystals, snow, and finally ice.
!
!-----------------------------------------------------------------------
!
! write (*,*) "ZUWEN subsatopt/rhsat", subsatopt, rhsat
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t(i,j,k,lvlq) )
IF ( .NOT. (rliq(i,j,k) == 0. .AND. &
qv(i,j,k,lvlq) < rsat(i,j,k)) ) THEN
! Call SatAdjL (qv(i,j,k,lvlq), p(i,j,k,lvlq), t(i,j,k,lvlq), rsat(i,j,k), t1)
t1(i,j,k) = t(i,j,k,lvlq)
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvl/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) & ! 1+Lv1/cp*d(qvs)/dt
* (rddrv+(1.-rddrv)*rsat(i,j,k)) &
* f_desdtl
(t1(i,j,k))
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvl/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) & ! 1+Lv1/cp*d(qvs)/dt
* (rddrv+(1.-rddrv)*rsat(i,j,k)) &
* f_desdtl
(t1(i,j,k))
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvl/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) & ! 1+Lv1/cp*d(qvs)/dt
* (rddrv+(1.-rddrv)*rsat(i,j,k)) &
* f_desdtl
(t1(i,j,k))
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) + (qv(i,j,k,lvlq)-rsat(i,j,k))
IF (qc(i,j,k,lvlq) > 0.) THEN
qv(i,j,k,lvlq) = rsat(i,j,k)
t(i,j,k,lvlq) = t1(i,j,k)
ELSE ! evaporation of cloud liquid, then rain
qv(i,j,k,lvlq) = rsat(i,j,k) + qc(i,j,k,lvlq)
qc(i,j,k,lvlq) = 0.
IF (qr(i,j,k,lvlq) > 0. .AND. qv(i,j,k,lvlq) < rsat(i,j,k)) THEN
rate(i,j,k) = r2v * (rsat(i,j,k)-qv(i,j,k,lvlq))
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > (rsat(i,j,k)-qv(i,j,k,lvlq))) &
change(i,j,k)=(rsat(i,j,k)-qv(i,j,k,lvlq))
IF (change(i,j,k) > qr(i,j,k,lvlq)) THEN
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + qr(i,j,k,lvlq)
qr(i,j,k,lvlq) = 0.
ELSE
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + change(i,j,k)
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
x(i,j,k) = qr(i,j,k,lvlq) - rliq(i,j,k)
t(i,j,k,lvlq) = t(i,j,k,lvlq) + x(i,j,k)*lvl/cp
END IF
rliq(i,j,k) = qc(i,j,k,lvlq) + qr(i,j,k,lvlq)
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Ice growth and evaporation. Ice nucleation is more a function of
! supersaturation than temperature (the same is true of diffusional
! ice crystal growth). In the presence of cloud water, ice
! supersaturation is greatest at -12C, and actually decreases at
! very cold temperatures.
!
! Ice nucleation generates ice mass much slower than diffusional
! growth, so we don't compute that function it if there's any cloud
! ice present. Also, no nucleation in the absence of cloud water.
!
! The diffusion from vapor to pristine crystals is proportional to
! the vapor excess and is a function of the crystal mass already
! there. In the presence of cloud water, the excess is .17 g/kg
! at 1000 mb and .85 g/kg at 200 mb. This is a supersaturation of
! 12.4% at -12 C, the temperature at which the difference is
! greatest.
!
! Diffusional growth of snow is not allowed at this time. The
! water mass will get there anyway via crystal growth and
! collection.
!
! If the vapor transfer should be independent of pressure, the
! equation should be rate(i,j,k) = V2P * (rho*(rv-rsat)) * (rho*rp)]
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rsat(i,j,k) = rhsat*f_qvsati
( p(i,j,k,lvlq), t(i,j,k,lvlq) )
IF (.NOT.(rice(i,j,k) == 0. .AND. qv(i,j,k,lvlq) < rsat(i,j,k))) THEN
! Call SatAdjI (qv(i,j,k,lvlq), p, t, rsat(i,j,k), t1(i,j,k))
t1(i,j,k) = t(i,j,k,lvlq)
rsat(i,j,k) = rhsat*f_qvsati
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvi/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) & ! 1+Lv1/cp*d(qvs)/dt
* (rddrv+(1.-rddrv)*rsat(i,j,k)) &
* f_desdti
(t1(i,j,k))
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsati
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvi/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) & ! 1+Lv1/cp*d(qvs)/dt
* (rddrv+(1.-rddrv)*rsat(i,j,k)) &
* f_desdti
(t1(i,j,k))
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsati
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvi/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) & ! 1+Lv1/cp*d(qvs)/dt
* (rddrv+(1.-rddrv)*rsat(i,j,k)) &
* f_desdti
(t1(i,j,k))
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsati
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
IF (qv(i,j,k,lvlq) > rsat(i,j,k)) THEN ! ice growth
IF (qc(i,j,k,lvlq) > 0. .AND. qi(i,j,k,lvlq) < 1E-6) THEN
! Call Nucleate_pristine (qv(i,j,k,lvlq), rsat(i,j,k),
! : t(i,j,k,lvlq), rho(i,j,k), rp_nuc(i,j,k))
rp_nuc(i,j,k) = 0.
IF (.NOT.(t(i,j,k,lvlq) > 268.)) THEN
IF (rp_nuc(i,j,k) > qi(i,j,k,lvlq)) THEN
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + qi(i,j,k,lvlq)
qi(i,j,k,lvlq) = rp_nuc(i,j,k)
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) - rp_nuc(i,j,k)
END IF
ELSE
rp_nuc(i,j,k) = 1E3 * EXP(-.639+12.96*(qv(i,j,k,lvlq) &
/ rsat(i,j,k)-1.)) &
* pmas / rho(i,j,k)
IF (rp_nuc(i,j,k) > (qv(i,j,k,lvlq)-rsat(i,j,k))/2.) &
rp_nuc(i,j,k) = (qv(i,j,k,lvlq)-rsat(i,j,k))/2.
IF (rp_nuc(i,j,k) > qi(i,j,k,lvlq)) THEN
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + qi(i,j,k,lvlq)
qi(i,j,k,lvlq) = rp_nuc(i,j,k)
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) - rp_nuc(i,j,k)
END IF
END IF
END IF
IF (qi(i,j,k,lvlq) > 0. .AND. qv(i,j,k,lvlq) > rsat(i,j,k)) THEN
rate(i,j,k) = v2p*(qv(i,j,k,lvlq)-rsat(i,j,k)) * &
(qi(i,j,k,lvlq)*rho(i,j,k))
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > (qv(i,j,k,lvlq)-rsat(i,j,k))) &
change(i,j,k)=(qv(i,j,k,lvlq)-rsat(i,j,k))
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) + change(i,j,k)
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) - change(i,j,k)
END IF
ELSE ! ice evaporation
!
!-----------------------------------------------------------------------
!
! Pristine crystals. Might make this instantaneous.
!
!-----------------------------------------------------------------------
!
IF (qi(i,j,k,lvlq) > 0. .AND. qv(i,j,k,lvlq) < rsat(i,j,k)) THEN
rate(i,j,k) = p2v * (rsat(i,j,k)-qv(i,j,k,lvlq))
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > (rsat(i,j,k)-qv(i,j,k,lvlq))) &
change(i,j,k)=(rsat(i,j,k)-qv(i,j,k,lvlq))
IF (change(i,j,k) > qi(i,j,k,lvlq)) THEN
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + qi(i,j,k,lvlq)
qi(i,j,k,lvlq) = 0.
ELSE
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + change(i,j,k)
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Then snow.
!
!-----------------------------------------------------------------------
!
IF (qs(i,j,k,lvlq) > 0. .AND. qv(i,j,k,lvlq) < rsat(i,j,k)) THEN
rate(i,j,k) = s2v * (rsat(i,j,k)-qv(i,j,k,lvlq))
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > (rsat(i,j,k)-qv(i,j,k,lvlq))) &
change(i,j,k)=(rsat(i,j,k)-qv(i,j,k,lvlq))
IF (change(i,j,k) > qs(i,j,k,lvlq)) THEN
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + qs(i,j,k,lvlq)
qs(i,j,k,lvlq) = 0.
ELSE
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + change(i,j,k)
qs(i,j,k,lvlq) = qs(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! And finally ice. It might be argued that graupel and hail
! can be water-coated and thus evaporate wrt liquid
! saturation (i.e., faster).
!
!-----------------------------------------------------------------------
!
IF (qh(i,j,k,lvlq) > 0. .AND. qv(i,j,k,lvlq) < rsat(i,j,k)) THEN
rate(i,j,k) = i2v * (rsat(i,j,k)-qv(i,j,k,lvlq))
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > (rsat(i,j,k)-qv(i,j,k,lvlq))) &
change(i,j,k)=(rsat(i,j,k)-qv(i,j,k,lvlq))
IF (change(i,j,k) > qh(i,j,k,lvlq)) THEN
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + qh(i,j,k,lvlq)
qh(i,j,k,lvlq) = 0.
ELSE
qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + change(i,j,k)
qh(i,j,k,lvlq) = qh(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
END IF
x(i,j,k) = (qi(i,j,k,lvlq) + qs(i,j,k,lvlq) + &
qh(i,j,k,lvlq)) - rice(i,j,k)
t(i,j,k,lvlq) = t(i,j,k,lvlq) + x(i,j,k)*lvi/cp
rice(i,j,k) = qi(i,j,k,lvlq) + &
qs(i,j,k,lvlq) + qh(i,j,k,lvlq)
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! MELTING AND FREEZING.
! Melting first. Cloud ice melts before snow, but they both melt
! immediately. Cloud ice melts into cloud liquid. Snow melts into
! rain. Ice also melts into rain, but not immediately. In all
! cases, the amount of melting is limited to the amount it takes to
! cool the parcel to the freezing point. It works out to about
! 3 g/kg per centigrade degree. Start by calculating
! the maximum amount of melting possible in this time step.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF (t(i,j,k,lvlq) > 273.1) THEN
maxmelt(i,j,k) = (t(i,j,k,lvlq)-273.1) * cp/lli
IF (qi(i,j,k,lvlq) > 0.) THEN
IF (maxmelt(i,j,k) < qi(i,j,k,lvlq)) THEN
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) + maxmelt(i,j,k)
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) - maxmelt(i,j,k)
GO TO 501
ELSE
maxmelt(i,j,k) = maxmelt(i,j,k) - qi(i,j,k,lvlq)
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) + qi(i,j,k,lvlq)
qi(i,j,k,lvlq) = 0.
END IF
END IF
IF (qs(i,j,k,lvlq) > 0.) THEN
IF (maxmelt(i,j,k) < qs(i,j,k,lvlq)) THEN
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + maxmelt(i,j,k)
qs(i,j,k,lvlq) = qs(i,j,k,lvlq) - maxmelt(i,j,k)
GO TO 501
ELSE
maxmelt(i,j,k) = maxmelt(i,j,k) - qs(i,j,k,lvlq)
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + qs(i,j,k,lvlq)
qs(i,j,k,lvlq) = 0.
END IF
END IF
IF (qh(i,j,k,lvlq) > 0.) THEN
rate(i,j,k) = i2r * (t(i,j,k,lvlq)-273.1)/5.
change(i,j,k) = rate(i,j,k)*delt
IF (change(i,j,k) > maxmelt(i,j,k)) change(i,j,k)=maxmelt(i,j,k)
IF (change(i,j,k) < qh(i,j,k,lvlq)) THEN
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + change(i,j,k)
qh(i,j,k,lvlq) = qh(i,j,k,lvlq) - change(i,j,k)
ELSE
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + qh(i,j,k,lvlq)
qh(i,j,k,lvlq) = 0.
END IF
END IF
501 CONTINUE
!
!-----------------------------------------------------------------------
!
! Now freezing. First the cloud liquid, then the rain.
!
!-----------------------------------------------------------------------
!
ELSE
!
!-----------------------------------------------------------------------
!
! Cloud water stays supercooled well below freezing, but how much?
! This is just freezing because it's cold. There is very little
! cloud water below -25C, and almost none observed below -40C.
! Ramp parabolically from -20 to -40.
!
!-----------------------------------------------------------------------
!
IF (qc(i,j,k,lvlq) > 0. .AND. t(i,j,k,lvlq) < 253.) THEN
rate(i,j,k) = c2p * ((253.-t(i,j,k,lvlq))/20.)**2
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > qc(i,j,k,lvlq)) THEN
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) + qc(i,j,k,lvlq)
qc(i,j,k,lvlq) = 0.
ELSE
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) + change(i,j,k)
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Rain freezing into ice; parabolic function similar to C2P.
! Based loosely on Fig.1 from Cotton (MWR 72b).
!
!-----------------------------------------------------------------------
!
IF (qr(i,j,k,lvlq) > 0. .AND. t(i,j,k,lvlq) < 267.) THEN
rate(i,j,k) = r2i * ((267.-t(i,j,k,lvlq))/14.)**2
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > qr(i,j,k,lvlq)) THEN
qh(i,j,k,lvlq) = qh(i,j,k,lvlq) + qr(i,j,k,lvlq)
qr(i,j,k,lvlq) = 0.
ELSE
qh(i,j,k,lvlq) = qh(i,j,k,lvlq) + change(i,j,k)
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Temperature after freezing or melting.
! This should give the same answer.
! x = (qi(i,j,k,lvlq) + qs(i,j,k,lvlq) + qh(i,j,k,lvlq)) -
! : rice(i,j,k)
! t = t + x*Lli/cp
!
!-----------------------------------------------------------------------
!
x(i,j,k) = (qc(i,j,k,lvlq) + qr(i,j,k,lvlq)) - rliq(i,j,k)
t(i,j,k,lvlq) = t(i,j,k,lvlq) - x(i,j,k)*lli/cp
rliq(i,j,k) = qc(i,j,k,lvlq) + qr(i,j,k,lvlq)
rice(i,j,k) = qi(i,j,k,lvlq) + qs(i,j,k,lvlq) + qh(i,j,k,lvlq)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! COLLECTION. These processes are determined by spacing between
! particles regardless of how much gas is also in the volume. So
! we'll first convert to specific contents, and then later back to
! mixing ratios.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) * rho(i,j,k)
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) * rho(i,j,k)
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) * rho(i,j,k)
qs(i,j,k,lvlq) = qs(i,j,k,lvlq) * rho(i,j,k)
qh(i,j,k,lvlq) = qh(i,j,k,lvlq) * rho(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Autoconversion. As soon as you build up enough cloud matter, it
! starts converting to rain or snow. This "nucleates" the
! collection process, which is nonlinear. The nucleated amount
! determines how long before rapid collection occurs.
! If some precipitate is already present, the autoconv procedure
! just makes sure there's enough.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF (qc(i,j,k,lvlq) > qcmin) THEN
change(i,j,k) = qc(i,j,k,lvlq) - qcmin
IF (change(i,j,k) > qr(i,j,k,lvlq)) THEN
change(i,j,k) = change(i,j,k) - qr(i,j,k,lvlq)
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + change(i,j,k)
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF (qi(i,j,k,lvlq) > qpmin) THEN
change(i,j,k) = qi(i,j,k,lvlq) - qpmin
IF (change(i,j,k) > qs(i,j,k,lvlq)) THEN
change(i,j,k) = change(i,j,k) - qs(i,j,k,lvlq)
qs(i,j,k,lvlq) = qs(i,j,k,lvlq) + change(i,j,k)
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! There can be a three-way competition for cloud water among the
! rain, snow, and ice, so we distribute it into the three
! categories. The "need" variables are the amount of cloud water
! that process would use up in a time step if it didn't have to
! compete. The collection formula for rain is very nearly the same
! as Soong and Ogura (1973); the other functions are based on that.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF (qc(i,j,k,lvlq) > 0.) THEN
rate(i,j,k) = c2r * qc(i,j,k,lvlq) * qr(i,j,k,lvlq)
needr(i,j,k) = rate(i,j,k)*delt
rate(i,j,k) = c2s * qc(i,j,k,lvlq) * qs(i,j,k,lvlq)
needs(i,j,k) = rate(i,j,k)*delt
rate(i,j,k) = c2i * qc(i,j,k,lvlq) * qh(i,j,k,lvlq)
needi(i,j,k) = rate(i,j,k)*delt
tem15(i,j,k) = needr(i,j,k) + needs(i,j,k) + needi(i,j,k)
IF (tem15(i,j,k) > qc(i,j,k,lvlq)) THEN
needr(i,j,k) = needr(i,j,k) * qc(i,j,k,lvlq) / tem15(i,j,k)
needs(i,j,k) = needs(i,j,k) * qc(i,j,k,lvlq) / tem15(i,j,k)
needi(i,j,k) = needi(i,j,k) * qc(i,j,k,lvlq) / tem15(i,j,k)
END IF
!
!-----------------------------------------------------------------------
!
! The riming process nucleates a little cloud ice. Until a better
! number comes along we'll say 1% of the collected liquid, both for
! snow and graupel.
!
!-----------------------------------------------------------------------
!
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) + .01*needs(i,j,k)
needs(i,j,k) = needs(i,j,k) - .01*needs(i,j,k)
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) + .01*needi(i,j,k)
needi(i,j,k) = needi(i,j,k) - .01*needi(i,j,k)
!
!-----------------------------------------------------------------------
!
! For simplicity (i.e., until a better way to do it comes along),
! we assume that the result of snow riming is to convert the
! cloud water, but not the snow, to the graupel category.
!
!-----------------------------------------------------------------------
!
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + needr(i,j,k)
qh(i,j,k,lvlq) = qh(i,j,k,lvlq) + needi(i,j,k) + needs(i,j,k)
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) - needr(i,j,k) - &
needs(i,j,k) - needi(i,j,k)
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Unlike the collection of cloud water, which can be complete, we
! don't want to zero out the pristine crystals. For one thing,
! some are so tiny they won't get collected, but also, we want to
! be able to produce more condensate if it still supersaturated wrt
! ice, which won't happen if there's zero cloud ice. We'll leave
! behind the equivalent of 100 per liter. At 1E-11 kg per crystal
! and 1000 liters per m**3, that would be 1E-6 kg/m**3 (1 mg/m**3).
! The temperature-dependent efficiency follows Lin et al (JCAM 83).
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF (qi(i,j,k,lvlq) > 0. .AND. qs(i,j,k,lvlq) > 0.) THEN
eff = 1. - (273.1-t(i,j,k,lvlq))/50.
rate(i,j,k) = p2s * eff * qi(i,j,k,lvlq) * qs(i,j,k,lvlq)
change(i,j,k) = rate(i,j,k) * delt
IF (change(i,j,k) > qi(i,j,k,lvlq)) THEN
qs(i,j,k,lvlq) = qs(i,j,k,lvlq) + qi(i,j,k,lvlq) - 1E-6
qi(i,j,k,lvlq) = 1E-6
ELSE
qs(i,j,k,lvlq) = qs(i,j,k,lvlq) + change(i,j,k)
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) - change(i,j,k)
END IF
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Convert back to mixing ratios.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) / rho(i,j,k)
qi(i,j,k,lvlq) = qi(i,j,k,lvlq) / rho(i,j,k)
qr(i,j,k,lvlq) = qr(i,j,k,lvlq) / rho(i,j,k)
qs(i,j,k,lvlq) = qs(i,j,k,lvlq) / rho(i,j,k)
qh(i,j,k,lvlq) = qh(i,j,k,lvlq) / rho(i,j,k)
!
!-----------------------------------------------------------------------
!
! Calculate temperature after phase change(i,j,k)s resulting from
! collection.
!
!-----------------------------------------------------------------------
!
x(i,j,k) = (qc(i,j,k,lvlq) + qr(i,j,k,lvlq)) - rliq(i,j,k)
t(i,j,k,lvlq) = t(i,j,k,lvlq) - x(i,j,k)*lli/cp
rliq(i,j,k) = qc(i,j,k,lvlq) + qr(i,j,k,lvlq)
rice(i,j,k) = qi(i,j,k,lvlq) + qs(i,j,k,lvlq) + qh(i,j,k,lvlq)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Now comes the final saturation adjustment, if necessary.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t(i,j,k,lvlq) )
IF (.NOT.(qc(i,j,k,lvlq) == 0. .AND. qv(i,j,k,lvlq) < rsat(i,j,k))) THEN
! Call SatAdjL (qv(i,j,k,lvlq), p, t, rsat(i,j,k), t1)
t1(i,j,k) = t(i,j,k,lvlq)
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvl/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) * f_desdtl
( t1(i,j,k) )
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvl/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) * f_desdtl
( t1(i,j,k) )
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
err_num = t1(i,j,k) - t(i,j,k,lvlq) - lvl/cp * dr
err_den = 1. + lvl/cp * rsat(i,j,k) * f_desdtl
( t1(i,j,k) )
t1(i,j,k) = t1(i,j,k) - err_num/err_den
rsat(i,j,k) = rhsat*f_qvsatl
( p(i,j,k,lvlq), t1(i,j,k) )
dr = qv(i,j,k,lvlq) - rsat(i,j,k)
qc(i,j,k,lvlq) = qc(i,j,k,lvlq) + (qv(i,j,k,lvlq)-rsat(i,j,k))
IF (qc(i,j,k,lvlq) > 0.) THEN
qv(i,j,k,lvlq) = rsat(i,j,k)
ELSE
qv(i,j,k,lvlq) = rsat(i,j,k) + qc(i,j,k,lvlq)
qc(i,j,k,lvlq) = 0.
END IF
x(i,j,k) = qc(i,j,k,lvlq) + qr(i,j,k,lvlq) - rliq(i,j,k)
t(i,j,k,lvlq) = t(i,j,k,lvlq) + x(i,j,k)*lvl/cp
rliq(i,j,k) = qc(i,j,k,lvlq) + qr(i,j,k,lvlq)
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Conservation checks.
!
!-----------------------------------------------------------------------
!
! rtot1(i,j,k) = qv(i,j,k,lvlq) + rliq(i,j,k) + rice(i,j,k)
! If (abs(rtot0-rtot1(i,j,k)).gt..000001) then
! print*, 'rtot check', rtot0, rtot1(i,j,k)
! print*, qv(i,j,k,lvlq), qc(i,j,k,lvlq), qr(i,j,k,lvlq), qi(i,j,k,lvlq), qs(i,j,k,lvlq), qh(i,j,k,lvlq)
! End if
! til1 = t - (Lvl*rliq(i,j,k)+Lvi*rice(i,j,k))/cp
! If (abs(til1-til0).gt..0001) then
! pqh(i,j,k,lvlq)nt*, 'til check', til0, til1
! End if
!
!-----------------------------------------------------------------------
!
! These terminal velocity formulations are similar in form to Ogura
! and Takahashi (1971). The curves for rain and snow were tweaked
! until they matched the curves on page 241 of Pielke's book (they
! are very, very close). The curve for ice is based on the curve
! for rain; the only difference is in the exponent. The effect is
! that small values of ice, presumed to be heavily-rimed snow, fall
! slower than rain of the same concentration, but higher values,
! presumed to be big graupel or hail, fall faster than rain. The
! transition is at 1 g/kg. The terminal velocity for pristine
! crystals does not have a dependency on mixing ratio like the
! others, because the others incorporate(i,j,k) the assumption that
! higher mixing ratios imply bigger particles, which fall faster,
! but that's not the case for pristine crystals.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
t(i,j,k,lvlq)=(t(i,j,k,lvlq)/ppi(i,j,k))-ptbar(i,j,k)
p(i,j,k,lvlq)=p(i,j,k,lvlq)-pbar(i,j,k)
qv(i,j,k,lvlq)=MAX(0.0,qv(i,j,k,lvlq))
qc(i,j,k,lvlq)=MAX(0.0,qc(i,j,k,lvlq))
qr(i,j,k,lvlq)=MAX(0.0,qr(i,j,k,lvlq))
qi(i,j,k,lvlq)=MAX(0.0,qi(i,j,k,lvlq))
qs(i,j,k,lvlq)=MAX(0.0,qs(i,j,k,lvlq))
qh(i,j,k,lvlq)=MAX(0.0,qh(i,j,k,lvlq))
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tvq(i,j,k)=0.0
IF (qi(i,j,k,lvlq) > 0.) tvq(i,j,k) = 0.5 * SQRT(1./rho(i,j,k))
END DO
END DO
END DO
CALL qfallout
(nx,ny,nz,dtbig1,qi,rho,j3,j3inv,tem15(1,1,1), &
tvq,tem16)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tvq(i,j,k)=0.0
IF (qr(i,j,k,lvlq) > 0.) tvq(i,j,k) = &
5.5 * (1000.*qr(i,j,k,lvlq))**.125 * SQRT(1./rho(i,j,k))
END DO
END DO
END DO
CALL qfallout
(nx,ny,nz,dtbig1,qr,rho,j3,j3inv,tem15(1,1,2), &
tvq,tem16)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tvq(i,j,k)=0.0
IF (qs(i,j,k,lvlq) > 0.) tvq(i,j,k) = &
2.0 * (1000.*qs(i,j,k,lvlq))**.100 * SQRT(1./rho(i,j,k))
END DO
END DO
END DO
CALL qfallout
(nx,ny,nz,dtbig1,qs,rho,j3,j3inv,tem15(1,1,3), &
tvq,tem16)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tvq(i,j,k)=0.0
IF (qh(i,j,k,lvlq) > 0.) tvq(i,j,k) = 5.5 * &
(1000.*qh(i,j,k,lvlq))**.333 * SQRT(1./rho(i,j,k))
END DO
END DO
END DO
CALL qfallout
(nx,ny,nz,dtbig1,qh,rho,j3,j3inv,tem15(1,1,4), &
tvq,tem16)
denwater = 1000.0 ! Density of liquid water (kg/m**3)
tem = denwater/(1000.0*dtbig1)
DO j=1,ny-1
DO i=1,nx-1
tema=tem15(i,j,2)+tem15(i,j,3)+tem15(i,j,4)
raing(i,j)=raing(i,j)+tema
prcrate(i,j) = tema*tem
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qr(i,j,k,lvlq)=MAX(0.0,qr(i,j,k,lvlq))
qi(i,j,k,lvlq)=MAX(0.0,qi(i,j,k,lvlq))
qs(i,j,k,lvlq)=MAX(0.0,qs(i,j,k,lvlq))
qh(i,j,k,lvlq)=MAX(0.0,qh(i,j,k,lvlq))
END DO
END DO
END DO
RETURN
END SUBROUTINE microph_nem