54 & eps,epsm1,fv,grav,hvap,rd,rv, &
55 & t0c,delt,ntk,ntr,delp,first_time_step,restart, &
56 & tmf,qmicro,progsigma,progomega, &
57 & prslp,psp,phil,tkeh,qtr,prevsq,q,q1,t1,u1,v1,fscav, &
58 & rn,kbot,ktop,kcnv,islimsk,garea,cscale, &
59 & dot,ncloud,hpbl,ud_mf,dt_mf,cnvw,cnvc, &
60 & clam,c0s,c1,evef,pgcon,asolfac,hwrf_samfshal, &
61 & sigmain,sigmaout,omegain,omegaout,betadcu,betamcu,betascu, &
64 use machine ,
only : kind_phys
65 use funcphys ,
only : fpvs
69 integer,
intent(in) :: im, km, itc, ntc, ntk, ntr, ncloud
70 integer,
intent(in) :: islimsk(:)
71 real(kind=kind_phys),
intent(in) :: cliq, cp, cvap, &
72 & eps, epsm1, fv, grav, hvap, rd, rv, t0c, betascu, betadcu, &
74 real(kind=kind_phys),
intent(in) :: delt, cscale
75 real(kind=kind_phys),
intent(in) :: psp(:), delp(:,:), &
76 & prslp(:,:), garea(:), hpbl(:), dot(:,:), phil(:,:), &
78 real(kind=kind_phys),
intent(in),
optional :: qmicro(:,:), &
80 real(kind=kind_phys),
intent(in),
optional :: sigmain(:,:), &
83 real(kind=kind_phys),
dimension(:),
intent(in) :: fscav
84 integer,
intent(inout) :: kcnv(:)
86 real(kind=kind_phys),
intent(inout) :: qtr(:,:,:), &
87 & q1(:,:), t1(:,:), u1(:,:), v1(:,:), tkeh(:,:)
89 integer,
intent(out) :: kbot(:), ktop(:)
90 real(kind=kind_phys),
intent(out) :: rn(:), &
91 & cnvw(:,:), cnvc(:,:), dt_mf(:,:)
93 real(kind=kind_phys),
intent(out) :: ud_mf(:,:)
94 real(kind=kind_phys),
intent(inout),
optional :: sigmaout(:,:), &
97 real(kind=kind_phys),
intent(in) :: clam, c0s, c1, &
98 & asolfac, evef, pgcon
99 logical,
intent(in) :: hwrf_samfshal,first_time_step, &
100 & restart,progsigma,progomega
101 character(len=*),
intent(out) :: errmsg
102 integer,
intent(out) :: errflg
105 integer i,j,indx, k, kk, km1, n
108 real(kind=kind_phys) clamd, tkemx, tkemn, dtke
110 real(kind=kind_phys) dellat,
113 & dq, dqsdp, dqsdt, dt,
118 & el2orc, elocp, aafac,
120 & es, etah, h1, shevf,
122 & fact1, fact2, factor,
123 & cthk, cthkmn, dthk,
124 & gamma, pprime, betaw, tauadv,
126 & rfact, shear, tfac,
131 & rho, tem, tem1, tem2,
134 integer kb(im), kb1(im), kbcon(im), kbcon1(im),
135 & ktcon(im), ktcon1(im),
138 real(kind=kind_phys) aa1(im), cina(im),
139 & tkemean(im), clamt(im),
140 & ps(im), del(im,km), prsl(im,km),
141 & umean(im), advfac(im), gdx(im),
142 & delhbar(im), delq(im), delq2(im),
143 & delqbar(im), delqev(im), deltbar(im),
145 & deltv(im), dtconv(im),
146 & pdot(im), po(im,km),
147 & qcond(im), qevap(im), hmax(im),
150 & xlamud(im), xmb(im), xmbmax(im),
152 & delubar(im), delvbar(im)
154 real(kind=kind_phys) c0(im), sfcpbl(im)
156 real(kind=kind_phys) crtlame, crtlamd
158 real(kind=kind_phys) cinpcr, cinpcrmx, cinpcrmn,
159 & cinacr, cinacrmx, cinacrmn,
164 real(kind=kind_phys) bb1, bb2, csmf, wucb
168 real(kind=kind_phys) omega_u(im,km),zdqca(im,km),tmfq(im,km),
169 & omegac(im),zeta(im,km),dbyo1(im,km),
170 & sigmab(im),qadv(im,km)
171 real(kind=kind_phys) gravinv,dxcrtas,invdelt,sigmind,sigmins,
173 logical flag_shallow,flag_mid
191 parameter(cm=1.0,cq=1.0)
193 parameter(clamd=0.1,tkemx=0.65,tkemn=0.05)
194 parameter(dtke=tkemx-tkemn)
195 parameter(cthk=200.,cthkmn=0.,dthk=25.)
196 parameter(sfclfac=0.2,rhcrt=0.75)
197 parameter(cinpcrmx=180.,cinpcrmn=120.)
199 parameter(cinacrmx=-120.,shevf=2.0)
200 parameter(dtmax=10800.,dtmin=600.)
201 parameter(bb1=4.0,bb2=0.8,csmf=0.2)
202 parameter(tkcrt=2.,cmxfac=10.)
204 parameter(betaw=.03,dxcrtc0=9.e3)
205 parameter(h1=0.33333333)
207 parameter(dxcrtas=500.e3,sigmind=0.01,sigmins=0.03,sigminm=0.01)
208c local variables and arrays
209 real(kind=kind_phys) pfld(im,km), to(im,km), qo(im,km),
210 & uo(im,km), vo(im,km), qeso(im,km),
211 & ctr(im,km,ntr), ctro(im,km,ntr)
214c variables for tracer wet deposition,
215 real(kind=kind_phys),
dimension(im,km,ntc) :: chem_c, chem_pw,
217 real(kind=kind_phys),
parameter :: escav = 0.8
220 real(kind=kind_phys) wu2(im,km), buo(im,km), drag(im,km),
221 & wush(im,km), wc(im)
224 real(kind=kind_phys) scaldfunc(im), sigmagfm(im)
228 real(kind=kind_phys) qlko_ktcon(im), dellal(im,km),
229 & dbyo(im,km), zo(im,km), xlamue(im,km),
231 & heo(im,km), heso(im,km),
232 & dellah(im,km), dellaq(im,km),
234 & dellau(im,km), dellav(im,km), hcko(im,km),
235 & ucko(im,km), vcko(im,km), qcko(im,km),
236 & qrcko(im,km), ecko(im,km,ntr),
237 & ercko(im,km,ntr), eta(im,km),
238 & zi(im,km), pwo(im,km), c0t(im,km),
239 & sumx(im), tx1(im), cnvwt(im,km)
245 real(kind=kind_phys) q_diff(im,0:km-1), e_diff(im,0:km-1,ntr),
247 real(kind=kind_phys) rrkp, phkp
248 real(kind=kind_phys) tsumn(im), tsump(im), rtnp(im)
250 logical do_aerosols, totflg, cnvflg(im), flg(im)
252 real(kind=kind_phys) tf, tcr, tcrf
253 parameter(tf=233.16, tcr=263.16, tcrf=1.0/(tcr-tf))
256c-----------------------------------------------------------------------
266 el2orc = hvap*hvap/(rv*cp)
268 fact1 = (cvap-cliq)/rv
269 fact2 = hvap/rv-fact1*t0c
271 if (.not.hwrf_samfshal)
then
281c-----------------------------------------------------------------------
282 if (.not.hwrf_samfshal)
then
284 do_aerosols = (itc > 0) .and. (ntc > 0) .and. (ntr > 0)
285 if (do_aerosols) do_aerosols = (ntr >= itc + ntc - 3)
307 if(hwrf_samfshal)
then
310 if(kcnv(i) == 1) cnvflg(i) = .false.
315 sfcpbl(i) = sfclfac * hpbl(i)
327 gdx(i) = sqrt(garea(i))
336 if(kcnv(i) == 1) cnvflg(i) = .false.
341 sfcpbl(i) = sfclfac * hpbl(i)
352 gdx(i) = sqrt(garea(i))
360 totflg = totflg .and. (.not. cnvflg(i))
366 if(islimsk(i) == 1)
then
375 if(gdx(i) < dxcrtc0)
then
376 tem = gdx(i) / dxcrtc0
385 if(t1(i,k) > 273.16)
then
388 tem = d0 * (t1(i,k) - 273.16)
390 c0t(i,k) = c0(i) * tem1
413c model tunable parameters are all here
430c define top layer for search of the downdraft originating layer
431c and the maximum thetae for updraft
442 if (prsl(i,k)*tx1(i) > 0.70) kbm(i) = k + 1
443 if (prsl(i,k)*tx1(i) > 0.60) kmax(i) = k + 1
447 kbm(i) = min(kbm(i),kmax(i))
450c hydrostatic height assume zero terr and compute
451c updraft entrainment rate as an inverse
function of height
456 zo(i,k) = phil(i,k) / grav
460 if(hwrf_samfshal)
then
463 zi(i,k) = 0.5*(zo(i,k)+zo(i,k+1))
464 xlamue(i,k) = clam / zi(i,k)
468 xlamue(i,km) = xlamue(i,km1)
473 zi(i,k) = 0.5*(zo(i,k)+zo(i,k+1))
487 if (flg(i) .and. zo(i,k) <= hpbl(i))
then
495 kpbl(i)= min(kpbl(i),kbm(i))
499c convert surface pressure to mb from cb
504 if (cnvflg(i) .and. k <= kmax(i))
then
505 pfld(i,k) = prsl(i,k) * 10.0
546 if (.not.hwrf_samfshal)
then
551 if (cnvflg(i) .and. k <= kmax(i))
then
552 ctr(i,k,kk) = qtr(i,k,n)
553 ctro(i,k,kk) = qtr(i,k,n)
564 if (cnvflg(i) .and. k <= kmax(i))
then
565 qeso(i,k) = 0.01 * fpvs(to(i,k))
566 qeso(i,k) = eps * qeso(i,k) / (pfld(i,k) + epsm1*qeso(i,k))
568 qeso(i,k) = max(qeso(i,k), val1)
570 qo(i,k) = max(qo(i,k), val2 )
577c compute moist static
energy
582 if (cnvflg(i) .and. k <= kmax(i))
then
584 tem = phil(i,k) + cp * to(i,k)
585 heo(i,k) = tem + hvap * qo(i,k)
586 heso(i,k) = tem + hvap * qeso(i,k)
587c heo(i,k) = min(heo(i,k),heso(i,k))
592c determine level with largest moist static
energy within pbl
593c this is the level
where updraft starts
603 if (flg(i) .and. zo(i,k) <= sfcpbl(i))
then
611 kb1(i) = min(kb1(i),kpbl(i))
617 hmax(i) = heo(i,kb1(i))
623 if(cnvflg(i) .and. (k > kb1(i) .and. k <= kpbl(i)))
then
624 if(heo(i,k) > hmax(i))
then
635 if (cnvflg(i) .and. k <= kmax(i)-1)
then
636 dz = .5 * (zo(i,k+1) - zo(i,k))
637 dp = .5 * (pfld(i,k+1) - pfld(i,k))
638 es = 0.01 * fpvs(to(i,k+1))
639 pprime = pfld(i,k+1) + epsm1 * es
640 qs = eps * es / pprime
641 dqsdp = - qs / pprime
642 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
643 dqsdt = qs * pfld(i,k+1) * desdt / (es * pprime)
644 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
645 dt = (grav*dz + hvap*dqsdp*dp) / (cp*(1. + gamma))
646 dq = dqsdt * dt + dqsdp * dp
647 to(i,k) = to(i,k+1) + dt
648 qo(i,k) = qo(i,k+1) + dq
649 po(i,k) = .5 * (pfld(i,k) + pfld(i,k+1))
657 if (cnvflg(i) .and. k <= kmax(i)-1)
then
658 qeso(i,k) = 0.01 * fpvs(to(i,k))
659 qeso(i,k) = eps * qeso(i,k) / (po(i,k) + epsm1*qeso(i,k))
661 qeso(i,k) = max(qeso(i,k), val1)
663 qo(i,k) = max(qo(i,k), val2 )
665 rh(i,k) = min(qo(i,k)/qeso(i,k), 1.)
666 heo(i,k) = .5 * grav * (zo(i,k) + zo(i,k+1)) +
667 & cp * to(i,k) + hvap * qo(i,k)
668 heso(i,k) = .5 * grav * (zo(i,k) + zo(i,k+1)) +
669 & cp * to(i,k) + hvap * qeso(i,k)
670 uo(i,k) = .5 * (uo(i,k) + uo(i,k+1))
671 vo(i,k) = .5 * (vo(i,k) + vo(i,k+1))
676 if (.not.hwrf_samfshal)
then
680 if (cnvflg(i) .and. k <= kmax(i)-1)
then
681 ctro(i,k,n) = .5 * (ctro(i,k,n) + ctro(i,k+1,n))
688c look for the level of free convection as cloud base
693 if(flg(i)) kbcon(i) = kmax(i)
697 if (flg(i) .and. k < kbm(i))
then
698 if(k > kb(i) .and. heo(i,kb(i)) > heso(i,k))
then
708 if(kbcon(i) == kmax(i)) cnvflg(i) = .false.
715 totflg = totflg .and. (.not. cnvflg(i))
723 pdot(i) = 0.01 * dot(i,kbcon(i))
727c turn off convection
if pressure depth between parcel source level
728c and cloud base is larger than a critical
value, cinpcr
732 if(islimsk(i) == 1)
then
743 if(pdot(i) <= w4)
then
744 tem = (pdot(i) - w4) / (w3 - w4)
745 elseif(pdot(i) >= -w4)
then
746 tem = - (pdot(i) + w4) / (w4 - w3)
755 ptem1= .5*(cinpcrmx-cinpcrmn)
756 cinpcr = cinpcrmx - ptem * ptem1
757 tem1 = pfld(i,kb(i)) - pfld(i,kbcon(i))
759 if(tem1 > cinpcr .and.
760 & zi(i,kbcon(i)) > hpbl(i))
then
768 totflg = totflg .and. (.not. cnvflg(i))
782 if (cnvflg(i) .and. k <= kpbl(i))
then
783 if(heo(i,k) > hmax(i))
then
793 if(flg(i)) kbcon(i) = kmax(i)
797 if (flg(i) .and. k < kbm(i))
then
798 if(k > kb(i) .and. heo(i,kb(i)) > heso(i,k))
then
808 if(kbcon(i) == kmax(i)) cnvflg(i) = .false.
814 totflg = totflg .and. (.not. cnvflg(i))
821 pdot(i) = 0.01 * dot(i,kbcon(i))
834 if(k >= kb(i) .and. k < kbcon(i))
then
835 dz = zo(i,k+1) - zo(i,k)
836 rhbar(i) = rhbar(i) + rh(i,k) * dz
837 sumx(i) = sumx(i) + dz
844 rhbar(i) = rhbar(i) / sumx(i)
845 if(rhbar(i) < rhcrt)
then
853 totflg = totflg .and. (.not. cnvflg(i))
864 if (hwrf_samfshal)
then
867 xlamud(i) = xlamue(i,kbcon(i))
883 if(k >= kb(i) .and. k < kbcon(i))
then
884 dz = zo(i,k+1) - zo(i,k)
885 tkemean(i) = tkemean(i) + tkeh(i,k) * dz
886 sumx(i) = sumx(i) + dz
894 tkemean(i) = tkemean(i) / sumx(i)
895 if(tkemean(i) > tkemx)
then
896 clamt(i) = clam + clamd
897 else if(tkemean(i) < tkemn)
then
898 clamt(i) = clam - clamd
900 tem = tkemx - tkemean(i)
901 tem1 = 1. - 2. * tem / dtke
902 clamt(i) = clam + clamd * tem1
909 if(tkemean(i) > tkcrt)
then
910 tem = 1. + tkemean(i)/tkcrt
911 tem1 = min(tem, cmxfac)
912 clamt(i) = tem1 * clam
934 dz = zo(i,k+1) - zo(i,k)
935 xlamue(i,k) = clamt(i) / (zi(i,k) + dz)
936 xlamue(i,k) = max(xlamue(i,k), crtlame)
942 xlamue(i,km) = xlamue(i,km1)
946c specify the detrainment rate for the updrafts
955 xlamud(i) = 0.001 * clamt(i)
960c determine updraft mass flux for the subcloud layers
970 if(k < kbcon(i) .and. k >= kb(i))
then
971 dz = zi(i,k+1) - zi(i,k)
972 ptem = 0.5*(xlamue(i,k)+xlamue(i,k+1))-xlamud(i)
973 eta(i,k) = eta(i,k+1) / (1. + ptem * dz)
979c compute mass flux above cloud base
987 if(k > kbcon(i) .and. k < kmax(i))
then
988 dz = zi(i,k) - zi(i,k-1)
989 ptem = 0.5*(xlamue(i,k)+xlamue(i,k-1))-xlamud(i)
990 eta(i,k) = eta(i,k-1) * (1 + ptem * dz)
991 if(eta(i,k) <= 0.)
then
993 kbm(i) = min(kbm(i),kmax(i))
1001c compute updraft cloud property
1007 hcko(i,indx) = heo(i,indx)
1008 ucko(i,indx) = uo(i,indx)
1009 vcko(i,indx) = vo(i,indx)
1013 if (.not. hwrf_samfshal)
then
1018 ecko(i,indx,n) = ctro(i,indx,n)
1019 ercko(i,indx,n) = ctro(i,indx,n)
1031 if(k > kb(i) .and. k < kmax(i))
then
1032 dz = zi(i,k) - zi(i,k-1)
1033 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
1034 tem1 = 0.5 * xlamud(i) * dz
1035 factor = 1. + tem - tem1
1036 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5*
1037 & (heo(i,k)+heo(i,k-1)))/factor
1038 dbyo(i,k) = hcko(i,k) - heso(i,k)
1040 tem = 0.5 * cm * tem
1044 ucko(i,k) = ((1.-tem)*ucko(i,k-1)+ptem*uo(i,k)
1045 & +ptem1*uo(i,k-1))/factor
1046 vcko(i,k) = ((1.-tem)*vcko(i,k-1)+ptem*vo(i,k)
1047 & +ptem1*vo(i,k-1))/factor
1053 if (.not.hwrf_samfshal)
then
1054 if (do_aerosols)
then
1063 if(k > kb(i) .and. k < kmax(i))
then
1064 dz = zi(i,k) - zi(i,k-1)
1065 tem = 0.25 * (xlamue(i,k)+xlamue(i,k-1)) * dz
1068 ecko(i,k,n) = ((1.-tem)*ecko(i,k-1,n)+tem*
1069 & (ctro(i,k,n)+ctro(i,k-1,n)))/factor
1070 ercko(i,k,n) = ecko(i,k,n)
1076 if (do_aerosols)
then
1082 if(k > kb(i) .and. k < kmax(i))
then
1083 dz = zi(i,k) - zi(i,k-1)
1084 tem = 0.25 * (xlamue(i,k)+xlamue(i,k-1)) * dz
1087 ecko(i,k,kk) = ((1. - tem) * ecko(i,k-1,kk) + tem *
1088 & (ctro(i,k,kk) + ctro(i,k-1,kk))) / factor
1089 ercko(i,k,kk) = ecko(i,k,kk)
1090 chem_c(i,k,n) = escav * fscav(n) * ecko(i,k,kk)
1091 tem = chem_c(i,k,n) / (1. + c0t(i,k) * dz)
1092 chem_pw(i,k,n) = c0t(i,k) * dz * tem * eta(i,k-1)
1093 ecko(i,k,kk) = tem + ecko(i,k,kk) - chem_c(i,k,n)
1104 if(k > kb(i) .and. k < kmax(i))
then
1105 dz = zi(i,k) - zi(i,k-1)
1106 tem = 0.25 * (xlamue(i,k)+xlamue(i,k-1)) * dz
1109 ecko(i,k,kk) = ((1. - tem) * ecko(i,k-1,kk) + tem *
1110 & (ctro(i,k,kk) + ctro(i,k-1,kk))) / factor
1111 ercko(i,k,kk) = ecko(i,k,kk)
1120c taking account into convection inhibition due to existence of
1121c dry layers below cloud base
1130 if (flg(i) .and. k < kbm(i))
then
1131 if(k >= kbcon(i) .and. dbyo(i,k) > 0.)
then
1140 if(kbcon1(i) == kmax(i)) cnvflg(i) = .false.
1145 tem = pfld(i,kbcon(i)) - pfld(i,kbcon1(i))
1154 totflg = totflg .and. (.not. cnvflg(i))
1159c calculate convective inhibition
1165 if(k > kb(i) .and. k < kbcon1(i))
then
1166 dz1 = zo(i,k+1) - zo(i,k)
1167 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1168 rfact = 1. + fv * cp * gamma
1172 & dz1 * (grav / (cp * to(i,k)))
1173 & * dbyo(i,k) / (1. + gamma)
1179 & max(val,(qeso(i,k) - qo(i,k)))
1186 if (hwrf_samfshal)
then
1190 if(cina(i) < cinacr) cnvflg(i) = .false.
1196 if(islimsk(i) == 1)
then
1207 if(pdot(i) <= w4)
then
1208 tem = (pdot(i) - w4) / (w3 - w4)
1209 elseif(pdot(i) >= -w4)
then
1210 tem = - (pdot(i) + w4) / (w4 - w3)
1220 tem1= .5*(cinacrmx-cinacrmn)
1221 cinacr = cinacrmx - tem * tem1
1222 if(cina(i) < cinacr) cnvflg(i) = .false.
1229 totflg = totflg .and. (.not. cnvflg(i))
1234c determine first guess cloud top as the level of zero buoyancy
1235c limited to the level of p/ps=0.7
1240 if(flg(i)) ktcon(i) = 1
1244 if (flg(i) .and. k < kbm(i))
then
1245 if(k > kbcon1(i) .and. dbyo(i,k) < 0.)
then
1253c turn off shallow convection
if cloud depth is larger than cthk or less than cthkmn
1257 tem = pfld(i,kbcon(i))-pfld(i,ktcon(i))
1258 if(tem > cthk .or. tem < cthkmn)
then
1265c specify upper limit of mass flux at cloud base
1271 dp = 1000. * del(i,k)
1272 xmbmax(i) = dp / (grav * dt2)
1276c compute cloud moisture property and precipitation
1282 qcko(i,kb(i)) = qo(i,kb(i))
1283 qrcko(i,kb(i)) = qo(i,kb(i))
1290 if(k > kb(i) .and. k < ktcon(i))
then
1291 dz = zi(i,k) - zi(i,k-1)
1292 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1294 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
1296 tem = 0.25 * (xlamue(i,k)+xlamue(i,k-1)) * dz
1299 qcko(i,k) = ((1.-tem)*qcko(i,k-1)+tem*
1300 & (qo(i,k)+qo(i,k-1)))/factor
1301 qrcko(i,k) = qcko(i,k)
1303 dq = eta(i,k) * (qcko(i,k) - qrch)
1307c below lfc check
if there is excess moisture to release latent heat
1309 if(k >= kbcon(i) .and. dq > 0.)
then
1310 etah = .5 * (eta(i,k) + eta(i,k-1))
1311 dp = 1000. * del(i,k)
1313 ptem = c0t(i,k) + c1
1314 qlk = dq / (eta(i,k) + etah * ptem * dz)
1315 dellal(i,k) = etah * c1 * dz * qlk * grav / dp
1317 qlk = dq / (eta(i,k) + etah * c0t(i,k) * dz)
1319 buo(i,k) = buo(i,k) - grav * qlk
1320 qcko(i,k)= qlk + qrch
1321 pwo(i,k) = etah * c0t(i,k) * dz * qlk
1322 cnvwt(i,k) = etah * qlk * grav / dp
1323 zdqca(i,k)=dq/eta(i,k)
1328 if(k >= kbcon(i))
then
1329 rfact = 1. + fv * cp * gamma
1331 buo(i,k) = buo(i,k) + (grav / (cp * to(i,k)))
1332 & * dbyo(i,k) / (1. + gamma)
1335 buo(i,k) = buo(i,k) + grav * fv *
1336 & max(val,(qeso(i,k) - qo(i,k)))
1337 drag(i,k) = max(xlamue(i,k),xlamud(i))
1339 tem = ((uo(i,k)-uo(i,k-1))/dz)**2
1340 tem = tem+((vo(i,k)-vo(i,k-1))/dz)**2
1341 wush(i,k) = csmf * sqrt(tem)
1350c calculate cloud work function
1393 if(k >= kbcon(i) .and. k < ktcon(i))
then
1394 dz1 = zo(i,k+1) - zo(i,k)
1395 aa1(i) = aa1(i) + buo(i,k) * dz1
1396 dbyo1(i,k) = hcko(i,k) - heso(i,k)
1402 if(cnvflg(i) .and. aa1(i) <= 0.) cnvflg(i) = .false.
1408 totflg = totflg .and. (.not. cnvflg(i))
1413c estimate the onvective overshooting as the level
1414c
where the [aafac * cloud work function] becomes zero,
1415c which is the final cloud top
1416c limited to the level of p/ps=0.7
1421 aa1(i) = aafac * aa1(i)
1432 if(k >= ktcon(i) .and. k < kbm(i))
then
1433 dz1 = zo(i,k+1) - zo(i,k)
1434 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1435 rfact = 1. + fv * cp * gamma
1439 & dz1 * (grav / (cp * to(i,k)))
1440 & * dbyo(i,k) / (1. + gamma)
1447 if(aa1(i) < 0.)
then
1456c compute cloud moisture property, detraining cloud
water
1457c and precipitation in overshooting layers
1463 if(k >= ktcon(i) .and. k < ktcon1(i))
then
1464 dz = zi(i,k) - zi(i,k-1)
1465 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1467 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
1469 tem = 0.25 * (xlamue(i,k)+xlamue(i,k-1)) * dz
1472 qcko(i,k) = ((1.-tem)*qcko(i,k-1)+tem*
1473 & (qo(i,k)+qo(i,k-1)))/factor
1474 qrcko(i,k) = qcko(i,k)
1476 dq = eta(i,k) * (qcko(i,k) - qrch)
1478c check
if there is excess moisture to release latent heat
1481 etah = .5 * (eta(i,k) + eta(i,k-1))
1482 dp = 1000. * del(i,k)
1484 ptem = c0t(i,k) + c1
1485 qlk = dq / (eta(i,k) + etah * ptem * dz)
1486 dellal(i,k) = etah * c1 * dz * qlk * grav / dp
1488 qlk = dq / (eta(i,k) + etah * c0t(i,k) * dz)
1490 qcko(i,k) = qlk + qrch
1491 pwo(i,k) = etah * c0t(i,k) * dz * qlk
1492 cnvwt(i,k) = etah * qlk * grav / dp
1493 zdqca(i,k)=dq/eta(i,k)
1503 if (hwrf_samfshal)
then
1507 tem = po(i,k) / (rd * to(i,k))
1508 wucb = -0.01 * dot(i,k) / (tem * grav)
1510 wu2(i,k) = wucb * wucb
1520 & kbcon1,ktcon,omegain,delt,del,zi,cnvflg,omegaout,
1521 & grav,buo,drag,wush,xlamue,bb1,bb2)
1525 if(k > kbcon1(i) .and. k < ktcon(i))
then
1526 omega_u(i,k)=omegaout(i,k)
1527 omega_u(i,k)=max(omega_u(i,k),-80.)
1529 rho = po(i,k)*100. / (rd * to(i,k))
1530 tem = (-omega_u(i,k)) / ((rho * grav))
1532 wu2(i,k) = max(wu2(i,k), 0.)
1543 if(k > kbcon1(i) .and. k < ktcon(i))
then
1544 dz = zi(i,k) - zi(i,k-1)
1545 tem = 0.25 * bb1 * (drag(i,k-1)+drag(i,k)) * dz
1546 tem1 = 0.5 * bb2 * (buo(i,k-1)+buo(i,k))
1547 tem2 = wush(i,k) * sqrt(wu2(i,k-1))
1548 tem2 = (tem1 - tem2) * dz
1549 ptem = (1. - tem) * wu2(i,k-1)
1551 wu2(i,k) = (ptem + tem2) / ptem1
1552 wu2(i,k) = max(wu2(i,k), 0.)
1561 if(k > kbcon1(i) .and. k < ktcon(i))
then
1562 rho = po(i,k)*100. / (rd * to(i,k))
1563 omega_u(i,k)=-1.0*sqrt(wu2(i,k))*rho*grav
1564 omega_u(i,k)=max(omega_u(i,k),-80.)
1582 if(k > kbcon1(i) .and. k < ktcon(i))
then
1583 dz = zi(i,k) - zi(i,k-1)
1584 tem = 0.5 * (sqrt(wu2(i,k)) + sqrt(wu2(i,k-1)))
1585 wc(i) = wc(i) + tem * dz
1586 sumx(i) = sumx(i) + dz
1593 if(sumx(i) == 0.)
then
1596 wc(i) = wc(i) / sumx(i)
1599 if (wc(i) < val) cnvflg(i)=.false.
1612 if(k > kbcon1(i) .and. k < ktcon(i))
then
1613 dp = 1000. * del(i,k)
1614 tem = 0.5 * (omega_u(i,k) + omega_u(i,k-1))
1615 omegac(i) = omegac(i) + tem * dp
1616 sumx(i) = sumx(i) + dp
1623 if(sumx(i) == 0.)
then
1626 omegac(i) = omegac(i) / sumx(i)
1629 if (omegac(i) > val) cnvflg(i)=.false.
1637 if(k > kbcon1(i) .and. k < ktcon(i))
then
1638 if(omega_u(i,k) .ne. 0.)
then
1639 zeta(i,k)=eta(i,k)*(omegac(i)/omega_u(i,k))
1643 zeta(i,k)=max(0.,zeta(i,k))
1644 zeta(i,k)=min(1.,zeta(i,k))
1651c exchange ktcon with ktcon1
1656 ktcon(i) = ktcon1(i)
1661c this section is ready for cloud
water
1665c compute liquid and vapor separation at cloud top
1671 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1673 & + gamma * dbyo(i,k) / (hvap * (1. + gamma))
1674 dq = qcko(i,k) - qrch
1676c check
if there is excess moisture to release latent heat
1688c--- compute precipitation efficiency in terms of windshear
1724c--- what would the change be, that a cloud with unit mass
1725c--- will
do to the environment?
1731 if(cnvflg(i) .and. k <= kmax(i))
then
1739 if (.not.hwrf_samfshal)
then
1743 if(cnvflg(i) .and. k <= kmax(i))
then
1751c--- changed due to subsidence and entrainment
1756 if(k > kb(i) .and. k < ktcon(i))
then
1757 dp = 1000. * del(i,k)
1758 dz = zi(i,k) - zi(i,k-1)
1761 dv2h = .5 * (heo(i,k) + heo(i,k-1))
1764 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1))
1769 dellah(i,k) = dellah(i,k) +
1770 & ( eta(i,k)*dv1h - eta(i,k-1)*dv3h
1771 & - tem*eta(i,k-1)*dv2h*dz
1772 & + tem1*eta(i,k-1)*.5*(hcko(i,k)+hcko(i,k-1))*dz
1775 tem1 = -eta(i,k) * qrcko(i,k)
1776 tem2 = -eta(i,k-1) * qcko(i,k-1)
1777 dellaq(i,k) = dellaq(i,k) + (tem1-tem2) * factor
1779 tem1=eta(i,k)*(uo(i,k)-ucko(i,k))
1780 tem2=eta(i,k-1)*(uo(i,k-1)-ucko(i,k-1))
1781 dellau(i,k) = dellau(i,k) + (tem1-tem2) * factor
1783 tem1=eta(i,k)*(vo(i,k)-vcko(i,k))
1784 tem2=eta(i,k-1)*(vo(i,k-1)-vcko(i,k-1))
1785 dellav(i,k) = dellav(i,k) + (tem1-tem2) * factor
1791 if(.not.hwrf_samfshal)
then
1796 if(k > kb(i) .and. k < ktcon(i))
then
1797 dp = 1000. * del(i,k)
1799 tem1 = -eta(i,k) * ercko(i,k,n)
1800 tem2 = -eta(i,k-1) * ecko(i,k-1,n)
1801 dellae(i,k,n) = dellae(i,k,n) + (tem1-tem2) * grav/dp
1815 dp = 1000. * del(i,indx)
1816 tem = eta(i,indx-1) * grav / dp
1817 dellah(i,indx) = tem * (hcko(i,indx-1) - heo(i,indx-1))
1818 dellaq(i,indx) = tem * qcko(i,indx-1)
1819 dellau(i,indx) = tem * (ucko(i,indx-1) - uo(i,indx-1))
1820 dellav(i,indx) = tem * (vcko(i,indx-1) - vo(i,indx-1))
1824 dellal(i,indx) = tem * qlko_ktcon(i)
1827 if (.not.hwrf_samfshal)
then
1832 dp = 1000. * del(i,indx)
1833 dellae(i,indx,n) = eta(i,indx-1) *
1834 & ecko(i,indx-1,n) * grav / dp
1847 if(cnvflg(i) .and. k <= ktcon(i))
then
1848 q_diff(i,k) = q1(i,k) - q1(i,k+1)
1854 if(q1(i,1) >= 0.)
then
1855 q_diff(i,0) = max(0.,2.*q1(i,1)-q1(i,2))-
1858 q_diff(i,0) = min(0.,2.*q1(i,1)-q1(i,2))-
1868 & (k >= kb(i) .and. k < ktcon(i)))
then
1869 if(eta(i,k) > 0.)
then
1871 if(abs(q_diff(i,k)) > 1.e-22)
1872 & rrkp = q_diff(i,k+1) / q_diff(i,k)
1873 phkp = (rrkp+abs(rrkp)) / (1.+abs(rrkp))
1875 & phkp*(qo(i,k)-q1(i,k+1))
1876 flxtvd(i,k) = eta(i,k) * tem1
1885 & (k > kb(i) .and. k <= ktcon(i)))
then
1886 dp = 1000. * del(i,k)
1887 dellaq(i,k) = dellaq(i,k) +
1888 & (flxtvd(i,k) - flxtvd(i,k-1)) * grav/dp
1895 if (.not.hwrf_samfshal)
then
1900 if(cnvflg(i) .and. k <= ktcon(i))
then
1901 e_diff(i,k,n) = ctr(i,k,n) - ctr(i,k+1,n)
1907 if(ctr(i,1,n) >= 0.)
then
1908 e_diff(i,0,n) = max(0.,2.*ctr(i,1,n)-ctr(i,2,n))-
1911 e_diff(i,0,n) = min(0.,2.*ctr(i,1,n)-ctr(i,2,n))-
1924 & (k >= kb(i) .and. k < ktcon(i)))
then
1925 if(eta(i,k) > 0.)
then
1927 if(abs(e_diff(i,k,n)) > 1.e-22)
1928 & rrkp = e_diff(i,k+1,n) / e_diff(i,k,n)
1929 phkp = (rrkp+abs(rrkp)) / (1.+abs(rrkp))
1930 tem1 = ctr(i,k+1,n) +
1931 & phkp*(ctro(i,k,n)-ctr(i,k+1,n))
1932 flxtvd(i,k) = eta(i,k) * tem1
1941 & (k > kb(i) .and. k <= ktcon(i)))
then
1942 dp = 1000. * del(i,k)
1943 dellae(i,k,n) = dellae(i,k,n) +
1944 & (flxtvd(i,k) - flxtvd(i,k-1)) * grav/dp
1958 tem = zi(i,ktcon1(i)) - zi(i,kbcon1(i))
1959 dtconv(i) = tem / wc(i)
1960 if (.not.hwrf_samfshal)
then
1961 tfac = 1. + gdx(i) / 75000.
1962 dtconv(i) = tfac * dtconv(i)
1964 dtconv(i) = max(dtconv(i),dtmin)
1965 dtconv(i) = max(dtconv(i),dt2)
1966 dtconv(i) = min(dtconv(i),dtmax)
1980 if(k >= kbcon1(i) .and. k < ktcon1(i))
then
1981 dz = zi(i,k) - zi(i,k-1)
1982 tem = sqrt(u1(i,k)*u1(i,k)+v1(i,k)*v1(i,k))
1983 umean(i) = umean(i) + tem * dz
1984 sumx(i) = sumx(i) + dz
1991 umean(i) = umean(i) / sumx(i)
1992 umean(i) = max(umean(i), 1.)
1993 tauadv = gdx(i) / umean(i)
1994 advfac(i) = tauadv / dtconv(i)
1995 advfac(i) = min(advfac(i), 1.)
1999c compute cloud base mass flux as a
function of the mean
2005 if(first_time_step .and. .not.restart)
then
2014 qadv(i,k)=(q(i,k) - prevsq(i,k))*invdelt
2021 tmfq(i,k)=tmf(i,k,1)
2025 flag_shallow = .true.
2027 call progsigma_calc(im,km,first_time_step,restart,flag_shallow,
2028 & flag_mid,del,tmfq,qmicro,dbyo1,zdqca,omega_u,zeta,hvap,
2029 & delt,qadv,kb,kbcon1,ktcon,cnvflg,betascu,betamcu,betadcu,
2030 & sigmind,sigminm,sigmins,sigmain,sigmaout,sigmab)
2039 rho = po(i,k)*100. / (rd*to(i,k))
2040 if(
progsigma .and. gdx(i) < dxcrtas)
then
2041 xmb(i) = advfac(i)*sigmab(i)*((-1.0*omegac(i))*gravinv)
2043 xmb(i) = advfac(i)*betaw*rho*wc(i)
2051 tem = min(max(xlamue(i,kbcon(i)), 2.e-4), 6.e-4)
2053 tem1 = 3.14 * tem * tem
2054 sigmagfm(i) = tem1 / garea(i)
2055 sigmagfm(i) = max(sigmagfm(i), 0.001)
2056 sigmagfm(i) = min(sigmagfm(i), 0.999)
2063 if (gdx(i) < dxcrt)
then
2065 scaldfunc(i)=(1.-sigmab(i))*(1.-sigmab(i))
2067 scaldfunc(i) = (1.-sigmagfm(i)) * (1.-sigmagfm(i))
2069 scaldfunc(i) = max(min(scaldfunc(i), 1.0), 0.)
2073 xmb(i) = xmb(i) * scaldfunc(i)
2074 xmb(i) = min(xmb(i),xmbmax(i))
2097 if (cnvflg(i) .and. k <= kmax(i))
then
2098 qeso(i,k) = 0.01 * fpvs(t1(i,k))
2099 qeso(i,k) = eps * qeso(i,k) / (pfld(i,k) + epsm1*qeso(i,k))
2101 qeso(i,k) = max(qeso(i,k), val )
2118 if (.not. hwrf_samfshal)
then
2128 if(k > kb(i) .and. k <= ktcon(i))
then
2129 dellat = (dellah(i,k) - hvap * dellaq(i,k)) / cp
2130 t1(i,k) = t1(i,k) + dellat * xmb(i) * dt2
2131 q1(i,k) = q1(i,k) + dellaq(i,k) * xmb(i) * dt2
2135 u1(i,k) = u1(i,k) + dellau(i,k) * xmb(i) * dt2
2136 v1(i,k) = v1(i,k) + dellav(i,k) * xmb(i) * dt2
2137 dp = 1000. * del(i,k)
2138 tem = xmb(i) * dp / grav
2139 delhbar(i) = delhbar(i) + tem * dellah(i,k)
2140 delqbar(i) = delqbar(i) + tem * dellaq(i,k)
2141 deltbar(i) = deltbar(i) + tem * dellat
2142 delubar(i) = delubar(i) + tem * dellau(i,k)
2143 delvbar(i) = delvbar(i) + tem * dellav(i,k)
2160 if(k > kb(i) .and. k <= ktcon(i))
then
2161 tem = q1(i,k) * delp(i,k) / grav
2162 if(q1(i,k) < 0.) tsumn(i) = tsumn(i) + tem
2163 if(q1(i,k) > 0.) tsump(i) = tsump(i) + tem
2170 if(tsump(i) > 0. .and. tsumn(i) < 0.)
then
2171 if(tsump(i) > abs(tsumn(i)))
then
2172 rtnp(i) = tsumn(i) / tsump(i)
2174 rtnp(i) = tsump(i) / tsumn(i)
2182 if(k > kb(i) .and. k <= ktcon(i))
then
2183 if(rtnp(i) < 0.)
then
2184 if(tsump(i) > abs(tsumn(i)))
then
2185 if(q1(i,k) < 0.) q1(i,k)= 0.
2186 if(q1(i,k) > 0.) q1(i,k)=(1.+rtnp(i))*q1(i,k)
2188 if(q1(i,k) < 0.) q1(i,k)=(1.+rtnp(i))*q1(i,k)
2189 if(q1(i,k) > 0.) q1(i,k)=0.
2197 if (.not.hwrf_samfshal)
then
2205 if(k > kb(i) .and. k <= ktcon(i))
then
2206 ctr(i,k,n) = ctr(i,k,n)+dellae(i,k,n)*xmb(i)*dt2
2207 dp = 1000. * del(i,k)
2208 delebar(i,n)=delebar(i,n)+dellae(i,k,n)*xmb(i)*dp/grav
2225 if(k > kb(i) .and. k <= ktcon(i))
then
2228 dz = zi(i,k) - zi(i,k-1)
2232 tem = ctr(i,k,n) * dz
2234 tem = ctr(i,k,n) * delp(i,k) / grav
2236 if(ctr(i,k,n) < 0.) tsumn(i) = tsumn(i) + tem
2237 if(ctr(i,k,n) > 0.) tsump(i) = tsump(i) + tem
2244 if(tsump(i) > 0. .and. tsumn(i) < 0.)
then
2245 if(tsump(i) > abs(tsumn(i)))
then
2246 rtnp(i) = tsumn(i) / tsump(i)
2248 rtnp(i) = tsump(i) / tsumn(i)
2256 if(k > kb(i) .and. k <= ktcon(i))
then
2257 if(rtnp(i) < 0.)
then
2258 if(tsump(i) > abs(tsumn(i)))
then
2259 if(ctr(i,k,n)<0.) ctr(i,k,n)=0.
2260 if(ctr(i,k,n)>0.) ctr(i,k,n)=(1.+rtnp(i))*ctr(i,k,n)
2262 if(ctr(i,k,n)<0.) ctr(i,k,n)=(1.+rtnp(i))*ctr(i,k,n)
2263 if(ctr(i,k,n)>0.) ctr(i,k,n)=0.
2275 if(k > kb(i) .and. k <= ktcon(i))
then
2276 qtr(i,k,kk) = ctr(i,k,n)
2284 if (do_aerosols)
then
2292 if(k > kb(i) .and. k < ktcon(i))
then
2293 dp = 1000. * del(i,k)
2294 wet_dep(i,k,n) = chem_pw(i,k,n)*grav/dp
2295 wet_dep(i,k,n) = wet_dep(i,k,n)*xmb(i)*dt2*dp
2305 if(k > kb(i) .and. k < ktcon(i))
then
2306 dp = 1000. * del(i,k)
2307 if (qtr(i,k,kk) < 0.)
then
2309 tem = -qtr(i,k,kk)*dp
2310 if(wet_dep(i,k,n) >= tem)
then
2311 wet_dep(i,k,n) = wet_dep(i,k,n) - tem
2315 qtr(i,k,kk) = qtr(i,k,kk)+wet_dep(i,k,n)/dp
2333 if(k > kb(i) .and. k <= ktcon(i))
then
2334 qeso(i,k) = 0.01 * fpvs(t1(i,k))
2335 qeso(i,k) = eps * qeso(i,k)/(pfld(i,k) + epsm1*qeso(i,k))
2337 qeso(i,k) = max(qeso(i,k), val )
2353 if(k < ktcon(i) .and. k > kb(i))
then
2354 rntot(i) = rntot(i) + pwo(i,k) * xmb(i) * .001 * dt2
2367 if (k <= kmax(i))
then
2372 if(k < ktcon(i) .and. k > kb(i))
then
2373 rn(i) = rn(i) + pwo(i,k) * xmb(i) * .001 * dt2
2376 if(flg(i) .and. k < ktcon(i))
then
2380 qcond(i) = shevf * evef * (q1(i,k) - qeso(i,k))
2381 & / (1. + el2orc * qeso(i,k) / t1(i,k)**2)
2382 dp = 1000. * del(i,k)
2384 if(rn(i) > 0. .and. qcond(i) < 0.)
then
2385 qevap(i) = -qcond(i) * (1.-exp(-.32*sqrt(dt2*rn(i))))
2386 qevap(i) = min(qevap(i), rn(i)*1000.*grav/dp)
2387 delq2(i) = delqev(i) + .001 * qevap(i) * factor
2389 if(rn(i) > 0. .and. qcond(i) < 0. .and.
2390 & delq2(i) > rntot(i))
then
2391 qevap(i) = 1000.* grav * (rntot(i) - delqev(i)) / dp
2394 if(rn(i) > 0. .and. qevap(i) > 0.)
then
2396 tem1 = qevap(i) * tem
2397 if(tem1 > rn(i))
then
2398 qevap(i) = rn(i) / tem
2401 rn(i) = rn(i) - tem1
2403 q1(i,k) = q1(i,k) + qevap(i)
2404 t1(i,k) = t1(i,k) - elocp * qevap(i)
2405 deltv(i) = - elocp*qevap(i)/dt2
2406 delq(i) = + qevap(i)/dt2
2407 delqev(i) = delqev(i) + tem * qevap(i)
2409 delqbar(i) = delqbar(i) + delq(i) * factor
2410 deltbar(i) = deltbar(i) + deltv(i) * factor
2437 if(rn(i) < 0. .or. .not.flg(i)) rn(i) = 0.
2444c convective cloud
water
2448 if (k >= kbcon(i) .and. k < ktcon(i))
then
2449 cnvw(i,k) = cnvwt(i,k) * xmb(i) * dt2
2451 cnvw(i,k) = cnvw(i,k) * cscale
2453 cnvw(i,k) = cnvw(i,k) * cscale
2460c convective cloud cover
2466 if (k >= kbcon(i) .and. k < ktcon(i))
then
2467 cnvc(i,k) = 0.04 * log(1. + 675. * eta(i,k) * xmb(i))
2468 cnvc(i,k) = min(cnvc(i,k), 0.2)
2469 cnvc(i,k) = max(cnvc(i,k), 0.0)
2478 if (ncloud > 0)
then
2484 if (k >= kbcon(i) .and. k <= ktcon(i))
then
2485 tem = dellal(i,k) * xmb(i) * dt2
2486 tem1 = max(0.0, min(1.0, (tcr-t1(i,k))*tcrf))
2487 if (qtr(i,k,2) > -999.0)
then
2488 qtr(i,k,1) = qtr(i,k,1) + tem * tem1
2489 qtr(i,k,2) = qtr(i,k,2) + tem *(1.0-tem1)
2491 qtr(i,k,1) = qtr(i,k,1) + tem
2523 if(k >= kb(i) .and. k < ktop(i))
then
2524 ud_mf(i,k) = eta(i,k) * xmb(i) * dt2
2533 dt_mf(i,k) = ud_mf(i,k)
2539 if (.not.hwrf_samfshal)
then
2545 if(k > kb(i) .and. k < ktop(i))
then
2546 tem = 0.5 * (eta(i,k-1) + eta(i,k)) * xmb(i)
2547 tem1 = pfld(i,k) * 100. / (rd * t1(i,k))
2551 tem2 = max(sigmagfm(i), betaw)
2553 ptem = tem / (tem2 * tem1)
2554 qtr(i,k,ntk)=qtr(i,k,ntk)+0.5*tem2*ptem*ptem