!WRF:MODEL_LAYER:PHYSICS
!
MODULE module_mp_lin 1
USE module_wrf_error
USE module_utility, ONLY: WRFU_Clock, WRFU_Alarm
USE module_domain
, ONLY : HISTORY_ALARM, Is_alarm_tstep
USE module_mp_radar
!
REAL , PARAMETER, PRIVATE :: RH = 1.0
! REAL , PARAMETER, PRIVATE :: episp0 = 0.622*611.21
REAL , PARAMETER, PRIVATE :: xnor = 8.0e6
REAL , PARAMETER, PRIVATE :: xnos = 3.0e6
! Lin
! REAL , PARAMETER, PRIVATE :: xnog = 4.0e4
! REAL , PARAMETER, PRIVATE :: rhograul = 917.
! Hobbs
REAL , PARAMETER, PRIVATE :: xnog = 4.0e6
REAL , PARAMETER, PRIVATE :: rhograul = 400.
!
REAL , PARAMETER, PRIVATE :: &
qi0 = 1.0e-3, ql0 = 7.0e-4, qs0 = 6.0E-4, &
xmi50 = 4.8e-10, xmi40 = 2.46e-10, &
constb = 0.8, constd = 0.25, &
o6 = 1./6., cdrag = 0.6, &
avisc = 1.49628e-6, adiffwv = 8.7602e-5, &
axka = 1.4132e3, di50 = 1.0e-4, xmi = 4.19e-13, &
cw = 4.187e3, vf1s = 0.78, vf2s = 0.31, &
xni0 = 1.0e-2, xmnin = 1.05e-18, bni = 0.5, &
ci = 2.093e3
CONTAINS
!-------------------------------------------------------------------
! Lin et al., 1983, JAM, 1065-1092, and
! Rutledge and Hobbs, 1984, JAS, 2949-2972
! May 2009 - Changes and corrections from P. Blossey (U. Washington)
!-------------------------------------------------------------------
SUBROUTINE lin_et_al(th & 1,2
,qv, ql, qr &
,qi, qs &
,rho, pii, p &
,dt_in &
,z,ht, dz8w &
,grav, cp, Rair, rvapor &
,XLS, XLV, XLF, rhowater, rhosnow &
,EP2,SVP1,SVP2,SVP3,SVPT0 &
, RAINNC, RAINNCV &
, SNOWNC, SNOWNCV &
, GRAUPELNC, GRAUPELNCV, SR &
,refl_10cm, diagflag, do_radar_ref &
,ids,ide, jds,jde, kds,kde &
,ims,ime, jms,jme, kms,kme &
,its,ite, jts,jte, kts,kte &
! Optional
,qlsink, precr, preci, precs, precg &
, F_QG,F_QNDROP &
, qg, qndrop &
)
!-------------------------------------------------------------------
IMPLICIT NONE
!-------------------------------------------------------------------
!
! Shuhua 12/17/99
!
INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
ims,ime, jms,jme, kms,kme , &
its,ite, jts,jte, kts,kte
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
INTENT(INOUT) :: &
th, &
qv, &
ql, &
qr
!
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
INTENT(IN ) :: &
rho, &
pii, &
p, &
dz8w
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
INTENT(IN ) :: z
REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: ht
REAL, INTENT(IN ) :: dt_in, &
grav, &
Rair, &
rvapor, &
cp, &
XLS, &
XLV, &
XLF, &
rhowater, &
rhosnow
REAL, INTENT(IN ) :: EP2,SVP1,SVP2,SVP3,SVPT0
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT) :: RAINNC, &
RAINNCV, &
SR
!+---+-----------------------------------------------------------------+
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: & ! GT
refl_10cm
!+---+-----------------------------------------------------------------+
! Optional
REAL, DIMENSION( ims:ime , jms:jme ), &
OPTIONAL, &
INTENT(INOUT) :: SNOWNC, &
SNOWNCV, &
GRAUPELNC, &
GRAUPELNCV
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
OPTIONAL, &
INTENT(INOUT) :: &
qi, &
qs, &
qg, &
qndrop
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
OPTIONAL, INTENT(OUT ) :: &
qlsink, & ! cloud water conversion to rain (/s)
precr, & ! rain precipitation rate at all levels (kg/m2/s)
preci, & ! ice precipitation rate at all levels (kg/m2/s)
precs, & ! snow precipitation rate at all levels (kg/m2/s)
precg ! graupel precipitation rate at all levels (kg/m2/s)
LOGICAL, INTENT(IN), OPTIONAL :: F_QG, F_QNDROP
! LOCAL VAR
INTEGER :: min_q, max_q
REAL, DIMENSION( its:ite , jts:jte ) &
:: rain, snow, graupel,ice
REAL, DIMENSION( kts:kte ) :: qvz, qlz, qrz, &
qiz, qsz, qgz, &
thz, &
tothz, rhoz, &
orhoz, sqrhoz, &
prez, zz, &
precrz, preciz, precsz, precgz, &
qndropz, &
dzw, preclw
LOGICAL :: flag_qg, flag_qndrop
!
REAL :: dt, pptrain, pptsnow, pptgraul, rhoe_s, &
gindex, pptice
real :: qndropconst
INTEGER :: i,j,k
!+---+-----------------------------------------------------------------+
REAL, DIMENSION(kts:kte):: qv1d, t1d, p1d, qr1d, qs1d, qg1d, dBZ
LOGICAL, OPTIONAL, INTENT(IN) :: diagflag
INTEGER, OPTIONAL, INTENT(IN) :: do_radar_ref
!+---+-----------------------------------------------------------------+
flag_qg = .false.
flag_qndrop = .false.
IF ( PRESENT ( f_qg ) ) flag_qg = f_qg
IF ( PRESENT ( f_qndrop ) ) flag_qndrop = f_qndrop
!
dt=dt_in
rhoe_s=1.29
qndropconst=100.e6 !sg
gindex=1.0
IF (.not.flag_qg) gindex=0.
j_loop: DO j = jts, jte
i_loop: DO i = its, ite
!
!- write data from 3-D to 1-D
!
DO k = kts, kte
qvz(k)=qv(i,k,j)
qlz(k)=ql(i,k,j)
qrz(k)=qr(i,k,j)
thz(k)=th(i,k,j)
!
rhoz(k)=rho(i,k,j)
orhoz(k)=1./rhoz(k)
prez(k)=p(i,k,j)
sqrhoz(k)=sqrt(rhoe_s*orhoz(k))
tothz(k)=pii(i,k,j)
zz(k)=z(i,k,j)
dzw(k)=dz8w(i,k,j)
END DO
IF (flag_qndrop .AND. PRESENT( qndrop )) THEN
DO k = kts, kte
qndropz(k)=qndrop(i,k,j)
ENDDO
ELSE
DO k = kts, kte
qndropz(k)=qndropconst
ENDDO
ENDIF
DO k = kts, kte
qiz(k)=qi(i,k,j)
qsz(k)=qs(i,k,j)
ENDDO
IF ( flag_qg .AND. PRESENT( qg ) ) THEN
DO k = kts, kte
qgz(k)=qg(i,k,j)
ENDDO
ELSE
DO k = kts, kte
qgz(k)=0.
ENDDO
ENDIF
!
pptrain=0.
pptsnow=0.
pptgraul=0.
pptice=0.
CALL clphy1d
( dt, qvz, qlz, qrz, qiz, qsz, qgz, &
qndropz,flag_qndrop, &
thz, tothz, rhoz, orhoz, sqrhoz, &
prez, zz, dzw, ht(I,J), preclw, &
precrz, preciz, precsz, precgz, &
pptrain, pptsnow, pptgraul, pptice, &
grav, cp, Rair, rvapor, gindex, &
XLS, XLV, XLF, rhowater, rhosnow, &
EP2,SVP1,SVP2,SVP3,SVPT0, &
kts, kte, i, j )
!
! Precipitation from cloud microphysics -- only for one time step
!
! unit is transferred from m to mm
!
rain(i,j)=pptrain
snow(i,j)=pptsnow
graupel(i,j)=pptgraul
ice(i,j)=pptice
sr(i,j)=(pptice+pptsnow+pptgraul)/(pptice+pptsnow+pptgraul+pptrain+1.e-12)
!
RAINNCV(i,j)= pptrain + pptsnow + pptgraul + pptice
RAINNC(i,j)=RAINNC(i,j) + pptrain + pptsnow + pptgraul + pptice
IF(PRESENT(SNOWNCV))SNOWNCV(i,j)= pptsnow + pptice
IF(PRESENT(SNOWNC))SNOWNC(i,j)=SNOWNC(i,j) + pptsnow + pptice
IF(PRESENT(GRAUPELNCV))GRAUPELNCV(i,j)= pptgraul
IF(PRESENT(GRAUPELNC))GRAUPELNC(i,j)=GRAUPELNC(i,j) + pptgraul
!
!- update data from 1-D back to 3-D
!
!
IF ( present(qlsink) .and. present(precr) ) THEN !sg beg
DO k = kts, kte
if(ql(i,k,j)>1.e-20) then
qlsink(i,k,j)=-preclw(k)/ql(i,k,j)
else
qlsink(i,k,j)=0.
endif
precr(i,k,j)=precrz(k)
END DO
END IF !sg end
DO k = kts, kte
qv(i,k,j)=qvz(k)
ql(i,k,j)=qlz(k)
qr(i,k,j)=qrz(k)
th(i,k,j)=thz(k)
END DO
!
IF ( flag_qndrop .AND. PRESENT( qndrop ) ) THEN !sg beg
DO k = kts, kte
qndrop(i,k,j)=qndropz(k)
ENDDO
END IF !sg end
DO k = kts, kte
qi(i,k,j)=qiz(k)
qs(i,k,j)=qsz(k)
ENDDO
IF ( present(preci) ) THEN !sg beg
DO k = kts, kte
preci(i,k,j)=preciz(k)
ENDDO
END IF
IF ( present(precs) ) THEN
DO k = kts, kte
precs(i,k,j)=precsz(k)
ENDDO
END IF !sg end
IF ( flag_qg .AND. PRESENT( qg ) ) THEN
DO k = kts, kte
qg(i,k,j)=qgz(k)
ENDDO
IF ( present(precg) ) THEN !sg beg
DO k = kts, kte
precg(i,k,j)=precgz(k)
ENDDO !sg end
END IF
ELSE !sg beg
IF ( present(precg) ) precg(i,:,j)=0. !sg end
ENDIF
!+---+-----------------------------------------------------------------+
IF ( PRESENT (diagflag) ) THEN
if (diagflag .and. do_radar_ref == 1) then
DO K=kts,kte
t1d(k)=th(i,k,j)*pii(i,k,j)
p1d(k)=p(i,k,j)
qv1d(k)=qv(i,k,j)
qr1d(k)=qr(i,k,j)
qs1d(k)=qs(i,k,j)
qg1d(k)=qg(i,k,j)
ENDDO
call refl10cm_lin
(qv1d, qr1d, qs1d, qg1d, &
t1d, p1d, dBZ, kts, kte, i, j)
do k = kts, kte
refl_10cm(i,k,j) = MAX(-35., dBZ(k))
enddo
endif
ENDIF
!+---+-----------------------------------------------------------------+
!
ENDDO i_loop
ENDDO j_loop
END SUBROUTINE lin_et_al
!-----------------------------------------------------------------------
SUBROUTINE clphy1d(dt, qvz, qlz, qrz, qiz, qsz, qgz, & 1,17
qndropz,flag_qndrop, &
thz, tothz, rho, orho, sqrho, &
prez, zz, dzw, zsfc, preclw, &
precrz, preciz, precsz, precgz, &
pptrain, pptsnow, pptgraul, &
pptice, grav, cp, Rair, rvapor, gindex, &
XLS, XLV, XLF, rhowater, rhosnow, &
EP2,SVP1,SVP2,SVP3,SVPT0, &
kts, kte, i, j )
!-----------------------------------------------------------------------
IMPLICIT NONE
!-----------------------------------------------------------------------
! This program handles the vertical 1-D cloud micphysics
!-----------------------------------------------------------------------
! avisc: constant in empirical formular for dynamic viscosity of air
! =1.49628e-6 [kg/m/s] = 1.49628e-5 [g/cm/s]
! adiffwv: constant in empirical formular for diffusivity of water
! vapor in air
! = 8.7602e-5 [kgm/s3] = 8.7602 [gcm/s3]
! axka: constant in empirical formular for thermal conductivity of air
! = 1.4132e3 [m2/s2/K] = 1.4132e7 [cm2/s2/K]
! qi0: mixing ratio threshold for cloud ice aggregation [kg/kg]
! xmi50: mass of a 50 micron ice crystal
! = 4.8e-10 [kg] =4.8e-7 [g]
! xmi40: mass of a 40 micron ice crystal
! = 2.46e-10 [kg] = 2.46e-7 [g]
! di50: diameter of a 50 micro (radius) ice crystal
! =1.0e-4 [m]
! xmi: mass of one cloud ice crystal
! =4.19e-13 [kg] = 4.19e-10 [g]
! oxmi=1.0/xmi
!
! xni0=1.0e-2 [m-3] The value given in Lin et al. is wrong.(see
! Hsie et al.(1980) and Rutledge and Hobbs(1983) )
! bni=0.5 [K-1]
! xmnin: mass of a natural ice nucleus
! = 1.05e-18 [kg] = 1.05e-15 [g] This values is suggested by
! Hsie et al. (1980)
! = 1.0e-12 [kg] suggested by Rutlegde and Hobbs (1983)
! rhowater: density of water=1.0 g/cm3=1000.0 kg/m3
! consta: constant in empirical formular for terminal
! velocity of raindrop
! =2115.0 [cm**(1-b)/s] = 2115.0*0.01**(1-b) [m**(1-b)/s]
! constb: constant in empirical formular for terminal
! velocity of raindrop
! =0.8
! xnor: intercept parameter of the raindrop size distribution
! = 0.08 cm-4 = 8.0e6 m-4
! araut: time sacle for autoconversion of cloud water to raindrops
! =1.0e-3 [s-1]
! ql0: mixing ratio threshold for cloud watercoalescence [kg/kg]
! vf1r: ventilation factors for rain =0.78
! vf2r: ventilation factors for rain =0.31
! rhosnow: density of snow=0.1 g/cm3=100.0 kg/m3
! constc: constant in empirical formular for terminal
! velocity of snow
! =152.93 [cm**(1-d)/s] = 152.93*0.01**(1-d) [m**(1-d)/s]
! constd: constant in empirical formular for terminal
! velocity of snow
! =0.25
! xnos: intercept parameter of the snowflake size distribution
! vf1s: ventilation factors for snow =0.78
! vf2s: ventilation factors for snow =0.31
!
!----------------------------------------------------------------------
INTEGER, INTENT(IN ) :: kts, kte, i, j
REAL, DIMENSION( kts:kte ), &
INTENT(INOUT) :: qvz, qlz, qrz, qiz, qsz, &
qndropz, &
qgz, thz
REAL, DIMENSION( kts:kte ), &
INTENT(IN ) :: tothz, rho, orho, sqrho, &
prez, zz, dzw
REAL, INTENT(IN ) :: dt, grav, cp, Rair, rvapor, &
XLS, XLV, XLF, rhowater, &
rhosnow,EP2,SVP1,SVP2,SVP3,SVPT0
REAL, DIMENSION( kts:kte ), INTENT(OUT) :: preclw, &
precrz, preciz, precsz, precgz
REAL, INTENT(INOUT) :: pptrain, pptsnow, pptgraul, pptice
REAL, INTENT(IN ) :: zsfc
logical, intent(in) :: flag_qndrop !sg
! local vars
REAL :: obp4, bp3, bp5, bp6, odp4, &
dp3, dp5, dp5o2
! temperary vars
REAL :: tmp, tmp0, tmp1, tmp2,tmp3, &
tmp4,delta2,delta3, delta4, &
tmpa,tmpb,tmpc,tmpd,alpha1, &
qic, abi,abr, abg, odtberg, &
vti50,eiw,eri,esi,esr, esw, &
erw,delrs,term0,term1,araut, &
constg2, vf1r, vf2r,alpha2, &
Ap, Bp, egw, egi, egs, egr, &
constg, gdelta4, g1sdelt4, &
factor, tmp_r, tmp_s,tmp_g, &
qlpqi, rsat, a1, a2, xnin
INTEGER :: k
!
REAL, DIMENSION( kts:kte ) :: oprez, tem, temcc, theiz, qswz, &
qsiz, qvoqswz, qvoqsiz, qvzodt, &
qlzodt, qizodt, qszodt, qrzodt, &
qgzodt
REAL, DIMENSION( kts:kte ) :: psnow, psaut, psfw, psfi, praci, &
piacr, psaci, psacw, psdep, pssub, &
pracs, psacr, psmlt, psmltevp, &
prain, praut, pracw, prevp, pvapor, &
pclw, pladj, pcli, pimlt, pihom, &
pidw, piadj, pgraupel, pgaut, &
pgfr, pgacw, pgaci, pgacr, pgacs, &
pgacip,pgacrp,pgacsp,pgwet, pdry, &
pgsub, pgdep, pgmlt, pgmltevp, &
qschg, qgchg
!
REAL, DIMENSION( kts:kte ) :: qvsbar, rs0, viscmu, visc, diffwv, &
schmidt, xka
REAL, DIMENSION( kts:kte ) :: vtr, vts, vtg, &
vtrold, vtsold, vtgold, vtiold, &
xlambdar, xlambdas, xlambdag, &
olambdar, olambdas, olambdag
REAL :: episp0k, dtb, odtb, pi, pio4, &
pio6, oxLf, xLvocp, xLfocp, consta, &
constc, ocdrag, gambp4, gamdp4, &
gam4pt5, Cpor, oxmi, gambp3, gamdp3,&
gambp6, gam3pt5, gam2pt75, gambp5o2,&
gamdp5o2, cwoxlf, ocp, xni50, es
!
REAL :: qvmin=1.e-20
REAL :: gindex
REAL :: temc1,save1,save2,xni50mx
! for terminal velocity flux
INTEGER :: min_q, max_q
REAL :: t_del_tv, del_tv, flux, fluxin, fluxout ,tmpqrz
LOGICAL :: notlast
!
REAL :: tmp_tem, tmp_temcc !bloss
!
real :: liqconc, dis, beta, kappa, p0, xc, capn,rhocgs
!+---+-----------------------------------------------------------------+
INTEGER:: NCALL=0
IF (NCALL .EQ. 0) THEN
!..Set these variables needed for computing radar reflectivity. These
!.. get used within radar_init to create other variables used in the
!.. radar module.
xam_r = 3.14159*rhowater/6.
xbm_r = 3.
xmu_r = 0.
xam_s = 3.14159*rhosnow/6.
xbm_s = 3.
xmu_s = 0.
xam_g = 3.14159*rhograul/6.
xbm_g = 3.
xmu_g = 0.
call radar_init
NCALL = 1
ENDIF
!+---+-----------------------------------------------------------------+
!sg: begin
! liqconc = liquid water content (g cm^-3)
! capn = droplet number concentration (# cm^-3)
! dis = relative dispersion (dimensionless) between 0.2 and 1.
! Written by Yangang Liu based on Liu et al., GRL 32, 2005.
! Autoconversion rate p = p0 * (threshold function)
! p0 = "base" autoconversion rate (g cm^-3 s^-1)
! kappa = constant in Long kernel = [kappa2 * (3/(4*pi*rhow))^3] in Liu papers
! beta = Condensation rate constant = (beta6)^6 in Liu papers
! xc = Normalized critical mass
! ***********************************************************
if(flag_qndrop)then
dis = 0.5 ! droplet dispersion, set to 0.5 per SG 8-Nov-2006
! Give empirical constants
kappa=1.1d10
! Calculate Condensation rate constant
beta = (1.0d0+3.0d0*dis**2)*(1.0d0+4.0d0*dis**2)* &
(1.0d0+5.0d0*dis**2)/((1.0d0+dis**2)*(1.0d0+2.0d0*dis**2))
endif
!sg: end
dtb=dt
odtb=1./dtb
pi=acos(-1.)
pio4=acos(-1.)/4.
pio6=acos(-1.)/6.
ocp=1./cp
oxLf=1./xLf
xLvocp=xLv/cp
xLfocp=xLf/cp
consta=2115.0*0.01**(1-constb)
constc=152.93*0.01**(1-constd)
ocdrag=1./Cdrag
! episp0k=RH*episp0
episp0k=RH*ep2*1000.*svp1
!
gambp4=ggamma
(constb+4.)
gamdp4=ggamma
(constd+4.)
gam4pt5=ggamma
(4.5)
Cpor=cp/Rair
oxmi=1.0/xmi
gambp3=ggamma
(constb+3.)
gamdp3=ggamma
(constd+3.)
gambp6=ggamma
(constb+6)
gam3pt5=ggamma
(3.5)
gam2pt75=ggamma
(2.75)
gambp5o2=ggamma
((constb+5.)/2.)
gamdp5o2=ggamma
((constd+5.)/2.)
cwoxlf=cw/xlf
delta2=0.
delta3=0.
delta4=0.
!
!-----------------------------------------------------------------------
! oprez 1./prez ( prez : pressure)
! qsw saturated mixing ratio on water surface
! qsi saturated mixing ratio on ice surface
! episp0k RH*e*saturated pressure at 273.15 K
! qvoqsw qv/qsw
! qvoqsi qv/qsi
! qvzodt qv/dt
! qlzodt ql/dt
! qizodt qi/dt
! qszodt qs/dt
! qrzodt qr/dt
! qgzodt qg/dt
!
! temcc temperature in dregee C
!
obp4=1.0/(constb+4.0)
bp3=constb+3.0
bp5=constb+5.0
bp6=constb+6.0
odp4=1.0/(constd+4.0)
dp3=constd+3.0
dp5=constd+5.0
dp5o2=0.5*(constd+5.0)
!
do k=kts,kte
oprez(k)=1./prez(k)
enddo
do k=kts,kte
qlz(k)=amax1( 0.0,qlz(k) )
qiz(k)=amax1( 0.0,qiz(k) )
qvz(k)=amax1( qvmin,qvz(k) )
qsz(k)=amax1( 0.0,qsz(k) )
qrz(k)=amax1( 0.0,qrz(k) )
qgz(k)=amax1( 0.0,qgz(k) )
qndropz(k)=amax1( 0.0,qndropz(k) ) !sg
!
tem(k)=thz(k)*tothz(k)
temcc(k)=tem(k)-273.15
!
! qswz(k)=episp0k*oprez(k)* &
! exp( svp2*temcc(k)/(tem(k)-svp3) )
es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
qswz(k)=ep2*es/(prez(k)-es)
if (tem(k) .lt. 273.15 ) then
! qsiz(k)=episp0k*oprez(k)* &
! exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
qsiz(k)=ep2*es/(prez(k)-es)
if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
else
qsiz(k)=qswz(k)
endif
!
qvoqswz(k)=qvz(k)/qswz(k)
qvoqsiz(k)=qvz(k)/qsiz(k)
theiz(k)=thz(k)+(xlvocp*qvz(k)-xlfocp*qiz(k))/tothz(k)
enddo
!
!
!-----------------------------------------------------------------------
! In this simple stable cloud parameterization scheme, only five
! forms of water substance (water vapor, cloud water, cloud ice,
! rain and snow are considered. The prognostic variables are total
! water (qp),cloud water (ql), and cloud ice (qi). Rain and snow are
! diagnosed following Nagata and Ogura, 1991, MWR, 1309-1337. Eq (A7).
! the micro physics are based on (1) Hsie et al.,1980, JAM, 950-977 ;
! (2) Lin et al., 1983, JAM, 1065-1092 ; (3) Rutledge and Hobbs, 1983,
! JAS, 1185-1206 ; (4) Rutledge and Hobbs, 1984, JAS, 2949-2972.
!-----------------------------------------------------------------------
!
! rhowater: density of water=1.0 g/cm3=1000.0 kg/m3
! rhosnow: density of snow=0.1 g/cm3=100.0 kg/m3
! xnor: intercept parameter of the raindrop size distribution
! = 0.08 cm-4 = 8.0e6 m-4
! xnos: intercept parameter of the snowflake size distribution
! = 0.03 cm-4 = 3.0e6 m-4
! xnog: intercept parameter of the graupel size distribution
! = 4.0e-4 cm-4 = 4.0e4 m-4
! consta: constant in empirical formular for terminal
! velocity of raindrop
! =2115.0 [cm**(1-b)/s] = 2115.0*0.01**(1-b) [m**(1-b)/s]
! constb: constant in empirical formular for terminal
! velocity of raindrop
! =0.8
! constc: constant in empirical formular for terminal
! velocity of snow
! =152.93 [cm**(1-d)/s] = 152.93*0.01**(1-d) [m**(1-d)/s]
! constd: constant in empirical formular for terminal
! velocity of snow
! =0.25
! avisc: constant in empirical formular for dynamic viscosity of air
! =1.49628e-6 [kg/m/s] = 1.49628e-5 [g/cm/s]
! adiffwv: constant in empirical formular for diffusivity of water
! vapor in air
! = 8.7602e-5 [kgm/s3] = 8.7602 [gcm/s3]
! axka: constant in empirical formular for thermal conductivity of air
! = 1.4132e3 [m2/s2/K] = 1.4132e7 [cm2/s2/K]
! qi0: mixing ratio threshold for cloud ice aggregation [kg/kg]
! = 1.0e-3 g/g = 1.0e-3 kg/gk
! ql0: mixing ratio threshold for cloud watercoalescence [kg/kg]
! = 2.0e-3 g/g = 2.0e-3 kg/gk
! qs0: mixing ratio threshold for snow aggregation
! = 6.0e-4 g/g = 6.0e-4 kg/gk
! xmi50: mass of a 50 micron ice crystal
! = 4.8e-10 [kg] =4.8e-7 [g]
! xmi40: mass of a 40 micron ice crystal
! = 2.46e-10 [kg] = 2.46e-7 [g]
! di50: diameter of a 50 micro (radius) ice crystal
! =1.0e-4 [m]
! xmi: mass of one cloud ice crystal
! =4.19e-13 [kg] = 4.19e-10 [g]
! oxmi=1.0/xmi
!
! if gindex=1.0 include graupel
! if gindex=0. no graupel
!
!
do k=kts,kte
psnow(k)=0.0
psaut(k)=0.0
psfw(k)=0.0
psfi(k)=0.0
praci(k)=0.0
piacr(k)=0.0
psaci(k)=0.0
psacw(k)=0.0
psdep(k)=0.0
pssub(k)=0.0
pracs(k)=0.0
psacr(k)=0.0
psmlt(k)=0.0
psmltevp(k)=0.0
!
prain(k)=0.0
praut(k)=0.0
pracw(k)=0.0
prevp(k)=0.0
!
pvapor(k)=0.0
!
pclw(k)=0.0
preclw(k)=0.0 !sg
pladj(k)=0.0
!
pcli(k)=0.0
pimlt(k)=0.0
pihom(k)=0.0
pidw(k)=0.0
piadj(k)=0.0
enddo
!
!!! graupel
!
do k=kts,kte
pgraupel(k)=0.0
pgaut(k)=0.0
pgfr(k)=0.0
pgacw(k)=0.0
pgaci(k)=0.0
pgacr(k)=0.0
pgacs(k)=0.0
pgacip(k)=0.0
pgacrP(k)=0.0
pgacsp(k)=0.0
pgwet(k)=0.0
pdry(k)=0.0
pgsub(k)=0.0
pgdep(k)=0.0
pgmlt(k)=0.0
pgmltevp(k)=0.0
qschg(k)=0.
qgchg(k)=0.
enddo
!
!
! Set rs0=episp0*oprez(k)
! episp0=e*saturated pressure at 273.15 K
! e = 0.622
!
DO k=kts,kte
rs0(k)=ep2*1000.*svp1/(prez(k)-1000.*svp1)
END DO
!
!***********************************************************************
! Calculate precipitation fluxes due to terminal velocities.
!***********************************************************************
!
!- Calculate termianl velocity (vt?) of precipitation q?z
!- Find maximum vt? to determine the small delta t
!
!-- rain
!
t_del_tv=0.
del_tv=dtb
notlast=.true.
DO while (notlast)
!
min_q=kte
max_q=kts-1
!
do k=kts,kte-1
if (qrz(k) .gt. 1.0e-8) then
min_q=min0(min_q,k)
max_q=max0(max_q,k)
tmp1=sqrt(pi*rhowater*xnor/rho(k)/qrz(k))
tmp1=sqrt(tmp1)
vtrold(k)=o6*consta*gambp4*sqrho(k)/tmp1**constb
if (k .eq. 1) then
del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtrold(k))
else
del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtrold(k))
endif
else
vtrold(k)=0.
endif
enddo
if (max_q .ge. min_q) then
!
!- Check if the summation of the small delta t >= big delta t
! (t_del_tv) (del_tv) (dtb)
t_del_tv=t_del_tv+del_tv
!
if ( t_del_tv .ge. dtb ) then
notlast=.false.
del_tv=dtb+del_tv-t_del_tv
endif
!
fluxin=0.
do k=max_q,min_q,-1
fluxout=rho(k)*vtrold(k)*qrz(k)
flux=(fluxin-fluxout)/rho(k)/dzw(k)
tmpqrz=qrz(k)
qrz(k)=qrz(k)+del_tv*flux
fluxin=fluxout
enddo
if (min_q .eq. 1) then
pptrain=pptrain+fluxin*del_tv
else
qrz(min_q-1)=qrz(min_q-1)+del_tv* &
fluxin/rho(min_q-1)/dzw(min_q-1)
endif
!
else
notlast=.false.
endif
ENDDO
!
!-- snow
!
t_del_tv=0.
del_tv=dtb
notlast=.true.
DO while (notlast)
!
min_q=kte
max_q=kts-1
!
do k=kts,kte-1
if (qsz(k) .gt. 1.0e-8) then
min_q=min0(min_q,k)
max_q=max0(max_q,k)
tmp1=sqrt(pi*rhosnow*xnos/rho(k)/qsz(k))
tmp1=sqrt(tmp1)
vtsold(k)=o6*constc*gamdp4*sqrho(k)/tmp1**constd
if (k .eq. 1) then
del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtsold(k))
else
del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtsold(k))
endif
else
vtsold(k)=0.
endif
enddo
if (max_q .ge. min_q) then
!
!
!- Check if the summation of the small delta t >= big delta t
! (t_del_tv) (del_tv) (dtb)
t_del_tv=t_del_tv+del_tv
if ( t_del_tv .ge. dtb ) then
notlast=.false.
del_tv=dtb+del_tv-t_del_tv
endif
!
fluxin=0.
do k=max_q,min_q,-1
fluxout=rho(k)*vtsold(k)*qsz(k)
flux=(fluxin-fluxout)/rho(k)/dzw(k)
qsz(k)=qsz(k)+del_tv*flux
qsz(k)=amax1(0.,qsz(k))
fluxin=fluxout
enddo
if (min_q .eq. 1) then
pptsnow=pptsnow+fluxin*del_tv
else
qsz(min_q-1)=qsz(min_q-1)+del_tv* &
fluxin/rho(min_q-1)/dzw(min_q-1)
endif
!
else
notlast=.false.
endif
ENDDO
!
!-- grauupel
!
t_del_tv=0.
del_tv=dtb
notlast=.true.
!
DO while (notlast)
!
min_q=kte
max_q=kts-1
!
do k=kts,kte-1
if (qgz(k) .gt. 1.0e-8) then
min_q=min0(min_q,k)
max_q=max0(max_q,k)
tmp1=sqrt(pi*rhograul*xnog/rho(k)/qgz(k))
tmp1=sqrt(tmp1)
term0=sqrt(4.*grav*rhograul*0.33334/rho(k)/cdrag)
vtgold(k)=o6*gam4pt5*term0*sqrt(1./tmp1)
if (k .eq. 1) then
del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtgold(k))
else
del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtgold(k))
endif
else
vtgold(k)=0.
endif
enddo
if (max_q .ge. min_q) then
!
!
!- Check if the summation of the small delta t >= big delta t
! (t_del_tv) (del_tv) (dtb)
t_del_tv=t_del_tv+del_tv
if ( t_del_tv .ge. dtb ) then
notlast=.false.
del_tv=dtb+del_tv-t_del_tv
endif
!
fluxin=0.
do k=max_q,min_q,-1
fluxout=rho(k)*vtgold(k)*qgz(k)
flux=(fluxin-fluxout)/rho(k)/dzw(k)
qgz(k)=qgz(k)+del_tv*flux
qgz(k)=amax1(0.,qgz(k))
fluxin=fluxout
enddo
if (min_q .eq. 1) then
pptgraul=pptgraul+fluxin*del_tv
else
qgz(min_q-1)=qgz(min_q-1)+del_tv* &
fluxin/rho(min_q-1)/dzw(min_q-1)
endif
!
else
notlast=.false.
endif
!
ENDDO
!
!-- cloud ice (03/21/02) follow Vaughan T.J. Phillips at GFDL
!
t_del_tv=0.
del_tv=dtb
notlast=.true.
!
DO while (notlast)
!
min_q=kte
max_q=kts-1
!
do k=kts,kte-1
if (qiz(k) .gt. 1.0e-8) then
min_q=min0(min_q,k)
max_q=max0(max_q,k)
vtiold(k)= 3.29 * (rho(k)* qiz(k))** 0.16 ! Heymsfield and Donner
if (k .eq. 1) then
del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtiold(k))
else
del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtiold(k))
endif
else
vtiold(k)=0.
endif
enddo
if (max_q .ge. min_q) then
!
!
!- Check if the summation of the small delta t >= big delta t
! (t_del_tv) (del_tv) (dtb)
t_del_tv=t_del_tv+del_tv
if ( t_del_tv .ge. dtb ) then
notlast=.false.
del_tv=dtb+del_tv-t_del_tv
endif
fluxin=0.
do k=max_q,min_q,-1
fluxout=rho(k)*vtiold(k)*qiz(k)
flux=(fluxin-fluxout)/rho(k)/dzw(k)
qiz(k)=qiz(k)+del_tv*flux
qiz(k)=amax1(0.,qiz(k))
fluxin=fluxout
enddo
if (min_q .eq. 1) then
pptice=pptice+fluxin*del_tv
else
qiz(min_q-1)=qiz(min_q-1)+del_tv* &
fluxin/rho(min_q-1)/dzw(min_q-1)
endif
!
else
notlast=.false.
endif
!
ENDDO
do k=kts,kte-1 !sg beg
precrz(k)=rho(k)*vtrold(k)*qrz(k)
preciz(k)=rho(k)*vtiold(k)*qiz(k)
precsz(k)=rho(k)*vtsold(k)*qsz(k)
precgz(k)=rho(k)*vtgold(k)*qgz(k)
enddo !sg end
precrz(kte)=0. !wig - top level never set for vtXold vars
preciz(kte)=0. !wig
precsz(kte)=0. !wig
precgz(kte)=0. !wig
! Microphysics processes
!
DO 2000 k=kts,kte
!
qvzodt(k)=amax1( 0.0,odtb*qvz(k) )
qlzodt(k)=amax1( 0.0,odtb*qlz(k) )
qizodt(k)=amax1( 0.0,odtb*qiz(k) )
qszodt(k)=amax1( 0.0,odtb*qsz(k) )
qrzodt(k)=amax1( 0.0,odtb*qrz(k) )
qgzodt(k)=amax1( 0.0,odtb*qgz(k) )
!***********************************************************************
!***** diagnose mixing ratios (qrz,qsz), terminal *****
!***** velocities (vtr,vts), and slope parameters in size *****
!***** distribution(xlambdar,xlambdas) of rain and snow *****
!***** follows Nagata and Ogura, 1991, MWR, 1309-1337. Eq (A7) *****
!***********************************************************************
!
!**** assuming no cloud water can exist in the top two levels due to
!**** radiation consideration
!
!! if
!! unsaturated,
!! no cloud water, rain, ice, snow and graupel
!! then
!! skip these processes and jump to line 2000
!
!
tmp=qiz(k)+qlz(k)+qsz(k)+qrz(k)+qgz(k)*gindex
if( qvz(k)+qlz(k)+qiz(k) .lt. qsiz(k) &
.and. tmp .eq. 0.0 ) go to 2000
!! calculate terminal velocity of rain
!
if (qrz(k) .gt. 1.0e-8) then
tmp1=sqrt(pi*rhowater*xnor*orho(k)/qrz(k))
xlambdar(k)=sqrt(tmp1)
olambdar(k)=1.0/xlambdar(k)
vtrold(k)=o6*consta*gambp4*sqrho(k)*olambdar(k)**constb
else
vtrold(k)=0.
olambdar(k)=0.
endif
!
! if (qrz(k) .gt. 1.0e-12) then
if (qrz(k) .gt. 1.0e-8) then
tmp1=sqrt(pi*rhowater*xnor*orho(k)/qrz(k))
xlambdar(k)=sqrt(tmp1)
olambdar(k)=1.0/xlambdar(k)
vtr(k)=o6*consta*gambp4*sqrho(k)*olambdar(k)**constb
else
vtr(k)=0.
olambdar(k)=0.
endif
!
!! calculate terminal velocity of snow
!
if (qsz(k) .gt. 1.0e-8) then
tmp1=sqrt(pi*rhosnow*xnos*orho(k)/qsz(k))
xlambdas(k)=sqrt(tmp1)
olambdas(k)=1.0/xlambdas(k)
vtsold(k)=o6*constc*gamdp4*sqrho(k)*olambdas(k)**constd
else
vtsold(k)=0.
olambdas(k)=0.
endif
!
! if (qsz(k) .gt. 1.0e-12) then
if (qsz(k) .gt. 1.0e-8) then
tmp1=sqrt(pi*rhosnow*xnos*orho(k)/qsz(k))
xlambdas(k)=sqrt(tmp1)
olambdas(k)=1.0/xlambdas(k)
vts(k)=o6*constc*gamdp4*sqrho(k)*olambdas(k)**constd
else
vts(k)=0.
olambdas(k)=0.
endif
!
!! calculate terminal velocity of graupel
!
if (qgz(k) .gt. 1.0e-8) then
tmp1=sqrt( pi*rhograul*xnog*orho(k)/qgz(k))
xlambdag(k)=sqrt(tmp1)
olambdag(k)=1.0/xlambdag(k)
term0=sqrt(4.*grav*rhograul*0.33334*orho(k)*ocdrag)
vtgold(k)=o6*gam4pt5*term0*sqrt(olambdag(k))
else
vtgold(k)=0.
olambdag(k)=0.
endif
!
! if (qgz(k) .gt. 1.0e-12) then
if (qgz(k) .gt. 1.0e-8) then
tmp1=sqrt( pi*rhograul*xnog*orho(k)/qgz(k))
xlambdag(k)=sqrt(tmp1)
olambdag(k)=1.0/xlambdag(k)
term0=sqrt(4.*grav*rhograul*0.33334*orho(k)*ocdrag)
vtg(k)=o6*gam4pt5*term0*sqrt(olambdag(k))
else
vtg(k)=0.
olambdag(k)=0.
endif
!
!***********************************************************************
!***** compute viscosity,difusivity,thermal conductivity, and ******
!***** Schmidt number ******
!***********************************************************************
!c------------------------------------------------------------------
!c viscmu: dynamic viscosity of air kg/m/s
!c visc: kinematic viscosity of air = viscmu/rho (m2/s)
!c avisc=1.49628e-6 kg/m/s=1.49628e-5 g/cm/s
!c viscmu=1.718e-5 kg/m/s in RH
!c diffwv: Diffusivity of water vapor in air
!c adiffwv = 8.7602e-5 (8.794e-5 in MM5) kgm/s3
!c = 8.7602 (8.794 in MM5) gcm/s3
!c diffwv(k)=2.26e-5 m2/s
!c schmidt: Schmidt number=visc/diffwv
!c xka: thermal conductivity of air J/m/s/K (Kgm/s3/K)
!c xka(k)=2.43e-2 J/m/s/K in RH
!c axka=1.4132e3 (1.414e3 in MM5) m2/s2/k = 1.4132e7 cm2/s2/k
!c------------------------------------------------------------------
viscmu(k)=avisc*tem(k)**1.5/(tem(k)+120.0)
visc(k)=viscmu(k)*orho(k)
diffwv(k)=adiffwv*tem(k)**1.81*oprez(k)
schmidt(k)=visc(k)/diffwv(k)
xka(k)=axka*viscmu(k)
if (tem(k) .lt. 273.15) then
!
!***********************************************************************
!********* snow production processes for T < 0 C **********
!***********************************************************************
!c
!c (1) ICE CRYSTAL AGGREGATION TO SNOW (Psaut): Lin (21)
!c! psaut=alpha1*(qi-qi0)
!c! alpha1=1.0e-3*exp(0.025*(T-T0))
!c
! alpha1=1.0e-3*exp( 0.025*temcc(k) )
alpha1=1.0e-3*exp( 0.025*temcc(k) )
!
if(temcc(k) .lt. -20.0) then
tmp1=-7.6+4.0*exp( -0.2443e-3*(abs(temcc(k))-20)**2.455 )
qic=1.0e-3*exp(tmp1)*orho(k)
else
qic=qi0
end if
!testing
! tmp1=amax1( 0.0,alpha1*(qiz(k)-qic) )
! psaut(k)=amin1( tmp1,qizodt(k) )
tmp1=odtb*(qiz(k)-qic)*(1.0-exp(-alpha1*dtb))
psaut(k)=amax1( 0.0,tmp1 )
!c
!c (2) BERGERON PROCESS TRANSFER OF CLOUD WATER TO SNOW (Psfw)
!c this process only considered when -31 C < T < 0 C
!c Lin (33) and Hsie (17)
!c
!c!
!c! parama1 and parama2 functions must be user supplied
!c!
! testing
if( qlz(k) .gt. 1.0e-10 ) then
temc1=amax1(-30.99,temcc(k))
! print*,'temc1',temc1,qlz(k)
a1=parama1
( temc1 )
a2=parama2
( temc1 )
tmp1=1.0-a2
!! change unit from cgs to mks
a1=a1*0.001**tmp1
!c! dtberg is the time needed for a crystal to grow from 40 to 50 um
!c ! odtberg=1.0/dtberg
odtberg=(a1*tmp1)/(xmi50**tmp1-xmi40**tmp1)
!
!c! compute terminal velocity of a 50 micron ice cystal
!
vti50=constc*di50**constd*sqrho(k)
!
eiw=1.0
save1=a1*xmi50**a2
save2=0.25*pi*eiw*rho(k)*di50*di50*vti50
!
tmp2=( save1 + save2*qlz(k) )
!
!! maximum number of 50 micron crystals limited by the amount
!! of supercool water
!
xni50mx=qlzodt(k)/tmp2
!
!! number of 50 micron crystals produced
!
!
xni50=qiz(k)*( 1.0-exp(-dtb*odtberg) )/xmi50
xni50=amin1(xni50,xni50mx)
!
tmp3=odtb*tmp2/save2*( 1.0-exp(-save2*xni50*dtb) )
psfw(k)=amin1( tmp3,qlzodt(k) )
!testing
! psfw(k)=0.
!0915 if( temcc(k).gt.-30.99 ) then
!0915 a1=parama1( temcc(k) )
!0915 a2=parama2( temcc(k) )
!0915 tmp1=1.0-a2
!! change unit from cgs to mks
!0915 a1=a1*0.001**tmp1
!c! dtberg is the time needed for a crystal to grow from 40 to 50 um
!c! odtberg=1.0/dtberg
!0915 odtberg=(a1*tmp1)/(xmi50**tmp1-xmi40**tmp1)
!c! number of 50 micron crystals produced
!0915 xni50=qiz(k)*dtb*odtberg/xmi50
!c! need to calculate the terminal velocity of a 50 micron
!c! ice cystal
!0915 vti50=constc*di50**constd*sqrho(k)
!0915 eiw=1.0
!0915 tmp2=xni50*( a1*xmi50**a2 + &
!0915 0.25*qlz(k)*pi*eiw*rho(k)*di50*di50*vti50 )
!0915 psfw(k)=amin1( tmp2,qlzodt(k) )
!0915 psfw(k)=0.
!c
!c (3) REDUCTION OF CLOUD ICE BY BERGERON PROCESS (Psfi): Lin (34)
!c this process only considered when -31 C < T < 0 C
!c
tmp1=xni50*xmi50-psfw(k)
psfi(k)=amin1(tmp1,qizodt(k))
! testing
! psfi(k)=0.
end if
!
!0915 tmp1=qiz(k)*odtberg
!0915 psfi(k)=amin1(tmp1,qizodt(k))
! testing
!0915 psfi(k)=0.
!0915 end if
!
if(qrz(k) .le. 0.0) go to 1000
!
! Processes (4) and (5) only need when qrz > 0.0
!
!c
!c (4) CLOUD ICE ACCRETION BY RAIN (Praci): Lin (25)
!c may produce snow or graupel
!c
eri=1.0
!0915 tmp1=qiz(k)*pio4*eri*xnor*consta*sqrho(k)
!0915 tmp2=tmp1*gambp3*olambdar(k)**bp3
!0915 praci(k)=amin1( tmp2,qizodt(k) )
save1=pio4*eri*xnor*consta*sqrho(k)
tmp1=save1*gambp3*olambdar(k)**bp3
praci(k)=qizodt(k)*( 1.0-exp(-tmp1*dtb) )
!c
!c (5) RAIN ACCRETION BY CLOUD ICE (Piacr): Lin (26)
!c
!0915 tmp2=tmp1*rho(k)*pio6*rhowater*gambp6*oxmi* &
!0915 olambdar(k)**bp6
!0915 piacr(k)=amin1( tmp2,qrzodt(k) )
tmp2=qiz(k)*save1*rho(k)*pio6*rhowater*gambp6*oxmi* &
olambdar(k)**bp6
piacr(k)=amin1( tmp2,qrzodt(k) )
!
1000 continue
!
if(qsz(k) .le. 0.0) go to 1200
!
! Compute the following processes only when qsz > 0.0
!
!c
!c (6) ICE CRYSTAL ACCRETION BY SNOW (Psaci): Lin (22)
!c
esi=exp( 0.025*temcc(k) )
save1=pio4*xnos*constc*gamdp3*sqrho(k)* &
olambdas(k)**dp3
tmp1=esi*save1
psaci(k)=qizodt(k)*( 1.0-exp(-tmp1*dtb) )
!0915 tmp1=pio4*xnos*constc*gamdp3*sqrho(k)* &
!0915 olambdas(k)**dp3
!0915 tmp2=qiz(k)*esi*tmp1
!0915 psaci(k)=amin1( tmp2,qizodt(k) )
!c
!c (7) CLOUD WATER ACCRETION BY SNOW (Psacw): Lin (24)
!c
esw=1.0
tmp1=esw*save1
psacw(k)=qlzodt(K)*( 1.0-exp(-tmp1*dtb) )
!0915 tmp2=qlz(k)*esw*tmp1
!0915 psacw(k)=amin1( tmp2,qlzodt(k) )
!c
!c (8) DEPOSITION/SUBLIMATION OF SNOW (Psdep/Pssub): Lin (31)
!c includes consideration of ventilation effect
!c
!c abi=2*pi*(Si-1)/rho/(A"+B")
!c
tmpa=rvapor*xka(k)*tem(k)*tem(k)
tmpb=xls*xls*rho(k)*qsiz(k)*diffwv(k)
tmpc=tmpa*qsiz(k)*diffwv(k)
abi=2.0*pi*(qvoqsiz(k)-1.0)*tmpc/(tmpa+tmpb)
!
!c vf1s,vf2s=ventilation factors for snow
!c vf1s=0.78,vf2s=0.31 in LIN
!
tmp1=constc*sqrho(k)*olambdas(k)**dp5/visc(k)
tmp2=abi*xnos*( vf1s*olambdas(k)*olambdas(k)+ &
vf2s*schmidt(k)**0.33334*gamdp5o2*sqrt(tmp1) )
tmp3=odtb*( qvz(k)-qsiz(k) )
!
!bloss: BEGIN
!the old implementation would give the wrong results if olambdas(k) ==0
!which can lead to positive pssub, i.e. tmp2=0 but tmp3> 0
! if( tmp2 .le. 0.0) then
if( tmp3 .le. 0.0) then
tmp2=amax1( tmp2,tmp3)
pssub(k)=amin1(0.,amax1( tmp2,-qszodt(k) ))
!bloss: END
psdep(k)=0.0
else
psdep(k)=amin1( tmp2,tmp3 )
pssub(k)=0.0
end if
!0915 psdep(k)=amax1(0.0,tmp2)
!0915 pssub(k)=amin1(0.0,tmp2)
!0915 pssub(k)=amax1( pssub(k),-qszodt(k) )
!
if(qrz(k) .le. 0.0) go to 1200
!
! Compute processes (9) and (10) only when qsz > 0.0 and qrz > 0.0
!
!c
!c (9) ACCRETION OF SNOW BY RAIN (Pracs): Lin (27)
!c
esr=1.0
tmpa=olambdar(k)*olambdar(k)
tmpb=olambdas(k)*olambdas(k)
tmpc=olambdar(k)*olambdas(k)
tmp1=pi*pi*esr*xnor*xnos*abs( vtr(k)-vts(k) )*orho(k)
tmp2=tmpb*tmpb*olambdar(k)*(5.0*tmpb+2.0*tmpc+0.5*tmpa)
tmp3=tmp1*rhosnow*tmp2
pracs(k)=amin1( tmp3,qszodt(k) )
!c
!c (10) ACCRETION OF RAIN BY SNOW (Psacr): Lin (28)
!c
tmp3=tmpa*tmpa*olambdas(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
tmp4=tmp1*rhowater*tmp3
psacr(k)=amin1( tmp4,qrzodt(k) )
!
1200 continue
!
else
!
!***********************************************************************
!********* snow production processes for T > 0 C **********
!***********************************************************************
!
if (qsz(k) .le. 0.0) go to 1400
!c
!c (1) CLOUD WATER ACCRETION BY SNOW (Psacw): Lin (24)
!c
esw=1.0
tmp1=esw*pio4*xnos*constc*gamdp3*sqrho(k)* &
olambdas(k)**dp3
psacw(k)=qlzodt(k)*( 1.0-exp(-tmp1*dtb) )
!0915 tmp1=pio4*xnos*constc*gamdp3*sqrho(k)* &
!0915 olambdas(k)**dp3
!0915 tmp2=qlz(k)*esw*tmp1
!0915 psacw(k)=amin1( tmp2,qlzodt(k) )
!c
!c (2) ACCRETION OF RAIN BY SNOW (Psacr): Lin (28)
!c
esr=1.0
tmpa=olambdar(k)*olambdar(k)
tmpb=olambdas(k)*olambdas(k)
tmpc=olambdar(k)*olambdas(k)
tmp1=pi*pi*esr*xnor*xnos*abs( vtr(k)-vts(k) )*orho(k)
tmp2=tmpa*tmpa*olambdas(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
tmp3=tmp1*rhowater*tmp2
psacr(k)=amin1( tmp3,qrzodt(k) )
!c
!c (3) MELTING OF SNOW (Psmlt): Lin (32)
!c Psmlt is negative value
!
delrs=rs0(k)-qvz(k)
term1=2.0*pi*orho(k)*( xlv*diffwv(k)*rho(k)*delrs- &
xka(k)*temcc(k) )
tmp1=constc*sqrho(k)*olambdas(k)**dp5/visc(k)
tmp2=xnos*( vf1s*olambdas(k)*olambdas(k)+ &
vf2s*schmidt(k)**0.33334*gamdp5o2*sqrt(tmp1) )
tmp3=term1*oxlf*tmp2-cwoxlf*temcc(k)*( psacw(k)+psacr(k) )
tmp4=amin1(0.0,tmp3)
psmlt(k)=amax1( tmp4,-qszodt(k) )
!c
!c (4) EVAPORATION OF MELTING SNOW (Psmltevp): HR (A27)
!c but use Lin et al. coefficience
!c Psmltevp is a negative value
!c
tmpa=rvapor*xka(k)*tem(k)*tem(k)
tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
tmpc=tmpa*qswz(k)*diffwv(k)
tmpd=amin1( 0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb )
! abr=2.0*pi*(qvoqswz(k)-1.0)*tmpc/(tmpa+tmpb)
abr=2.0*pi*(qvoqswz(k)-0.90)*tmpc/(tmpa+tmpb)
!
!**** allow evaporation to occur when RH less than 90%
!**** here not using 100% because the evaporation cooling
!**** of temperature is not taking into account yet; hence,
!**** the qsw value is a little bit larger. This will avoid
!**** evaporation can generate cloud.
!
!c vf1s,vf2s=ventilation factors for snow
!c vf1s=0.78,vf2s=0.31 in LIN
!
tmp1=constc*sqrho(k)*olambdas(k)**dp5/visc(k)
tmp2=abr*xnos*( vf1s*olambdas(k)*olambdas(k)+ &
vf2s*schmidt(k)**0.33334*gamdp5o2*sqrt(tmp1) )
tmp3=amin1(0.0,tmp2)
tmp3=amax1( tmp3,tmpd )
psmltevp(k)=amax1( tmp3,-qszodt(k) )
1400 continue
!
end if
!***********************************************************************
!********* rain production processes **********
!***********************************************************************
!
!c
!c (1) AUTOCONVERSION OF RAIN (Praut): RH
!sg: begin
if(flag_qndrop)then
if( qndropz(k) >= 1. ) then
! Liu et al. autoconversion scheme
rhocgs=rho(k)*1.e-3
liqconc=rhocgs*qlz(k) ! (kg/kg) to (g/cm3)
capn=1.0e-3*rhocgs*qndropz(k) ! (#/kg) to (#/cm3)
! rate function
if(liqconc.gt.1.e-10)then
p0=(kappa*beta/capn)*(liqconc*liqconc*liqconc)
xc=9.7d-17*capn*sqrt(capn)/(liqconc*liqconc)
! Calculate autoconversion rate (g/g/s)
if(xc.lt.10.)then
praut(k)=(p0/rhocgs) * ( 0.5d0*(xc*xc+2*xc+2.0d0)* &
(1.0d0+xc)*exp(-2.0d0*xc) )
endif
endif
endif
else
!sg: end
!c araut=afa*rho
!c afa=0.001 Rate coefficient for autoconvergence
!c
!c araut=1.0e-3
!c
araut=0.001
!testing
! tmp1=amax1( 0.0,araut*(qlz(k)-ql0) )
! praut(k)=amin1( tmp1,qlzodt(k) )
tmp1=odtb*(qlz(k)-ql0)*( 1.0-exp(-araut*dtb) )
praut(k)=amax1( 0.0,tmp1 )
endif !sg
!c
!c (2) ACCRETION OF CLOUD WATER BY RAIN (Pracw): Lin (51)
!c
erw=1.0
! tmp1=qlz(k)*pio4*erw*xnor*consta*sqrho(k)
! tmp2=tmp1*gambp3*olambdar(k)**bp3
! pracw(k)=amin1( tmp2,qlzodt(k) )
tmp1=pio4*erw*xnor*consta*sqrho(k)* &
gambp3*olambdar(k)**bp3
pracw(k)=qlzodt(k)*( 1.0-exp(-tmp1*dtb) )
!c
!c (3) EVAPORATION OF RAIN (Prevp): Lin (52)
!c Prevp is negative value
!c
!c Sw=qvoqsw : saturation ratio
!c
tmpa=rvapor*xka(k)*tem(k)*tem(k)
tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
tmpc=tmpa*qswz(k)*diffwv(k)
!bloss: BEGIN
! tmpd=amin1(0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb)
! set max allowed evaporation to 90% of the amount that
! would induce saturation wrt liquid in a single step.
tmpd = qswz(k)*xlv/(rvapor*tem(k)**2) ! d(qsat_liq)/dT
tmpd = min( 0., 0.9*odtb*(qvz(k) + qlz(k) - qswz(k)) &
/ (1. + xlvocp * tmpd) )
abr=2.0*pi*(qvoqswz(k)-1.0)*tmpc/(tmpa+tmpb)
! abr=2.0*pi*(qvoqswz(k)-0.90)*tmpc/(tmpa+tmpb)
!bloss: END
!
!c vf1r,vf2r=ventilation factors for rain
!c vf1r=0.78,vf2r=0.31 in RH, LIN and MM5
!
vf1r=0.78
vf2r=0.31
tmp1=consta*sqrho(k)*olambdar(k)**bp5/visc(k)
tmp2=abr*xnor*( vf1r*olambdar(k)*olambdar(k)+ &
vf2r*schmidt(k)**0.33334*gambp5o2*sqrt(tmp1) )
tmp3=amin1( 0.0,tmp2 )
tmp3=amax1( tmp3,tmpd )
prevp(k)=amax1( tmp3,-qrzodt(k) )
!
! if(iout .gt. 0) write(20,*)'tmp1,tmp2,tmp3=',tmp1,tmp2,tmp3
! if(iout .gt. 0) write(20,*)'qlz,qiz,qrz=',qlz(k),qiz(k),qrz(k)
! if(iout .gt. 0) write(20,*)'tem,qsz,qvz=',tem(k),qsz(k),qvz(k)
! if (gindex .eq. 0.) goto 900
!
if (tem(k) .lt. 273.15) then
!
!
!-- graupel
!***********************************************************************
!********* graupel production processes for T < 0 C **********
!***********************************************************************
!c
!c (1) AUTOCONVERSION OF SNOW TO FORM GRAUPEL (Pgaut): Lin (37)
!c pgaut=alpha2*(qsz-qs0)
!c qs0=6.0E-4
!c alpha2=1.0e-3*exp(0.09*temcc(k)) Lin (38)
!
alpha2=1.0e-3*exp(0.09*temcc(k))
!
! testing
! tmp1=alpha2*(qsz(k)-qs0)
! tmp1=amax1(0.0,tmp1)
! pgaut(k)=amin1( tmp1,qszodt(k) )
tmp1=odtb*(qsz(k)-qs0)*(1.0-exp(-alpha2*dtb))
pgaut(k)=amax1( 0.0,tmp1 )
!c
!c (2) FREEZING OF RAIN TO FORM GRAUPEL (Pgfr): Lin (45)
!c positive value
!c Constant in Bigg freezing Aplume=Ap=0.66 /k
!c Constant in raindrop freezing equ. Bplume=Bp=100./m/m/m/s
!
if (qrz(k) .gt. 1.e-8 ) then
Bp=100.
Ap=0.66
tmp1=olambdar(k)*olambdar(k)*olambdar(k)
tmp2=20.*pi*pi*Bp*xnor*rhowater*orho(k)* &
(exp(-Ap*temcc(k))-1.0)*tmp1*tmp1*olambdar(k)
Pgfr(k)=amin1( tmp2,qrzodt(k) )
else
Pgfr(k)=0
endif
!c
!c if (qgz(k) = 0.0) skip the other step below about graupel
!c
if (qgz(k) .eq. 0.0) goto 4000
!c
!c Comparing Pgwet(wet process) and Pdry(dry process),
!c we will pick up the small one.
!c
!c ---------------
!c | dry processes |
!c ---------------
!c
!c (3) ACCRETION OF CLOUD WATER BY GRAUPEL (Pgacw): Lin (40)
!c egw=1.0
!c Cdrag=0.6 drag coefficients for hairstone
!c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
!c
egw=1.0
constg=sqrt(4.*grav*rhograul*0.33334*orho(k)*oCdrag)
tmp1=pio4*xnog*gam3pt5*constg*olambdag(k)**3.5
tmp2=qlz(k)*egw*tmp1
Pgacw(k)=amin1( tmp2,qlzodt(k) )
!c
!c (4) ACCRETION OF ICE CRYSTAL BY GRAUPEL (Pgaci): Lin (41)
!c egi=1. for wet growth
!c egi=0.1 for dry growth
!c
egi=0.1
tmp2=qiz(k)*egi*tmp1
pgaci(k)=amin1( tmp2,qizodt(k) )
!c
!c (5) ACCRETION OF SNOW BY GRAUPEL (Pgacs) : Lin (29)
!c Compute processes (6) only when qsz > 0.0 and qgz > 0.0
!c
egs=exp(0.09*temcc(k))
tmpa=olambdas(k)*olambdas(k)
tmpb=olambdag(k)*olambdag(k)
tmpc=olambdas(k)*olambdag(k)
tmp1=pi*pi*xnos*xnog*abs( vts(k)-vtg(k) )*orho(k)
tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
tmp3=tmp1*egs*rhosnow*tmp2
Pgacs(k)=amin1( tmp3,qszodt(k) )
!c
!c (6) ACCRETION OF RAIN BY GRAUPEL (Pgacr): Lin (42)
!c Compute processes (6) only when qrz > 0.0 and qgz > 0.0
!c egr=1.
!c
egr=1.
tmpa=olambdar(k)*olambdar(k)
tmpb=olambdag(k)*olambdag(k)
tmpc=olambdar(k)*olambdag(k)
tmp1=pi*pi*xnor*xnog*abs( vtr(k)-vtg(k) )*orho(k)
tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
tmp3=tmp1*egr*rhowater*tmp2
pgacr(k)=amin1( tmp3,qrzodt(k) )
!c
!c (7) Calculate total dry process effect Pdry(k)
!c
Pdry(k)=Pgacw(k)+pgaci(k)+Pgacs(k)+pgacr(k)
!c ---------------
!c | wet processes |
!c ---------------
!c
!c (3) ACCRETION OF ICE CRYSTAL BY GRAUPEL (Pgacip): Lin (41)
!c egi=1. for wet growth
!c egi=0.1 for dry growth
!c
tmp2=10.*pgaci(k)
pgacip(k)=amin1( tmp2,qizodt(k) )
!c
!c (4) ACCRETION OF SNOW BY GRAUPEL ((Pgacsp) : Lin (29)
!c Compute processes (6) only when qsz > 0.0 and qgz > 0.0
!c egs=exp(0.09*(tem(k)-273.15)) when T < 273.15 k
!c
tmp3=Pgacs(k)*1.0/egs
Pgacsp(k)=amin1( tmp3,qszodt(k) )
!c
!c (5) WET GROWTH OF GRAUPEL (Pgwet) : Lin (43)
!c may involve Pgacs or Pgaci and
!c must include PPgacw or Pgacr, or both.
!c ( The amount of Pgacw which is not able
!c to freeze is shed to rain. )
IF(temcc(k).gt.-40.)THEN
term0=constg*olambdag(k)**5.5/visc(k)
!c
!c vf1s,vf2s=ventilation factors for graupel
!c vf1s=0.78,vf2s=0.31 in LIN
!c Cdrag=0.6 drag coefficient for hairstone
!c constg2=vf1s*olambdag(k)*olambdag(k)+
!c vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
delrs=rs0(k)-qvz(k)
tmp0=1./(xlf+cw*temcc(k))
tmp1=2.*pi*xnog*(rho(k)*xlv*diffwv(k)*delrs-xka(k)* &
temcc(k))*orho(k)*tmp0
constg2=vf1s*olambdag(k)*olambdag(k)+ &
vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
tmp3=tmp1*constg2+(Pgacip(k)+Pgacsp(k))* &
(1-Ci*temcc(k)*tmp0)
tmp3=amax1(0.0,tmp3)
Pgwet(k)=amin1(tmp3,qlzodt(k)+qszodt(k)+qizodt(k) ) !bloss
!c
!c Comparing Pgwet(wet process) and Pdry(dry process),
!c we will apply the small one.
!c if dry processes then delta4=1.0
!c if wet processes then delta4=0.0
!
if ( Pdry(k) .lt. Pgwet(k) ) then
delta4=1.0
else
delta4=0.0
endif
ELSE
delta4=1.0
ENDIF
!c
!c
!c (6) Pgacrp(k)=Pgwet(k)-Pgacw(k)-Pgacip(k)-Pgacsp(k)
!c if Pgacrp(k) > 0. then some of the rain is frozen to hail
!c if Pgacrp(k) < 0. then some of the cloud water collected
!c by the hail is unable to freeze and is
!c shed as rain.
!c
Pgacrp(k)=Pgwet(k)-Pgacw(k)-Pgacip(k)-Pgacsp(k)
!c
!c (8) DEPOSITION/SUBLIMATION OF GRAUPEL (Pgdep/Pgsub): Lin (46)
!c includes ventilation effect
!c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
!c constg2=vf1s*olambdag(k)*olambdag(k)+
!c vf2s*schmidt(k)**0.33334*gam2pt75*constg
!c
!c abg=2*pi*(Si-1)/rho/(A"+B")
!c
tmpa=rvapor*xka(k)*tem(k)*tem(k)
tmpb=xls*xls*rho(k)*qsiz(k)*diffwv(k)
tmpc=tmpa*qsiz(k)*diffwv(k)
abg=2.0*pi*(qvoqsiz(k)-1.0)*tmpc/(tmpa+tmpb)
!c
!c vf1s,vf2s=ventilation factors for graupel
!c vf1s=0.78,vf2s=0.31 in LIN
!c Cdrag=0.6 drag coefficient for hairstone
!c
term0=constg*olambdag(k)**5.5/visc(k)
constg2=vf1s*olambdag(k)*olambdag(k)+ &
vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
tmp2=abg*xnog*constg2
pgdep(k)=amax1(0.0,tmp2)
pgsub(k)=amin1(0.0,tmp2)
pgsub(k)=amax1( pgsub(k),-qgzodt(k) )
4000 continue
else
!
!***********************************************************************
!********* graupel production processes for T > 0 C **********
!***********************************************************************
!
!c
!c (1) ACCRETION OF CLOUD WATER BY GRAUPEL (Pgacw): Lin (40)
!c egw=1.0
!c Cdrag=0.6 drag coefficients for hairstone
!c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
egw=1.0
constg=sqrt(4.*grav*rhograul*0.33334*orho(k)*oCdrag)
tmp1=pio4*xnog*gam3pt5*constg*olambdag(k)**3.5
tmp2=qlz(k)*egw*tmp1
Pgacw(k)=amin1( tmp2,qlzodt(k) )
!c
!c (2) ACCRETION OF RAIN BY GRAUPEL (Pgacr): Lin (42)
!c Compute processes (5) only when qrz > 0.0 and qgz > 0.0
!c egr=1.
!c
egr=1.
tmpa=olambdar(k)*olambdar(k)
tmpb=olambdag(k)*olambdag(k)
tmpc=olambdar(k)*olambdag(k)
tmp1=pi*pi*xnor*xnog*abs( vtr(k)-vtg(k) )*orho(k)
tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
tmp3=tmp1*egr*rhowater*tmp2
pgacr(k)=amin1( tmp3,qrzodt(k) )
!c
!c (3) GRAUPEL MELTING TO FORM RAIN (Pgmlt): Lin (47)
!c Pgmlt is negative value
!c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
!c constg2=vf1s*olambdag(k)*olambdag(k)+
!c vf2s*schmidt(k)**0.33334*gam2pt75*constg
!c Cdrag=0.6 drag coefficients for hairstone
!
delrs=rs0(k)-qvz(k)
term1=2.0*pi*orho(k)*( xlv*diffwv(k)*rho(k)*delrs- &
xka(k)*temcc(k) )
term0=sqrt(4.*grav*rhograul*0.33334*orho(k)*ocdrag) &
*olambdag(k)**5.5/visc(k)
constg2=vf1s*olambdag(k)*olambdag(k)+ &
vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
tmp2=xnog*constg2
tmp3=term1*oxlf*tmp2-cwoxlf*temcc(k)*( pgacw(k)+pgacr(k) )
tmp4=amin1(0.0,tmp3)
pgmlt(k)=amax1( tmp4,-qgzodt(k) )
!c
!c (4) EVAPORATION OF MELTING GRAUPEL (Pgmltevp) : HR (A19)
!c but use Lin et al. coefficience
!c Pgmltevp is a negative value
!c abg=2.0*pi*(qvoqsiz(k)-1.0)*tmpc/(tmpa+tmpb)
!c
tmpa=rvapor*xka(k)*tem(k)*tem(k)
tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
tmpc=tmpa*qswz(k)*diffwv(k)
tmpd=amin1( 0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb )
!c
!c abg=2*pi*(Si-1)/rho/(A"+B")
!c
abg=2.0*pi*(qvoqswz(k)-0.90)*tmpc/(tmpa+tmpb)
!
!**** allow evaporation to occur when RH less than 90%
!**** here not using 100% because the evaporation cooling
!**** of temperature is not taking into account yet; hence,
!**** the qgw value is a little bit larger. This will avoid
!**** evaporation can generate cloud.
!
!c vf1s,vf2s=ventilation factors for snow
!c vf1s=0.78,vf2s=0.31 in LIN
!c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
!c constg2=vf1s*olambdag(k)*olambdag(k)+
!c vf2s*schmidt(k)**0.33334*gam2pt75*constg
!
tmp2=abg*xnog*constg2
tmp3=amin1(0.0,tmp2)
tmp3=amax1( tmp3,tmpd )
pgmltevp(k)=amax1( tmp3,-qgzodt(k) )
!c
!c (5) ACCRETION OF SNOW BY GRAUPEL (Pgacs) : Lin (29)
!c Compute processes (3) only when qsz > 0.0 and qgz > 0.0
!c egs=1.0
!c
egs=1.
tmpa=olambdas(k)*olambdas(k)
tmpb=olambdag(k)*olambdag(k)
tmpc=olambdas(k)*olambdag(k)
tmp1=pi*pi*xnos*xnog*abs( vts(k)-vtg(k) )*orho(k)
tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
tmp3=tmp1*egs*rhosnow*tmp2
Pgacs(k)=amin1( tmp3,qszodt(k) )
endif
!
900 continue
!cc
!c
!c**********************************************************************
!c***** combine all processes together and avoid negative *****
!c***** water substances
!***********************************************************************
!c
if ( temcc(k) .lt. 0.0) then
!,delta4,1.-delta4
!c
!c gdelta4=gindex*delta4
!c g1sdelt4=gindex*(1.-delta4)
!c
gdelta4=gindex*delta4
g1sdelt4=gindex*(1.-delta4)
!c
!c combined water vapor depletions
!c
!cc graupel
tmp=psdep(k)+pgdep(k)*gindex
if ( tmp .gt. qvzodt(k) ) then
factor=qvzodt(k)/tmp
psdep(k)=psdep(k)*factor
pgdep(k)=pgdep(k)*factor*gindex
end if
!c
!c combined cloud water depletions
!c
tmp=praut(k)+psacw(k)+psfw(k)+pracw(k)+gindex*Pgacw(k)
if ( tmp .gt. qlzodt(k) ) then
factor=qlzodt(k)/tmp
praut(k)=praut(k)*factor
psacw(k)=psacw(k)*factor
psfw(k)=psfw(k)*factor
pracw(k)=pracw(k)*factor
!cc graupel
Pgacw(k)=Pgacw(k)*factor*gindex
end if
!c
!c combined cloud ice depletions
!c
tmp=psaut(k)+psaci(k)+praci(k)+psfi(k)+Pgaci(k)*gdelta4 &
+Pgacip(k)*g1sdelt4
if (tmp .gt. qizodt(k) ) then
factor=qizodt(k)/tmp
psaut(k)=psaut(k)*factor
psaci(k)=psaci(k)*factor
praci(k)=praci(k)*factor
psfi(k)=psfi(k)*factor
!cc graupel
Pgaci(k)=Pgaci(k)*factor*gdelta4
Pgacip(k)=Pgacip(k)*factor*g1sdelt4
endif
!c
!c combined all rain processes
!c
tmp_r=piacr(k)+psacr(k)-prevp(k)-praut(k)-pracw(k) &
+Pgfr(k)*gindex+Pgacr(k)*gdelta4 &
+Pgacrp(k)*g1sdelt4
if (tmp_r .gt. qrzodt(k) ) then
factor=qrzodt(k)/tmp_r
piacr(k)=piacr(k)*factor
psacr(k)=psacr(k)*factor
prevp(k)=prevp(k)*factor
!cc graupel
Pgfr(k)=Pgfr(k)*factor*gindex
Pgacr(k)=Pgacr(k)*factor*gdelta4
Pgacrp(k)=Pgacrp(k)*factor*g1sdelt4
endif
!c
!c if qrz < 1.0E-4 and qsz < 1.0E-4 then delta2=1.
!c (all Pracs and Psacr become to snow)
!c if qrz >= 1.0E-4 or qsz >= 1.0E-4 then delta2=0.
!c (all Pracs and Psacr become to graupel)
!c
if (qrz(k) .lt. 1.0E-4 .and. qsz(k) .lt. 1.0E-4) then
delta2=1.0
else
delta2=0.0
endif
!
!cc graupel
!c
!c if qrz(k) < 1.0e-4 then delta3=1. means praci(k) --> qs
!c piacr(k) --> qs
!c if qrz(k) > 1.0e-4 then delta3=0. means praci(k) --> qg
!c piacr(k) --> qg : Lin (20)
if (qrz(k) .lt. 1.0e-4) then
delta3=1.0
else
delta3=0.0
endif
!
!c
!c if gindex = 0.(no graupel) then delta2=1.0
!c delta3=1.0
!c
if (gindex .eq. 0.) then
delta2=1.0
delta3=1.0
endif
!
!c
!c combined all snow processes
!c
tmp_s=-pssub(k)-(psaut(k)+psaci(k)+psacw(k)+psfw(k)+ &
psfi(k)+praci(k)*delta3+piacr(k)*delta3+ &
psdep(k))+Pgaut(k)*gindex+Pgacs(k)*gdelta4+ &
Pgacsp(k)*g1sdelt4+Pracs(k)*(1.-delta2)- &
Psacr(k)*delta2
if ( tmp_s .gt. qszodt(k) ) then
factor=qszodt(k)/tmp_s
pssub(k)=pssub(k)*factor
Pracs(k)=Pracs(k)*factor
!cc graupel
Pgaut(k)=Pgaut(k)*factor*gindex
Pgacs(k)=Pgacs(k)*factor*gdelta4
Pgacsp(k)=Pgacsp(k)*factor*g1sdelt4
endif
!cc graupel
!
! if (gindex .eq. 0.) goto 998
!c
!c combined all graupel processes
!c
if(delta4.lt.0.5) then
!Re-define pgwet to account for limiting of pgacrp,
! pgacip, pgacw and pgacsp above
pgwet(k) = pgacrp(k) + pgacw(k) + pgacip(k) + pgacsp(k)
end if
tmp_g=-pgaut(k)-pgfr(k)-Pgacw(k)*delta4-Pgaci(k)*delta4 &
-Pgacr(k)*delta4-Pgacs(k)*delta4 &
-pgwet(k)*(1.-delta4)-pgsub(k)-pgdep(k) &
-psacr(k)*(1-delta2)-Pracs(k)*(1-delta2) &
-praci(k)*(1-delta3)-piacr(k)*(1-delta3)
if (tmp_g .gt. qgzodt(k)) then
factor=qgzodt(k)/tmp_g
pgsub(k)=pgsub(k)*factor
endif
998 continue
!c
!c calculate new water substances, thetae, tem, and qvsbar
!c
!cc graupel
pvapor(k)=-pssub(k)-psdep(k)-prevp(k)-pgsub(k)*gindex &
-pgdep(k)*gindex
qvz(k)=amax1( qvmin,qvz(k)+dtb*pvapor(k) )
pclw(k)=-praut(k)-pracw(k)-psacw(k)-psfw(k)-pgacw(k)*gindex
if(flag_qndrop)then
if( qlz(k) > 1e-20 ) &
qndropz(k)=amax1( 0.0,qndropz(k)+dtb*pclw(k)*qndropz(k)/qlz(k) ) !sg
endif
qlz(k)=amax1( 0.0,qlz(k)+dtb*pclw(k) )
pcli(k)=-psaut(k)-psfi(k)-psaci(k)-praci(k)-pgaci(k)*gdelta4 &
-Pgacip(k)*g1sdelt4
qiz(k)=amax1( 0.0,qiz(k)+dtb*pcli(k) )
tmp_r=piacr(k)+psacr(k)-prevp(k)-praut(k)-pracw(k) &
+Pgfr(k)*gindex+Pgacr(k)*gdelta4 &
+Pgacrp(k)*g1sdelt4
232 format(i2,1x,6(f9.3,1x))
prain(k)=-tmp_r
qrz(k)=amax1( 0.0,qrz(k)+dtb*prain(k) )
tmp_s=-pssub(k)-(psaut(k)+psaci(k)+psacw(k)+psfw(k)+ &
psfi(k)+praci(k)*delta3+piacr(k)*delta3+ &
psdep(k))+Pgaut(k)*gindex+Pgacs(k)*gdelta4+ &
Pgacsp(k)*g1sdelt4+Pracs(k)*(1.-delta2)- &
Psacr(k)*delta2
psnow(k)=-tmp_s
qsz(k)=amax1( 0.0,qsz(k)+dtb*psnow(k) )
qschg(k)=qschg(k)+psnow(k)
qschg(k)=psnow(k)
!cc graupel
tmp_g=-pgaut(k)-pgfr(k)-Pgacw(k)*delta4-Pgaci(k)*delta4 &
-Pgacr(k)*delta4-Pgacs(k)*delta4 &
-pgwet(k)*(1.-delta4)-pgsub(k)-pgdep(k) &
-psacr(k)*(1-delta2)-Pracs(k)*(1-delta2) &
-praci(k)*(1-delta3)-piacr(k)*(1-delta3)
252 format(i2,1x,6(f12.9,1x))
262 format(i2,1x,7(f12.9,1x))
pgraupel(k)=-tmp_g
pgraupel(k)=pgraupel(k)*gindex
qgz(k)=amax1( 0.0,qgz(k)+dtb*pgraupel(k))
! qgchg(k)=qgchg(k)+pgraupel(k)
qgchg(k)=pgraupel(k)
qgz(k)=qgz(k)*gindex
tmp=ocp/tothz(k)*xLf*(qschg(k)+qgchg(k))
theiz(k)=theiz(k)+dtb*tmp
thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
tem(k)=thz(k)*tothz(k)
temcc(k)=tem(k)-273.15
!bloss: Moves computation of saturation mixing ratio below
! if( temcc(k) .lt. -40.0 ) qswz(k)=qsiz(k)
! qlpqi=qlz(k)+qiz(k)
! if ( qlpqi .eq. 0.0 ) then
! qvsbar(k)=qsiz(k)
! else
! qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
! endif
!
else
!c
!c combined cloud water depletions
!c
tmp=praut(k)+psacw(k)+pracw(k)+pgacw(k)*gindex
if ( tmp .gt. qlzodt(k) ) then
factor=qlzodt(k)/tmp
praut(k)=praut(k)*factor
psacw(k)=psacw(k)*factor
pracw(k)=pracw(k)*factor
!cc graupel
pgacw(k)=pgacw(k)*factor*gindex
end if
!c
!c combined all snow processes
!c
tmp_s=-(psmlt(k)+psmltevp(k))+Pgacs(k)*gindex
if (tmp_s .gt. qszodt(k) ) then
factor=qszodt(k)/tmp_s
psmlt(k)=psmlt(k)*factor
psmltevp(k)=psmltevp(k)*factor
!cc graupel
Pgacs(k)=Pgacs(k)*factor*gindex
endif
!c
!c
!cc graupel
!c
! if (gindex .eq. 0.) goto 997
!c
!c combined all graupel processes
!c
tmp_g=-pgmlt(k)-pgacs(k)-pgmltevp(k)
if (tmp_g .gt. qgzodt(k)) then
factor=qgzodt(k)/tmp_g
pgmltevp(k)=pgmltevp(k)*factor
pgmlt(k)=pgmlt(k)*factor
endif
!c
997 continue
!c
!c combined all rain processes
!c
tmp_r=-prevp(k)-(praut(k)+pracw(k)+psacw(k)-psmlt(k)) &
+pgmlt(k)*gindex-pgacw(k)*gindex
if (tmp_r .gt. qrzodt(k) ) then
factor=qrzodt(k)/tmp_r
prevp(k)=prevp(k)*factor
endif
!c
!c
!c calculate new water substances and thetae
!c
pvapor(k)=-psmltevp(k)-prevp(k)-pgmltevp(k)*gindex
qvz(k)=amax1( qvmin,qvz(k)+dtb*pvapor(k))
pclw(k)=-praut(k)-pracw(k)-psacw(k)-pgacw(k)*gindex
if(flag_qndrop)then
if( qlz(k) > 1e-20 ) &
qndropz(k)=amax1( 0.0,qndropz(k)+dtb*pclw(k)*qndropz(k)/qlz(k) ) !sg
endif
qlz(k)=amax1( 0.0,qlz(k)+dtb*pclw(k) )
pcli(k)=0.0
qiz(k)=amax1( 0.0,qiz(k)+dtb*pcli(k) )
tmp_r=-prevp(k)-(praut(k)+pracw(k)+psacw(k)-psmlt(k)) &
+pgmlt(k)*gindex-pgacw(k)*gindex
242 format(i2,1x,7(f9.6,1x))
prain(k)=-tmp_r
tmpqrz=qrz(k)
qrz(k)=amax1( 0.0,qrz(k)+dtb*prain(k) )
tmp_s=-(psmlt(k)+psmltevp(k))+Pgacs(k)*gindex
psnow(k)=-tmp_s
qsz(k)=amax1( 0.0,qsz(k)+dtb*psnow(k) )
! qschg(k)=qschg(k)+psnow(k)
qschg(k)=psnow(k)
!cc graupel
tmp_g=-pgmlt(k)-pgacs(k)-pgmltevp(k)
! write(*,272)k,pgmlt(k),pgacs(k),pgmltevp(k),
272 format(i2,1x,3(f12.9,1x))
pgraupel(k)=-tmp_g*gindex
qgz(k)=amax1( 0.0,qgz(k)+dtb*pgraupel(k))
! qgchg(k)=qgchg(k)+pgraupel(k)
qgchg(k)=pgraupel(k)
qgz(k)=qgz(k)*gindex
!
tmp=ocp/tothz(k)*xLf*(qschg(k)+qgchg(k))
theiz(k)=theiz(k)+dtb*tmp
thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
tem(k)=thz(k)*tothz(k)
temcc(k)=tem(k)-273.15
! qswz(k)=episp0k*oprez(k)* &
! exp( svp2*temcc(k)/(tem(k)-svp3) )
!bloss: Moved computation of saturation mixing ratio below
! es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
! qswz(k)=ep2*es/(prez(k)-es)
! qsiz(k)=qswz(k)
! qvsbar(k)=qswz(k)
!
end if
preclw(k)=pclw(k) !sg
!
!***********************************************************************
!********** saturation adjustment **********
!***********************************************************************
!bloss: BEGIN
!
! compute saturation specific humidity at the temperature
! which would be experienced if all cloud liquid and ice
! were to become vapor. This will make for a consistent
! check of saturation. Previously, qvsbar was computed
! without accounting for the change in temperature due to
! evaporation/sublimation, and as a result would
! incorrectly identify some points as subsaturated.
tmp_tem = tem(k) ! updated temperature from above.
if(qlz(k)+qiz(k).gt. 0.) then
! account for latent heat if all qlz and qiz were converted to vapor
tmp_tem = tem(k) - xlvocp*qlz(k) - (xlvocp+xlfocp)*qiz(k)
end if
! compute temperature in celsius
tmp_temcc = tmp_tem - 273.15
! estimate lower bound on saturation vapor pressure
! (ice if <0C, liquid aboce)
if (tmp_temcc .lt. 0.) then
es=1000.*svp1*exp( 21.8745584*(tmp_tem-273.16)/(tmp_tem-7.66) ) !ice
else
es=1000.*svp1*exp( svp2*tmp_temcc/(tmp_tem-svp3) ) !liquid
end if
! compute lower bound on saturation mixing ratio.
qvsbar(k)=ep2*es/(prez(k)-es)
!
!bloss: END
!
! allow supersaturation exits linearly from 0% at 500 mb to 50%
! above 300 mb
! 5.0e-5=1.0/(500mb-300mb)
!
rsat=1.0+0.5*(50000.0-prez(k))*5.0e-5
rsat=amax1(1.0,rsat)
rsat=amin1(1.5,rsat)
rsat=1.0
if( qvz(k)+qlz(k)+qiz(k) .lt. rsat*qvsbar(k) ) then
!c
!c unsaturated
!c
qvz(k)=qvz(k)+qlz(k)+qiz(k)
qlz(k)=0.0
qiz(k)=0.0
thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
tem(k)=thz(k)*tothz(k)
temcc(k)=tem(k)-273.15
go to 1800
!
else
!c
!c saturated
!c
!
pladj(k)=qlz(k)
piadj(k)=qiz(k)
!
CALL satadj
(qvz, qlz, qiz, prez, theiz, thz, tothz, kts, kte, &
k, xLvocp, xLfocp, episp0k, EP2,SVP1,SVP2,SVP3,SVPT0 )
!
pladj(k)=odtb*(qlz(k)-pladj(k))
piadj(k)=odtb*(qiz(k)-piadj(k))
!
pclw(k)=pclw(k)+pladj(k)
pcli(k)=pcli(k)+piadj(k)
pvapor(k)=pvapor(k)-( pladj(k)+piadj(k) )
!
thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
tem(k)=thz(k)*tothz(k)
temcc(k)=tem(k)-273.15
! qswz(k)=episp0k*oprez(k)* &
! exp( svp2*temcc(k)/(tem(k)-svp3) )
es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
qswz(k)=ep2*es/(prez(k)-es)
if (tem(k) .lt. 273.15 ) then
! qsiz(k)=episp0k*oprez(k)* &
! exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
qsiz(k)=ep2*es/(prez(k)-es)
if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
else
qsiz(k)=qswz(k)
endif
qlpqi=qlz(k)+qiz(k)
if ( qlpqi .eq. 0.0 ) then
qvsbar(k)=qsiz(k)
else
qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
endif
end if
!
!***********************************************************************
!***** melting and freezing of cloud ice and cloud water *****
!***********************************************************************
qlpqi=qlz(k)+qiz(k)
if(qlpqi .le. 0.0) go to 1800
!
!c
!c (1) HOMOGENEOUS NUCLEATION WHEN T< -40 C (Pihom)
!c
if(temcc(k) .lt. -40.0) pihom(k)=qlz(k)*odtb
!c
!c (2) MELTING OF ICE CRYSTAL WHEN T> 0 C (Pimlt)
!c
if(temcc(k) .gt. 0.0) pimlt(k)=qiz(k)*odtb
!c
!c (3) PRODUCTION OF CLOUD ICE BY BERGERON PROCESS (Pidw): Hsie (p957)
!c this process only considered when -31 C < T < 0 C
!c
if(temcc(k) .lt. 0.0 .and. temcc(k) .gt. -31.0) then
!c!
!c! parama1 and parama2 functions must be user supplied
!c!
a1=parama1
( temcc(k) )
a2=parama2
( temcc(k) )
!! change unit from cgs to mks
a1=a1*0.001**(1.0-a2)
xnin=xni0*exp(-bni*temcc(k))
pidw(k)=xnin*orho(k)*(a1*xmnin**a2)
end if
!
pcli(k)=pcli(k)+pihom(k)-pimlt(k)+pidw(k)
pclw(k)=pclw(k)-pihom(k)+pimlt(k)-pidw(k)
qlz(k)=amax1( 0.0,qlz(k)+dtb*(-pihom(k)+pimlt(k)-pidw(k)) )
qiz(k)=amax1( 0.0,qiz(k)+dtb*(pihom(k)-pimlt(k)+pidw(k)) )
!
CALL satadj
(qvz, qlz, qiz, prez, theiz, thz, tothz, kts, kte, &
k, xLvocp, xLfocp, episp0k ,EP2,SVP1,SVP2,SVP3,SVPT0)
thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
tem(k)=thz(k)*tothz(k)
temcc(k)=tem(k)-273.15
! qswz(k)=episp0k*oprez(k)* &
! exp( svp2*temcc(k)/(tem(k)-svp3) )
es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
qswz(k)=ep2*es/(prez(k)-es)
if (tem(k) .lt. 273.15 ) then
! qsiz(k)=episp0k*oprez(k)* &
! exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
qsiz(k)=ep2*es/(prez(k)-es)
if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
else
qsiz(k)=qswz(k)
endif
qlpqi=qlz(k)+qiz(k)
if ( qlpqi .eq. 0.0 ) then
qvsbar(k)=qsiz(k)
else
qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
endif
1800 continue
!
!***********************************************************************
!********** integrate the productions of rain and snow **********
!***********************************************************************
!c
2000 continue
!---------------------------------------------------------------------
!
!***********************************************************************
!****** Write terms in cloud physics to time series dataset *****
!***********************************************************************
!
! open(unit=24,form='formatted',status='new',
! & file='cloud.dat')
!9030 format(10e12.6)
! write(24,*)'tmp'
! write(24,9030) (tem(k),k=kts+1,kte)
! write(24,*)'qiz'
! write(24,9030) (qiz(k),k=kts+1,kte)
! write(24,*)'qsz'
! write(24,9030) (qsz(k),k=kts+1,kte)
! write(24,*)'qrz'
! write(24,9030) (qrz(k),k=kts+1,kte)
! write(24,*)'qgz'
! write(24,9030) (qgz(k),k=kts+1,kte)
! write(24,*)'qvoqsw'
! write(24,9030) (qvoqswz(k),k=kts+1,kte)
! write(24,*)'qvoqsi'
! write(24,9030) (qvoqsiz(k),k=kts+1,kte)
! write(24,*)'vtr'
! write(24,9030) (vtr(k),k=kts+1,kte)
! write(24,*)'vts'
! write(24,9030) (vts(k),k=kts+1,kte)
! write(24,*)'vtg'
! write(24,9030) (vtg(k),k=kts+1,kte)
! write(24,*)'pclw'
! write(24,9030) (pclw(k),k=kts+1,kte)
! write(24,*)'pvapor'
! write(24,9030) (pvapor(k),k=kts+1,kte)
! write(24,*)'pcli'
! write(24,9030) (pcli(k),k=kts+1,kte)
! write(24,*)'pimlt'
! write(24,9030) (pimlt(k),k=kts+1,kte)
! write(24,*)'pihom'
! write(24,9030) (pihom(k),k=kts+1,kte)
! write(24,*)'pidw'
! write(24,9030) (pidw(k),k=kts+1,kte)
! write(24,*)'prain'
! write(24,9030) (prain(k),k=kts+1,kte)
! write(24,*)'praut'
! write(24,9030) (praut(k),k=kts+1,kte)
! write(24,*)'pracw'
! write(24,9030) (pracw(k),k=kts+1,kte)
! write(24,*)'prevp'
! write(24,9030) (prevp(k),k=kts+1,kte)
! write(24,*)'psnow'
! write(24,9030) (psnow(k),k=kts+1,kte)
! write(24,*)'psaut'
! write(24,9030) (psaut(k),k=kts+1,kte)
! write(24,*)'psfw'
! write(24,9030) (psfw(k),k=kts+1,kte)
! write(24,*)'psfi'
! write(24,9030) (psfi(k),k=kts+1,kte)
! write(24,*)'praci'
! write(24,9030) (praci(k),k=kts+1,kte)
! write(24,*)'piacr'
! write(24,9030) (piacr(k),k=kts+1,kte)
! write(24,*)'psaci'
! write(24,9030) (psaci(k),k=kts+1,kte)
! write(24,*)'psacw'
! write(24,9030) (psacw(k),k=kts+1,kte)
! write(24,*)'psdep'
! write(24,9030) (psdep(k),k=kts+1,kte)
! write(24,*)'pssub'
! write(24,9030) (pssub(k),k=kts+1,kte)
! write(24,*)'pracs'
! write(24,9030) (pracs(k),k=kts+1,kte)
! write(24,*)'psacr'
! write(24,9030) (psacr(k),k=kts+1,kte)
! write(24,*)'psmlt'
! write(24,9030) (psmlt(k),k=kts+1,kte)
! write(24,*)'psmltevp'
! write(24,9030) (psmltevp(k),k=kts+1,kte)
! write(24,*)'pladj'
! write(24,9030) (pladj(k),k=kts+1,kte)
! write(24,*)'piadj'
! write(24,9030) (piadj(k),k=kts+1,kte)
! write(24,*)'pgraupel'
! write(24,9030) (pgraupel(k),k=kts+1,kte)
! write(24,*)'pgaut'
! write(24,9030) (pgaut(k),k=kts+1,kte)
! write(24,*)'pgfr'
! write(24,9030) (pgfr(k),k=kts+1,kte)
! write(24,*)'pgacw'
! write(24,9030) (pgacw(k),k=kts+1,kte)
! write(24,*)'pgaci'
! write(24,9030) (pgaci(k),k=kts+1,kte)
! write(24,*)'pgacr'
! write(24,9030) (pgacr(k),k=kts+1,kte)
! write(24,*)'pgacs'
! write(24,9030) (pgacs(k),k=kts+1,kte)
! write(24,*)'pgacip'
! write(24,9030) (pgacip(k),k=kts+1,kte)
! write(24,*)'pgacrP'
! write(24,9030) (pgacrP(k),k=kts+1,kte)
! write(24,*)'pgacsp'
! write(24,9030) (pgacsp(k),k=kts+1,kte)
! write(24,*)'pgwet'
! write(24,9030) (pgwet(k),k=kts+1,kte)
! write(24,*)'pdry'
! write(24,9030) (pdry(k),k=kts+1,kte)
! write(24,*)'pgsub'
! write(24,9030) (pgsub(k),k=kts+1,kte)
! write(24,*)'pgdep'
! write(24,9030) (pgdep(k),k=kts+1,kte)
! write(24,*)'pgmlt'
! write(24,9030) (pgmlt(k),k=kts+1,kte)
! write(24,*)'pgmltevp'
! write(24,9030) (pgmltevp(k),k=kts+1,kte)
!**** below if qv < qvmin then qv=qvmin, ql=0.0, and qi=0.0
!
do k=kts+1,kte
if ( qvz(k) .lt. qvmin ) then
qlz(k)=0.0
qiz(k)=0.0
qvz(k)=amax1( qvmin,qvz(k)+qlz(k)+qiz(k) )
end if
enddo
!
END SUBROUTINE clphy1d
!---------------------------------------------------------------------
! SATURATED ADJUSTMENT
!---------------------------------------------------------------------
SUBROUTINE satadj(qvz, qlz, qiz, prez, theiz, thz, tothz, & 4
kts, kte, k, xLvocp, xLfocp, episp0k, EP2,SVP1,SVP2,SVP3,SVPT0)
!---------------------------------------------------------------------
IMPLICIT NONE
!---------------------------------------------------------------------
! This program use Newton's method for finding saturated temperature
! and saturation mixing ratio.
!
! In this saturation adjustment scheme we assume
! (1) the saturation mixing ratio is the mass weighted average of
! saturation values over liquid water (qsw), and ice (qsi)
! following Lord et al., 1984 and Tao, 1989
!
! (2) the percentage of cloud liquid and cloud ice will
! be fixed during the saturation calculation
!---------------------------------------------------------------------
!
INTEGER, INTENT(IN ) :: kts, kte, k
REAL, DIMENSION( kts:kte ), &
INTENT(INOUT) :: qvz, qlz, qiz
!
REAL, DIMENSION( kts:kte ), &
INTENT(IN ) :: prez, theiz, tothz
REAL, INTENT(IN ) :: xLvocp, xLfocp, episp0k
REAL, INTENT(IN ) :: EP2,SVP1,SVP2,SVP3,SVPT0
! LOCAL VARS
INTEGER :: n
REAL, DIMENSION( kts:kte ) :: thz, tem, temcc, qsiz, &
qswz, qvsbar
REAL :: qsat, qlpqi, ratql, t0, t1, tmp1, ratqi, tsat, absft, &
denom1, denom2, dqvsbar, ftsat, dftsat, qpz, &
gindex, es
REAL :: tem_noliqice, qsat_noliqice !bloss
!
!---------------------------------------------------------------------
thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
tem(k)=tothz(k)*thz(k)
!bloss: BEGIN
tem_noliqice = tem(k) - xlvocp*qlz(k) - (xLvocp+xLfocp)*qiz(k)
if (tem_noliqice .gt. 273.15) then
es=1000.*svp1*exp( svp2*(tem_noliqice-svpt0)/(tem_noliqice-svp3) )
qsat_noliqice=ep2*es/(prez(k)-es)
else
qsat_noliqice=episp0k/prez(k)* &
exp( 21.8745584*(tem_noliqice-273.15)/(tem_noliqice-7.66) )
end if
!bloss: END
qpz=qvz(k)+qlz(k)+qiz(k)
if (qpz .lt. qsat_noliqice) then
qvz(k)=qpz
qiz(k)=0.0
qlz(k)=0.0
go to 400
end if
qlpqi=qlz(k)+qiz(k)
if( qlpqi .ge. 1.0e-5) then
ratql=qlz(k)/qlpqi
ratqi=qiz(k)/qlpqi
else
t0=273.15
! t1=233.15
t1=248.15
tmp1=( t0-tem(k) )/(t0-t1)
tmp1=amin1(1.0,tmp1)
tmp1=amax1(0.0,tmp1)
ratqi=tmp1
ratql=1.0-tmp1
end if
!
!
!-- saturation mixing ratios over water and ice
!-- at the outset we will follow Bolton 1980 MWR for
!-- the water and Murray JAS 1967 for the ice
!
!-- dqvsbar=d(qvsbar)/dT
!-- ftsat=F(Tsat)
!-- dftsat=d(F(T))/dT
!
! First guess of tsat
tsat=tem(k)
absft=1.0
!
do 200 n=1,20
denom1=1.0/(tsat-svp3)
denom2=1.0/(tsat-7.66)
! qswz(k)=episp0k/prez(k)* &
! exp( svp2*denom1*(tsat-273.15) )
es=1000.*svp1*exp( svp2*denom1*(tsat-svpt0) )
qswz(k)=ep2*es/(prez(k)-es)
if (tem(k) .lt. 273.15) then
! qsiz(k)=episp0k/prez(k)* &
! exp( 21.8745584*denom2*(tsat-273.15) )
es=1000.*svp1*exp( 21.8745584*denom2*(tsat-273.15) )
qsiz(k)=ep2*es/(prez(k)-es)
if (tem(k) .lt. 233.15) qswz(k)=qsiz(k)
else
qsiz(k)=qswz(k)
endif
qvsbar(k)=ratql*qswz(k)+ratqi*qsiz(k)
!
! if( absft .lt. 0.01 .and. n .gt. 3 ) go to 300
if( absft .lt. 0.01 ) go to 300
!
dqvsbar=ratql*qswz(k)*svp2*243.5*denom1*denom1+ &
ratqi*qsiz(k)*21.8745584*265.5*denom2*denom2
ftsat=tsat+(xlvocp+ratqi*xlfocp)*qvsbar(k)- &
tothz(k)*theiz(k)-xlfocp*ratqi*(qvz(k)+qlz(k)+qiz(k))
dftsat=1.0+(xlvocp+ratqi*xlfocp)*dqvsbar
tsat=tsat-ftsat/dftsat
absft=abs(ftsat)
200 continue
9020 format(1x,'point can not converge, absft,n=',e12.5,i5)
!
300 continue
if( qpz .gt. qvsbar(k) ) then
qvz(k)=qvsbar(k)
qiz(k)=ratqi*( qpz-qvz(k) )
qlz(k)=ratql*( qpz-qvz(k) )
else
qvz(k)=qpz
qiz(k)=0.0
qlz(k)=0.0
end if
400 continue
END SUBROUTINE satadj
!----------------------------------------------------------------
REAL FUNCTION parama1(temp) 4
!----------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------
! This program calculate the parameter for crystal growth rate
! in Bergeron process
!----------------------------------------------------------------
REAL, INTENT (IN ) :: temp
REAL, DIMENSION(32) :: a1
INTEGER :: i1, i1p1
REAL :: ratio
data a1/0.100e-10,0.7939e-7,0.7841e-6,0.3369e-5,0.4336e-5, &
0.5285e-5,0.3728e-5,0.1852e-5,0.2991e-6,0.4248e-6, &
0.7434e-6,0.1812e-5,0.4394e-5,0.9145e-5,0.1725e-4, &
0.3348e-4,0.1725e-4,0.9175e-5,0.4412e-5,0.2252e-5, &
0.9115e-6,0.4876e-6,0.3473e-6,0.4758e-6,0.6306e-6, &
0.8573e-6,0.7868e-6,0.7192e-6,0.6513e-6,0.5956e-6, &
0.5333e-6,0.4834e-6/
i1=int(-temp)+1
i1p1=i1+1
ratio=-(temp)-float(i1-1)
parama1=a1(i1)+ratio*( a1(i1p1)-a1(i1) )
END FUNCTION parama1
!----------------------------------------------------------------
REAL FUNCTION parama2(temp) 4
!----------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------
! This program calculate the parameter for crystal growth rate
! in Bergeron process
!----------------------------------------------------------------
REAL, INTENT (IN ) :: temp
REAL, DIMENSION(32) :: a2
INTEGER :: i1, i1p1
REAL :: ratio
data a2/0.0100,0.4006,0.4831,0.5320,0.5307,0.5319,0.5249, &
0.4888,0.3849,0.4047,0.4318,0.4771,0.5183,0.5463, &
0.5651,0.5813,0.5655,0.5478,0.5203,0.4906,0.4447, &
0.4126,0.3960,0.4149,0.4320,0.4506,0.4483,0.4460, &
0.4433,0.4413,0.4382,0.4361/
i1=int(-temp)+1
i1p1=i1+1
ratio=-(temp)-float(i1-1)
parama2=a2(i1)+ratio*( a2(i1p1)-a2(i1) )
END FUNCTION parama2
!----------------------------------------------------------------
REAL FUNCTION ggamma(X) 20,2
!----------------------------------------------------------------
IMPLICIT NONE
!----------------------------------------------------------------
REAL, INTENT(IN ) :: x
REAL, DIMENSION(8) :: B
INTEGER ::j, K1
REAL ::PF, G1TO2 ,TEMP
DATA B/-.577191652,.988205891,-.897056937,.918206857, &
-.756704078,.482199394,-.193527818,.035868343/
PF=1.
TEMP=X
DO 10 J=1,200
IF (TEMP .LE. 2) GO TO 20
TEMP=TEMP-1.
10 PF=PF*TEMP
100 FORMAT(//,5X,'module_mp_lin: INPUT TO GAMMA FUNCTION TOO LARGE, X=',E12.5)
WRITE(wrf_err_message,100)X
CALL wrf_error_fatal
(wrf_err_message)
20 G1TO2=1.
TEMP=TEMP - 1.
DO 30 K1=1,8
30 G1TO2=G1TO2 + B(K1)*TEMP**K1
ggamma=PF*G1TO2
END FUNCTION ggamma
!----------------------------------------------------------------
!+---+-----------------------------------------------------------------+
subroutine refl10cm_lin (qv1d, qr1d, qs1d, qg1d, & 1,2
t1d, p1d, dBZ, kts, kte, ii, jj)
IMPLICIT NONE
!..Sub arguments
INTEGER, INTENT(IN):: kts, kte, ii, jj
REAL, DIMENSION(kts:kte), INTENT(IN):: &
qv1d, qr1d, qs1d, qg1d, t1d, p1d
REAL, DIMENSION(kts:kte), INTENT(INOUT):: dBZ
!..Local variables
REAL, DIMENSION(kts:kte):: temp, pres, qv, rho
REAL, DIMENSION(kts:kte):: rr, rs, rg
DOUBLE PRECISION, DIMENSION(kts:kte):: ilamr, ilams, ilamg
DOUBLE PRECISION, DIMENSION(kts:kte):: N0_r, N0_s, N0_g
DOUBLE PRECISION:: lamr, lams, lamg
LOGICAL, DIMENSION(kts:kte):: L_qr, L_qs, L_qg
REAL, DIMENSION(kts:kte):: ze_rain, ze_snow, ze_graupel
DOUBLE PRECISION:: fmelt_s, fmelt_g
INTEGER:: i, k, k_0, kbot, n
LOGICAL:: melti
DOUBLE PRECISION:: cback, x, eta, f_d
REAL, PARAMETER:: R=287.
REAL, PARAMETER:: PIx=3.1415926536
!+---+
do k = kts, kte
dBZ(k) = -35.0
enddo
!+---+-----------------------------------------------------------------+
!..Put column of data into local arrays.
!+---+-----------------------------------------------------------------+
do k = kts, kte
temp(k) = t1d(k)
qv(k) = MAX(1.E-10, qv1d(k))
pres(k) = p1d(k)
rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
if (qr1d(k) .gt. 1.E-9) then
rr(k) = qr1d(k)*rho(k)
N0_r(k) = xnor
lamr = (xam_r*xcrg(3)*N0_r(k)/rr(k))**(1./xcre(1))
ilamr(k) = 1./lamr
L_qr(k) = .true.
else
rr(k) = 1.E-12
L_qr(k) = .false.
endif
if (qs1d(k) .gt. 1.E-9) then
rs(k) = qs1d(k)*rho(k)
N0_s(k) = xnos
lams = (xam_s*xcsg(3)*N0_s(k)/rs(k))**(1./xcse(1))
ilams(k) = 1./lams
L_qs(k) = .true.
else
rs(k) = 1.E-12
L_qs(k) = .false.
endif
if (qg1d(k) .gt. 1.E-9) then
rg(k) = qg1d(k)*rho(k)
N0_g(k) = xnog
lamg = (xam_g*xcgg(3)*N0_g(k)/rg(k))**(1./xcge(1))
ilamg(k) = 1./lamg
L_qg(k) = .true.
else
rg(k) = 1.E-12
L_qg(k) = .false.
endif
enddo
!+---+-----------------------------------------------------------------+
!..Locate K-level of start of melting (k_0 is level above).
!+---+-----------------------------------------------------------------+
melti = .false.
k_0 = kts
do k = kte-1, kts, -1
if ( (temp(k).gt.273.15) .and. L_qr(k) &
.and. (L_qs(k+1).or.L_qg(k+1)) ) then
k_0 = MAX(k+1, k_0)
melti=.true.
goto 195
endif
enddo
195 continue
!+---+-----------------------------------------------------------------+
!..Assume Rayleigh approximation at 10 cm wavelength. Rain (all temps)
!.. and non-water-coated snow and graupel when below freezing are
!.. simple. Integrations of m(D)*m(D)*N(D)*dD.
!+---+-----------------------------------------------------------------+
do k = kts, kte
ze_rain(k) = 1.e-22
ze_snow(k) = 1.e-22
ze_graupel(k) = 1.e-22
if (L_qr(k)) ze_rain(k) = N0_r(k)*xcrg(4)*ilamr(k)**xcre(4)
if (L_qs(k)) ze_snow(k) = (0.176/0.93) * (6.0/PIx)*(6.0/PIx) &
* (xam_s/900.0)*(xam_s/900.0) &
* N0_s(k)*xcsg(4)*ilams(k)**xcse(4)
if (L_qg(k)) ze_graupel(k) = (0.176/0.93) * (6.0/PIx)*(6.0/PIx) &
* (xam_g/900.0)*(xam_g/900.0) &
* N0_g(k)*xcgg(4)*ilamg(k)**xcge(4)
enddo
!+---+-----------------------------------------------------------------+
!..Special case of melting ice (snow/graupel) particles. Assume the
!.. ice is surrounded by the liquid water. Fraction of meltwater is
!.. extremely simple based on amount found above the melting level.
!.. Uses code from Uli Blahak (rayleigh_soak_wetgraupel and supporting
!.. routines).
!+---+-----------------------------------------------------------------+
if (melti .and. k_0.ge.kts+1) then
do k = k_0-1, kts, -1
!..Reflectivity contributed by melting snow
if (L_qs(k) .and. L_qs(k_0) ) then
fmelt_s = MAX(0.005d0, MIN(1.0d0-rs(k)/rs(k_0), 0.99d0))
eta = 0.d0
lams = 1./ilams(k)
do n = 1, nrbins
x = xam_s * xxDs(n)**xbm_s
call rayleigh_soak_wetgraupel
(x,DBLE(xocms),DBLE(xobms), &
fmelt_s, melt_outside_s, m_w_0, m_i_0, lamda_radar, &
CBACK, mixingrulestring_s, matrixstring_s, &
inclusionstring_s, hoststring_s, &
hostmatrixstring_s, hostinclusionstring_s)
f_d = N0_s(k)*xxDs(n)**xmu_s * DEXP(-lams*xxDs(n))
eta = eta + f_d * CBACK * simpson(n) * xdts(n)
enddo
ze_snow(k) = SNGL(lamda4 / (pi5 * K_w) * eta)
endif
!..Reflectivity contributed by melting graupel
if (L_qg(k) .and. L_qg(k_0) ) then
fmelt_g = MAX(0.005d0, MIN(1.0d0-rg(k)/rg(k_0), 0.99d0))
eta = 0.d0
lamg = 1./ilamg(k)
do n = 1, nrbins
x = xam_g * xxDg(n)**xbm_g
call rayleigh_soak_wetgraupel
(x,DBLE(xocmg),DBLE(xobmg), &
fmelt_g, melt_outside_g, m_w_0, m_i_0, lamda_radar, &
CBACK, mixingrulestring_g, matrixstring_g, &
inclusionstring_g, hoststring_g, &
hostmatrixstring_g, hostinclusionstring_g)
f_d = N0_g(k)*xxDg(n)**xmu_g * DEXP(-lamg*xxDg(n))
eta = eta + f_d * CBACK * simpson(n) * xdtg(n)
enddo
ze_graupel(k) = SNGL(lamda4 / (pi5 * K_w) * eta)
endif
enddo
endif
do k = kte, kts, -1
dBZ(k) = 10.*log10((ze_rain(k)+ze_snow(k)+ze_graupel(k))*1.d18)
enddo
end subroutine refl10cm_lin
!+---+-----------------------------------------------------------------+
END MODULE module_mp_lin