Skip to content

Commit 7639166

Browse files
authored
Add scale-aware to the new Tiedtke cu scheme as an option (wrf-model#1806)
Add scale-aware to the new Tiedtke scheme as an option TYPE: new feature KEYWORDS: new Tiedtke cu scheme, scale aware option SOURCE: internal DESCRIPTION OF CHANGES: A scale-aware or grid-distance-dependent option is added to the new Tiedtke scheme. The code is based on the paper by Wang (2022), and can be turned on by using namelist option ntiedtke_dx_opt = 1. The option becomes active when grid sizes is less than 15 km. Wang, W., 2022: Forecasting Convection with a “Scale-Aware” Tiedtke Cumulus Parameterization Scheme at Kilometer Scales. _Wea. Forecasting_, 37/8, 1491 - 1507, 10.1175/WAF-D-21-0179.1. LIST OF MODIFIED FILES: M Registry/Registry.EM_COMMON M dyn_em/module_first_rk_step_part1.F M phys/module_cu_ntiedtke.F M phys/module_cumulus_driver.F M run/README.namelist TESTS CONDUCTED: 1. Do mods fix problem? How can that be demonstrated, and was that test conducted? 2. The Jenkins tests have passed. RELEASE NOTE: A scale-aware or grid-distance-dependent option is added to the new Tiedtke scheme. The code is based on the paper by Wang (2022), and can be turned on by using namelist option ntiedtke_dx_opt = 1. The option becomes active when grid sizes is less than 15 km.
1 parent 2a29582 commit 7639166

5 files changed

+85
-10
lines changed

Registry/Registry.EM_COMMON

+1
Original file line numberDiff line numberDiff line change
@@ -2449,6 +2449,7 @@ rconfig integer cu_diag namelist,physics max_domains 0
24492449
rconfig integer kf_edrates namelist,physics max_domains 0 rh "kf_edrates" "output entrainment/detrainment rates and convective timescale for KF schemes" ""
24502450
rconfig integer kfeta_trigger namelist,physics 1 1 rh "KFETA Trigger function" "" ""
24512451
rconfig integer nsas_dx_factor namelist,physics 1 0 rh "NSAS DX-dependent option" "" ""
2452+
rconfig integer ntiedtke_dx_opt namelist,physics 1 0 rh "nTiedtke DX-dependent option" "" ""
24522453
rconfig real CUDT namelist,physics max_domains 0 h "CUDT" "" ""
24532454
rconfig real GSMDT namelist,physics max_domains 0 h "GSMDT" "" ""
24542455
rconfig integer ISFFLX namelist,physics 1 1 irh "ISFFLX" "" ""

dyn_em/module_first_rk_step_part1.F

+1
Original file line numberDiff line numberDiff line change
@@ -1474,6 +1474,7 @@ SUBROUTINE first_rk_step_part1 ( grid , config_flags &
14741474
!BSINGH -ENDS
14751475
& ,KFETA_TRIGGER=config_flags%kfeta_trigger &
14761476
& ,NSAS_DX_FACTOR=config_flags%nsas_dx_factor &
1477+
& ,NTIEDTKE_DX_OPT=config_flags%ntiedtke_dx_opt &
14771478
! Dimension arguments
14781479
& ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
14791480
& ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &

phys/module_cu_ntiedtke.F

+76-10
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ subroutine cu_ntiedtke( &
150150
,u3d,v3d,w,t3d,qv3d,qc3d,qi3d,pi3d,rho3d &
151151
,qvften,thften &
152152
,dz8w,pcps,p8w,xland,cu_act_flag,dx &
153+
,ntiedtke_dx_opt &
153154
,ids,ide, jds,jde, kds,kde &
154155
,ims,ime, jms,jme, kms,kme &
155156
,its,ite, jts,jte, kts,kte &
@@ -191,6 +192,7 @@ subroutine cu_ntiedtke( &
191192
!-- dz8w dz between full levels (m)
192193
!-- qfx upward moisture flux at the surface (kg/m^2/s)
193194
!-- hfx upward heat flux at the surface (w/m^2)
195+
!-- ntiedtke_dx_opt whether the schemem is scale-aware
194196
!-- dt time step (s)
195197
!-- ids start index for i in domain
196198
!-- ide end index for i in domain
@@ -217,6 +219,8 @@ subroutine cu_ntiedtke( &
217219
itimestep, &
218220
stepcu
219221

222+
integer, intent(in) :: ntiedtke_dx_opt
223+
220224
real, intent(in) :: &
221225
dt
222226
real, dimension(ims:ime, jms:jme), intent(in) :: &
@@ -426,7 +430,7 @@ subroutine cu_ntiedtke( &
426430
!
427431
!########################################################################
428432
call tiecnvn(u1,v1,t1,q1,q2,q3,q1b,t1b,ghtl,ghti,omg,prsl,prsi,evap,heatflux, &
429-
rn,slimsk,im,kx,kx1,delt,dx2d)
433+
rn,slimsk,im,kx,kx1,delt,dx2d,ntiedtke_dx_opt)
430434

431435
do i=its,ite
432436
raincv(i,j)=rn(i)/stepcu
@@ -555,7 +559,7 @@ end subroutine ntiedtkeinit
555559
! level 1 subroutine 'tiecnvn'
556560
!-----------------------------------------------------------------
557561
subroutine tiecnvn(pu,pv,pt,pqv,pqc,pqi,pqvf,ptf,poz,pzz,pomg, &
558-
& pap,paph,evap,hfx,zprecc,lndj,lq,km,km1,dt,dx)
562+
& pap,paph,evap,hfx,zprecc,lndj,lq,km,km1,dt,dx,ntiedtke_dx_opt)
559563
!-----------------------------------------------------------------
560564
! this is the interface between the model and the mass
561565
! flux convection module
@@ -577,6 +581,7 @@ subroutine tiecnvn(pu,pv,pt,pqv,pqc,pqi,pqvf,ptf,poz,pzz,pomg, &
577581
& zqsat(lq,km), pqc(lq,km), pqi(lq,km), zrain(lq)
578582
real pqvf(lq,km), ptf(lq,km)
579583
real dx(lq)
584+
integer ntiedtke_dx_opt
580585

581586
integer icbot(lq), ictop(lq), ktype(lq), lndj(lq)
582587
logical locum(lq)
@@ -585,6 +590,18 @@ subroutine tiecnvn(pu,pv,pt,pqv,pqc,pqi,pqvf,ptf,poz,pzz,pomg, &
585590
integer i,j,k,lq,km,km1
586591
real dt,ztpp1
587592
real zew,zqs,zcor
593+
real scale_fac(lq), dxref
594+
!
595+
! set scale-dependency factor when dx is < 15 km
596+
!
597+
dxref = 15000.
598+
do j=1,lq
599+
if (dx(j).lt.dxref .and. ntiedtke_dx_opt.eq.1) then
600+
scale_fac(j) = (1.+log(dxref/dx(j)))**3
601+
else
602+
scale_fac(j) = 1.+1.33e-5*dx(j)
603+
end if
604+
end do
588605
!
589606
ztmst=dt
590607
!
@@ -638,7 +655,8 @@ subroutine tiecnvn(pu,pv,pt,pqv,pqc,pqi,pqvf,ptf,poz,pzz,pomg, &
638655
& pssfc, locum, &
639656
& ktype, icbot, ictop, ztu, zqu, &
640657
& zlu, zlude, zmfu, zmfd, zrain,&
641-
& pcte, phhfl, lndj, pgeoh, dx)
658+
& pcte, phhfl, lndj, pgeoh, dx, &
659+
& scale_fac, ntiedtke_dx_opt )
642660
!
643661
! to include the cloud water and cloud ice detrained from convection
644662
!
@@ -693,7 +711,8 @@ subroutine cumastrn &
693711
& pssfc, ldcum, &
694712
& ktype, kcbot, kctop, ptu, pqu,&
695713
& plu, plude, pmfu, pmfd, prain,&
696-
& pcte, phhfl, lndj, zgeoh, dx)
714+
& pcte, phhfl, lndj, zgeoh, dx, &
715+
& scale_fac, ntiedtke_dx_opt )
697716
implicit none
698717
!
699718
!***cumastrn* master routine for cumulus massflux-scheme
@@ -801,6 +820,8 @@ subroutine cumastrn &
801820
& ktype(klon), lndj(klon)
802821
logical ldcum(klon)
803822
logical loddraf(klon), llo1, llo2(klon)
823+
real scale_fac(klon)
824+
integer ntiedtke_dx_opt
804825

805826
! local varaiables
806827
real zcons,zcons2,zqumqe,zdqmin,zdh,zmfmax
@@ -901,7 +922,8 @@ subroutine cumastrn &
901922
& zuu, zvu, pmfu, zmfub,&
902923
& zmfus, zmfuq, zmful, plude, zdmfup,&
903924
& kcbot, kctop, ictop0, icum, ztmst,&
904-
& zqsenh, zlglac, lndj, wup, wbase, kdpl, pmfude_rate )
925+
& zqsenh, zlglac, lndj, wup, wbase, kdpl, pmfude_rate,&
926+
& scale_fac, ntiedtke_dx_opt )
905927

906928
!* (b) check cloud depth and change entrainment rate accordingly
907929
! calculate precipitation rate (for downdraft calculation)
@@ -1017,10 +1039,14 @@ subroutine cumastrn &
10171039
if(ldcum(jl).and.ktype(jl).eq.1) then
10181040
ikb = kcbot(jl)
10191041
ikt = kctop(jl)
1020-
ztau = ztauc(jl) * (1.+1.33e-5*dx(jl))
1042+
ztau = ztauc(jl) * scale_fac(jl)
10211043
ztau = max(ztmst,ztau)
10221044
ztau = max(360.,ztau)
1023-
ztau = min(10800.,ztau)
1045+
if(ntiedtke_dx_opt.eq.1) then
1046+
ztau = min(43200.,ztau)
1047+
else
1048+
ztau = min(10800.,ztau)
1049+
end if
10241050
if(nonequil) then
10251051
zcape2(jl)= max(0.,zcape2(jl))
10261052
zcape(jl) = max(0.,min(zcape1(jl)-zcape2(jl),5000.))
@@ -1060,6 +1086,9 @@ subroutine cumastrn &
10601086
zmfub1(jl) = zmfub(jl)
10611087
end if
10621088
zmfub1(jl) = min(zmfub1(jl),zmfmax)
1089+
if(ntiedtke_dx_opt.eq.1) then
1090+
zmfub1(jl) = zmfub1(jl)/(scale_fac(jl))**(.5)
1091+
end if
10631092
end if
10641093

10651094
!* 6.3 mid-level convection - nothing special
@@ -2102,7 +2131,8 @@ subroutine cuascn &
21022131
& puu, pvu, pmfu, pmfub, &
21032132
& pmfus, pmfuq, pmful, plude, pdmfup,&
21042133
& kcbot, kctop, kctop0, kcum, ztmst,&
2105-
& pqsenh, plglac, lndj, wup, wbase, kdpl, pmfude_rate)
2134+
& pqsenh, plglac, lndj, wup, wbase, kdpl, pmfude_rate,&
2135+
& scale_fac, ntiedtke_dx_opt )
21062136
implicit none
21072137
! this routine does the calculations for cloud ascents
21082138
! for cumulus parameterization
@@ -2223,12 +2253,18 @@ subroutine cuascn &
22232253
real zrnew,zz,zdmfeu,zdmfdu,dp
22242254
real zfac,zbuoc,zdkbuo,zdken,zvv,zarg,zchange,zxe,zxs,zdshrd
22252255
real atop1,atop2,abot
2256+
real scale_fac(klon)
2257+
integer ntiedtke_dx_opt
22262258
!--------------------------------
22272259
!* 1. specify parameters
22282260
!--------------------------------
22292261
zcons2=3./(g*ztmst)
22302262
zfacbuo = 0.5/(1.+0.5)
2263+
if(ntiedtke_dx_opt.eq.1) then
2264+
zprcdgw = cprcon*zrg/(scale_fac(jl)**(1./3.))
2265+
else
22312266
zprcdgw = cprcon*zrg
2267+
end if
22322268
z_cldmax = 5.e-3
22332269
z_cwifrac = 0.5
22342270
z_cprc2 = 0.5
@@ -2307,7 +2343,7 @@ subroutine cuascn &
23072343
& pgeo, pgeoh, ldcum, ktype, klab, zlrain,&
23082344
& pmfu, pmfub, kcbot, ptu,&
23092345
& pqu, plu, puu, pvu, pmfus,&
2310-
& pmfuq, pmful, pdmfup)
2346+
& pmfuq, pmful, pdmfup, ntiedtke_dx_opt )
23112347
is = 0
23122348
jlm = 0
23132349
do jl = 1,klon
@@ -3709,7 +3745,7 @@ subroutine cubasmcn &
37093745
& pgeo, pgeoh, ldcum, ktype, klab, plrain,&
37103746
& pmfu, pmfub, kcbot, ptu,&
37113747
& pqu, plu, puu, pvu, pmfus,&
3712-
& pmfuq, pmful, pdmfup)
3748+
& pmfuq, pmful, pdmfup, ntiedtke_dx_opt )
37133749
implicit none
37143750
! m.tiedtke e.c.m.w.f. 12/89
37153751
! c.zhang iprc 05/2012
@@ -3746,9 +3782,38 @@ subroutine cubasmcn &
37463782
! local variabels
37473783
integer jl,kk,klev,klon,klevp1,klevm1
37483784
real zzzmb
3785+
integer ntiedtke_dx_opt
37493786
!--------------------------------------------------------
37503787
!* 1. calculate entrainment and detrainment rates
37513788
! -------------------------------------------------------
3789+
if(ntiedtke_dx_opt.eq.1) then
3790+
do jl=1,klon
3791+
if(.not.ldcum(jl) .and. klab(jl,kk+1).eq.0) then
3792+
if(lmfmid .and. pqen(jl,kk) .gt. 0.80*pqsen(jl,kk).and. &
3793+
! ww (no mid level conv, if the air is saturated)
3794+
pqen(jl,kk) .le. pqsen(jl,kk).and. &
3795+
pgeo(jl,kk)*zrg .gt. 5.0e2 .and. &
3796+
& pgeo(jl,kk)*zrg .lt. 1.0e4 ) then
3797+
ptu(jl,kk+1)=(cpd*pten(jl,kk)+pgeo(jl,kk)-pgeoh(jl,kk+1))&
3798+
& *rcpd
3799+
pqu(jl,kk+1)=pqen(jl,kk)
3800+
plu(jl,kk+1)=0.
3801+
zzzmb=max(cmfcmin,-pverv(jl,kk)*zrg)
3802+
zzzmb=min(zzzmb,cmfcmax)
3803+
pmfub(jl)=zzzmb
3804+
pmfu(jl,kk+1)=pmfub(jl)
3805+
pmfus(jl,kk+1)=pmfub(jl)*(cpd*ptu(jl,kk+1)+pgeoh(jl,kk+1))
3806+
pmfuq(jl,kk+1)=pmfub(jl)*pqu(jl,kk+1)
3807+
pmful(jl,kk+1)=0.
3808+
pdmfup(jl,kk+1)=0.
3809+
kcbot(jl)=kk
3810+
klab(jl,kk+1)=1
3811+
plrain(jl,kk+1)=0.0
3812+
ktype(jl)=3
3813+
end if
3814+
end if
3815+
end do
3816+
else
37523817
do jl=1,klon
37533818
if(.not.ldcum(jl) .and. klab(jl,kk+1).eq.0) then
37543819
if(lmfmid .and. pqen(jl,kk) .gt. 0.80*pqsen(jl,kk).and. &
@@ -3773,6 +3838,7 @@ subroutine cubasmcn &
37733838
end if
37743839
end if
37753840
end do
3841+
end if
37763842
return
37773843
end subroutine cubasmcn
37783844
!---------------------------------------------------------

phys/module_cumulus_driver.F

+4
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ SUBROUTINE cumulus_driver(grid &
125125
! Optional trigger function activation variable
126126
,kfeta_trigger &
127127
,nsas_dx_factor &
128+
,ntiedtke_dx_opt &
128129
#if ( WRF_DFI_RADAR == 1 )
129130
! Optional CAP suppress option --- 3.2 CLEANUP TODO -- THESE SHOULD BE OPTIONAL, NOT #IF/#ENDIF
130131
,do_capsuppress &
@@ -324,6 +325,7 @@ SUBROUTINE cumulus_driver(grid &
324325
!-- W0AVG average vertical velocity, (for KF scheme) (m/s)
325326
!-- kfeta_trigger namelist for KF trigger (=1, default; =2, moisture-advection-dependent trigger)
326327
!-- nsas_dx_factor namelist for NSAS deep scheme to have some dependency on grid sizes
328+
!-- ntiedtke_dx_opt namelist for nTiedtke cu scheme to have some dependency on grid sizes
327329
!-- rho density (kg/m^3)
328330
!-- CONVCLD Convective cloud (for BMJ scheme) (kg/m^2)
329331
!-- CCLDFRA convective cloud fraction (for BMJ scheme)
@@ -525,6 +527,7 @@ SUBROUTINE cumulus_driver(grid &
525527
526528
INTEGER, INTENT(IN ), OPTIONAL :: kfeta_trigger
527529
INTEGER, INTENT(IN ), OPTIONAL :: nsas_dx_factor
530+
INTEGER, INTENT(IN ) :: ntiedtke_dx_opt
528531
529532
REAL, INTENT(IN ) :: DT, DX
530533
REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
@@ -1423,6 +1426,7 @@ SUBROUTINE cumulus_driver(grid &
14231426
,QV3D=QV_CURR,QC3D=QC_CURR,QI3D=QI_CURR &
14241427
,DZ8W=dz8w,PCPS=p,P8W=p8w,XLAND=XLAND,DX=dx2d &
14251428
,CU_ACT_FLAG=CU_ACT_FLAG &
1429+
,NTIEDTKE_DX_OPT=NTIEDTKE_DX_OPT &
14261430
,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
14271431
,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
14281432
,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &

run/README.namelist

+3
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,9 @@ Namelist variables for controlling the adaptive time step option:
852852
= 3, for small grid distances (DX < 5 km)
853853
nsas_dx_factor = 0, ! default option
854854
= 1, NSAS grid-distance dependent option
855+
ntiedtke_dx_opt = 0, default option
856+
= 1, new Tiedtke grid-distance dependent option (scale-aware)
857+
when grid size falls below 15 km
855858
For KF-CuP scheme: recommended to use with cu_rad_feedback
856859
shallowcu_forced_ra(max_dom) radiative impact of shallow Cu by a prescribed maximum cloud fraction
857860
= .false., option off, default

0 commit comments

Comments
 (0)