8 !-------------------------------------------------------------------------------
9 subroutine cu_nsas(dt,p3di,p3d,pi3d,qc3d,qi3d,rho3d,itimestep,stepcu, &
10 hbot,htop,cu_act_flag,cudt,curr_secs,adapt_step_flag, &
12 rthcuten,rqvcuten,rqccuten,rqicuten, &
14 qv3d,t3d,raincv,pratec,xland,dz8w,w,u3d,v3d, &
17 p_qc,p_qi,p_first_scalar, &
19 cp,cliq,cpv,g,xlv,r_d,r_v,ep_1,ep_2, &
20 cice,xls,psat,f_qi,f_qc, &
21 ids,ide, jds,jde, kds,kde, &
22 ims,ime, jms,jme, kms,kme, &
23 its,ite, jts,jte, kts,kte)
24 !-------------------------------------------------------------------------------
26 !-------------------------------------------------------------------------------
29 !-- p3di 3d pressure (pa) at interface level
30 !-- p3d 3d pressure (pa)
31 !-- pi3d 3d exner function (dimensionless)
32 !-- z height above sea level (m)
33 !-- qc3d cloud water mixing ratio (kg/kg)
34 !-- qi3d cloud ice mixing ratio (kg/kg)
35 !-- qv3d 3d water vapor mixing ratio (kg/kg)
36 !-- t3d temperature (k)
37 !-- raincv cumulus scheme precipitation (mm)
38 !-- w vertical velocity (m/s)
39 !-- dz8w dz between full levels (m)
40 !-- u3d 3d u-velocity interpolated to theta points (m/s)
41 !-- v3d 3d v-velocity interpolated to theta points (m/s)
42 !-- ids start index for i in domain
43 !-- ide end index for i in domain
44 !-- jds start index for j in domain
45 !-- jde end index for j in domain
46 !-- kds start index for k in domain
47 !-- kde end index for k in domain
48 !-- ims start index for i in memory
49 !-- ime end index for i in memory
50 !-- jms start index for j in memory
51 !-- jme end index for j in memory
52 !-- kms start index for k in memory
53 !-- kme end index for k in memory
54 !-- its start index for i in tile
55 !-- ite end index for i in tile
56 !-- jts start index for j in tile
57 !-- jte end index for j in tile
58 !-- kts start index for k in tile
59 !-- kte end index for k in tile
60 !-------------------------------------------------------------------------------
61 integer, intent(in ) :: ids,ide, jds,jde, kds,kde, &
62 ims,ime, jms,jme, kms,kme, &
63 its,ite, jts,jte, kts,kte, &
65 p_qc,p_qi,p_first_scalar
67 real, intent(in ) :: cp,cliq,cpv,g,xlv,r_d,r_v,ep_1,ep_2, &
69 real, intent(in ) :: dt
70 real, optional, intent(in ) :: pgcon
72 real, dimension( ims:ime, kms:kme, jms:jme ),optional , &
73 intent(inout) :: rthcuten, &
79 logical, optional :: F_QC,F_QI
80 real, dimension( ims:ime, kms:kme, jms:jme ) , &
81 intent(in ) :: qv3d, &
88 real, dimension( ims:ime, kms:kme, jms:jme ) , &
90 real, dimension( ims:ime, kms:kme, jms:jme ) , &
91 intent(in ) :: dz8w, &
93 real, dimension( ims:ime, jms:jme ) , &
94 intent(inout) :: raincv, &
96 real, dimension( ims:ime, jms:jme ) , &
97 intent(out) :: hbot, &
99 real, dimension( ims:ime, jms:jme ) , &
102 real, dimension( ims:ime, kms:kme, jms:jme ) , &
103 intent(in ) :: u3d, &
105 logical, dimension( ims:ime, jms:jme ) , &
106 intent(inout) :: cu_act_flag
107 real, intent( in) :: cudt
108 real, intent( in) :: curr_secs
109 logical, intent( in) , optional :: adapt_step_flag
111 real, intent (inout) :: cudtacttime
113 real, dimension( ims:ime, jms:jme ) , &
114 intent(in ) :: hpbl, &
117 integer, intent(in ) :: mp_physics
122 real, dimension( its:ite, jts:jte ) :: raincv1, &
126 real, dimension( its:ite, kts:kte ) :: del, &
135 real, dimension( its:ite, kts:kte+1 ) :: prsii, &
137 real, dimension( its:ite, kts:kte ) :: zll
138 real, dimension( its:ite) :: rain
140 integer, dimension (its:ite) :: kbot, &
144 logical :: run_param , doing_adapt_dt , decided
147 !-------------------------------------------------------------------------------
148 ! microphysics scheme --> ncloud
149 if (mp_physics .eq. 0) then
151 elseif ( mp_physics .eq. 1 .or. mp_physics .eq. 3 ) then
157 !-------------------------------------------------------------------------------
159 !*** check to see if this is a convection timestep
162 ! Initialization for adaptive time step.
164 doing_adapt_dt = .FALSE.
165 IF ( PRESENT(adapt_step_flag) ) THEN
166 IF ( adapt_step_flag ) THEN
167 doing_adapt_dt = .TRUE.
168 IF ( cudtacttime .EQ. 0. ) THEN
169 cudtacttime = curr_secs + cudt*60.
174 ! Do we run through this scheme or not?
176 ! Test 1: If this is the initial model time, then yes.
178 ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
180 ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
181 ! MOD(ITIMESTEP,STEPCU)=0
182 ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
183 ! CURR_SECS >= CUDTACTTIME
185 ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
186 ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
187 ! We only proceed to other tests if the previous tests all have left decided as FALSE.
189 ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
194 IF ( ( .NOT. decided ) .AND. &
195 ( itimestep .EQ. 1 ) ) THEN
200 IF ( ( .NOT. decided ) .AND. &
201 ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
206 IF ( ( .NOT. decided ) .AND. &
207 ( .NOT. doing_adapt_dt ) .AND. &
208 ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
213 IF ( ( .NOT. decided ) .AND. &
214 ( doing_adapt_dt ) .AND. &
215 ( curr_secs .GE. cudtacttime ) ) THEN
218 cudtacttime = curr_secs + cudt*60
221 !-------------------------------------------------------------------------------
223 if(present(pgcon)) then
226 ! pgcon_use = 0.7 ! Gregory et al. (1997, QJRMS)
227 pgcon_use = 0.55 ! Zhang & Wu (2003,JAS)
228 ! 0.55 is a physically-based value used by GFS
229 ! HWRF uses 0.2, for model tuning purposes
235 cu_act_flag(i,j)=.TRUE.
241 do j = jts,jte !outer most J_loop
245 dot(i,k) = -5.0e-4*g*rho3d(i,k,j)*(w(i,k,j)+w(i,kp,j))
246 prsll(i,k)=p3d(i,k,j)*0.001
247 prsii(i,k)=p3di(i,k,j)*0.001
251 prsii(i,kte+1)=p3di(i,kte+1,j)*0.001
260 zii(i,k+1)=zii(i,k)+dz8w(i,k,j)
266 zll(i,k)=0.5*(zii(i,k)+zii(i,k+1))
272 del(i,k)=prsll(i,k)*g/r_d*dz8w(i,k,j)/t3d(i,k,j)
277 qi2(i,k) = qi3d(i,k,j)
278 qc2(i,k) = qc3d(i,k,j)
283 call nsas2d(delt=dt,del=del(its,kts),prsl=prsll(its,kts), &
284 prsi=prsii(its,kts),prslk=pi3d(ims,kms,j),zl=zll(its,kts), &
285 zi=zii(its,kts),ncloud=ncloud,qc2=qc2(its,kts),qi2=qi2(its,kts), &
286 q1=q1(its,kts),t1=t1(its,kts),rain=rain(its), &
287 kbot=kbot(its),ktop=ktop(its), &
289 lat=j,slimsk=xland(ims,j),dot=dot(its,kts), &
290 u1=u1(its,kts), v1=v1(its,kts), &
291 cp_=cp,cliq_=cliq,cvap_=cpv,g_=g,hvap_=xlv, &
292 rd_=r_d,rv_=r_v,fv_=ep_1,ep2=ep_2, &
293 cice=cice,xls=xls,psat=psat, &
295 ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
296 ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
297 its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
300 pratec1(i,j)=rain(i)*1000./(stepcu*dt)
301 raincv1(i,j)=rain(i)*1000./(stepcu)
305 call nscv2d(delt=dt,del=del(its,kts),prsl=prsll(its,kts), &
306 prsi=prsii(its,kts),prslk=pi3d(ims,kms,j),zl=zll(its,kts), &
307 zi=zii(its,kts),ncloud=ncloud,qc2=qc2(its,kts),qi2=qi2(its,kts), &
308 q1=q1(its,kts),t1=t1(its,kts),rain=rain(its), &
309 kbot=kbot(its),ktop=ktop(its), &
311 slimsk=xland(ims,j),dot=dot(its,kts), &
312 u1=u1(its,kts), v1=v1(its,kts), &
313 cp_=cp,cliq_=cliq,cvap_=cpv,g_=g,hvap_=xlv, &
314 rd_=r_d,rv_=r_v,fv_=ep_1,ep2=ep_2, &
315 cice=cice,xls=xls,psat=psat, &
316 hpbl=hpbl(ims,j),hfx=hfx(ims,j),qfx=qfx(ims,j), &
318 ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
319 ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
320 its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
323 pratec2(i,j)=rain(i)*1000./(stepcu*dt)
324 raincv2(i,j)=rain(i)*1000./(stepcu)
328 raincv(i,j) = raincv1(i,j) + raincv2(i,j)
329 pratec(i,j) = pratec1(i,j) + pratec2(i,j)
334 IF(PRESENT(rthcuten).AND.PRESENT(rqvcuten)) THEN
337 rthcuten(i,k,j)=(t1(i,k)-t3d(i,k,j))/pi3d(i,k,j)*rdelt
338 rqvcuten(i,k,j)=(q1(i,k)-qv3d(i,k,j))*rdelt
343 IF(PRESENT(rucuten).AND.PRESENT(rvcuten)) THEN
346 rucuten(i,k,j)=(u1(i,k)-u3d(i,k,j))*rdelt
347 rvcuten(i,k,j)=(v1(i,k)-v3d(i,k,j))*rdelt
352 if(PRESENT( rqicuten )) THEN
356 rqicuten(i,k,j)=(qi2(i,k)-qi3d(i,k,j))*rdelt
361 if(PRESENT( rqccuten )) THEN
365 rqccuten(i,k,j)=(qc2(i,k)-qc3d(i,k,j))*rdelt
371 enddo ! outer most J_loop
374 end subroutine cu_nsas
376 !==============================================================================
377 ! NCEP SAS (Deep Convection Scheme)
378 !==============================================================================
379 subroutine nsas2d(delt,del,prsl,prsi,prslk,zl,zi, &
382 q1,t1,rain,kbot,ktop, &
384 lat,slimsk,dot,u1,v1,cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2, &
387 ids,ide, jds,jde, kds,kde, &
388 ims,ime, jms,jme, kms,kme, &
389 its,ite, jts,jte, kts,kte)
391 !------------------------------------------------------------------------------
393 ! subprogram: phys_cps_sas computes convective heating and moistening
394 ! and momentum transport
396 ! abstract: computes convective heating and moistening using a one
397 ! cloud type arakawa-schubert convection scheme originally developed
398 ! by georg grell. the scheme has been revised at ncep since initial
399 ! implementation in 1993. it includes updraft and downdraft effects.
400 ! the closure is the cloud work function. both updraft and downdraft
401 ! are assumed to be saturated and the heating and moistening are
402 ! accomplished by the compensating environment. convective momentum transport
403 ! is taken into account. the name comes from "simplified arakawa-schubert
404 ! convection parameterization".
406 ! developed by hua-lu pan, wan-shu wu, songyou hong, and jongil han
407 ! implemented into wrf by kyosun sunny lim and songyou hong
408 ! module with cpp-based options is available in grims
410 ! program history log:
411 ! 92-03-01 hua-lu pan operational development
412 ! 96-03-01 song-you hong revised closure, and trigger
413 ! 99-03-01 hua-lu pan multiple clouds
414 ! 06-03-01 young-hwa byun closure based on moisture convergence (optional)
415 ! 09-10-01 jung-eun kim f90 format with standard physics modules
416 ! 10-07-01 jong-il han revised cloud model,trigger, as in gfs july 2010
417 ! 10-12-01 kyosun sunny lim wrf compatible version
420 ! usage: call phys_cps_sas(delt,delx,del,prsl,prsi,prslk,prsik,zl,zi, &
421 ! q2,q1,t1,u1,v1,rcs,slimsk,dot,cldwrk,rain, &
422 ! jcap,ncloud,lat,kbot,ktop,kuo, &
423 ! ids,ide, jds,jde, kds,kde, &
424 ! ims,ime, jms,jme, kms,kme, &
425 ! its,ite, jts,jte, kts,kte)
427 ! delt - real model integration time step
428 ! delx - real model grid interval
429 ! del - real (kms:kme) sigma layer thickness
430 ! prsl - real (ims:ime,kms:kme) pressure values
431 ! prsi - real (ims:ime,kms:kme) pressure values at interface level
432 ! prslk - real (ims:ime,kms:kme) pressure values to the kappa
433 ! prsik - real (ims:ime,kms:kme) pressure values to the kappa at interface lev.
434 ! zl - real (ims:ime,kms:kme) height above sea level
435 ! zi - real (ims:ime,kms:kme) height above sea level at interface level
437 ! slimsk - real (ims:ime) land(1),sea(0), ice(2) flag
438 ! dot - real (ims:ime,kms:kme) vertical velocity
439 ! jcap - integer spectral truncation
440 ! ncloud - integer no_cloud(0),no_ice(1),cloud+ice(2)
441 ! lat - integer current latitude index
443 ! output argument list:
444 ! q2 - real (ims:ime,kms:kme) detrained hydrometeors in kg/kg
445 ! - in case of the --> qc2(cloud), qi2(ice)
446 ! q1 - real (ims:ime,kms:kme) adjusted specific humidity in kg/kg
447 ! t1 - real (ims:ime,kms:kme) adjusted temperature in kelvin
448 ! u1 - real (ims:ime,kms:kme) adjusted zonal wind in m/s
449 ! v1 - real (ims:ime,kms:kme) adjusted meridional wind in m/s
450 ! cldwrk - real (ims:ime) cloud work function
451 ! rain - real (ims:ime) convective rain in meters
452 ! kbot - integer (ims:ime) cloud bottom level
453 ! ktop - integer (ims:ime) cloud top level
454 ! kuo - integer (ims:ime) bit flag indicating deep convection
456 ! subprograms called:
457 ! fpvs - function to compute saturation vapor pressure
459 ! remarks: function fpvs is inlined by fpp.
460 ! nonstandard automatic arrays are used.
463 ! pan and wu (1995, ncep office note)
464 ! hong and pan (1998, mon wea rev)
465 ! park and hong (2007,jmsj)
466 ! byun and hong (2007, mon wea rev)
467 ! han and pan (2011, wea. forecasting)
469 !------------------------------------------------------------------------------
470 !------------------------------------------------------------------------------
472 !------------------------------------------------------------------------------
474 ! model tunable parameters
476 real,parameter :: alphal = 0.5, alphas = 0.5
477 real,parameter :: betal = 0.05, betas = 0.05
478 real,parameter :: pdpdwn = 0.0, pdetrn = 200.0
479 real,parameter :: c0 = 0.002, c1 = 0.002
480 real,parameter :: xlamdd = 1.0e-4, xlamde = 1.0e-4
481 real,parameter :: clam = 0.1, cxlamu = 1.0e-4
482 real,parameter :: aafac = 0.1
483 real,parameter :: dthk=25.
484 real,parameter :: cincrmax = 180.,cincrmin = 120.
485 real,parameter :: W1l = -8.E-3
486 real,parameter :: W2l = -4.E-2
487 real,parameter :: W3l = -5.E-3
488 real,parameter :: W4l = -5.E-4
489 real,parameter :: W1s = -2.E-4
490 real,parameter :: W2s = -2.E-3
491 real,parameter :: W3s = -1.E-3
492 real,parameter :: W4s = -2.E-5
493 real,parameter :: mbdt = 10., edtmaxl = 0.3, edtmaxs = 0.3
494 real,parameter :: evfacts = 0.3, evfactl = 0.3
496 real,parameter :: tf=233.16,tcr=263.16,tcrf=1.0/(tcr-tf)
497 real,parameter :: xk1=2.e-5,xlhor=3.e4,xhver=5000.,theimax=1.
498 real,parameter :: xc1=1.e-7,xc2=1.e4,xc3=3.e3,ecesscr=3.0,edtk1=3.e4
502 real :: cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2
503 real :: pi_,qmin_,t0c_,cice,xlv0,xls,psat
506 ids,ide, jds,jde, kds,kde, &
507 ims,ime, jms,jme, kms,kme, &
508 its,ite, jts,jte, kts,kte
511 real :: del(its:ite,kts:kte), &
512 prsl(its:ite,kts:kte),prslk(ims:ime,kms:kme), &
513 prsi(its:ite,kts:kte+1), &
514 zl(its:ite,kts:kte),zi(its:ite,kts:kte+1), &
515 q1(its:ite,kts:kte),t1(its:ite,kts:kte), &
516 u1(its:ite,kts:kte),v1(its:ite,kts:kte), &
518 real :: qi2(its:ite,kts:kte)
519 real :: qc2(its:ite,kts:kte)
521 real :: rain(its:ite)
522 integer :: kbot(its:ite),ktop(its:ite),kuo(its:ite)
523 real :: slimsk(ims:ime)
527 ! local variables and arrays
529 integer :: i,k,kmax,kbmax,kbm,jmn,indx,indp,kts1,kte1,kmax1,kk
530 real :: p(its:ite,kts:kte),pdot(its:ite),acrtfct(its:ite)
531 real :: uo(its:ite,kts:kte),vo(its:ite,kts:kte)
532 real :: to(its:ite,kts:kte),qo(its:ite,kts:kte)
533 real :: hcko(its:ite,kts:kte)
534 real :: qcko(its:ite,kts:kte),eta(its:ite,kts:kte)
535 real :: etad(its:ite,kts:kte)
536 real :: qrcdo(its:ite,kts:kte)
537 real :: pwo(its:ite,kts:kte),pwdo(its:ite,kts:kte)
538 real :: dtconv(its:ite)
539 real :: deltv(its:ite),acrt(its:ite)
540 real :: qeso(its:ite,kts:kte)
541 real :: tvo(its:ite,kts:kte),dbyo(its:ite,kts:kte)
542 real :: heo(its:ite,kts:kte),heso(its:ite,kts:kte)
543 real :: qrcd(its:ite,kts:kte)
544 real :: dellah(its:ite,kts:kte),dellaq(its:ite,kts:kte)
546 integer :: kb(its:ite),kbcon(its:ite)
547 integer :: kbcon1(its:ite)
548 real :: hmax(its:ite),delq(its:ite)
549 real :: hkbo(its:ite),qkbo(its:ite),pbcdif(its:ite)
550 integer :: kbds(its:ite),lmin(its:ite),jmin(its:ite)
551 integer :: ktcon(its:ite)
552 integer :: ktcon1(its:ite)
553 integer :: kbdtr(its:ite),kpbl(its:ite)
554 integer :: klcl(its:ite),ktdown(its:ite)
555 real :: vmax(its:ite)
556 real :: hmin(its:ite),pwavo(its:ite)
557 real :: aa1(its:ite),vshear(its:ite)
558 real :: qevap(its:ite)
560 real :: edto(its:ite),pwevo(its:ite)
561 real :: qcond(its:ite)
562 real :: hcdo(its:ite,kts:kte)
563 real :: ddp(its:ite),pp2(its:ite)
564 real :: qcdo(its:ite,kts:kte)
565 real :: adet(its:ite),aatmp(its:ite)
566 real :: xhkb(its:ite),xqkb(its:ite)
567 real :: xpwav(its:ite),xpwev(its:ite),xhcd(its:ite,kts:kte)
568 real :: xaa0(its:ite),f(its:ite),xk(its:ite)
570 real :: edtx(its:ite),xqcd(its:ite,kts:kte)
571 real :: hsbar(its:ite),xmbmax(its:ite)
572 real :: xlamb(its:ite,kts:kte),xlamd(its:ite)
573 real :: excess(its:ite)
574 real :: plcl(its:ite)
575 real :: delhbar(its:ite),delqbar(its:ite),deltbar(its:ite)
576 real,save :: pcrit(15), acritt(15)
578 real :: qcirs(its:ite,kts:kte),qrski(its:ite)
579 real :: dellal(its:ite,kts:kte)
580 real :: rntot(its:ite),delqev(its:ite),delq2(its:ite)
582 real :: fent1(its:ite,kts:kte),fent2(its:ite,kts:kte)
583 real :: frh(its:ite,kts:kte)
584 real :: xlamud(its:ite),sumx(its:ite)
586 real :: ucko(its:ite,kts:kte),vcko(its:ite,kts:kte)
587 real :: ucdo(its:ite,kts:kte),vcdo(its:ite,kts:kte)
588 real :: dellau(its:ite,kts:kte),dellav(its:ite,kts:kte)
589 real :: delubar(its:ite),delvbar(its:ite)
590 real :: qlko_ktcon(its:ite)
592 real :: alpha,beta, &
593 dt2,dtmin,dtmax,dtmaxl,dtmaxs, &
594 el2orc,eps,fact1,fact2, &
596 real :: dz,dp,es,pprime,qs, &
597 dqsdp,desdt,dqsdt,gamma, &
598 dt,dq,po,thei,delza,dzfac, &
599 thec,theb,thekb,thekh,theavg,thedif, &
600 omgkb,omgkbp1,omgdif,omgfac,heom,rh,thermal,chi, &
601 factor,onemf,dz1,qrch,etah,qlk,qc,rfact,shear, &
602 e1,dh,deta,detad,theom,edtmax,dhh,dg,aup,adw, &
603 dv1,dv2,dv3,dv1q,dv2q,dv3q,dvq1, &
604 dv1u,dv2u,dv3u,dv1v,dv2v,dv3v, &
605 dellat,xdby,xqrch,xqc,xpw,xpwd, &
606 w1,w2,w3,w4,qrsk,evef,ptem,ptem1
608 logical :: totflg, cnvflg(its:ite),flg(its:ite)
610 ! climatological critical cloud work functions for closure
612 data pcrit/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
613 350.,300.,250.,200.,150./
614 data acritt/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
615 .3151,.3677,.41,.5255,.7663,1.1686,1.6851/
617 !-----------------------------------------------------------------------
619 ! define miscellaneous values
626 el2orc = hvap_*hvap_/(rv_*cp_)
628 fact1 = (cvap_-cliq_)/rv_
629 fact2 = hvap_/rv_-fact1*t0c_
633 dtmin = max(dt2,1200.)
634 dtmax = max(dt2,3600.)
662 acrit(k) = acritt(k) * (975. - pcrit(k))
665 ! Define top layer for search of the downdraft originating layer
666 ! and the maximum thetae for updraft
673 if(prsl(i,k).gt.prsi(i,1)*0.45) kbmax = k + 1
674 if(prsl(i,k).gt.prsi(i,1)*0.70) kbm = k + 1
675 if(prsl(i,k).gt.prsi(i,1)*0.04) kmax = k + 1
682 ! convert surface pressure to mb from cb
698 p(i,k) = prsl(i,k) * 10.
711 uo(i,k) = u1(i,k) * rcs
712 vo(i,k) = v1(i,k) * rcs
718 ! p is pressure of the layer (mb)
719 ! t is temperature at t-dt (k)..tn
720 ! q is mixing ratio at t-dt (kg/kg)..qn
721 ! to is temperature at t+dt (k)... this is after advection and turbulan
722 ! qo is mixing ratio at t+dt (kg/kg)..q1
726 qeso(i,k)=0.01*fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
727 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.) * qeso(i,k))
728 qeso(i,k) = max(qeso(i,k),qmin_)
729 qo(i,k) = max(qo(i,k), 1.e-10 )
730 tvo(i,k) = to(i,k) + fv_ * to(i,k) * max(qo(i,k),qmin_)
734 ! compute moist static energy
738 heo(i,k) = g_ * zl(i,k) + cp_* to(i,k) + hvap_ * qo(i,k)
739 heso(i,k) = g_ * zl(i,k) + cp_* to(i,k) + hvap_ * qeso(i,k)
743 ! Determine level with largest moist static energy
744 ! This is the level where updraft starts
753 if(heo(i,k).gt.hmax(i)) then
763 dz = .5 * (zl(i,k+1) - zl(i,k))
764 dp = .5 * (p(i,k+1) - p(i,k))
765 es = 0.01*fpvs(to(i,k+1),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
766 pprime = p(i,k+1) + (eps-1.) * es
767 qs = eps * es / pprime
768 dqsdp = - qs / pprime
769 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
770 dqsdt = qs * p(i,k+1) * desdt / (es * pprime)
771 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
772 dt = (g_ * dz + hvap_ * dqsdp * dp) / (cp_ * (1. + gamma))
773 dq = dqsdt * dt + dqsdp * dp
774 to(i,k) = to(i,k+1) + dt
775 qo(i,k) = qo(i,k+1) + dq
776 po = .5 * (p(i,k) + p(i,k+1))
777 qeso(i,k)=0.01*fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
778 qeso(i,k) = eps * qeso(i,k) / (po + (eps-1.) * qeso(i,k))
779 qeso(i,k) = max(qeso(i,k),qmin_)
780 qo(i,k) = max(qo(i,k), 1.e-10)
781 frh(i,k) = 1. - min(qo(i,k)/qeso(i,k), 1.)
782 heo(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
783 cp_ * to(i,k) + hvap_ * qo(i,k)
784 heso(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
785 cp_ * to(i,k) + hvap_ * qeso(i,k)
786 uo(i,k) = .5 * (uo(i,k) + uo(i,k+1))
787 vo(i,k) = .5 * (vo(i,k) + vo(i,k+1))
792 ! look for convective cloud base as the level of free convection
797 hkbo(i) = heo(i,indx)
809 if(flg(i).and.k.gt.kb(i)) then
811 if(hkbo(i).gt.hsbar(i)) then
819 if(kbcon(i).eq.kmax) cnvflg(i) = .false.
824 totflg = totflg .and. (.not. cnvflg(i))
831 ! determine critical convective inhibition
832 ! as a function of vertical velocity at cloud base.
834 pdot(i) = 10.* dot(i,kbcon(i))
835 if(slimsk(i).eq.1.) then
846 if(pdot(i).le.w4) then
847 tem = (pdot(i) - w4) / (w3 - w4)
848 elseif(pdot(i).ge.-w4) then
849 tem = - (pdot(i) + w4) / (w4 - w3)
856 tem1= .5*(cincrmax-cincrmin)
857 cincr = cincrmax - tem * tem1
858 pbcdif(i) = -p(i,kbcon(i)) + p(i,kb(i))
859 if(pbcdif(i).gt.cincr) cnvflg(i) = .false.
866 totflg = totflg .and. (.not. cnvflg(i))
872 xlamb(i,k) = clam / zi(i,k+1)
876 ! assume that updraft entrainment rate above cloud base is
877 ! same as that at cloud base
881 if(cnvflg(i).and.(k.gt.kbcon(i))) then
882 xlamb(i,k) = xlamb(i,kbcon(i))
887 ! assume the detrainment rate for the updrafts to be same as
888 ! the entrainment rate at cloud base
892 xlamud(i) = xlamb(i,kbcon(i))
896 ! functions rapidly decreasing with height, mimicking a cloud ensemble
897 ! (Bechtold et al., 2008)
901 if(cnvflg(i).and.(k.gt.kbcon(i))) then
902 tem = qeso(i,k)/qeso(i,kbcon(i))
909 ! final entrainment rate as the sum of turbulent part and organized entrainment
910 ! depending on the environmental relative humidity
911 ! (Bechtold et al., 2008)
915 if(cnvflg(i).and.(k.ge.kbcon(i))) then
916 tem = cxlamu * frh(i,k) * fent2(i,k)
917 xlamb(i,k) = xlamb(i,k)*fent1(i,k) + tem
922 ! determine updraft mass flux
934 if(cnvflg(i).and.k.lt.kbcon(i).and.k.ge.kb(i)) then
935 dz = zi(i,k+2) - zi(i,k+1)
936 ptem = 0.5*(xlamb(i,k)+xlamb(i,k+1))-xlamud(i)
937 eta(i,k) = eta(i,k+1) / (1. + ptem * dz)
943 if(cnvflg(i).and.k.gt.kbcon(i)) then
944 dz = zi(i,k+1) - zi(i,k)
945 ptem = 0.5*(xlamb(i,k)+xlamb(i,k-1))-xlamud(i)
946 eta(i,k) = eta(i,k-1) * (1 + ptem * dz)
952 dz = zi(i,3) - zi(i,2)
953 ptem = 0.5*(xlamb(i,1)+xlamb(i,2))-xlamud(i)
954 eta(i,1) = eta(i,2) / (1. + ptem * dz)
958 ! work up updraft cloud properties
963 hcko(i,indx) = hkbo(i)
964 qcko(i,indx) = qkbo(i)
965 ucko(i,indx) = uo(i,indx)
966 vcko(i,indx) = vo(i,indx)
971 ! cloud property below cloud base is modified by the entrainment proces
975 if(cnvflg(i).and.k.gt.kb(i)) then
976 dz = zi(i,k+1) - zi(i,k)
977 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
978 tem1 = 0.5 * xlamud(i) * dz
979 factor = 1. + tem - tem1
980 ptem = 0.5 * tem + pgcon
981 ptem1= 0.5 * tem - pgcon
982 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
983 (heo(i,k)+heo(i,k-1)))/factor
984 ucko(i,k) = ((1.-tem1)*ucko(i,k-1)+ptem*uo(i,k) &
985 +ptem1*uo(i,k-1))/factor
986 vcko(i,k) = ((1.-tem1)*vcko(i,k-1)+ptem*vo(i,k) &
987 +ptem1*vo(i,k-1))/factor
988 dbyo(i,k) = hcko(i,k) - heso(i,k)
993 ! taking account into convection inhibition due to existence of
994 ! dry layers below cloud base
1003 if(flg(i).and.k.ge.kbcon(i).and.dbyo(i,k).gt.0.) then
1012 if(kbcon1(i).eq.kmax) cnvflg(i) = .false.
1018 tem = p(i,kbcon(i)) - p(i,kbcon1(i))
1019 if(tem.gt.dthk) then
1027 totflg = totflg .and. (.not. cnvflg(i))
1032 ! determine cloud top
1044 if(dbyo(i,k).lt.0..and.flg(i).and.k.gt. kbcon1(i)) then
1055 if(cnvflg(i).and.(p(i,kbcon(i)) - p(i,ktcon(i))).lt.150.) &
1061 totflg = totflg .and. (.not. cnvflg(i))
1066 ! search for downdraft originating level above theta-e minimum
1070 hmin(i) = heo(i,kbcon1(i))
1078 if(cnvflg(i).and.k.gt.kbcon1(i).and.heo(i,k).lt.hmin(i)) then
1085 ! make sure that jmin is within the cloud
1089 jmin(i) = min(lmin(i),ktcon(i)-1)
1090 jmin(i) = max(jmin(i),kbcon1(i)+1)
1091 if(jmin(i).ge.ktcon(i)) cnvflg(i) = .false.
1095 ! specify upper limit of mass flux at cloud base
1100 dp = 1000. * del(i,k)
1101 xmbmax(i) = dp / (g_ * dt2)
1106 ! compute cloud moisture property and precipitation
1114 if(cnvflg(i).and.k.gt.kb(i).and.k.lt.ktcon(i)) then
1115 dz = .5 * (zl(i,k+1) - zl(i,k-1))
1116 dz1 = (zi(i,k+1) - zi(i,k))
1117 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1119 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
1120 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz1
1121 tem1 = 0.5 * xlamud(i) * dz1
1122 factor = 1. + tem - tem1
1123 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
1124 (qo(i,k)+qo(i,k-1)))/factor
1125 qcirs(i,k) = eta(i,k) * qcko(i,k) - eta(i,k) * qrch
1127 ! check if there is excess moisture to release latent heat
1129 if(qcirs(i,k).gt.0. .and. k.ge.kbcon(i)) then
1130 etah = .5 * (eta(i,k) + eta(i,k-1))
1131 if(ncloud.gt.0..and.k.gt.jmin(i)) then
1132 dp = 1000. * del(i,k)
1133 qlk = qcirs(i,k) / (eta(i,k) + etah * (c0 + c1) * dz1)
1134 dellal(i,k) = etah * c1 * dz1 * qlk * g_ / dp
1136 qlk = qcirs(i,k) / (eta(i,k) + etah * c0 * dz1)
1138 aa1(i) = aa1(i) - dz1 * g_ * qlk
1140 pwo(i,k) = etah * c0 * dz1 * qlk
1142 pwavo(i) = pwavo(i) + pwo(i,k)
1148 ! calculate cloud work function at t+dt
1152 if(cnvflg(i).and.k.ge.kbcon(i).and.k.lt.ktcon(i)) then
1153 dz1 = zl(i,k+1) - zl(i,k)
1154 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1155 rfact = 1. + fv_ * cp_ * gamma* to(i,k) / hvap_
1156 aa1(i) = aa1(i) +dz1 * (g_ / (cp_ * to(i,k))) &
1157 * dbyo(i,k) / (1. + gamma)* rfact
1158 aa1(i) = aa1(i)+dz1 * g_ * fv_ * &
1159 max(0.,(qeso(i,k) - qo(i,k)))
1165 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
1170 totflg = totflg .and. (.not. cnvflg(i))
1174 ! estimate the convective overshooting as the level
1175 ! where the [aafac * cloud work function] becomes zero,
1176 ! which is the final cloud top
1180 aa2(i) = aafac * aa1(i)
1192 if(k.ge.ktcon(i).and.k.lt.kmax) then
1193 dz1 = zl(i,k+1) - zl(i,k)
1194 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1195 rfact = 1. + fv_ * cp_ * gamma* to(i,k) / hvap_
1196 aa2(i) = aa2(i) +dz1 * (g_ / (cp_ * to(i,k))) &
1197 * dbyo(i,k) / (1. + gamma)* rfact
1198 if(aa2(i).lt.0.) then
1207 ! compute cloud moisture property, detraining cloud water
1208 ! and precipitation in overshooting layers
1213 if(k.ge.ktcon(i).and.k.lt.ktcon1(i)) then
1214 dz = (zi(i,k+1) - zi(i,k))
1215 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1216 qrch = qeso(i,k)+ gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
1217 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
1218 tem1 = 0.5 * xlamud(i) * dz
1219 factor = 1. + tem - tem1
1220 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
1221 (qo(i,k)+qo(i,k-1)))/factor
1222 qcirs(i,k) = eta(i,k) * qcko(i,k) - eta(i,k) * qrch
1224 ! check if there is excess moisture to release latent heat
1226 if(qcirs(i,k).gt.0.) then
1227 etah = .5 * (eta(i,k) + eta(i,k-1))
1228 if(ncloud.gt.0.) then
1229 dp = 1000. * del(i,k)
1230 qlk = qcirs(i,k) / (eta(i,k) + etah * (c0 + c1) * dz)
1231 dellal(i,k) = etah * c1 * dz * qlk * g_ / dp
1233 qlk = qcirs(i,k) / (eta(i,k) + etah * c0 * dz)
1236 pwo(i,k) = etah * c0 * dz * qlk
1238 pwavo(i) = pwavo(i) + pwo(i,k)
1245 ! exchange ktcon with ktcon1
1250 ktcon(i) = ktcon1(i)
1255 ! this section is ready for cloud water
1257 if (ncloud.gt.0) then
1259 ! compute liquid and vapor separation at cloud top
1264 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1266 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
1267 dq = qcko(i,k) - qrch
1269 ! check if there is excess moisture to release latent heat
1279 ! ..... downdraft calculations .....
1281 ! determine downdraft strength in terms of wind shear
1291 if(k.gt.kb(i).and.k.le.ktcon(i).and.cnvflg(i)) then
1292 shear= sqrt((uo(i,k)-uo(i,k-1)) ** 2 &
1293 + (vo(i,k)-vo(i,k-1)) ** 2)
1294 vshear(i) = vshear(i) + shear
1301 vshear(i) = 1.e3 * vshear(i) / (zi(i,ktcon(i)+1)-zi(i,kb(i)+1))
1302 e1 = 1.591-.639*vshear(i) &
1303 +.0953*(vshear(i)**2)-.00496*(vshear(i)**3)
1305 edt(i) = min(edt(i),.9)
1306 edt(i) = max(edt(i),.0)
1312 ! determine detrainment rate between 1 and kbdtr
1322 if(cnvflg(i).and.k.ge.1.and.k.lt.kbcon(i)) then
1323 dz = zi(i,k+2) - zi(i,k+1)
1324 sumx(i) = sumx(i) + dz
1332 if(slimsk(i).eq.1.) beta = betal
1335 kbdtr(i) = max(kbdtr(i),1)
1336 dz =(sumx(i)+zi(i,2))/float(kbcon(i))
1337 tem = 1./float(kbcon(i))
1338 xlamd(i) = (1.-beta**tem)/dz
1342 ! determine downdraft mass flux
1357 if(k.lt.jmin(i).and.k.ge.kbcon(i))then
1358 dz = (zi(i,k+2) - zi(i,k+1))
1359 ptem = xlamdd-xlamde
1360 etad(i,k) = etad(i,k+1) * (1.-ptem * dz)
1361 elseif(k.lt.kbcon(i))then
1362 dz = (zi(i,k+2) - zi(i,k+1))
1363 ptem = xlamd(i)+xlamdd-xlamde
1364 etad(i,k) = etad(i,k+1) * (1.-ptem * dz)
1371 ! downdraft moisture properties
1382 hcdo(i,jmn) = heo(i,jmn)
1383 qcdo(i,jmn) = qo(i,jmn)
1384 qrcdo(i,jmn) = qeso(i,jmn)
1385 ucdo(i,jmn) = uo(i,jmn)
1386 vcdo(i,jmn) = vo(i,jmn)
1392 if (cnvflg(i) .and. k.lt.jmin(i)) then
1393 dz = zi(i,k+2) - zi(i,k+1)
1394 if(k.ge.kbcon(i)) then
1396 tem1 = 0.5 * xlamdd * dz
1399 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1401 factor = 1. + tem - tem1
1402 ptem = 0.5 * tem - pgcon
1403 ptem1= 0.5 * tem + pgcon
1404 hcdo(i,k) = ((1.-tem1)*hcdo(i,k+1)+tem*0.5* &
1405 (heo(i,k)+heo(i,k+1)))/factor
1406 ucdo(i,k) = ((1.-tem1)*ucdo(i,k+1)+ptem*uo(i,k+1) &
1407 +ptem1*uo(i,k))/factor
1408 vcdo(i,k) = ((1.-tem1)*vcdo(i,k+1)+ptem*vo(i,k+1) &
1409 +ptem1*vo(i,k))/factor
1410 dbyo(i,k) = hcdo(i,k) - heso(i,k)
1417 if(cnvflg(i).and.k.lt.jmin(i)) then
1420 gamma = el2orc * dq / dt**2
1421 qrcdo(i,k)=dq+(1./hvap_)*(gamma/(1.+gamma))*dbyo(i,k)
1422 detad = etad(i,k+1) - etad(i,k)
1423 dz = zi(i,k+2) - zi(i,k+1)
1424 if(k.ge.kbcon(i)) then
1426 tem1 = 0.5 * xlamdd * dz
1429 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1431 factor = 1. + tem - tem1
1432 qcdo(i,k) = ((1.-tem1)*qcdo(i,k+1)+tem*0.5* &
1433 (qo(i,k)+qo(i,k+1)))/factor
1434 pwdo(i,k) = etad(i,k+1) * qcdo(i,k) -etad(i,k+1) * qrcdo(i,k)
1435 qcdo(i,k) = qrcdo(i,k)
1436 pwevo(i) = pwevo(i) + pwdo(i,k)
1441 ! final downdraft strength dependent on precip
1442 ! efficiency (edt), normalized condensate (pwav), and
1447 if(slimsk(i).eq.2.) edtmax = edtmaxs
1449 if(pwevo(i).lt.0.) then
1450 edto(i) = -edto(i) * pwavo(i) / pwevo(i)
1451 edto(i) = min(edto(i),edtmax)
1458 ! downdraft cloudwork functions
1462 if(cnvflg(i).and.k.lt.jmin(i)) then
1463 gamma = el2orc * qeso(i,k) / to(i,k)**2
1468 dz=-1.*(zl(i,k+1)-zl(i,k))
1469 aa1(i)=aa1(i)+edto(i)*dz*(g_/(cp_*dt))*((dhh-dh)/(1.+dg)) &
1470 *(1.+fv_*cp_*dg*dt/hvap_)
1471 aa1(i)=aa1(i)+edto(i)*dz*g_*fv_*max(0.,(qeso(i,k)-qo(i,k)))
1477 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
1482 totflg = totflg .and. (.not. cnvflg(i))
1486 ! what would the change be, that a cloud with unit mass
1487 ! will do to the environment?
1502 dp = 1000. * del(i,1)
1503 dellah(i,1) = edto(i) * etad(i,1) * (hcdo(i,1) &
1504 - heo(i,1)) * g_ / dp
1505 dellaq(i,1) = edto(i) * etad(i,1) * (qcdo(i,1) &
1506 - qo(i,1)) * g_ / dp
1507 dellau(i,1) = edto(i) * etad(i,1) * (ucdo(i,1) &
1508 - uo(i,1)) * g_ / dp
1509 dellav(i,1) = edto(i) * etad(i,1) * (vcdo(i,1) &
1510 - vo(i,1)) * g_ / dp
1514 ! changed due to subsidence and entrainment
1518 if(cnvflg(i).and.k.lt.ktcon(i)) then
1520 if(k.le.kb(i)) aup = 0.
1522 if(k.gt.jmin(i)) adw = 0.
1524 dv2 = .5 * (heo(i,k) + heo(i,k-1))
1527 dv2q = .5 * (qo(i,k) + qo(i,k-1))
1530 dv2u = .5 * (uo(i,k) + uo(i,k-1))
1533 dv2v = .5 * (vo(i,k) + vo(i,k-1))
1535 dp = 1000. * del(i,k)
1536 dz = zi(i,k+1) - zi(i,k)
1537 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1))
1539 if(k.le.kbcon(i)) then
1541 ptem1 = xlamd(i)+xlamdd
1546 deta = eta(i,k) - eta(i,k-1)
1547 detad = etad(i,k) - etad(i,k-1)
1548 dellah(i,k) = dellah(i,k) + &
1549 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1 &
1550 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3 &
1551 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2*dz &
1552 + aup*tem1*eta(i,k-1)*.5*(hcko(i,k)+hcko(i,k-1))*dz &
1553 + adw*edto(i)*ptem1*etad(i,k)*.5*(hcdo(i,k)+hcdo(i,k-1))*dz) *g_/dp
1554 dellaq(i,k) = dellaq(i,k) + &
1555 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1q &
1556 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3q &
1557 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2q*dz &
1558 + aup*tem1*eta(i,k-1)*.5*(qcko(i,k)+qcko(i,k-1))*dz &
1559 + adw*edto(i)*ptem1*etad(i,k)*.5*(qrcdo(i,k)+qrcdo(i,k-1))*dz) *g_/dp
1560 dellau(i,k) = dellau(i,k) + &
1561 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1u &
1562 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3u &
1563 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2u*dz &
1564 + aup*tem1*eta(i,k-1)*.5*(ucko(i,k)+ucko(i,k-1))*dz &
1565 + adw*edto(i)*ptem1*etad(i,k)*.5*(ucdo(i,k)+ucdo(i,k-1))*dz &
1566 - pgcon*(aup*eta(i,k-1)-adw*edto(i)*etad(i,k))*(dv1u-dv3u))*g_/dp
1568 dellav(i,k) = dellav(i,k) + &
1569 ((aup * eta(i,k) - adw * edto(i) * etad(i,k)) * dv1v &
1570 - (aup * eta(i,k-1) - adw * edto(i) * etad(i,k-1))* dv3v &
1571 - (aup*tem*eta(i,k-1)+adw*edto(i)*ptem*etad(i,k))*dv2v*dz &
1572 + aup*tem1*eta(i,k-1)*.5*(vcko(i,k)+vcko(i,k-1))*dz &
1573 + adw*edto(i)*ptem1*etad(i,k)*.5*(vcdo(i,k)+vcdo(i,k-1))*dz &
1574 - pgcon*(aup*eta(i,k-1)-adw*edto(i)*etad(i,k))*(dv1v-dv3v))*g_/dp
1584 dp = 1000. * del(i,indx)
1586 dellah(i,indx) = eta(i,indx-1) * &
1587 (hcko(i,indx-1) - dv1) * g_ / dp
1589 dellaq(i,indx) = eta(i,indx-1) * &
1590 (qcko(i,indx-1) - dvq1) * g_ / dp
1592 dellau(i,indx) = eta(i,indx-1) * &
1593 (ucko(i,indx-1) - dv1u) * g_ / dp
1595 dellav(i,indx) = eta(i,indx-1) * &
1596 (vcko(i,indx-1) - dv1v) * g_ / dp
1600 dellal(i,indx) = eta(i,indx-1) * qlko_ktcon(i) * g_ / dp
1604 ! final changed variable per unit mass flux
1608 if(cnvflg(i).and.k.gt.ktcon(i)) then
1612 if(cnvflg(i).and.k.le.ktcon(i)) then
1613 qo(i,k) = dellaq(i,k) * mbdt + q1(i,k)
1614 dellat = (dellah(i,k) - hvap_ * dellaq(i,k)) / cp_
1615 to(i,k) = dellat * mbdt + t1(i,k)
1616 qo(i,k) = max(qo(i,k),1.0e-10)
1621 !------------------------------------------------------------------------------
1623 ! the above changed environment is now used to calulate the
1624 ! effect the arbitrary cloud (with unit mass flux)
1625 ! which then is used to calculate the real mass flux,
1626 ! necessary to keep this change in balance with the large-scale
1629 ! environmental conditions again
1631 !------------------------------------------------------------------------------
1636 qeso(i,k)=0.01* fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1637 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.) * qeso(i,k))
1638 qeso(i,k) = max(qeso(i,k),qmin_)
1639 tvo(i,k) = to(i,k) + fv_ * to(i,k) * max(qo(i,k),qmin_)
1651 ! moist static energy
1656 dz = .5 * (zl(i,k+1) - zl(i,k))
1657 dp = .5 * (p(i,k+1) - p(i,k))
1658 es =0.01*fpvs(to(i,k+1),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1659 pprime = p(i,k+1) + (eps-1.) * es
1660 qs = eps * es / pprime
1661 dqsdp = - qs / pprime
1662 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
1663 dqsdt = qs * p(i,k+1) * desdt / (es * pprime)
1664 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
1665 dt = (g_ * dz + hvap_ * dqsdp * dp) / (cp_ * (1. + gamma))
1666 dq = dqsdt * dt + dqsdp * dp
1667 to(i,k) = to(i,k+1) + dt
1668 qo(i,k) = qo(i,k+1) + dq
1669 po = .5 * (p(i,k) + p(i,k+1))
1670 qeso(i,k) =0.01* fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1671 qeso(i,k) = eps * qeso(i,k) / (po + (eps-1.) * qeso(i,k))
1672 qeso(i,k) = max(qeso(i,k),qmin_)
1673 qo(i,k) = max(qo(i,k), 1.0e-10)
1674 heo(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
1675 cp_ * to(i,k) + hvap_ * qo(i,k)
1676 heso(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
1677 cp_ * to(i,k) + hvap_ * qeso(i,k)
1685 heo(i,k) = g_ * zl(i,k) + cp_ * to(i,k) + hvap_ * qo(i,k)
1686 heso(i,k) = g_ * zl(i,k) + cp_ * to(i,k) + hvap_ * qeso(i,k)
1695 xhkb(i) = heo(i,indx)
1696 xqkb(i) = qo(i,indx)
1697 hcko(i,indx) = xhkb(i)
1698 qcko(i,indx) = xqkb(i)
1702 ! ..... static control .....
1704 ! moisture and cloud work functions
1708 if(cnvflg(i).and.k.gt.kb(i).and.k.le.ktcon(i)) then
1709 dz = zi(i,k+1) - zi(i,k)
1710 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
1711 tem1 = 0.5 * xlamud(i) * dz
1712 factor = 1. + tem - tem1
1713 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
1714 (heo(i,k)+heo(i,k-1)))/factor
1721 if(cnvflg(i).and.k.gt.kb(i).and.k.lt.ktcon(i)) then
1722 dz = zi(i,k+1) - zi(i,k)
1723 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1724 xdby = hcko(i,k) - heso(i,k)
1726 + gamma * xdby / (hvap_ * (1. + gamma))
1727 tem = 0.5 * (xlamb(i,k)+xlamb(i,k-1)) * dz
1728 tem1 = 0.5 * xlamud(i) * dz
1729 factor = 1. + tem - tem1
1730 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5*(qo(i,k)+qo(i,k-1)))/factor
1731 dq = eta(i,k) * qcko(i,k) - eta(i,k) * xqrch
1732 if(k.ge.kbcon(i).and.dq.gt.0.) then
1733 etah = .5 * (eta(i,k) + eta(i,k-1))
1734 if(ncloud.gt.0..and.k.gt.jmin(i)) then
1735 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
1737 qlk = dq / (eta(i,k) + etah * c0 * dz)
1739 if(k.lt.ktcon1(i)) then
1740 xaa0(i) = xaa0(i) - dz * g_ * qlk
1742 qcko(i,k) = qlk + xqrch
1743 xpw = etah * c0 * dz * qlk
1744 xpwav(i) = xpwav(i) + xpw
1747 if(cnvflg(i).and.k.ge.kbcon(i).and.k.lt.ktcon1(i)) then
1748 dz1 = zl(i,k+1) - zl(i,k)
1749 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
1750 rfact = 1. + fv_ * cp_ * gamma &
1752 xdby = hcko(i,k) - heso(i,k)
1754 + dz1 * (g_ / (cp_ * to(i,k))) &
1755 * xdby / (1. + gamma) &
1759 max(0.,(qeso(i,k) - qo(i,k)))
1764 ! ..... downdraft calculations .....
1767 ! downdraft moisture properties
1775 xhcd(i,jmn) = heo(i,jmn)
1776 xqcd(i,jmn) = qo(i,jmn)
1777 qrcd(i,jmn) = qeso(i,jmn)
1781 do k = kmax1,kts, -1
1783 if(cnvflg(i).and.k.lt.jmin(i)) then
1784 dz = zi(i,k+2) - zi(i,k+1)
1785 if(k.ge.kbcon(i)) then
1787 tem1 = 0.5 * xlamdd * dz
1790 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1792 factor = 1. + tem - tem1
1793 xhcd(i,k) = ((1.-tem1)*xhcd(i,k+1)+tem*0.5* &
1794 (heo(i,k)+heo(i,k+1)))/factor
1799 do k = kmax1,kts, -1
1801 if(cnvflg(i).and.k.lt.jmin(i)) then
1804 gamma = el2orc * dq / dt**2
1805 dh = xhcd(i,k) - heso(i,k)
1806 qrcd(i,k)=dq+(1./hvap_)*(gamma/(1.+gamma))*dh
1807 dz = zi(i,k+2) - zi(i,k+1)
1808 if(k.ge.kbcon(i)) then
1810 tem1 = 0.5 * xlamdd * dz
1813 tem1 = 0.5 * (xlamd(i)+xlamdd) * dz
1815 factor = 1. + tem - tem1
1816 xqcd(i,k) = ((1.-tem1)*xqcd(i,k+1)+tem*0.5* &
1817 (qo(i,k)+qo(i,k+1)))/factor
1818 xpwd = etad(i,k+1) * (xqcd(i,k) - qrcd(i,k))
1819 xqcd(i,k)= qrcd(i,k)
1820 xpwev(i) = xpwev(i) + xpwd
1827 if(slimsk(i).eq.2.) edtmax = edtmaxs
1829 if(xpwev(i).ge.0.) then
1832 edtx(i) = -edtx(i) * xpwav(i) / xpwev(i)
1833 edtx(i) = min(edtx(i),edtmax)
1838 ! downdraft cloudwork functions
1840 do k = kmax1,kts, -1
1842 if(cnvflg(i).and.k.lt.jmin(i)) then
1843 gamma = el2orc * qeso(i,k) / to(i,k)**2
1848 dz=-1.*(zl(i,k+1)-zl(i,k))
1849 xaa0(i)=xaa0(i)+edtx(i)*dz*(g_/(cp_*dt))*((dhh-dh)/(1.+dg)) &
1850 *(1.+fv_*cp_*dg*dt/hvap_)
1851 xaa0(i)=xaa0(i)+edtx(i)* &
1852 dz*g_*fv_*max(0.,(qeso(i,k)-qo(i,k)))
1857 ! calculate critical cloud work function
1862 if(p(i,ktcon(i)).lt.pcrit(15))then
1863 acrt(i)=acrit(15)*(975.-p(i,ktcon(i)))/(975.-pcrit(15))
1864 else if(p(i,ktcon(i)).gt.pcrit(1))then
1867 k = int((850. - p(i,ktcon(i)))/50.) + 2
1870 acrt(i)=acrit(k)+(acrit(k-1)-acrit(k))* &
1871 (p(i,ktcon(i))-pcrit(k))/(pcrit(k-1)-pcrit(k))
1882 if(slimsk(i).eq.1.) then
1889 if(pdot(i).le.w4) then
1890 acrtfct(i) = (pdot(i) - w4) / (w3 - w4)
1891 elseif(pdot(i).ge.-w4) then
1892 acrtfct(i) = - (pdot(i) + w4) / (w4 - w3)
1896 acrtfct(i) = max(acrtfct(i),-1.)
1897 acrtfct(i) = min(acrtfct(i),1.)
1898 acrtfct(i) = 1. - acrtfct(i)
1899 dtconv(i) = dt2 + max((1800. - dt2),0.) * (pdot(i) - w2) / (w1 - w2)
1900 dtconv(i) = max(dtconv(i),dtmin)
1901 dtconv(i) = min(dtconv(i),dtmax)
1906 ! large scale forcing
1910 f(i) = (aa1(i) - acrt(i) * acrtfct(i)) / dtconv(i)
1911 if(f(i).le.0.) cnvflg(i) = .false.
1914 xk(i) = (xaa0(i) - aa1(i)) / mbdt
1915 if(xk(i).ge.0.) cnvflg(i) = .false.
1918 ! kernel, cloud base mass flux
1921 xmb(i) = -f(i) / xk(i)
1922 xmb(i) = min(xmb(i),xmbmax(i))
1931 totflg = totflg .and. (.not. cnvflg(i))
1935 ! restore t0 and qo to t1 and q1 in case convection stops
1944 qeso(i,k) = 0.01*fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1945 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.) * qeso(i,k))
1946 qeso(i,k) = max(qeso(i,k),qmin_)
1951 ! feedback: simply the changes from the cloud with unit mass flux
1952 ! multiplied by the mass flux necessary to keep the
1953 ! equilibrium with the larger-scale.
1967 if(cnvflg(i).and.k.le.ktcon(i)) then
1969 if(k.le.kb(i)) aup = 0.
1971 if(k.gt.jmin(i)) adw = 0.
1972 dellat = (dellah(i,k) - hvap_ * dellaq(i,k)) / cp_
1973 t1(i,k) = t1(i,k) + dellat * xmb(i) * dt2
1974 q1(i,k) = q1(i,k) + dellaq(i,k) * xmb(i) * dt2
1976 u1(i,k) = u1(i,k) + dellau(i,k) * xmb(i) * dt2 * tem
1977 v1(i,k) = v1(i,k) + dellav(i,k) * xmb(i) * dt2 * tem
1978 dp = 1000. * del(i,k)
1979 delhbar(i) = delhbar(i) + dellah(i,k)*xmb(i)*dp/g_
1980 delqbar(i) = delqbar(i) + dellaq(i,k)*xmb(i)*dp/g_
1981 deltbar(i) = deltbar(i) + dellat*xmb(i)*dp/g_
1982 delubar(i) = delubar(i) + dellau(i,k)*xmb(i)*dp/g_
1983 delvbar(i) = delvbar(i) + dellav(i,k)*xmb(i)*dp/g_
1995 if (cnvflg(i) .and. k.le.ktcon(i)) then
1996 qeso(i,k)=0.01* fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
1997 qeso(i,k) = eps * qeso(i,k)/(p(i,k) + (eps-1.)*qeso(i,k))
1998 qeso(i,k) = max(qeso(i,k), qmin_ )
2014 if(cnvflg(i).and.k.lt.ktcon(i)) then
2016 if(k.le.kb(i)) aup = 0.
2018 if(k.ge.jmin(i)) adw = 0.
2019 rntot(i) = rntot(i) &
2020 + (aup * pwo(i,k) + adw * edto(i) * pwdo(i,k)) &
2021 * xmb(i) * .001 * dt2
2026 ! conversion rainfall (m) and compute the evaporation of falling raindrops
2033 if(cnvflg(i).and.k.lt.ktcon(i)) then
2035 if(k.le.kb(i)) aup = 0.
2037 if(k.ge.jmin(i)) adw = 0.
2039 + (aup * pwo(i,k) + adw * edto(i) * pwdo(i,k)) &
2040 * xmb(i) * .001 * dt2
2042 if(flg(i).and.k.lt.ktcon(i)) then
2043 evef = edt(i) * evfacts
2044 if(slimsk(i).eq.1.) evef = edt(i) * evfactl
2045 qcond(i) = evef * (q1(i,k) - qeso(i,k)) / (1. + el2orc * &
2046 qeso(i,k) / t1(i,k)**2)
2047 dp = 1000. * del(i,k)
2048 if(rain(i).gt.0..and.qcond(i).lt.0.) then
2049 qevap(i) = -qcond(i) * (1. - exp(-.32 * sqrt(dt2 * rain(i))))
2050 qevap(i) = min(qevap(i), rain(i)*1000.*g_/dp)
2051 delq2(i) = delqev(i) + .001 * qevap(i) * dp / g_
2052 if (delq2(i).gt.rntot(i)) then
2053 qevap(i) = 1000.* g_ * (rntot(i) - delqev(i)) / dp
2057 if(rain(i).gt.0..and.qevap(i).gt.0.) then
2058 q1(i,k) = q1(i,k) + qevap(i)
2059 t1(i,k) = t1(i,k) - (hvap_/cp_) * qevap(i)
2060 rain(i) = rain(i) - .001 * qevap(i) * dp / g_
2061 delqev(i) = delqev(i) + .001*dp*qevap(i)/g_
2062 deltv(i) = - (hvap_/cp_)*qevap(i)/dt2
2063 delq(i) = + qevap(i)/dt2
2065 dellaq(i,k) = dellaq(i,k) + delq(i)/xmb(i)
2066 delqbar(i) = delqbar(i) + delq(i)*dp/g_
2067 deltbar(i) = deltbar(i) + deltv(i)*dp/g_
2073 ! consider the negative rain in the event of rain evaporation and downdrafts
2077 if(rain(i).lt.0..and..not.flg(i)) rain(i) = 0.
2078 if(rain(i).le.0.) then
2090 if(cnvflg(i).and.rain(i).le.0.) then
2099 ! detrainment of cloud water and ice
2101 if (ncloud.gt.0) then
2104 if (cnvflg(i) .and. rain(i).gt.0.) then
2105 if (k.ge.kbcon(i).and.k.le.ktcon(i)) then
2106 tem = dellal(i,k) * xmb(i) * dt2
2107 tem1 = max(0.0, min(1.0, (tcr-t1(i,k))*tcrf))
2108 if (ncloud.ge.2) then
2109 qi2(i,k) = qi2(i,k) + tem * tem1 ! ice
2110 qc2(i,k) = qc2(i,k) + tem *(1.0-tem1) ! water
2112 qc2(i,k) = qc2(i,k) + tem
2120 end subroutine nsas2d
2121 !===============================================================================
2122 REAL FUNCTION fpvs(t,ice,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c)
2123 !-------------------------------------------------------------------------------
2125 !-------------------------------------------------------------------------------
2126 REAL :: t,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c,dldt,xa,xb,dldti, &
2129 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2136 xbi=xai+hsub/(rv*ttp)
2138 if(t.lt.ttp.and.ice.eq.1) then
2139 fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
2141 fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
2146 if(t.lt.ttp.and.ice.eq.1) then
2147 fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
2149 fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
2155 if(t.lt.ttp.and.ice.eq.1) then
2156 fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
2158 fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
2162 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2164 !===============================================================================
2165 subroutine nsasinit(rthcuten,rqvcuten,rqccuten,rqicuten, &
2167 restart,p_qc,p_qi,p_first_scalar, &
2169 ids, ide, jds, jde, kds, kde, &
2170 ims, ime, jms, jme, kms, kme, &
2171 its, ite, jts, jte, kts, kte )
2172 !-------------------------------------------------------------------------------
2174 !-------------------------------------------------------------------------------
2175 logical , intent(in) :: allowed_to_read,restart
2176 integer , intent(in) :: ids, ide, jds, jde, kds, kde, &
2177 ims, ime, jms, jme, kms, kme, &
2178 its, ite, jts, jte, kts, kte
2179 integer , intent(in) :: p_first_scalar, p_qi, p_qc
2180 real, dimension( ims:ime , kms:kme , jms:jme ) , intent(out) :: &
2187 integer :: i, j, k, itf, jtf, ktf
2191 if(.not.restart)then
2202 if (p_qc .ge. p_first_scalar) then
2211 if (p_qi .ge. p_first_scalar) then
2221 end subroutine nsasinit
2223 !==============================================================================
2224 ! NCEP SCV (Shallow Convection Scheme)
2225 !==============================================================================
2226 subroutine nscv2d(delt,del,prsl,prsi,prslk,zl,zi, &
2227 ncloud,qc2,qi2,q1,t1,rain,kbot,ktop, &
2230 cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2, &
2234 ids,ide, jds,jde, kds,kde, &
2235 ims,ime, jms,jme, kms,kme, &
2236 its,ite, jts,jte, kts,kte)
2238 !-------------------------------------------------------------------------------
2240 ! subprogram: nscv2d computes shallow-convective heating and moisng
2242 ! abstract: computes non-precipitating convective heating and moistening
2243 ! using a one cloud type arakawa-schubert convection scheme as in the ncep
2244 ! sas scheme. the scheme has been operational at ncep gfs model since july 2010
2245 ! the scheme includes updraft and downdraft effects, but the cloud depth is
2246 ! limited less than 150 hpa.
2248 ! developed by jong-il han and hua-lu pan
2249 ! implemented into wrf by jiheon jang and songyou hong
2250 ! module with cpp-based options is available in grims
2252 ! program history log:
2253 ! 10-07-01 jong-il han initial operational implementation at ncep gfs
2254 ! 10-12-01 jihyeon jang implemented into wrf
2256 ! subprograms called:
2257 ! fpvs - function to compute saturation vapor pressure
2260 ! han and pan (2010, wea. forecasting)
2262 !-------------------------------------------------------------------------------
2264 !-------------------------------------------------------------------------------
2267 integer :: ids,ide, jds,jde, kds,kde, &
2268 ims,ime, jms,jme, kms,kme, &
2269 its,ite, jts,jte, kts,kte
2270 real :: cp_,cliq_,cvap_,g_,hvap_,rd_,rv_,fv_,ep2
2271 real :: pi_,qmin_,t0c_
2272 real :: cice,xlv0,xls,psat
2275 real :: del(its:ite,kts:kte), &
2276 prsl(its:ite,kts:kte),prslk(ims:ime,kms:kme), &
2277 prsi(its:ite,kts:kte+1),zl(its:ite,kts:kte)
2279 real :: slimsk(ims:ime)
2280 real :: dot(its:ite,kts:kte)
2281 real :: hpbl(ims:ime)
2283 real :: hfx(ims:ime),qfx(ims:ime)
2285 real :: qi2(its:ite,kts:kte),qc2(its:ite,kts:kte)
2286 real :: q1(its:ite,kts:kte), &
2287 t1(its:ite,kts:kte), &
2288 u1(its:ite,kts:kte), &
2290 integer :: kuo(its:ite)
2292 real :: rain(its:ite)
2293 integer :: kbot(its:ite),ktop(its:ite)
2296 ! local variables and arrays
2298 integer :: i,j,indx, jmn, k, kk, km1
2299 integer :: kpbl(its:ite)
2302 desdt, deta, detad, dg, &
2303 dh, dhh, dlnsig, dp, &
2304 dq, dqsdp, dqsdt, dt, &
2305 dt2, dtmax, dtmin, &
2310 dz, dz1, e1, clam, &
2313 evef, evfact, evfactl, &
2315 gamma, pprime, betaw, &
2317 rfact, shear, tem1, &
2319 val2, w1, w1l, w1s, &
2321 w3l, w3s, w4, w4l, &
2322 w4s, tem, ptem, ptem1
2324 integer :: kb(its:ite), kbcon(its:ite), kbcon1(its:ite), &
2325 ktcon(its:ite), ktcon1(its:ite), &
2326 kbm(its:ite), kmax(its:ite)
2328 real :: aa1(its:ite), &
2329 delhbar(its:ite), delq(its:ite), &
2330 delq2(its:ite), delqev(its:ite), rntot(its:ite), &
2331 delqbar(its:ite), deltbar(its:ite), &
2332 deltv(its:ite), edt(its:ite), &
2333 wstar(its:ite), sflx(its:ite), &
2334 pdot(its:ite), po(its:ite,kts:kte), &
2335 qcond(its:ite), qevap(its:ite), hmax(its:ite), &
2337 xlamud(its:ite), xmb(its:ite), xmbmax(its:ite)
2338 real :: delubar(its:ite), delvbar(its:ite)
2342 real :: thx(its:ite, kts:kte)
2343 real :: rhox(its:ite)
2346 real :: p(its:ite,kts:kte), to(its:ite,kts:kte), &
2347 qo(its:ite,kts:kte), qeso(its:ite,kts:kte), &
2348 uo(its:ite,kts:kte), vo(its:ite,kts:kte)
2352 real :: qlko_ktcon(its:ite), dellal(its:ite,kts:kte), &
2353 dbyo(its:ite,kts:kte), &
2354 xlamue(its:ite,kts:kte), &
2355 heo(its:ite,kts:kte), heso(its:ite,kts:kte), &
2356 dellah(its:ite,kts:kte), dellaq(its:ite,kts:kte), &
2357 dellau(its:ite,kts:kte), dellav(its:ite,kts:kte), &
2358 ucko(its:ite,kts:kte), vcko(its:ite,kts:kte), &
2359 hcko(its:ite,kts:kte), qcko(its:ite,kts:kte), &
2360 eta(its:ite,kts:kte), zi(its:ite,kts:kte+1), &
2361 pwo(its:ite,kts:kte)
2363 logical :: totflg, cnvflg(its:ite), flg(its:ite)
2365 ! physical parameters
2367 real,parameter :: c0=.002,c1=5.e-4
2368 real,parameter :: cincrmax=180.,cincrmin=120.,dthk=25.
2369 real :: el2orc,fact1,fact2,eps
2370 real,parameter :: h1=0.33333333
2371 real,parameter :: tf=233.16, tcr=263.16, tcrf=1.0/(tcr-tf)
2373 !-------------------------------------------------------------------------------
2381 ! compute surface buoyancy flux
2385 thx(i,k) = t1(i,k)/prslk(i,k)
2390 tvcon = (1.+fv_*q1(i,1))
2391 rhox(i) = prsl(i,1)*1.e3/(rd_*t1(i,1)*tvcon)
2395 ! sflx(i) = heat(i)+fv_*t1(i,1)*evap(i)
2396 sflx(i) = hfx(i)/rhox(i)/cp_ + qfx(i)/rhox(i)*fv_*thx(i,1)
2403 if(kuo(i).eq.1) cnvflg(i) = .false.
2404 if(sflx(i).le.0.) cnvflg(i) = .false.
2422 totflg = totflg .and. (.not. cnvflg(i))
2428 dtmin = max(dt2, val )
2430 dtmax = max(dt2, val )
2431 ! model tunable parameters are all here
2437 ! namelist parameter...
2438 ! pgcon = 0.55 ! Zhang & Wu (2003,JAS)
2441 ! define miscellaneous values
2443 el2orc = hvap_*hvap_/(rv_*cp_)
2445 fact1 = (cvap_-cliq_)/rv_
2446 fact2 = hvap_/rv_-fact1*t0c_
2457 ! define top layer for search of the downdraft originating layer
2458 ! and the maximum thetae for updraft
2467 if (prsl(i,k).gt.prsi(i,1)*0.70) kbm(i) = k + 1
2468 if (prsl(i,k).gt.prsi(i,1)*0.60) kmax(i) = k + 1
2472 kbm(i) = min(kbm(i),kmax(i))
2475 ! hydrostatic height assume zero terr and compute
2476 ! updraft entrainment rate as an inverse function of height
2480 xlamue(i,k) = clam / zi(i,k)
2484 xlamue(i,kte) = xlamue(i,km1)
2496 if (flg(i).and.zl(i,k).le.hpbl(i)) then
2505 kpbl(i)= min(kpbl(i),kbm(i))
2508 ! convert surface pressure to mb from cb
2513 if (cnvflg(i) .and. k .le. kmax(i)) then
2514 p(i,k) = prsl(i,k) * 10.0
2525 uo(i,k) = u1(i,k) * rcs
2526 vo(i,k) = v1(i,k) * rcs
2533 ! p is pressure of the layer (mb)
2534 ! t is temperature at t-dt (k)..tn
2535 ! q is mixing ratio at t-dt (kg/kg)..qn
2536 ! to is temperature at t+dt (k)... this is after advection and turbulan
2537 ! qo is mixing ratio at t+dt (kg/kg)..q1
2541 if (cnvflg(i) .and. k .le. kmax(i)) then
2542 qeso(i,k) = 0.01 * fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
2543 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.)*qeso(i,k))
2545 qeso(i,k) = max(qeso(i,k), val1)
2547 qo(i,k) = max(qo(i,k), val2 )
2552 ! compute moist static energy
2556 if (cnvflg(i) .and. k .le. kmax(i)) then
2557 tem = g_ * zl(i,k) + cp_ * to(i,k)
2558 heo(i,k) = tem + hvap_ * qo(i,k)
2559 heso(i,k) = tem + hvap_ * qeso(i,k)
2564 ! determine level with largest moist static energy within pbl
2565 ! this is the level where updraft starts
2576 if (cnvflg(i).and.k.le.kpbl(i)) then
2577 if(heo(i,k).gt.hmax(i)) then
2587 if (cnvflg(i) .and. k .le. kmax(i)-1) then
2588 dz = .5 * (zl(i,k+1) - zl(i,k))
2589 dp = .5 * (p(i,k+1) - p(i,k))
2590 es = 0.01*fpvs(to(i,k+1),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
2591 pprime = p(i,k+1) + (eps-1.) * es
2592 qs = eps * es / pprime
2593 dqsdp = - qs / pprime
2594 desdt = es * (fact1 / to(i,k+1) + fact2 / (to(i,k+1)**2))
2595 dqsdt = qs * p(i,k+1) * desdt / (es * pprime)
2596 gamma = el2orc * qeso(i,k+1) / (to(i,k+1)**2)
2597 dt = (g_ * dz + hvap_ * dqsdp * dp) / (cp_ * (1. + gamma))
2598 dq = dqsdt * dt + dqsdp * dp
2599 to(i,k) = to(i,k+1) + dt
2600 qo(i,k) = qo(i,k+1) + dq
2601 po(i,k) = .5 * (p(i,k) + p(i,k+1))
2608 if (cnvflg(i) .and. k .le. kmax(i)-1) then
2609 qeso(i,k)=0.01*fpvs(to(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
2610 qeso(i,k) = eps * qeso(i,k) / (po(i,k) + (eps-1.) * qeso(i,k))
2612 qeso(i,k) = max(qeso(i,k), val1)
2614 qo(i,k) = max(qo(i,k), val2 )
2615 heo(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
2616 cp_ * to(i,k) + hvap_ * qo(i,k)
2617 heso(i,k) = .5 * g_ * (zl(i,k) + zl(i,k+1)) + &
2618 cp_ * to(i,k) + hvap_ * qeso(i,k)
2619 uo(i,k) = .5 * (uo(i,k) + uo(i,k+1))
2620 vo(i,k) = .5 * (vo(i,k) + vo(i,k+1))
2625 ! look for the level of free convection as cloud base
2629 if(flg(i)) kbcon(i) = kmax(i)
2634 if (flg(i).and.k.lt.kbm(i)) then
2635 if(k.gt.kb(i).and.heo(i,kb(i)).gt.heso(i,k)) then
2645 if(kbcon(i).eq.kmax(i)) cnvflg(i) = .false.
2651 totflg = totflg .and. (.not. cnvflg(i))
2655 ! determine critical convective inhibition
2656 ! as a function of vertical velocity at cloud base.
2660 pdot(i) = 10.* dot(i,kbcon(i))
2666 if(slimsk(i).eq.1.) then
2677 if(pdot(i).le.w4) then
2678 ptem = (pdot(i) - w4) / (w3 - w4)
2679 elseif(pdot(i).ge.-w4) then
2680 ptem = - (pdot(i) + w4) / (w4 - w3)
2685 ptem = max(ptem,val1)
2687 ptem = min(ptem,val2)
2689 ptem1= .5*(cincrmax-cincrmin)
2690 cincr = cincrmax - ptem * ptem1
2691 tem1 = p(i,kb(i)) - p(i,kbcon(i))
2692 if(tem1.gt.cincr) then
2700 totflg = totflg .and. (.not. cnvflg(i))
2704 ! assume the detrainment rate for the updrafts to be same as
2705 ! the entrainment rate at cloud base
2709 xlamud(i) = xlamue(i,kbcon(i))
2713 ! determine updraft mass flux for the subcloud layers
2718 if(k.lt.kbcon(i).and.k.ge.kb(i)) then
2719 dz = zi(i,k+1) - zi(i,k)
2720 ptem = 0.5*(xlamue(i,k)+xlamue(i,k+1))-xlamud(i)
2721 eta(i,k) = eta(i,k+1) / (1. + ptem * dz)
2727 ! compute mass flux above cloud base
2732 if(k.gt.kbcon(i).and.k.lt.kmax(i)) then
2733 dz = zi(i,k) - zi(i,k-1)
2734 ptem = 0.5*(xlamue(i,k)+xlamue(i,k-1))-xlamud(i)
2735 eta(i,k) = eta(i,k-1) * (1 + ptem * dz)
2741 ! compute updraft cloud property
2746 hcko(i,indx) = heo(i,indx)
2747 ucko(i,indx) = uo(i,indx)
2748 vcko(i,indx) = vo(i,indx)
2755 if(k.gt.kb(i).and.k.lt.kmax(i)) then
2756 dz = zi(i,k) - zi(i,k-1)
2757 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
2758 tem1 = 0.5 * xlamud(i) * dz
2759 factor = 1. + tem - tem1
2760 ptem = 0.5 * tem + pgcon
2761 ptem1= 0.5 * tem - pgcon
2762 hcko(i,k) = ((1.-tem1)*hcko(i,k-1)+tem*0.5* &
2763 (heo(i,k)+heo(i,k-1)))/factor
2764 ucko(i,k) = ((1.-tem1)*ucko(i,k-1)+ptem*uo(i,k) &
2765 +ptem1*uo(i,k-1))/factor
2766 vcko(i,k) = ((1.-tem1)*vcko(i,k-1)+ptem*vo(i,k) &
2767 +ptem1*vo(i,k-1))/factor
2768 dbyo(i,k) = hcko(i,k) - heso(i,k)
2774 ! taking account into convection inhibition due to existence of
2775 ! dry layers below cloud base
2784 if (flg(i).and.k.lt.kbm(i)) then
2785 if(k.ge.kbcon(i).and.dbyo(i,k).gt.0.) then
2795 if(kbcon1(i).eq.kmax(i)) cnvflg(i) = .false.
2801 tem = p(i,kbcon(i)) - p(i,kbcon1(i))
2802 if(tem.gt.dthk) then
2810 totflg = totflg .and. (.not. cnvflg(i))
2814 ! determine first guess cloud top as the level of zero buoyancy
2815 ! limited to the level of sigma=0.7
2819 if(flg(i)) ktcon(i) = kbm(i)
2824 if (flg(i).and.k .lt. kbm(i)) then
2825 if(k.gt.kbcon1(i).and.dbyo(i,k).lt.0.) then
2833 ! specify upper limit of mass flux at cloud base
2838 dp = 1000. * del(i,k)
2839 xmbmax(i) = dp / (g_ * dt2)
2843 ! compute cloud moisture property and precipitation
2848 qcko(i,kb(i)) = qo(i,kb(i))
2855 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
2856 dz = zi(i,k) - zi(i,k-1)
2857 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2859 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
2860 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
2861 tem1 = 0.5 * xlamud(i) * dz
2862 factor = 1. + tem - tem1
2863 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
2864 (qo(i,k)+qo(i,k-1)))/factor
2865 dq = eta(i,k) * (qcko(i,k) - qrch)
2867 ! rhbar(i) = rhbar(i) + qo(i,k) / qeso(i,k)
2869 ! below lfc check if there is excess moisture to release latent heat
2871 if(k.ge.kbcon(i).and.dq.gt.0.) then
2872 etah = .5 * (eta(i,k) + eta(i,k-1))
2873 if(ncloud.gt.0) then
2874 dp = 1000. * del(i,k)
2875 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
2876 dellal(i,k) = etah * c1 * dz * qlk * g_ / dp
2878 qlk = dq / (eta(i,k) + etah * c0 * dz)
2880 aa1(i) = aa1(i) - dz * g_ * qlk
2881 qcko(i,k)= qlk + qrch
2882 pwo(i,k) = etah * c0 * dz * qlk
2889 ! calculate cloud work function
2894 if(k.ge.kbcon(i).and.k.lt.ktcon(i)) then
2895 dz1 = zl(i,k+1) - zl(i,k)
2896 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2897 rfact = 1. + fv_ * cp_ * gamma &
2899 aa1(i) = aa1(i) + dz1 * (g_ / (cp_ * to(i,k))) &
2900 * dbyo(i,k) / (1. + gamma) * rfact
2902 aa1(i)=aa1(i)+ dz1 * g_ * fv_ * &
2903 max(val,(qeso(i,k) - qo(i,k)))
2910 if(cnvflg(i).and.aa1(i).le.0.) cnvflg(i) = .false.
2915 totflg = totflg .and. (.not. cnvflg(i))
2919 ! estimate the convective overshooting as the level
2920 ! where the [aafac * cloud work function] becomes zero,
2921 ! which is the final cloud top limited to the level of sigma=0.7
2925 aa1(i) = aafac * aa1(i)
2937 if(k.ge.ktcon(i).and.k.lt.kbm(i)) then
2938 dz1 = zl(i,k+1) - zl(i,k)
2939 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2940 rfact = 1. + fv_ * cp_ * gamma &
2943 dz1 * (g_ / (cp_ * to(i,k))) &
2944 * dbyo(i,k) / (1. + gamma) * rfact
2945 if(aa1(i).lt.0.) then
2954 ! compute cloud moisture property, detraining cloud water
2955 ! and precipitation in overshooting layers
2960 if(k.ge.ktcon(i).and.k.lt.ktcon1(i)) then
2961 dz = zi(i,k) - zi(i,k-1)
2962 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
2964 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
2965 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1)) * dz
2966 tem1 = 0.5 * xlamud(i) * dz
2967 factor = 1. + tem - tem1
2968 qcko(i,k) = ((1.-tem1)*qcko(i,k-1)+tem*0.5* &
2969 (qo(i,k)+qo(i,k-1)))/factor
2970 dq = eta(i,k) * (qcko(i,k) - qrch)
2972 ! check if there is excess moisture to release latent heat
2975 etah = .5 * (eta(i,k) + eta(i,k-1))
2976 if(ncloud.gt.0) then
2977 dp = 1000. * del(i,k)
2978 qlk = dq / (eta(i,k) + etah * (c0 + c1) * dz)
2979 dellal(i,k) = etah * c1 * dz * qlk * g_ / dp
2981 qlk = dq / (eta(i,k) + etah * c0 * dz)
2983 qcko(i,k) = qlk + qrch
2984 pwo(i,k) = etah * c0 * dz * qlk
2991 ! exchange ktcon with ktcon1
2996 ktcon(i) = ktcon1(i)
3001 ! this section is ready for cloud water
3003 if(ncloud.gt.0) then
3005 ! compute liquid and vapor separation at cloud top
3010 gamma = el2orc * qeso(i,k) / (to(i,k)**2)
3012 + gamma * dbyo(i,k) / (hvap_ * (1. + gamma))
3013 dq = qcko(i,k) - qrch
3015 ! check if there is excess moisture to release latent heat
3026 !--- compute precipitation efficiency in terms of windshear
3037 if(k.gt.kb(i).and.k.le.ktcon(i)) then
3038 shear= sqrt((uo(i,k)-uo(i,k-1)) ** 2 &
3039 + (vo(i,k)-vo(i,k-1)) ** 2)
3040 vshear(i) = vshear(i) + shear
3048 vshear(i) = 1.e3 * vshear(i) / (zi(i,ktcon(i))-zi(i,kb(i)))
3049 e1=1.591-.639*vshear(i) &
3050 +.0953*(vshear(i)**2)-.00496*(vshear(i)**3)
3053 edt(i) = min(edt(i),val)
3055 edt(i) = max(edt(i),val)
3059 !--- what would the change be, that a cloud with unit mass
3060 !--- will do to the environment?
3064 if(cnvflg(i) .and. k .le. kmax(i)) then
3073 !--- changed due to subsidence and entrainment
3078 if(k.gt.kb(i).and.k.lt.ktcon(i)) then
3079 dp = 1000. * del(i,k)
3080 dz = zi(i,k) - zi(i,k-1)
3083 dv2h = .5 * (heo(i,k) + heo(i,k-1))
3086 dv2q = .5 * (qo(i,k) + qo(i,k-1))
3089 dv2u = .5 * (uo(i,k) + uo(i,k-1))
3092 dv2v = .5 * (vo(i,k) + vo(i,k-1))
3095 tem = 0.5 * (xlamue(i,k)+xlamue(i,k-1))
3098 dellah(i,k) = dellah(i,k) + &
3099 ( eta(i,k)*dv1h - eta(i,k-1)*dv3h &
3100 - tem*eta(i,k-1)*dv2h*dz &
3101 + tem1*eta(i,k-1)*.5*(hcko(i,k)+hcko(i,k-1))*dz &
3104 dellaq(i,k) = dellaq(i,k) + &
3105 ( eta(i,k)*dv1q - eta(i,k-1)*dv3q &
3106 - tem*eta(i,k-1)*dv2q*dz &
3107 + tem1*eta(i,k-1)*.5*(qcko(i,k)+qcko(i,k-1))*dz &
3110 dellau(i,k) = dellau(i,k) + &
3111 ( eta(i,k)*dv1u - eta(i,k-1)*dv3u &
3112 - tem*eta(i,k-1)*dv2u*dz &
3113 + tem1*eta(i,k-1)*.5*(ucko(i,k)+ucko(i,k-1))*dz &
3114 - pgcon*eta(i,k-1)*(dv1u-dv3u) &
3117 dellav(i,k) = dellav(i,k) + &
3118 ( eta(i,k)*dv1v - eta(i,k-1)*dv3v &
3119 - tem*eta(i,k-1)*dv2v*dz &
3120 + tem1*eta(i,k-1)*.5*(vcko(i,k)+vcko(i,k-1))*dz &
3121 - pgcon*eta(i,k-1)*(dv1v-dv3v) &
3134 dp = 1000. * del(i,indx)
3135 dv1h = heo(i,indx-1)
3136 dellah(i,indx) = eta(i,indx-1) * &
3137 (hcko(i,indx-1) - dv1h) * g_ / dp
3139 dellaq(i,indx) = eta(i,indx-1) * &
3140 (qcko(i,indx-1) - dv1q) * g_ / dp
3142 dellau(i,indx) = eta(i,indx-1) * &
3143 (ucko(i,indx-1) - dv1u) * g_ / dp
3145 dellav(i,indx) = eta(i,indx-1) * &
3146 (vcko(i,indx-1) - dv1v) * g_ / dp
3150 dellal(i,indx) = eta(i,indx-1) * &
3151 qlko_ktcon(i) * g_ / dp
3155 ! mass flux at cloud base for shallow convection
3161 ptem = g_*sflx(i)*hpbl(i)/t1(i,1)
3163 tem = po(i,k)*100. / (rd_*t1(i,k))
3164 xmb(i) = betaw*tem*wstar(i)
3165 xmb(i) = min(xmb(i),xmbmax(i))
3171 if (cnvflg(i) .and. k .le. kmax(i)) then
3172 qeso(i,k)=0.01* fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls,psat,t0c_)
3173 qeso(i,k) = eps * qeso(i,k) / (p(i,k) + (eps-1.)*qeso(i,k))
3175 qeso(i,k) = max(qeso(i,k), val )
3192 if(k.gt.kb(i).and.k.le.ktcon(i)) then
3193 dellat = (dellah(i,k) - hvap_ * dellaq(i,k)) / cp_
3194 t1(i,k) = t1(i,k) + dellat * xmb(i) * dt2
3195 q1(i,k) = q1(i,k) + dellaq(i,k) * xmb(i) * dt2
3197 u1(i,k) = u1(i,k) + dellau(i,k) * xmb(i) * dt2 * tem
3198 v1(i,k) = v1(i,k) + dellav(i,k) * xmb(i) * dt2 * tem
3199 dp = 1000. * del(i,k)
3200 delhbar(i) = delhbar(i) + dellah(i,k)*xmb(i)*dp/g_
3201 delqbar(i) = delqbar(i) + dellaq(i,k)*xmb(i)*dp/g_
3202 deltbar(i) = deltbar(i) + dellat*xmb(i)*dp/g_
3203 delubar(i) = delubar(i) + dellau(i,k)*xmb(i)*dp/g_
3204 delvbar(i) = delvbar(i) + dellav(i,k)*xmb(i)*dp/g_
3213 if(k.gt.kb(i).and.k.le.ktcon(i)) then
3214 qeso(i,k)=0.01* fpvs(t1(i,k),1,rd_,rv_,cvap_,cliq_,cice,xlv0,xls &
3216 qeso(i,k) = eps * qeso(i,k)/(p(i,k) + (eps-1.)*qeso(i,k))
3218 qeso(i,k) = max(qeso(i,k), val )
3234 if(k.lt.ktcon(i).and.k.gt.kb(i)) then
3235 rntot(i) = rntot(i) + pwo(i,k) * xmb(i) * .001 * dt2
3245 if (k .le. kmax(i)) then
3250 if(k.lt.ktcon(i).and.k.gt.kb(i)) then
3251 rain(i) = rain(i) + pwo(i,k) * xmb(i) * .001 * dt2
3254 if(flg(i).and.k.lt.ktcon(i)) then
3255 evef = edt(i) * evfact
3256 if(slimsk(i).eq.1.) evef=edt(i) * evfactl
3257 qcond(i) = evef * (q1(i,k) - qeso(i,k)) &
3258 / (1. + el2orc * qeso(i,k) / t1(i,k)**2)
3259 dp = 1000. * del(i,k)
3260 if(rain(i).gt.0..and.qcond(i).lt.0.) then
3261 qevap(i) = -qcond(i) * (1.-exp(-.32*sqrt(dt2*rain(i))))
3262 qevap(i) = min(qevap(i), rain(i)*1000.*g_/dp)
3263 delq2(i) = delqev(i) + .001 * qevap(i) * dp / g_
3265 if(rain(i).gt.0..and.qcond(i).lt.0..and. &
3266 delq2(i).gt.rntot(i)) then
3267 qevap(i) = 1000.* g_ * (rntot(i) - delqev(i)) / dp
3270 if(rain(i).gt.0..and.qevap(i).gt.0.) then
3271 tem = .001 * dp / g_
3272 tem1 = qevap(i) * tem
3273 if(tem1.gt.rain(i)) then
3274 qevap(i) = rain(i) / tem
3277 rain(i) = rain(i) - tem1
3279 q1(i,k) = q1(i,k) + qevap(i)
3280 t1(i,k) = t1(i,k) - (hvap_/cp_) * qevap(i)
3281 deltv(i) = - (hvap_/cp_)*qevap(i)/dt2
3282 delq(i) = + qevap(i)/dt2
3283 delqev(i) = delqev(i) + .001*dp*qevap(i)/g_
3285 dellaq(i,k) = dellaq(i,k) + delq(i) / xmb(i)
3286 delqbar(i) = delqbar(i) + delq(i)*dp/g_
3287 deltbar(i) = deltbar(i) + deltv(i)*dp/g_
3295 if(rain(i).lt.0..or..not.flg(i)) rain(i) = 0.
3304 if (ncloud.gt.0) then
3309 if (k.ge.kbcon(i).and.k.le.ktcon(i)) then
3310 tem = dellal(i,k) * xmb(i) * dt2
3311 tem1 = max(0.0, min(1.0, (tcr-t1(i,k))*tcrf))
3312 if (ncloud.ge.4) then
3313 qi2(i,k) = qi2(i,k) + tem * tem1 ! ice
3314 qc2(i,k) = qc2(i,k) + tem *(1.0-tem1) ! water
3316 qc2(i,k) = qc2(i,k) + tem
3325 end subroutine nscv2d
3326 !-------------------------------------------------------------------------------
3328 END MODULE module_cu_nsas