4 !-------------------------------------------------------------------------------
5 subroutine cu_nsas(dt,p3di,p3d,pi3d,qc3d,qi3d,rho3d,itimestep,stepcu, &
6 hbot,htop,cu_act_flag,cudt,curr_secs,adapt_step_flag, &
7 rthcuten,rqvcuten,rqccuten,rqicuten, &
9 qv3d,t3d,raincv,pratec,xland,dz8w,w,u3d,v3d, &
12 p_qc,p_qi,p_first_scalar, &
13 cp,cliq,cpv,g,xlv,r_d,r_v,ep_1,ep_2, &
14 cice,xlv0,xls,psat,f_qi,f_qc, &
15 ids,ide, jds,jde, kds,kde, &
16 ims,ime, jms,jme, kms,kme, &
17 its,ite, jts,jte, kts,kte)
18 !-------------------------------------------------------------------------------
20 !-------------------------------------------------------------------------------
23 !-- p3di 3d pressure (pa) at interface level
24 !-- p3d 3d pressure (pa)
25 !-- pi3d 3d exner function (dimensionless)
26 !-- z height above sea level (m)
27 !-- qc3d cloud water mixing ratio (kg/kg)
28 !-- qi3d cloud ice mixing ratio (kg/kg)
29 !-- qv3d 3d water vapor mixing ratio (kg/kg)
30 !-- t3d temperature (k)
31 !-- raincv cumulus scheme precipitation (mm)
32 !-- w vertical velocity (m/s)
33 !-- dz8w dz between full levels (m)
34 !-- u3d 3d u-velocity interpolated to theta points (m/s)
35 !-- v3d 3d v-velocity interpolated to theta points (m/s)
36 !-- ids start index for i in domain
37 !-- ide end index for i in domain
38 !-- jds start index for j in domain
39 !-- jde end index for j in domain
40 !-- kds start index for k in domain
41 !-- kde end index for k in domain
42 !-- ims start index for i in memory
43 !-- ime end index for i in memory
44 !-- jms start index for j in memory
45 !-- jme end index for j in memory
46 !-- kms start index for k in memory
47 !-- kme end index for k in memory
48 !-- its start index for i in tile
49 !-- ite end index for i in tile
50 !-- jts start index for j in tile
51 !-- jte end index for j in tile
52 !-- kts start index for k in tile
53 !-- kte end index for k in tile
54 !-------------------------------------------------------------------------------
55 integer, intent(in ) :: ids,ide, jds,jde, kds,kde, &
56 ims,ime, jms,jme, kms,kme, &
57 its,ite, jts,jte, kts,kte, &
59 p_qc,p_qi,p_first_scalar
61 real, intent(in ) :: cp,cliq,cpv,g,xlv,r_d,r_v,ep_1,ep_2, &
63 real, intent(in ) :: dt
65 real, dimension( ims:ime, kms:kme, jms:jme ),optional , &
66 intent(inout) :: rthcuten, &
72 logical, optional :: F_QC,F_QI
73 real, dimension( ims:ime, kms:kme, jms:jme ) , &
74 intent(in ) :: qv3d, &
81 real, dimension( ims:ime, kms:kme, jms:jme ) , &
83 real, dimension( ims:ime, kms:kme, jms:jme ) , &
84 intent(in ) :: dz8w, &
86 real, dimension( ims:ime, jms:jme ) , &
87 intent(inout) :: raincv, &
89 real, dimension( ims:ime, jms:jme ) , &
90 intent(out) :: hbot, &
92 real, dimension( ims:ime, jms:jme ) , &
95 real, dimension( ims:ime, kms:kme, jms:jme ) , &
98 logical, dimension( ims:ime, jms:jme ) , &
99 intent(inout) :: cu_act_flag
100 real, intent( in) :: cudt
101 real, intent( in) :: curr_secs
102 logical, intent( in) :: adapt_step_flag
104 real, dimension( ims:ime, jms:jme ) , &
105 intent(in ) :: hpbl, &
108 integer, intent(in ) :: mp_physics
113 real, dimension( its:ite, jts:jte ) :: raincv1, &
117 real, dimension( its:ite, kts:kte ) :: del, &
126 real, dimension( its:ite, kts:kte+1 ) :: prsii, &
128 real, dimension( its:ite, kts:kte ) :: zll
129 real, dimension( its:ite) :: rain
131 integer, dimension (its:ite) :: kbot, &
137 !-------------------------------------------------------------------------------
138 ! microphysics scheme --> ncloud
139 if (mp_physics .eq. 1) then
141 elseif ( mp_physics .eq. 2 .or. mp_physics .eq. 3 ) then
143 elseif ( mp_physics .eq. 5 ) then
145 elseif ( mp_physics .eq. 4 .or. mp_physics .eq. 14 ) then
147 elseif ( mp_physics .eq. 9) then
153 !-------------------------------------------------------------------------------
155 !*** check to see if this is a convection timestep
157 if (adapt_step_flag) then
158 if ( (itimestep .eq. 0) .or. (cudt .eq. 0) .or. &
159 (curr_secs + dt >= (int(curr_secs/(cudt*60))+1)*cudt*60)) then
165 if (MOD(itimestep,stepcu) .EQ. 0 .or. itimestep .eq. 0) then
171 !-------------------------------------------------------------------------------
175 cu_act_flag(i,j)=.TRUE.
181 do j = jts,jte !outer most J_loop
185 dot(i,k) = -5.0e-4*g*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j))
186 prsll(i,k)=p3d(i,k,j)*0.001
187 prsii(i,k)=p3di(i,k,j)*0.001
191 prsii(i,kte+1)=p3di(i,kte+1,j)*0.001
200 zii(i,k+1)=zii(i,k)+dz8w(i,k,j)
206 zll(i,k)=0.5*(zii(i,k)+zii(i,k+1))
212 del(i,k)=prsll(i,k)*g/r_d*dz8w(i,k,j)/t3d(i,k,j)
216 ! q1(i,k)=qv3d(i,k,j)/(1.+qv3d(i,k,j))
218 qi2(i,k) = qi3d(i,k,j)
219 qc2(i,k) = qc3d(i,k,j)
224 call nsas2d(delt=dt,del=del(its,kts),prsl=prsll(its,kts), &
225 prsi=prsii(its,kts),prslk=pi3d(ims,kms,j),zl=zll(its,kts), &
226 zi=zii(its,kts),ncloud=ncloud,qi2=qi2(its,kts),qc2=qc2(its,kts), &
227 q1=q1(its,kts),t1=t1(its,kts),rain=rain(its), &
228 kbot=kbot(its),ktop=ktop(its), &
230 lat=j,slimsk=xland(ims,j),dot=dot(its,kts), &
231 u1=u1(its,kts), v1=v1(its,kts), &
232 cp_=cp,cliq_=cliq,cvap_=cpv,g_=g,hvap_=xlv, &
233 rd_=r_d,rv_=r_v,fv_=ep_1,ep2=ep_2, &
234 cice=cice,xlv0=xlv0,xls=xls,psat=psat, &
235 ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
236 ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
237 its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
240 pratec1(i,j)=rain(i)*1000./(stepcu*dt)
241 raincv1(i,j)=rain(i)*1000./(stepcu)
245 call nscv2d(delt=dt,del=del(its,kts),prsl=prsll(its,kts), &
246 prsi=prsii(its,kts),prslk=pi3d(ims,kms,j),zl=zll(its,kts), &
247 zi=zii(its,kts),ncloud=ncloud,qc2=qc2(its,kts),qi2=qi2(its,kts), &
248 q1=q1(its,kts),t1=t1(its,kts),rain=rain(its), &
249 kbot=kbot(its),ktop=ktop(its), &
251 slimsk=xland(ims,j),dot=dot(its,kts), &
252 u1=u1(its,kts), v1=v1(its,kts), &
253 cp_=cp,cliq_=cliq,cvap_=cpv,g_=g,hvap_=xlv, &
254 rd_=r_d,rv_=r_v,fv_=ep_1,ep2=ep_2, &
255 cice=cice,xlv0=xlv0,xls=xls,psat=psat, &
256 hpbl=hpbl(ims,j),hfx=hfx(ims,j),qfx=qfx(ims,j), &
257 ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
258 ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
259 its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
262 pratec2(i,j)=rain(i)*1000./(stepcu*dt)
263 raincv2(i,j)=rain(i)*1000./(stepcu)
267 raincv(i,j) = raincv1(i,j) + raincv2(i,j)
268 pratec(i,j) = pratec1(i,j) + pratec2(i,j)
273 IF(PRESENT(rthcuten).AND.PRESENT(rqvcuten)) THEN
276 rthcuten(i,k,j)=(t1(i,k)-t3d(i,k,j))/pi3d(i,k,j)*rdelt
277 ! rqvcuten(i,k,j) = (q1(i,k)/(1.-q1(i,k))-qv3d(i,k,j))*rdelt
278 rqvcuten(i,k,j)=(q1(i,k)-qv3d(i,k,j))*rdelt
283 IF(PRESENT(rucuten).AND.PRESENT(rvcuten)) THEN
286 rucuten(i,k,j)=(u1(i,k)-u3d(i,k,j))*rdelt
287 rvcuten(i,k,j)=(v1(i,k)-v3d(i,k,j))*rdelt
292 if(PRESENT( rqicuten )) THEN
296 rqicuten(i,k,j)=(qi2(i,k)-qi3d(i,k,j))*rdelt
301 if(PRESENT( rqccuten )) THEN
305 rqccuten(i,k,j)=(qc2(i,k)-qc3d(i,k,j))*rdelt
311 enddo ! outer most J_loop
314 end subroutine cu_nsas
316 !==============================================================================
317 ! NCEP SAS (Deep Convection Scheme)
318 !==============================================================================
319 subroutine nsas2d(delt,del,prsl,prsi,prslk,zl,zi, &
322 q1,t1,rain,kbot,ktop, &
324 lat,slimsk,dot,u1,v1,cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2, &
325 cice,xlv0,xls,psat, &
326 ids,ide, jds,jde, kds,kde, &
327 ims,ime, jms,jme, kms,kme, &
328 its,ite, jts,jte, kts,kte)
330 !------------------------------------------------------------------------------
332 ! subprogram: phys_cps_sas computes convective heating and moistening
333 ! and momentum transport
335 ! abstract: computes convective heating and moistening using a one
336 ! cloud type arakawa-schubert convection scheme originally developed
337 ! by georg grell. the scheme has been revised at ncep since initial
338 ! implementation in 1993. it includes updraft and downdraft effects.
339 ! the closure is the cloud work function. both updraft and downdraft
340 ! are assumed to be saturated and the heating and moistening are
341 ! accomplished by the compensating environment. convective momentum transport
342 ! is taken into account. the name comes from "simplified arakawa-schubert
343 ! convection parameterization".
345 ! developed by hua-lu pan, wan-shu wu, songyou hong, and jongil han
346 ! implemented into wrf by kyosun sunny lim and songyou hong
347 ! module with cpp-based options is available in grims
349 ! program history log:
350 ! 92-03-01 hua-lu pan operational development
351 ! 96-03-01 song-you hong revised closure, and trigger
352 ! 99-03-01 hua-lu pan multiple clouds
353 ! 06-03-01 young-hwa byun closure based on moisture convergence (optional)
354 ! 09-10-01 jung-eun kim f90 format with standard physics modules
355 ! 10-07-01 jong-il han revised cloud model,trigger, as in gfs july 2010
356 ! 10-12-01 kyosun sunny lim wrf compatible version
359 ! usage: call phys_cps_sas(delt,delx,del,prsl,prsi,prslk,prsik,zl,zi, &
360 ! q2,q1,t1,u1,v1,rcs,slimsk,dot,cldwrk,rain, &
361 ! jcap,ncloud,lat,kbot,ktop,kuo, &
362 ! ids,ide, jds,jde, kds,kde, &
363 ! ims,ime, jms,jme, kms,kme, &
364 ! its,ite, jts,jte, kts,kte)
366 ! delt - real model integration time step
367 ! delx - real model grid interval
368 ! del - real (kms:kme) sigma layer thickness
369 ! prsl - real (ims:ime,kms:kme) pressure values
370 ! prsi - real (ims:ime,kms:kme) pressure values at interface level
371 ! prslk - real (ims:ime,kms:kme) pressure values to the kappa
372 ! prsik - real (ims:ime,kms:kme) pressure values to the kappa at interface lev.
373 ! zl - real (ims:ime,kms:kme) height above sea level
374 ! zi - real (ims:ime,kms:kme) height above sea level at interface level
376 ! slimsk - real (ims:ime) land(1),sea(0), ice(2) flag
377 ! dot - real (ims:ime,kms:kme) vertical velocity
378 ! jcap - integer spectral truncation
379 ! ncloud - integer number of hydrometeors
380 ! lat - integer current latitude index
382 ! output argument list:
383 ! q2 - real (ims:ime,kms:kme) detrained hydrometeors in kg/kg
384 ! - in case of the --> qc2(cloud), qi2(ice)
385 ! q1 - real (ims:ime,kms:kme) adjusted specific humidity in kg/kg
386 ! t1 - real (ims:ime,kms:kme) adjusted temperature in kelvin
387 ! u1 - real (ims:ime,kms:kme) adjusted zonal wind in m/s
388 ! v1 - real (ims:ime,kms:kme) adjusted meridional wind in m/s
389 ! cldwrk - real (ims:ime) cloud work function
390 ! rain - real (ims:ime) convective rain in meters
391 ! kbot - integer (ims:ime) cloud bottom level
392 ! ktop - integer (ims:ime) cloud top level
393 ! kuo - integer (ims:ime) bit flag indicating deep convection
395 ! subprograms called:
396 ! fpvs - function to compute saturation vapor pressure
398 ! remarks: function fpvs is inlined by fpp.
399 ! nonstandard automatic arrays are used.
402 ! pan and wu (1995, ncep office note)
403 ! hong and pan (1998, mon wea rev)
404 ! park and hong (2007,jmsj)
405 ! byun and hong (2007, mon wea rev)
406 ! han and pan (2011, wea. forecasting)
408 !------------------------------------------------------------------------------
409 !------------------------------------------------------------------------------
411 !------------------------------------------------------------------------------
413 ! model tunable parameters
415 real,parameter :: alphal = 0.5, alphas = 0.5
416 real,parameter :: betal = 0.05, betas = 0.05
417 real,parameter :: pdpdwn = 0.0, pdetrn = 200.0
418 real,parameter :: c0 = 0.002, c1 = 0.002
419 real,parameter :: pgcon = 0.55
420 real,parameter :: xlamdd = 1.0e-4, xlamde = 1.0e-4
421 real,parameter :: clam = 0.1, cxlamu = 1.0e-4
422 real,parameter :: aafac = 0.1
423 real,parameter :: dthk=25.
424 real,parameter :: cincrmax = 180.,cincrmin = 120.
425 real,parameter :: W1l = -8.E-3
426 real,parameter :: W2l = -4.E-2
427 real,parameter :: W3l = -5.E-3
428 real,parameter :: W4l = -5.E-4
429 real,parameter :: W1s = -2.E-4
430 real,parameter :: W2s = -2.E-3
431 real,parameter :: W3s = -1.E-3
432 real,parameter :: W4s = -2.E-5
433 real,parameter :: mbdt = 10., edtmaxl = 0.3, edtmaxs = 0.3
434 real,parameter :: evfacts = 0.3, evfactl = 0.3
436 real,parameter :: tf=233.16,tcr=263.16,tcrf=1.0/(tcr-tf)
437 real,parameter :: xk1=2.e-5,xlhor=3.e4,xhver=5000.,theimax=1.
438 real,parameter :: xc1=1.e-7,xc2=1.e4,xc3=3.e3,ecesscr=3.0,edtk1=3.e4
442 real :: cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2
443 real :: pi_,qmin_,t0c_,cice,xlv0,xls,psat
446 ids,ide, jds,jde, kds,kde, &
447 ims,ime, jms,jme, kms,kme, &
448 its,ite, jts,jte, kts,kte
451 real :: del(its:ite,kts:kte), &
452 prsl(its:ite,kts:kte),prslk(ims:ime,kms:kme), &
453 prsi(its:ite,kts:kte+1), &
454 zl(its:ite,kts:kte),zi(its:ite,kts:kte+1), &
455 q1(its:ite,kts:kte),t1(its:ite,kts:kte), &
456 u1(its:ite,kts:kte),v1(its:ite,kts:kte), &
458 real :: qi2(its:ite,kts:kte)
459 real :: qc2(its:ite,kts:kte)
461 real :: rain(its:ite)
462 integer :: kbot(its:ite),ktop(its:ite),kuo(its:ite)
463 real :: slimsk(ims:ime)
466 ! local variables and arrays
468 integer :: i,k,kmax,kbmax,kbm,jmn,indx,indp,kts1,kte1,kmax1,kk
469 real :: p(its:ite,kts:kte),pdot(its:ite),acrtfct(its:ite)
470 real :: uo(its:ite,kts:kte),vo(its:ite,kts:kte)
471 real :: to(its:ite,kts:kte),qo(its:ite,kts:kte)
472 real :: hcko(its:ite,kts:kte)
473 real :: qcko(its:ite,kts:kte),eta(its:ite,kts:kte)
474 real :: etad(its:ite,kts:kte)
475 real :: qrcdo(its:ite,kts:kte)
476 real :: pwo(its:ite,kts:kte),pwdo(its:ite,kts:kte)
477 real :: dtconv(its:ite)
478 real :: deltv(its:ite),acrt(its:ite)
479 real :: qeso(its:ite,kts:kte)
480 real :: tvo(its:ite,kts:kte),dbyo(its:ite,kts:kte)
481 real :: heo(its:ite,kts:kte),heso(its:ite,kts:kte)
482 real :: qrcd(its:ite,kts:kte)
483 real :: dellah(its:ite,kts:kte),dellaq(its:ite,kts:kte)
485 integer :: kb(its:ite),kbcon(its:ite)
486 integer :: kbcon1(its:ite)
487 real :: hmax(its:ite),delq(its:ite)
488 real :: hkbo(its:ite),qkbo(its:ite),pbcdif(its:ite)
489 integer :: kbds(its:ite),lmin(its:ite),jmin(its:ite)
490 integer :: ktcon(its:ite)
491 integer :: ktcon1(its:ite)
492 integer :: kbdtr(its:ite),kpbl(its:ite)
493 integer :: klcl(its:ite),ktdown(its:ite)
494 real :: vmax(its:ite)
495 real :: hmin(its:ite),pwavo(its:ite)
496 real :: aa1(its:ite),vshear(its:ite)
497 real :: qevap(its:ite)
499 real :: edto(its:ite),pwevo(its:ite)
500 real :: qcond(its:ite)
501 real :: hcdo(its:ite,kts:kte)
502 real :: ddp(its:ite),pp2(its:ite)
503 real :: qcdo(its:ite,kts:kte)
504 real :: adet(its:ite),aatmp(its:ite)
505 real :: xhkb(its:ite),xqkb(its:ite)
506 real :: xpwav(its:ite),xpwev(its:ite),xhcd(its:ite,kts:kte)
507 real :: xaa0(its:ite),f(its:ite),xk(its:ite)
509 real :: edtx(its:ite),xqcd(its:ite,kts:kte)
510 real :: hsbar(its:ite),xmbmax(its:ite)
511 real :: xlamb(its:ite,kts:kte),xlamd(its:ite)
512 real :: excess(its:ite)
513 real :: plcl(its:ite)
514 real :: delhbar(its:ite),delqbar(its:ite),deltbar(its:ite)
515 real,save :: pcrit(15), acritt(15)
517 real :: qcirs(its:ite,kts:kte),qrski(its:ite)
518 real :: dellal(its:ite,kts:kte)
519 real :: rntot(its:ite),delqev(its:ite),delq2(its:ite)
521 real :: fent1(its:ite,kts:kte),fent2(its:ite,kts:kte)
522 real :: frh(its:ite,kts:kte)
523 real :: xlamud(its:ite),sumx(its:ite)
525 real :: ucko(its:ite,kts:kte),vcko(its:ite,kts:kte)
526 real :: ucdo(its:ite,kts:kte),vcdo(its:ite,kts:kte)
527 real :: dellau(its:ite,kts:kte),dellav(its:ite,kts:kte)
528 real :: delubar(its:ite),delvbar(its:ite)
529 real :: qlko_ktcon(its:ite)
532 real :: alpha,beta, &
533 dt2,dtmin,dtmax,dtmaxl,dtmaxs, &
534 el2orc,eps,fact1,fact2, &
536 real :: dz,dp,es,pprime,qs, &
537 dqsdp,desdt,dqsdt,gamma, &
538 dt,dq,po,thei,delza,dzfac, &
539 thec,theb,thekb,thekh,theavg,thedif, &
540 omgkb,omgkbp1,omgdif,omgfac,heom,rh,thermal,chi, &
541 factor,onemf,dz1,qrch,etah,qlk,qc,rfact,shear, &
542 e1,dh,deta,detad,theom,edtmax,dhh,dg,aup,adw, &
543 dv1,dv2,dv3,dv1q,dv2q,dv3q,dvq1, &
544 dv1u,dv2u,dv3u,dv1v,dv2v,dv3v, &
545 dellat,xdby,xqrch,xqc,xpw,xpwd, &
546 w1,w2,w3,w4,qrsk,evef,ptem,ptem1
548 logical :: totflg, cnvflg(its:ite),flg(its:ite)
550 ! climatological critical cloud work functions for closure
552 data pcrit/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
553 350.,300.,250.,200.,150./
554 data acritt/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
555 .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
557 !-----------------------------------------------------------------------
559 ! define miscellaneous values
565 el2orc = hvap_*hvap_/(rv_*cp_)
567 fact1 = (cvap_-cliq_)/rv_
568 fact2 = hvap_/rv_-fact1*t0c_
572 dtmin = max(dt2,1200.)
573 dtmax = max(dt2,3600.)
601 acrit(k) = acritt(k) * (975. - pcrit(k))
604 ! Define top layer for search of the downdraft originating layer
605 ! and the maximum thetae for updraft
612 if(prsl(i,k).gt.prsi(i,1)*0.45) kbmax = k + 1
613 if(prsl(i,k).gt.prsi(i,1)*0.70) kbm = k + 1
614 if(prsl(i,k).gt.prsi(i,1)*0.04) kmax = k + 1
621 ! convert surface pressure to mb from cb
637 p(i,k) = prsl(i,k) * 10.
650 uo(i,k) = u1(i,k) * rcs
651 vo(i,k) = v1(i,k) * rcs
657 ! p is pressure of the layer (mb)
658 ! t is temperature at t-dt (k)..tn
659 ! q is mixing ratio at t-dt (kg/kg)..qn
660 ! to is temperature at t+dt (k)... this is after advection and turbulan
661 ! qo is mixing ratio at t+dt (kg/kg)..q1
665 qeso(i,k)=0.01*fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
666 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.) * qeso(i,k))
667 qeso(i,k) = max(qeso(i,k),qmin_)
668 qo(i,k) = max(qo(i,k), 1.e-10 )
669 tvo(i,k) = to(i,k) + fv_ * to(i,k) * max(qo(i,k),qmin_)
673 ! compute moist static energy
677 heo(i,k) = g_ * zl(i,k) + cp_* to(i,k) + hvap_ * qo(i,k)
678 heso(i,k) = g_ * zl(i,k) + cp_* to(i,k) + hvap_ * qeso(i,k)
682 ! Determine level with largest moist static energy
683 ! This is the level where updraft starts
692 if(heo(i,k).gt.hmax(i)) then
702 dz = .5 * (zl(i,k+1) - zl(i,k))
703 dp = .5 * (p(i,k+1) - p(i,k))
704 es = 0.01*fpvs(to(i,k+1),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
705 pprime = p(i,k+1) + (eps-1.) * es
706 qs = eps * es / pprime
707 dqsdp = - qs / pprime
708 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
709 dqsdt = qs * p(i,k+1) * desdt / (es * pprime)
710 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
711 dt = (g_ * dz + hvap_ * dqsdp * dp) / (cp_ * (1. + gamma))
712 dq = dqsdt * dt + dqsdp * dp
713 to(i,k) = to(i,k+1) + dt
714 qo(i,k) = qo(i,k+1) + dq
715 po = .5 * (p(i,k) + p(i,k+1))
716 qeso(i,k)=0.01*fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
717 qeso(i,k) = eps * qeso(i,k) / (po + (eps-1.) * qeso(i,k))
718 qeso(i,k) = max(qeso(i,k),qmin_)
719 qo(i,k) = max(qo(i,k), 1.e-10)
720 frh(i,k) = 1. - min(qo(i,k)/qeso(i,k), 1.)
721 heo(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
722 cp_ * to(i,k) + hvap_ * qo(i,k)
723 heso(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
724 cp_ * to(i,k) + hvap_ * qeso(i,k)
725 uo(i,k) = .5 * (uo(i,k) + uo(i,k+1))
726 vo(i,k) = .5 * (vo(i,k) + vo(i,k+1))
731 ! look for convective cloud base as the level of free convection
736 hkbo(i) = heo(i,indx)
748 if(flg(i).and.k.gt.kb(i)) then
750 if(hkbo(i).gt.hsbar(i)) then
758 if(kbcon(i).eq.kmax) cnvflg(i) = .false.
763 totflg = totflg .and. (.not. cnvflg(i))
770 ! determine critical convective inhibition
771 ! as a function of vertical velocity at cloud base.
773 pdot(i) = 10.* dot(i,kbcon(i))
774 if(slimsk(i).eq.1.) then
785 if(pdot(i).le.w4) then
786 tem = (pdot(i) - w4) / (w3 - w4)
787 elseif(pdot(i).ge.-w4) then
788 tem = - (pdot(i) + w4) / (w4 - w3)
795 tem1= .5*(cincrmax-cincrmin)
796 cincr = cincrmax - tem * tem1
797 pbcdif(i) = -p(i,kbcon(i)) + p(i,kb(i))
798 if(pbcdif(i).gt.cincr) cnvflg(i) = .false.
805 totflg = totflg .and. (.not. cnvflg(i))
811 xlamb(i,k) = clam / zi(i,k+1)
815 ! assume that updraft entrainment rate above cloud base is
816 ! same as that at cloud base
820 if(cnvflg(i).and.(k.gt.kbcon(i))) then
821 xlamb(i,k) = xlamb(i,kbcon(i))
826 ! assume the detrainment rate for the updrafts to be same as
827 ! the entrainment rate at cloud base
831 xlamud(i) = xlamb(i,kbcon(i))
835 ! functions rapidly decreasing with height, mimicking a cloud ensemble
836 ! (Bechtold et al., 2008)
840 if(cnvflg(i).and.(k.gt.kbcon(i))) then
841 tem = qeso(i,k)/qeso(i,kbcon(i))
848 ! final entrainment rate as the sum of turbulent part and organized entrainment
849 ! depending on the environmental relative humidity
850 ! (Bechtold et al., 2008)
854 if(cnvflg(i).and.(k.ge.kbcon(i))) then
855 tem = cxlamu * frh(i,k) * fent2(i,k)
856 xlamb(i,k) = xlamb(i,k)*fent1(i,k) + tem
861 ! determine updraft mass flux
873 if(cnvflg(i).and.k.lt.kbcon(i).and.k.ge.kb(i)) then
874 dz = zi(i,k+2) - zi(i,k+1)
875 ptem = 0.5*(xlamb(i,k)+xlamb(i,k+1))-xlamud(i)
876 eta(i,k) = eta(i,k+1) / (1. + ptem * dz)
882 if(cnvflg(i).and.k.gt.kbcon(i)) then
883 dz = zi(i,k+1) - zi(i,k)
884 ptem = 0.5*(xlamb(i,k)+xlamb(i,k-1))-xlamud(i)
885 eta(i,k) = eta(i,k-1) * (1 + ptem * dz)
891 dz = zi(i,3) - zi(i,2)
892 ptem = 0.5*(xlamb(i,1)+xlamb(i,2))-xlamud(i)
893 eta(i,1) = eta(i,2) / (1. + ptem * dz)
897 ! work up updraft cloud properties
902 hcko(i,indx) = hkbo(i)
903 qcko(i,indx) = qkbo(i)
904 ucko(i,indx) = uo(i,indx)
905 vcko(i,indx) = vo(i,indx)
910 ! cloud property below cloud base is modified by the entrainment proces
914 if(cnvflg(i).and.k.gt.kb(i)) then
915 dz = zi(i,k+1) - zi(i,k)
916 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
917 tem1 = 0.5 * xlamud(i) * dz
918 factor = 1. + tem - tem1
919 ptem = 0.5 * tem + pgcon
920 ptem1= 0.5 * tem - pgcon
921 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
922 (heo(i,k)+heo(i,k-1)))/factor
923 ucko(i,k) = ((1.-tem1)*ucko(i,k-1)+ptem*uo(i,k) &
924 +ptem1*uo(i,k-1))/factor
925 vcko(i,k) = ((1.-tem1)*vcko(i,k-1)+ptem*vo(i,k) &
926 +ptem1*vo(i,k-1))/factor
927 dbyo(i,k) = hcko(i,k) - heso(i,k)
932 ! taking account into convection inhibition due to existence of
933 ! dry layers below cloud base
942 if(flg(i).and.k.ge.kbcon(i).and.dbyo(i,k).gt.0.) then
951 if(kbcon1(i).eq.kmax) cnvflg(i) = .false.
957 tem = p(i,kbcon(i)) - p(i,kbcon1(i))
966 totflg = totflg .and. (.not. cnvflg(i))
971 ! determine cloud top
983 if(dbyo(i,k).lt.0..and.flg(i).and.k.gt. kbcon1(i)) then
994 if(cnvflg(i).and.(p(i,kbcon(i)) - p(i,ktcon(i))).lt.150.) &
1000 totflg = totflg .and. (.not. cnvflg(i))
1005 ! search for downdraft originating level above theta-e minimum
1009 hmin(i) = heo(i,kbcon1(i))
1017 if(cnvflg(i).and.k.gt.kbcon1(i).and.heo(i,k).lt.hmin(i)) then
1024 ! make sure that jmin is within the cloud
1028 jmin(i) = min(lmin(i),ktcon(i)-1)
1029 jmin(i) = max(jmin(i),kbcon1(i)+1)
1030 if(jmin(i).ge.ktcon(i)) cnvflg(i) = .false.
1034 ! specify upper limit of mass flux at cloud base
1039 dp = 1000. * del(i,k)
1040 xmbmax(i) = dp / (g_ * dt2)
1045 ! compute cloud moisture property and precipitation
1053 if(cnvflg(i).and.k.gt.kb(i).and.k.lt.ktcon(i)) then
1054 dz = .5 * (zl(i,k+1) - zl(i,k-1))
1055 dz1 = (zi(i,k+1) - zi(i,k))
1056 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1058 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
1059 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz1
1060 tem1 = 0.5 * xlamud(i) * dz1
1061 factor = 1. + tem - tem1
1062 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
1063 (qo(i,k)+qo(i,k-1)))/factor
1064 qcirs(i,k) = eta(i,k) * qcko(i,k) - eta(i,k) * qrch
1066 ! check if there is excess moisture to release latent heat
1068 if(qcirs(i,k).gt.0. .and. k.ge.kbcon(i)) then
1069 etah = .5 * (eta(i,k) + eta(i,k-1))
1070 if(ncloud.gt.0..and.k.gt.jmin(i)) then
1071 dp = 1000. * del(i,k)
1072 qlk = qcirs(i,k) / (eta(i,k) + etah * (c0 + c1) * dz1)
1073 dellal(i,k) = etah * c1 * dz1 * qlk * g_ / dp
1075 qlk = qcirs(i,k) / (eta(i,k) + etah * c0 * dz1)
1077 aa1(i) = aa1(i) - dz1 * g_ * qlk
1079 pwo(i,k) = etah * c0 * dz1 * qlk
1081 pwavo(i) = pwavo(i) + pwo(i,k)
1087 ! calculate cloud work function at t+dt
1091 if(cnvflg(i).and.k.ge.kbcon(i).and.k.lt.ktcon(i)) then
1092 dz1 = zl(i,k+1) - zl(i,k)
1093 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1094 rfact = 1. + fv_ * cp_ * gamma* to(i,k) / hvap_
1095 aa1(i) = aa1(i) +dz1 * (g_ / (cp_ * to(i,k))) &
1096 * dbyo(i,k) / (1. + gamma)* rfact
1097 aa1(i) = aa1(i)+dz1 * g_ * fv_ * &
1098 max(0.,(qeso(i,k) - qo(i,k)))
1104 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
1109 totflg = totflg .and. (.not. cnvflg(i))
1113 ! estimate the convective overshooting as the level
1114 ! where the [aafac * cloud work function] becomes zero,
1115 ! which is the final cloud top
1119 aa2(i) = aafac * aa1(i)
1131 if(k.ge.ktcon(i).and.k.lt.kmax) then
1132 dz1 = zl(i,k+1) - zl(i,k)
1133 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1134 rfact = 1. + fv_ * cp_ * gamma* to(i,k) / hvap_
1135 aa2(i) = aa2(i) +dz1 * (g_ / (cp_ * to(i,k))) &
1136 * dbyo(i,k) / (1. + gamma)* rfact
1137 if(aa2(i).lt.0.) then
1146 ! compute cloud moisture property, detraining cloud water
1147 ! and precipitation in overshooting layers
1152 if(k.ge.ktcon(i).and.k.lt.ktcon1(i)) then
1153 dz = (zi(i,k+1) - zi(i,k))
1154 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1155 qrch = qeso(i,k)+ gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
1156 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
1157 tem1 = 0.5 * xlamud(i) * dz
1158 factor = 1. + tem - tem1
1159 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
1160 (qo(i,k)+qo(i,k-1)))/factor
1161 qcirs(i,k) = eta(i,k) * qcko(i,k) - eta(i,k) * qrch
1163 ! check if there is excess moisture to release latent heat
1165 if(qcirs(i,k).gt.0.) then
1166 etah = .5 * (eta(i,k) + eta(i,k-1))
1167 if(ncloud.gt.0.) then
1168 dp = 1000. * del(i,k)
1169 qlk = qcirs(i,k) / (eta(i,k) + etah * (c0 + c1) * dz)
1170 dellal(i,k) = etah * c1 * dz * qlk * g_ / dp
1172 qlk = qcirs(i,k) / (eta(i,k) + etah * c0 * dz)
1175 pwo(i,k) = etah * c0 * dz * qlk
1177 pwavo(i) = pwavo(i) + pwo(i,k)
1184 ! exchange ktcon with ktcon1
1189 ktcon(i) = ktcon1(i)
1194 ! this section is ready for cloud water
1196 if (ncloud.gt.0) then
1198 ! compute liquid and vapor separation at cloud top
1203 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1205 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
1206 dq = qcko(i,k) - qrch
1208 ! check if there is excess moisture to release latent heat
1218 ! ..... downdraft calculations .....
1220 ! determine downdraft strength in terms of wind shear
1230 if(k.gt.kb(i).and.k.le.ktcon(i).and.cnvflg(i)) then
1231 shear= sqrt((uo(i,k)-uo(i,k-1)) ** 2 &
1232 + (vo(i,k)-vo(i,k-1)) ** 2)
1233 vshear(i) = vshear(i) + shear
1240 vshear(i) = 1.e3 * vshear(i) / (zi(i,ktcon(i)+1)-zi(i,kb(i)+1))
1241 e1 = 1.591-.639*vshear(i) &
1242 +.0953*(vshear(i)**2)-.00496*(vshear(i)**3)
1244 edt(i) = min(edt(i),.9)
1245 edt(i) = max(edt(i),.0)
1251 ! determine detrainment rate between 1 and kbdtr
1261 if(cnvflg(i).and.k.ge.1.and.k.lt.kbcon(i)) then
1262 dz = zi(i,k+2) - zi(i,k+1)
1263 sumx(i) = sumx(i) + dz
1271 if(slimsk(i).eq.1.) beta = betal
1274 kbdtr(i) = max(kbdtr(i),1)
1275 dz =(sumx(i)+zi(i,2))/float(kbcon(i))
1276 tem = 1./float(kbcon(i))
1277 xlamd(i) = (1.-beta**tem)/dz
1281 ! determine downdraft mass flux
1296 if(k.lt.jmin(i).and.k.ge.kbcon(i))then
1297 dz = (zi(i,k+2) - zi(i,k+1))
1298 ptem = xlamdd-xlamde
1299 etad(i,k) = etad(i,k+1) * (1.-ptem * dz)
1300 elseif(k.lt.kbcon(i))then
1301 dz = (zi(i,k+2) - zi(i,k+1))
1302 ptem = xlamd(i)+xlamdd-xlamde
1303 etad(i,k) = etad(i,k+1) * (1.-ptem * dz)
1310 ! downdraft moisture properties
1321 hcdo(i,jmn) = heo(i,jmn)
1322 qcdo(i,jmn) = qo(i,jmn)
1323 qrcdo(i,jmn) = qeso(i,jmn)
1324 ucdo(i,jmn) = uo(i,jmn)
1325 vcdo(i,jmn) = vo(i,jmn)
1331 if (cnvflg(i) .and. k.lt.jmin(i)) then
1332 dz = zi(i,k+2) - zi(i,k+1)
1333 if(k.ge.kbcon(i)) then
1335 tem1 = 0.5 * xlamdd * dz
1338 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1340 factor = 1. + tem - tem1
1341 ptem = 0.5 * tem - pgcon
1342 ptem1= 0.5 * tem + pgcon
1343 hcdo(i,k) = ((1.-tem1)*hcdo(i,k+1)+tem*0.5* &
1344 (heo(i,k)+heo(i,k+1)))/factor
1345 ucdo(i,k) = ((1.-tem1)*ucdo(i,k+1)+ptem*uo(i,k+1) &
1346 +ptem1*uo(i,k))/factor
1347 vcdo(i,k) = ((1.-tem1)*vcdo(i,k+1)+ptem*vo(i,k+1) &
1348 +ptem1*vo(i,k))/factor
1349 dbyo(i,k) = hcdo(i,k) - heso(i,k)
1356 if(cnvflg(i).and.k.lt.jmin(i)) then
1359 gamma = el2orc * dq / dt**2
1360 qrcdo(i,k)=dq+(1./hvap_)*(gamma/(1.+gamma))*dbyo(i,k)
1361 detad = etad(i,k+1) - etad(i,k)
1362 dz = zi(i,k+2) - zi(i,k+1)
1363 if(k.ge.kbcon(i)) then
1365 tem1 = 0.5 * xlamdd * dz
1368 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1370 factor = 1. + tem - tem1
1371 qcdo(i,k) = ((1.-tem1)*qcdo(i,k+1)+tem*0.5* &
1372 (qo(i,k)+qo(i,k+1)))/factor
1373 pwdo(i,k) = etad(i,k+1) * qcdo(i,k) -etad(i,k+1) * qrcdo(i,k)
1374 qcdo(i,k) = qrcdo(i,k)
1375 pwevo(i) = pwevo(i) + pwdo(i,k)
1380 ! final downdraft strength dependent on precip
1381 ! efficiency (edt), normalized condensate (pwav), and
1386 if(slimsk(i).eq.2.) edtmax = edtmaxs
1388 if(pwevo(i).lt.0.) then
1389 edto(i) = -edto(i) * pwavo(i) / pwevo(i)
1390 edto(i) = min(edto(i),edtmax)
1397 ! downdraft cloudwork functions
1401 if(cnvflg(i).and.k.lt.jmin(i)) then
1402 gamma = el2orc * qeso(i,k) / to(i,k)**2
1407 dz=-1.*(zl(i,k+1)-zl(i,k))
1408 aa1(i)=aa1(i)+edto(i)*dz*(g_/(cp_*dt))*((dhh-dh)/(1.+dg)) &
1409 *(1.+fv_*cp_*dg*dt/hvap_)
1410 aa1(i)=aa1(i)+edto(i)*dz*g_*fv_*max(0.,(qeso(i,k)-qo(i,k)))
1416 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
1421 totflg = totflg .and. (.not. cnvflg(i))
1425 ! what would the change be, that a cloud with unit mass
1426 ! will do to the environment?
1441 dp = 1000. * del(i,1)
1442 dellah(i,1) = edto(i) * etad(i,1) * (hcdo(i,1) &
1443 - heo(i,1)) * g_ / dp
1444 dellaq(i,1) = edto(i) * etad(i,1) * (qcdo(i,1) &
1445 - qo(i,1)) * g_ / dp
1446 dellau(i,1) = edto(i) * etad(i,1) * (ucdo(i,1) &
1447 - uo(i,1)) * g_ / dp
1448 dellav(i,1) = edto(i) * etad(i,1) * (vcdo(i,1) &
1449 - vo(i,1)) * g_ / dp
1453 ! changed due to subsidence and entrainment
1457 if(cnvflg(i).and.k.lt.ktcon(i)) then
1459 if(k.le.kb(i)) aup = 0.
1461 if(k.gt.jmin(i)) adw = 0.
1463 dv2 = .5 * (heo(i,k) + heo(i,k-1))
1466 dv2q = .5 * (qo(i,k) + qo(i,k-1))
1469 dv2u = .5 * (uo(i,k) + uo(i,k-1))
1472 dv2v = .5 * (vo(i,k) + vo(i,k-1))
1474 dp = 1000. * del(i,k)
1475 dz = zi(i,k+1) - zi(i,k)
1476 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1))
1478 if(k.le.kbcon(i)) then
1480 ptem1 = xlamd(i)+xlamdd
1485 deta = eta(i,k) - eta(i,k-1)
1486 detad = etad(i,k) - etad(i,k-1)
1487 dellah(i,k) = dellah(i,k) + &
1488 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1 &
1489 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3 &
1490 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2*dz &
1491 + aup*tem1*eta(i,k-1)*.5*(hcko(i,k)+hcko(i,k-1))*dz &
1492 + adw*edto(i)*ptem1*etad(i,k)*.5*(hcdo(i,k)+hcdo(i,k-1))*dz) *g_/dp
1493 dellaq(i,k) = dellaq(i,k) + &
1494 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1q &
1495 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3q &
1496 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2q*dz &
1497 + aup*tem1*eta(i,k-1)*.5*(qcko(i,k)+qcko(i,k-1))*dz &
1498 + adw*edto(i)*ptem1*etad(i,k)*.5*(qrcdo(i,k)+qrcdo(i,k-1))*dz) *g_/dp
1499 dellau(i,k) = dellau(i,k) + &
1500 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1u &
1501 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3u &
1502 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2u*dz &
1503 + aup*tem1*eta(i,k-1)*.5*(ucko(i,k)+ucko(i,k-1))*dz &
1504 + adw*edto(i)*ptem1*etad(i,k)*.5*(ucdo(i,k)+ucdo(i,k-1))*dz &
1505 - pgcon*(aup*eta(i,k-1)-adw*edto(i)*etad(i,k))*(dv1u-dv3u))*g_/dp
1507 dellav(i,k) = dellav(i,k) + &
1508 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1v &
1509 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3v &
1510 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2v*dz &
1511 + aup*tem1*eta(i,k-1)*.5*(vcko(i,k)+vcko(i,k-1))*dz &
1512 + adw*edto(i)*ptem1*etad(i,k)*.5*(vcdo(i,k)+vcdo(i,k-1))*dz &
1513 - pgcon*(aup*eta(i,k-1)-adw*edto(i)*etad(i,k))*(dv1v-dv3v))*g_/dp
1523 dp = 1000. * del(i,indx)
1525 dellah(i,indx) = eta(i,indx-1) * &
1526 (hcko(i,indx-1) - dv1) * g_ / dp
1528 dellaq(i,indx) = eta(i,indx-1) * &
1529 (qcko(i,indx-1) - dvq1) * g_ / dp
1531 dellau(i,indx) = eta(i,indx-1) * &
1532 (ucko(i,indx-1) - dv1u) * g_ / dp
1534 dellav(i,indx) = eta(i,indx-1) * &
1535 (vcko(i,indx-1) - dv1v) * g_ / dp
1539 dellal(i,indx) = eta(i,indx-1) * qlko_ktcon(i) * g_ / dp
1543 ! final changed variable per unit mass flux
1547 if(cnvflg(i).and.k.gt.ktcon(i)) then
1551 if(cnvflg(i).and.k.le.ktcon(i)) then
1552 qo(i,k) = dellaq(i,k) * mbdt + q1(i,k)
1553 dellat = (dellah(i,k) - hvap_ * dellaq(i,k)) / cp_
1554 to(i,k) = dellat * mbdt + t1(i,k)
1555 qo(i,k) = max(qo(i,k),1.0e-10)
1560 !------------------------------------------------------------------------------
1562 ! the above changed environment is now used to calulate the
1563 ! effect the arbitrary cloud (with unit mass flux)
1564 ! which then is used to calculate the real mass flux,
1565 ! necessary to keep this change in balance with the large-scale
1568 ! environmental conditions again
1570 !------------------------------------------------------------------------------
1575 qeso(i,k)=0.01* fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1576 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.) * qeso(i,k))
1577 qeso(i,k) = max(qeso(i,k),qmin_)
1578 tvo(i,k) = to(i,k) + fv_ * to(i,k) * max(qo(i,k),qmin_)
1590 ! moist static energy
1595 dz = .5 * (zl(i,k+1) - zl(i,k))
1596 dp = .5 * (p(i,k+1) - p(i,k))
1597 es =0.01*fpvs(to(i,k+1),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1598 pprime = p(i,k+1) + (eps-1.) * es
1599 qs = eps * es / pprime
1600 dqsdp = - qs / pprime
1601 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
1602 dqsdt = qs * p(i,k+1) * desdt / (es * pprime)
1603 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
1604 dt = (g_ * dz + hvap_ * dqsdp * dp) / (cp_ * (1. + gamma))
1605 dq = dqsdt * dt + dqsdp * dp
1606 to(i,k) = to(i,k+1) + dt
1607 qo(i,k) = qo(i,k+1) + dq
1608 po = .5 * (p(i,k) + p(i,k+1))
1609 qeso(i,k) =0.01* fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1610 qeso(i,k) = eps * qeso(i,k) / (po + (eps-1.) * qeso(i,k))
1611 qeso(i,k) = max(qeso(i,k),qmin_)
1612 qo(i,k) = max(qo(i,k), 1.0e-10)
1613 heo(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
1614 cp_ * to(i,k) + hvap_ * qo(i,k)
1615 heso(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
1616 cp_ * to(i,k) + hvap_ * qeso(i,k)
1624 heo(i,k) = g_ * zl(i,k) + cp_ * to(i,k) + hvap_ * qo(i,k)
1625 heso(i,k) = g_ * zl(i,k) + cp_ * to(i,k) + hvap_ * qeso(i,k)
1634 xhkb(i) = heo(i,indx)
1635 xqkb(i) = qo(i,indx)
1636 hcko(i,indx) = xhkb(i)
1637 qcko(i,indx) = xqkb(i)
1641 ! ..... static control .....
1643 ! moisture and cloud work functions
1647 if(cnvflg(i).and.k.gt.kb(i).and.k.le.ktcon(i)) then
1648 dz = zi(i,k+1) - zi(i,k)
1649 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
1650 tem1 = 0.5 * xlamud(i) * dz
1651 factor = 1. + tem - tem1
1652 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
1653 (heo(i,k)+heo(i,k-1)))/factor
1660 if(cnvflg(i).and.k.gt.kb(i).and.k.lt.ktcon(i)) then
1661 dz = zi(i,k+1) - zi(i,k)
1662 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1663 xdby = hcko(i,k) - heso(i,k)
1665 + gamma * xdby / (hvap_ * (1. + gamma))
1666 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
1667 tem1 = 0.5 * xlamud(i) * dz
1668 factor = 1. + tem - tem1
1669 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5*(qo(i,k)+qo(i,k-1)))/factor
1670 dq = eta(i,k) * qcko(i,k) - eta(i,k) * xqrch
1671 if(k.ge.kbcon(i).and.dq.gt.0.) then
1672 etah = .5 * (eta(i,k) + eta(i,k-1))
1673 if(ncloud.gt.0..and.k.gt.jmin(i)) then
1674 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
1676 qlk = dq / (eta(i,k) + etah * c0 * dz)
1678 if(k.lt.ktcon1(i)) then
1679 xaa0(i) = xaa0(i) - dz * g_ * qlk
1681 qcko(i,k) = qlk + xqrch
1682 xpw = etah * c0 * dz * qlk
1683 xpwav(i) = xpwav(i) + xpw
1686 if(cnvflg(i).and.k.ge.kbcon(i).and.k.lt.ktcon1(i)) then
1687 dz1 = zl(i,k+1) - zl(i,k)
1688 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1689 rfact = 1. + fv_ * cp_ * gamma &
1691 xdby = hcko(i,k) - heso(i,k)
1693 + dz1 * (g_ / (cp_ * to(i,k))) &
1694 * xdby / (1. + gamma) &
1698 max(0.,(qeso(i,k) - qo(i,k)))
1703 ! ..... downdraft calculations .....
1706 ! downdraft moisture properties
1714 xhcd(i,jmn) = heo(i,jmn)
1715 xqcd(i,jmn) = qo(i,jmn)
1716 qrcd(i,jmn) = qeso(i,jmn)
1720 do k = kmax1,kts, -1
1722 if(cnvflg(i).and.k.lt.jmin(i)) then
1723 dz = zi(i,k+2) - zi(i,k+1)
1724 if(k.ge.kbcon(i)) then
1726 tem1 = 0.5 * xlamdd * dz
1729 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1731 factor = 1. + tem - tem1
1732 xhcd(i,k) = ((1.-tem1)*xhcd(i,k+1)+tem*0.5* &
1733 (heo(i,k)+heo(i,k+1)))/factor
1738 do k = kmax1,kts, -1
1740 if(cnvflg(i).and.k.lt.jmin(i)) then
1743 gamma = el2orc * dq / dt**2
1744 dh = xhcd(i,k) - heso(i,k)
1745 qrcd(i,k)=dq+(1./hvap_)*(gamma/(1.+gamma))*dh
1746 dz = zi(i,k+2) - zi(i,k+1)
1747 if(k.ge.kbcon(i)) then
1749 tem1 = 0.5 * xlamdd * dz
1752 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1754 factor = 1. + tem - tem1
1755 xqcd(i,k) = ((1.-tem1)*xqcd(i,k+1)+tem*0.5* &
1756 (qo(i,k)+qo(i,k+1)))/factor
1757 xpwd = etad(i,k+1) * (xqcd(i,k) - qrcd(i,k))
1758 xqcd(i,k)= qrcd(i,k)
1759 xpwev(i) = xpwev(i) + xpwd
1766 if(slimsk(i).eq.2.) edtmax = edtmaxs
1768 if(xpwev(i).ge.0.) then
1771 edtx(i) = -edtx(i) * xpwav(i) / xpwev(i)
1772 edtx(i) = min(edtx(i),edtmax)
1777 ! downdraft cloudwork functions
1779 do k = kmax1,kts, -1
1781 if(cnvflg(i).and.k.lt.jmin(i)) then
1782 gamma = el2orc * qeso(i,k) / to(i,k)**2
1787 dz=-1.*(zl(i,k+1)-zl(i,k))
1788 xaa0(i)=xaa0(i)+edtx(i)*dz*(g_/(cp_*dt))*((dhh-dh)/(1.+dg)) &
1789 *(1.+fv_*cp_*dg*dt/hvap_)
1790 xaa0(i)=xaa0(i)+edtx(i)* &
1791 dz*g_*fv_*max(0.,(qeso(i,k)-qo(i,k)))
1796 ! calculate critical cloud work function
1801 if(p(i,ktcon(i)).lt.pcrit(15))then
1802 acrt(i)=acrit(15)*(975.-p(i,ktcon(i)))/(975.-pcrit(15))
1803 else if(p(i,ktcon(i)).gt.pcrit(1))then
1806 k = int((850. - p(i,ktcon(i)))/50.) + 2
1809 acrt(i)=acrit(k)+(acrit(k-1)-acrit(k))* &
1810 (p(i,ktcon(i))-pcrit(k))/(pcrit(k-1)-pcrit(k))
1821 if(slimsk(i).eq.1.) then
1828 if(pdot(i).le.w4) then
1829 acrtfct(i) = (pdot(i) - w4) / (w3 - w4)
1830 elseif(pdot(i).ge.-w4) then
1831 acrtfct(i) = - (pdot(i) + w4) / (w4 - w3)
1835 acrtfct(i) = max(acrtfct(i),-1.)
1836 acrtfct(i) = min(acrtfct(i),1.)
1837 acrtfct(i) = 1. - acrtfct(i)
1838 dtconv(i) = dt2 + max((1800. - dt2),0.) * (pdot(i) - w2) / (w1 - w2)
1839 dtconv(i) = max(dtconv(i),dtmin)
1840 dtconv(i) = min(dtconv(i),dtmax)
1845 ! large scale forcing
1849 f(i) = (aa1(i) - acrt(i) * acrtfct(i)) / dtconv(i)
1850 if(f(i).le.0.) cnvflg(i) = .false.
1853 xk(i) = (xaa0(i) - aa1(i)) / mbdt
1854 if(xk(i).ge.0.) cnvflg(i) = .false.
1857 ! kernel, cloud base mass flux
1860 xmb(i) = -f(i) / xk(i)
1861 xmb(i) = min(xmb(i),xmbmax(i))
1870 totflg = totflg .and. (.not. cnvflg(i))
1874 ! restore t0 and qo to t1 and q1 in case convection stops
1883 qeso(i,k) = 0.01*fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1884 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.) * qeso(i,k))
1885 qeso(i,k) = max(qeso(i,k),qmin_)
1890 ! feedback: simply the changes from the cloud with unit mass flux
1891 ! multiplied by the mass flux necessary to keep the
1892 ! equilibrium with the larger-scale.
1906 if(cnvflg(i).and.k.le.ktcon(i)) then
1908 if(k.le.kb(i)) aup = 0.
1910 if(k.gt.jmin(i)) adw = 0.
1911 dellat = (dellah(i,k) - hvap_ * dellaq(i,k)) / cp_
1912 t1(i,k) = t1(i,k) + dellat * xmb(i) * dt2
1913 q1(i,k) = q1(i,k) + dellaq(i,k) * xmb(i) * dt2
1915 u1(i,k) = u1(i,k) + dellau(i,k) * xmb(i) * dt2 * tem
1916 v1(i,k) = v1(i,k) + dellav(i,k) * xmb(i) * dt2 * tem
1917 dp = 1000. * del(i,k)
1918 delhbar(i) = delhbar(i) + dellah(i,k)*xmb(i)*dp/g_
1919 delqbar(i) = delqbar(i) + dellaq(i,k)*xmb(i)*dp/g_
1920 deltbar(i) = deltbar(i) + dellat*xmb(i)*dp/g_
1921 delubar(i) = delubar(i) + dellau(i,k)*xmb(i)*dp/g_
1922 delvbar(i) = delvbar(i) + dellav(i,k)*xmb(i)*dp/g_
1934 if (cnvflg(i) .and. k.le.ktcon(i)) then
1935 qeso(i,k)=0.01* fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1936 qeso(i,k) = eps * qeso(i,k)/(p(i,k) + (eps-1.)*qeso(i,k))
1937 qeso(i,k) = max(qeso(i,k), qmin_ )
1953 if(cnvflg(i).and.k.lt.ktcon(i)) then
1955 if(k.le.kb(i)) aup = 0.
1957 if(k.ge.jmin(i)) adw = 0.
1958 rntot(i) = rntot(i) &
1959 + (aup * pwo(i,k) + adw * edto(i) * pwdo(i,k)) &
1960 * xmb(i) * .001 * dt2
1965 ! conversion rainfall (m) and compute the evaporation of falling raindrops
1972 if(cnvflg(i).and.k.lt.ktcon(i)) then
1974 if(k.le.kb(i)) aup = 0.
1976 if(k.ge.jmin(i)) adw = 0.
1978 + (aup * pwo(i,k) + adw * edto(i) * pwdo(i,k)) &
1979 * xmb(i) * .001 * dt2
1981 if(flg(i).and.k.lt.ktcon(i)) then
1982 evef = edt(i) * evfacts
1983 if(slimsk(i).eq.1.) evef = edt(i) * evfactl
1984 qcond(i) = evef * (q1(i,k) - qeso(i,k)) / (1. + el2orc * &
1985 qeso(i,k) / t1(i,k)**2)
1986 dp = 1000. * del(i,k)
1987 if(rain(i).gt.0..and.qcond(i).lt.0.) then
1988 qevap(i) = -qcond(i) * (1. - exp(-.32 * sqrt(dt2 * rain(i))))
1989 qevap(i) = min(qevap(i), rain(i)*1000.*g_/dp)
1990 delq2(i) = delqev(i) + .001 * qevap(i) * dp / g_
1991 if (delq2(i).gt.rntot(i)) then
1992 qevap(i) = 1000.* g_ * (rntot(i) - delqev(i)) / dp
1996 if(rain(i).gt.0..and.qevap(i).gt.0.) then
1997 q1(i,k) = q1(i,k) + qevap(i)
1998 t1(i,k) = t1(i,k) - (hvap_/cp_) * qevap(i)
1999 rain(i) = rain(i) - .001 * qevap(i) * dp / g_
2000 delqev(i) = delqev(i) + .001*dp*qevap(i)/g_
2001 deltv(i) = - (hvap_/cp_)*qevap(i)/dt2
2002 delq(i) = + qevap(i)/dt2
2004 dellaq(i,k) = dellaq(i,k) + delq(i)/xmb(i)
2005 delqbar(i) = delqbar(i) + delq(i)*dp/g_
2006 deltbar(i) = deltbar(i) + deltv(i)*dp/g_
2012 ! consider the negative rain in the event of rain evaporation and downdrafts
2016 if(rain(i).lt.0..and..not.flg(i)) rain(i) = 0.
2017 if(rain(i).le.0.) then
2029 if(cnvflg(i).and.rain(i).le.0.) then
2038 ! detrainment of cloud water and ice
2040 if (ncloud.gt.0) then
2043 if (cnvflg(i) .and. rain(i).gt.0.) then
2044 if (k.ge.kbcon(i).and.k.le.ktcon(i)) then
2045 tem = dellal(i,k) * xmb(i) * dt2
2046 tem1 = max(0.0, min(1.0, (tcr-t1(i,k))*tcrf))
2047 if (ncloud.ge.4) then
2048 qi2(i,k) = qi2(i,k) + tem * tem1 ! ice
2049 qc2(i,k) = qc2(i,k) + tem *(1.0-tem1) ! water
2051 qc2(i,k) = qc2(i,k) + tem
2059 end subroutine nsas2d
2060 !===============================================================================
2061 REAL FUNCTION fpvs(t,ice,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c)
2062 !-------------------------------------------------------------------------------
2064 !-------------------------------------------------------------------------------
2065 REAL :: t,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c,dldt,xa,xb,dldti, &
2068 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2075 xbi=xai+hsub/(rv*ttp)
2077 if(t.lt.ttp.and.ice.eq.1) then
2078 fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
2080 fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
2085 if(t.lt.ttp.and.ice.eq.1) then
2086 fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
2088 fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
2094 if(t.lt.ttp.and.ice.eq.1) then
2095 fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
2097 fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
2101 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2103 !===============================================================================
2104 subroutine nsasinit(rthcuten,rqvcuten,rqccuten,rqicuten, &
2106 restart,p_qc,p_qi,p_first_scalar, &
2108 ids, ide, jds, jde, kds, kde, &
2109 ims, ime, jms, jme, kms, kme, &
2110 its, ite, jts, jte, kts, kte )
2111 !--------------------------------------------------------------------
2113 !--------------------------------------------------------------------
2114 logical , intent(in) :: allowed_to_read,restart
2115 integer , intent(in) :: ids, ide, jds, jde, kds, kde, &
2116 ims, ime, jms, jme, kms, kme, &
2117 its, ite, jts, jte, kts, kte
2118 integer , intent(in) :: p_first_scalar, p_qi, p_qc
2119 real, dimension( ims:ime , kms:kme , jms:jme ) , intent(out) :: &
2126 integer :: i, j, k, itf, jtf, ktf
2130 if(.not.restart)then
2141 if (p_qc .ge. p_first_scalar) then
2150 if (p_qi .ge. p_first_scalar) then
2160 end subroutine nsasinit
2162 !==============================================================================
2163 ! NCEP SCV (Shallow Convection Scheme)
2164 !==============================================================================
2165 subroutine nscv2d(delt,del,prsl,prsi,prslk,zl,zi, &
2166 ncloud,qc2,qi2,q1,t1,rain,kbot,ktop, &
2169 cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2, &
2170 cice,xlv0,xls,psat, &
2172 ids,ide, jds,jde, kds,kde, &
2173 ims,ime, jms,jme, kms,kme, &
2174 its,ite, jts,jte, kts,kte)
2176 !-------------------------------------------------------------------------------
2178 ! subprogram: nscv2d computes shallow-convective heating and moisng
2180 ! abstract: computes non-precipitating convective heating and moistening
2181 ! using a one cloud type arakawa-schubert convection scheme as in the ncep
2182 ! sas scheme. the scheme has been operational at ncep gfs model since july 2010
2183 ! the scheme includes updraft and downdraft effects, but the cloud depth is
2184 ! limited less than 150 hpa.
2186 ! developed by jong-il han and hua-lu pan
2187 ! implemented into wrf by jiheon jang and songyou hong
2188 ! module with cpp-based options is available in grims
2190 ! program history log:
2191 ! 10-07-01 jong-il han initial operational implementation at ncep gfs
2192 ! 10-12-01 jihyeon jang implemented into wrf
2194 ! subprograms called:
2195 ! fpvs - function to compute saturation vapor pressure
2198 ! han and pan (2010, wea. forecasting)
2200 !-------------------------------------------------------------------------------
2202 !-------------------------------------------------------------------------------
2205 integer :: ids,ide, jds,jde, kds,kde, &
2206 ims,ime, jms,jme, kms,kme, &
2207 its,ite, jts,jte, kts,kte
2208 real :: cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2
2209 real :: pi_,qmin_,t0c_
2210 real :: cice,xlv0,xls,psat
2213 real :: del(its:ite,kts:kte), &
2214 prsl(its:ite,kts:kte),prslk(ims:ime,kms:kme), &
2215 prsi(its:ite,kts:kte+1),zl(its:ite,kts:kte)
2217 real :: slimsk(ims:ime)
2218 real :: dot(its:ite,kts:kte)
2219 real :: hpbl(ims:ime)
2221 real :: hfx(ims:ime),qfx(ims:ime)
2223 real :: qi2(its:ite,kts:kte),qc2(its:ite,kts:kte)
2224 real :: q1(its:ite,kts:kte), &
2225 t1(its:ite,kts:kte), &
2226 u1(its:ite,kts:kte), &
2228 integer :: kuo(its:ite)
2230 real :: rain(its:ite)
2231 integer :: kbot(its:ite),ktop(its:ite)
2233 ! local variables and arrays
2235 integer :: i,j,indx, jmn, k, kk, km1
2236 integer :: kpbl(its:ite)
2239 desdt, deta, detad, dg, &
2240 dh, dhh, dlnsig, dp, &
2241 dq, dqsdp, dqsdt, dt, &
2242 dt2, dtmax, dtmin, &
2247 dz, dz1, e1, clam, &
2250 evef, evfact, evfactl, &
2252 gamma, pprime, betaw, &
2254 rfact, shear, tem1, &
2256 val2, w1, w1l, w1s, &
2258 w3l, w3s, w4, w4l, &
2259 w4s, tem, ptem, ptem1, &
2262 integer :: kb(its:ite), kbcon(its:ite), kbcon1(its:ite), &
2263 ktcon(its:ite), ktcon1(its:ite), &
2264 kbm(its:ite), kmax(its:ite)
2266 real :: aa1(its:ite), &
2267 delhbar(its:ite), delq(its:ite), &
2268 delq2(its:ite), delqev(its:ite), rntot(its:ite), &
2269 delqbar(its:ite), deltbar(its:ite), &
2270 deltv(its:ite), edt(its:ite), &
2271 wstar(its:ite), sflx(its:ite), &
2272 pdot(its:ite), po(its:ite,kts:kte), &
2273 qcond(its:ite), qevap(its:ite), hmax(its:ite), &
2275 xlamud(its:ite), xmb(its:ite), xmbmax(its:ite)
2277 real :: delubar(its:ite), delvbar(its:ite)
2281 real :: thx(its:ite, kts:kte)
2282 real :: rhox(its:ite)
2285 real :: p(its:ite,kts:kte), to(its:ite,kts:kte), &
2286 qo(its:ite,kts:kte), qeso(its:ite,kts:kte), &
2287 uo(its:ite,kts:kte), vo(its:ite,kts:kte)
2291 real :: qlko_ktcon(its:ite), dellal(its:ite,kts:kte), &
2292 dbyo(its:ite,kts:kte), &
2293 xlamue(its:ite,kts:kte), &
2294 heo(its:ite,kts:kte), heso(its:ite,kts:kte), &
2295 dellah(its:ite,kts:kte), dellaq(its:ite,kts:kte), &
2296 dellau(its:ite,kts:kte), dellav(its:ite,kts:kte), &
2297 ucko(its:ite,kts:kte), vcko(its:ite,kts:kte), &
2298 hcko(its:ite,kts:kte), qcko(its:ite,kts:kte), &
2299 eta(its:ite,kts:kte), zi(its:ite,kts:kte+1), &
2300 pwo(its:ite,kts:kte)
2302 logical :: totflg, cnvflg(its:ite), flg(its:ite)
2304 ! real :: fpvs,fpvs0
2306 ! physical parameters
2308 real,parameter :: c0=.002,c1=5.e-4
2309 real,parameter :: cincrmax=180.,cincrmin=120.,dthk=25.
2310 real :: el2orc,fact1,fact2,eps
2311 real,parameter :: h1=0.33333333
2312 real,parameter :: tf=233.16, tcr=263.16, tcrf=1.0/(tcr-tf)
2314 !-------------------------------------------------------------------------------
2321 ! compute surface buoyancy flux
2325 thx(i,k) = t1(i,k)/prslk(i,k)
2329 tvcon = (1.+fv_*q1(i,1))
2330 rhox(i) = prsl(i,1)*1.e3/(rd_*t1(i,1)*tvcon)
2333 ! sflx(i) = heat(i)+fv_*t1(i,1)*evap(i)
2334 sflx(i) = hfx(i)/rhox(i)/cp_ + qfx(i)/rhox(i)*fv_*thx(i,1)
2341 if(kuo(i).eq.1) cnvflg(i) = .false.
2342 if(sflx(i).le.0.) cnvflg(i) = .false.
2360 totflg = totflg .and. (.not. cnvflg(i))
2366 dtmin = max(dt2, val )
2368 dtmax = max(dt2, val )
2369 ! model tunable parameters are all here
2376 pgcon = 0.55 ! Zhang & Wu (2003,JAS)
2379 ! define miscellaneous values
2381 el2orc = hvap_*hvap_/(rv_*cp_)
2383 fact1 = (cvap_-cliq_)/rv_
2384 fact2 = hvap_/rv_-fact1*t0c_
2395 ! define top layer for search of the downdraft originating layer
2396 ! and the maximum thetae for updraft
2405 if (prsl(i,k).gt.prsi(i,1)*0.70) kbm(i) = k + 1
2406 if (prsl(i,k).gt.prsi(i,1)*0.60) kmax(i) = k + 1
2410 kbm(i) = min(kbm(i),kmax(i))
2413 ! hydrostatic height assume zero terr and compute
2414 ! updraft entrainment rate as an inverse function of height
2418 xlamue(i,k) = clam / zi(i,k)
2422 xlamue(i,kte) = xlamue(i,km1)
2433 if (flg(i).and.zl(i,k).le.hpbl(i)) then
2441 kpbl(i)= min(kpbl(i),kbm(i))
2444 ! convert surface pressure to mb from cb
2449 if (cnvflg(i) .and. k .le. kmax(i)) then
2450 p(i,k) = prsl(i,k) * 10.0
2461 uo(i,k) = u1(i,k) * rcs
2462 vo(i,k) = v1(i,k) * rcs
2469 ! p is pressure of the layer (mb)
2470 ! t is temperature at t-dt (k)..tn
2471 ! q is mixing ratio at t-dt (kg/kg)..qn
2472 ! to is temperature at t+dt (k)... this is after advection and turbulan
2473 ! qo is mixing ratio at t+dt (kg/kg)..q1
2477 if (cnvflg(i) .and. k .le. kmax(i)) then
2478 qeso(i,k) = 0.01 * fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
2479 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.)*qeso(i,k))
2481 qeso(i,k) = max(qeso(i,k), val1)
2483 qo(i,k) = max(qo(i,k), val2 )
2488 ! compute moist static energy
2492 if (cnvflg(i) .and. k .le. kmax(i)) then
2493 tem = g_ * zl(i,k) + cp_ * to(i,k)
2494 heo(i,k) = tem + hvap_ * qo(i,k)
2495 heso(i,k) = tem + hvap_ * qeso(i,k)
2500 ! determine level with largest moist static energy within pbl
2501 ! this is the level where updraft starts
2511 if (cnvflg(i).and.k.le.kpbl(i)) then
2512 if(heo(i,k).gt.hmax(i)) then
2522 if (cnvflg(i) .and. k .le. kmax(i)-1) then
2523 dz = .5 * (zl(i,k+1) - zl(i,k))
2524 dp = .5 * (p(i,k+1) - p(i,k))
2525 es = 0.01*fpvs(to(i,k+1),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
2526 pprime = p(i,k+1) + (eps-1.) * es
2527 qs = eps * es / pprime
2528 dqsdp = - qs / pprime
2529 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
2530 dqsdt = qs * p(i,k+1) * desdt / (es * pprime)
2531 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
2532 dt = (g_ * dz + hvap_ * dqsdp * dp) / (cp_ * (1. + gamma))
2533 dq = dqsdt * dt + dqsdp * dp
2534 to(i,k) = to(i,k+1) + dt
2535 qo(i,k) = qo(i,k+1) + dq
2536 po(i,k) = .5 * (p(i,k) + p(i,k+1))
2543 if (cnvflg(i) .and. k .le. kmax(i)-1) then
2544 qeso(i,k)=0.01*fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
2545 qeso(i,k) = eps * qeso(i,k) / (po(i,k) + (eps-1.) * qeso(i,k))
2547 qeso(i,k) = max(qeso(i,k), val1)
2549 qo(i,k) = max(qo(i,k), val2 )
2550 heo(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
2551 cp_ * to(i,k) + hvap_ * qo(i,k)
2552 heso(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
2553 cp_ * to(i,k) + hvap_ * qeso(i,k)
2554 uo(i,k) = .5 * (uo(i,k) + uo(i,k+1))
2555 vo(i,k) = .5 * (vo(i,k) + vo(i,k+1))
2560 ! look for the level of free convection as cloud base
2564 if(flg(i)) kbcon(i) = kmax(i)
2568 if (flg(i).and.k.lt.kbm(i)) then
2569 if(k.gt.kb(i).and.heo(i,kb(i)).gt.heso(i,k)) then
2579 if(kbcon(i).eq.kmax(i)) cnvflg(i) = .false.
2585 totflg = totflg .and. (.not. cnvflg(i))
2590 ! determine critical convective inhibition
2591 ! as a function of vertical velocity at cloud base.
2595 pdot(i) = 10.* dot(i,kbcon(i))
2600 if(slimsk(i).eq.1.) then
2611 if(pdot(i).le.w4) then
2612 ptem = (pdot(i) - w4) / (w3 - w4)
2613 elseif(pdot(i).ge.-w4) then
2614 ptem = - (pdot(i) + w4) / (w4 - w3)
2619 ptem = max(ptem,val1)
2621 ptem = min(ptem,val2)
2623 ptem1= .5*(cincrmax-cincrmin)
2624 cincr = cincrmax - ptem * ptem1
2625 tem1 = p(i,kb(i)) - p(i,kbcon(i))
2626 if(tem1.gt.cincr) then
2634 totflg = totflg .and. (.not. cnvflg(i))
2639 ! assume the detrainment rate for the updrafts to be same as
2640 ! the entrainment rate at cloud base
2644 xlamud(i) = xlamue(i,kbcon(i))
2648 ! determine updraft mass flux for the subcloud layers
2653 if(k.lt.kbcon(i).and.k.ge.kb(i)) then
2654 dz = zi(i,k+1) - zi(i,k)
2655 ptem = 0.5*(xlamue(i,k)+xlamue(i,k+1))-xlamud(i)
2656 eta(i,k) = eta(i,k+1) / (1. + ptem * dz)
2662 ! compute mass flux above cloud base
2667 if(k.gt.kbcon(i).and.k.lt.kmax(i)) then
2668 dz = zi(i,k) - zi(i,k-1)
2669 ptem = 0.5*(xlamue(i,k)+xlamue(i,k-1))-xlamud(i)
2670 eta(i,k) = eta(i,k-1) * (1 + ptem * dz)
2676 ! compute updraft cloud property
2681 hcko(i,indx) = heo(i,indx)
2682 ucko(i,indx) = uo(i,indx)
2683 vcko(i,indx) = vo(i,indx)
2690 if(k.gt.kb(i).and.k.lt.kmax(i)) then
2691 dz = zi(i,k) - zi(i,k-1)
2692 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
2693 tem1 = 0.5 * xlamud(i) * dz
2694 factor = 1. + tem - tem1
2695 ptem = 0.5 * tem + pgcon
2696 ptem1= 0.5 * tem - pgcon
2697 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
2698 (heo(i,k)+heo(i,k-1)))/factor
2699 ucko(i,k) = ((1.-tem1)*ucko(i,k-1)+ptem*uo(i,k) &
2700 +ptem1*uo(i,k-1))/factor
2701 vcko(i,k) = ((1.-tem1)*vcko(i,k-1)+ptem*vo(i,k) &
2702 +ptem1*vo(i,k-1))/factor
2703 dbyo(i,k) = hcko(i,k) - heso(i,k)
2709 ! taking account into convection inhibition due to existence of
2710 ! dry layers below cloud base
2718 if (flg(i).and.k.lt.kbm(i)) then
2719 if(k.ge.kbcon(i).and.dbyo(i,k).gt.0.) then
2728 if(kbcon1(i).eq.kmax(i)) cnvflg(i) = .false.
2733 tem = p(i,kbcon(i)) - p(i,kbcon1(i))
2734 if(tem.gt.dthk) then
2742 totflg = totflg .and. (.not. cnvflg(i))
2747 ! determine first guess cloud top as the level of zero buoyancy
2748 ! limited to the level of sigma=0.7
2752 if(flg(i)) ktcon(i) = kbm(i)
2756 if (flg(i).and.k .lt. kbm(i)) then
2757 if(k.gt.kbcon1(i).and.dbyo(i,k).lt.0.) then
2765 ! specify upper limit of mass flux at cloud base
2770 dp = 1000. * del(i,k)
2771 xmbmax(i) = dp / (g_ * dt2)
2775 ! compute cloud moisture property and precipitation
2780 qcko(i,kb(i)) = qo(i,kb(i))
2786 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
2787 dz = zi(i,k) - zi(i,k-1)
2788 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2790 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
2792 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
2793 tem1 = 0.5 * xlamud(i) * dz
2794 factor = 1. + tem - tem1
2795 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
2796 (qo(i,k)+qo(i,k-1)))/factor
2798 dq = eta(i,k) * (qcko(i,k) - qrch)
2800 ! rhbar(i) = rhbar(i) + qo(i,k) / qeso(i,k)
2802 ! below lfc check if there is excess moisture to release latent heat
2804 if(k.ge.kbcon(i).and.dq.gt.0.) then
2805 etah = .5 * (eta(i,k) + eta(i,k-1))
2806 if(ncloud.gt.0) then
2807 dp = 1000. * del(i,k)
2808 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
2809 dellal(i,k) = etah * c1 * dz * qlk * g_ / dp
2811 qlk = dq / (eta(i,k) + etah * c0 * dz)
2813 aa1(i) = aa1(i) - dz * g_ * qlk
2814 qcko(i,k)= qlk + qrch
2815 pwo(i,k) = etah * c0 * dz * qlk
2822 ! calculate cloud work function
2827 if(k.ge.kbcon(i).and.k.lt.ktcon(i)) then
2828 dz1 = zl(i,k+1) - zl(i,k)
2829 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2830 rfact = 1. + fv_ * cp_ * gamma &
2832 aa1(i) = aa1(i) + dz1 * (g_ / (cp_ * to(i,k))) &
2833 * dbyo(i,k) / (1. + gamma) * rfact
2835 aa1(i)=aa1(i)+ dz1 * g_ * fv_ * &
2836 max(val,(qeso(i,k) - qo(i,k)))
2842 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
2847 totflg = totflg .and. (.not. cnvflg(i))
2852 ! estimate the convective overshooting as the level
2853 ! where the [aafac * cloud work function] becomes zero,
2854 ! which is the final cloud top limited to the level of sigma=0.7
2858 aa1(i) = aafac * aa1(i)
2869 if(k.ge.ktcon(i).and.k.lt.kbm(i)) then
2870 dz1 = zl(i,k+1) - zl(i,k)
2871 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2872 rfact = 1. + fv_ * cp_ * gamma &
2875 dz1 * (g_ / (cp_ * to(i,k))) &
2876 * dbyo(i,k) / (1. + gamma) * rfact
2877 if(aa1(i).lt.0.) then
2886 ! compute cloud moisture property, detraining cloud water
2887 ! and precipitation in overshooting layers
2892 if(k.ge.ktcon(i).and.k.lt.ktcon1(i)) then
2893 dz = zi(i,k) - zi(i,k-1)
2894 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2896 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
2897 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
2898 tem1 = 0.5 * xlamud(i) * dz
2899 factor = 1. + tem - tem1
2900 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
2901 (qo(i,k)+qo(i,k-1)))/factor
2902 dq = eta(i,k) * (qcko(i,k) - qrch)
2904 ! check if there is excess moisture to release latent heat
2907 etah = .5 * (eta(i,k) + eta(i,k-1))
2908 if(ncloud.gt.0) then
2909 dp = 1000. * del(i,k)
2910 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
2911 dellal(i,k) = etah * c1 * dz * qlk * g_ / dp
2913 qlk = dq / (eta(i,k) + etah * c0 * dz)
2915 qcko(i,k) = qlk + qrch
2916 pwo(i,k) = etah * c0 * dz * qlk
2923 ! exchange ktcon with ktcon1
2928 ktcon(i) = ktcon1(i)
2933 ! this section is ready for cloud water
2935 if(ncloud.gt.0) then
2937 ! compute liquid and vapor separation at cloud top
2942 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2944 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
2945 dq = qcko(i,k) - qrch
2947 ! check if there is excess moisture to release latent heat
2957 !--- compute precipitation efficiency in terms of windshear
2967 if(k.gt.kb(i).and.k.le.ktcon(i)) then
2968 shear= sqrt((uo(i,k)-uo(i,k-1)) ** 2 &
2969 + (vo(i,k)-vo(i,k-1)) ** 2)
2970 vshear(i) = vshear(i) + shear
2977 vshear(i) = 1.e3 * vshear(i) / (zi(i,ktcon(i))-zi(i,kb(i)))
2978 e1=1.591-.639*vshear(i) &
2979 +.0953*(vshear(i)**2)-.00496*(vshear(i)**3)
2982 edt(i) = min(edt(i),val)
2984 edt(i) = max(edt(i),val)
2988 !--- what would the change be, that a cloud with unit mass
2989 !--- will do to the environment?
2993 if(cnvflg(i) .and. k .le. kmax(i)) then
3002 !--- changed due to subsidence and entrainment
3007 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
3008 dp = 1000. * del(i,k)
3009 dz = zi(i,k) - zi(i,k-1)
3012 dv2h = .5 * (heo(i,k) + heo(i,k-1))
3015 dv2q = .5 * (qo(i,k) + qo(i,k-1))
3018 dv2u = .5 * (uo(i,k) + uo(i,k-1))
3021 dv2v = .5 * (vo(i,k) + vo(i,k-1))
3024 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1))
3027 dellah(i,k) = dellah(i,k) + &
3028 ( eta(i,k)*dv1h - eta(i,k-1)*dv3h &
3029 - tem*eta(i,k-1)*dv2h*dz &
3030 + tem1*eta(i,k-1)*.5*(hcko(i,k)+hcko(i,k-1))*dz &
3033 dellaq(i,k) = dellaq(i,k) + &
3034 ( eta(i,k)*dv1q - eta(i,k-1)*dv3q &
3035 - tem*eta(i,k-1)*dv2q*dz &
3036 + tem1*eta(i,k-1)*.5*(qcko(i,k)+qcko(i,k-1))*dz &
3039 dellau(i,k) = dellau(i,k) + &
3040 ( eta(i,k)*dv1u - eta(i,k-1)*dv3u &
3041 - tem*eta(i,k-1)*dv2u*dz &
3042 + tem1*eta(i,k-1)*.5*(ucko(i,k)+ucko(i,k-1))*dz &
3043 - pgcon*eta(i,k-1)*(dv1u-dv3u) &
3046 dellav(i,k) = dellav(i,k) + &
3047 ( eta(i,k)*dv1v - eta(i,k-1)*dv3v &
3048 - tem*eta(i,k-1)*dv2v*dz &
3049 + tem1*eta(i,k-1)*.5*(vcko(i,k)+vcko(i,k-1))*dz &
3050 - pgcon*eta(i,k-1)*(dv1v-dv3v) &
3063 dp = 1000. * del(i,indx)
3064 dv1h = heo(i,indx-1)
3065 dellah(i,indx) = eta(i,indx-1) * &
3066 (hcko(i,indx-1) - dv1h) * g_ / dp
3068 dellaq(i,indx) = eta(i,indx-1) * &
3069 (qcko(i,indx-1) - dv1q) * g_ / dp
3071 dellau(i,indx) = eta(i,indx-1) * &
3072 (ucko(i,indx-1) - dv1u) * g_ / dp
3074 dellav(i,indx) = eta(i,indx-1) * &
3075 (vcko(i,indx-1) - dv1v) * g_ / dp
3079 dellal(i,indx) = eta(i,indx-1) * &
3080 qlko_ktcon(i) * g_ / dp
3084 ! mass flux at cloud base for shallow convection
3090 ptem = g_*sflx(i)*hpbl(i)/t1(i,1)
3092 tem = po(i,k)*100. / (rd_*t1(i,k))
3093 xmb(i) = betaw*tem*wstar(i)
3094 xmb(i) = min(xmb(i),xmbmax(i))
3098 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3102 if (cnvflg(i) .and. k .le. kmax(i)) then
3103 qeso(i,k)=0.01* fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
3104 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.)*qeso(i,k))
3106 qeso(i,k) = max(qeso(i,k), val )
3110 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3123 if(k.gt.kb(i).and.k.le.ktcon(i)) then
3124 dellat = (dellah(i,k) - hvap_ * dellaq(i,k)) / cp_
3125 t1(i,k) = t1(i,k) + dellat * xmb(i) * dt2
3126 q1(i,k) = q1(i,k) + dellaq(i,k) * xmb(i) * dt2
3128 u1(i,k) = u1(i,k) + dellau(i,k) * xmb(i) * dt2 * tem
3129 v1(i,k) = v1(i,k) + dellav(i,k) * xmb(i) * dt2 * tem
3130 dp = 1000. * del(i,k)
3131 delhbar(i) = delhbar(i) + dellah(i,k)*xmb(i)*dp/g_
3132 delqbar(i) = delqbar(i) + dellaq(i,k)*xmb(i)*dp/g_
3133 deltbar(i) = deltbar(i) + dellat*xmb(i)*dp/g_
3134 delubar(i) = delubar(i) + dellau(i,k)*xmb(i)*dp/g_
3135 delvbar(i) = delvbar(i) + dellav(i,k)*xmb(i)*dp/g_
3143 if(k.gt.kb(i).and.k.le.ktcon(i)) then
3144 qeso(i,k)=0.01* fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
3145 qeso(i,k) = eps * qeso(i,k)/(p(i,k) + (eps-1.)*qeso(i,k))
3147 qeso(i,k) = max(qeso(i,k), val )
3162 if(k.lt.ktcon(i).and.k.gt.kb(i)) then
3163 rntot(i) = rntot(i) + pwo(i,k) * xmb(i) * .001 * dt2
3173 if (k .le. kmax(i)) then
3178 if(k.lt.ktcon(i).and.k.gt.kb(i)) then
3179 rain(i) = rain(i) + pwo(i,k) * xmb(i) * .001 * dt2
3182 if(flg(i).and.k.lt.ktcon(i)) then
3183 evef = edt(i) * evfact
3184 if(slimsk(i).eq.1.) evef=edt(i) * evfactl
3185 qcond(i) = evef * (q1(i,k) - qeso(i,k)) &
3186 / (1. + el2orc * qeso(i,k) / t1(i,k)**2)
3187 dp = 1000. * del(i,k)
3188 if(rain(i).gt.0..and.qcond(i).lt.0.) then
3189 qevap(i) = -qcond(i) * (1.-exp(-.32*sqrt(dt2*rain(i))))
3190 qevap(i) = min(qevap(i), rain(i)*1000.*g_/dp)
3191 delq2(i) = delqev(i) + .001 * qevap(i) * dp / g_
3193 if(rain(i).gt.0..and.qcond(i).lt.0..and. &
3194 delq2(i).gt.rntot(i)) then
3195 qevap(i) = 1000.* g_ * (rntot(i) - delqev(i)) / dp
3198 if(rain(i).gt.0..and.qevap(i).gt.0.) then
3199 tem = .001 * dp / g_
3200 tem1 = qevap(i) * tem
3201 if(tem1.gt.rain(i)) then
3202 qevap(i) = rain(i) / tem
3205 rain(i) = rain(i) - tem1
3207 q1(i,k) = q1(i,k) + qevap(i)
3208 t1(i,k) = t1(i,k) - (hvap_/cp_) * qevap(i)
3209 deltv(i) = - (hvap_/cp_)*qevap(i)/dt2
3210 delq(i) = + qevap(i)/dt2
3211 delqev(i) = delqev(i) + .001*dp*qevap(i)/g_
3213 dellaq(i,k) = dellaq(i,k) + delq(i) / xmb(i)
3214 delqbar(i) = delqbar(i) + delq(i)*dp/g_
3215 deltbar(i) = deltbar(i) + deltv(i)*dp/g_
3223 if(rain(i).lt.0..or..not.flg(i)) rain(i) = 0.
3232 if (ncloud.gt.0) then
3237 if (k.ge.kbcon(i).and.k.le.ktcon(i)) then
3238 tem = dellal(i,k) * xmb(i) * dt2
3239 tem1 = max(0.0, min(1.0, (tcr-t1(i,k))*tcrf))
3240 if (ncloud.ge.4) then
3241 qi2(i,k) = qi2(i,k) + tem * tem1 ! ice
3242 qc2(i,k) = qc2(i,k) + tem *(1.0-tem1) ! water
3244 qc2(i,k) = qc2(i,k) + tem
3253 end subroutine nscv2d
3254 !--------------------------------------------------------------------------
3256 END MODULE module_cu_nsas