Skip to content

Commit 8293f36

Browse files
Merge pull request NCAR#142 from mdtoyNOAA/gsl/develop_physics_mods_from_RRFS_dev
GWD, LSM and MYNN physics updates from RRFS_dev branch
2 parents 54f769c + 5f250c1 commit 8293f36

5 files changed

+73
-37
lines changed

physics/GFS_surface_composites.F90

+24-7
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ end subroutine GFS_surface_composites_pre_finalize
2727
!> \section arg_table_GFS_surface_composites_pre_run Argument Table
2828
!! \htmlinclude GFS_surface_composites_pre_run.html
2929
!!
30-
subroutine GFS_surface_composites_pre_run (im, flag_init, flag_restart, lkm, frac_grid, &
31-
flag_cice, cplflx, cplice, cplwav2atm, landfrac, lakefrac, lakedepth, oceanfrac, frland, &
30+
subroutine GFS_surface_composites_pre_run (im, xlat_d, xlon_d, flag_init, lsm_cold_start, lkm, frac_grid, &
31+
flag_cice, cplflx, cplice, cplwav2atm, lsm, lsm_ruc, &
32+
landfrac, lakefrac, lakedepth, oceanfrac, frland, &
3233
dry, icy, lake, use_flake, wet, hice, cice, zorlo, zorll, zorli, &
3334
snowd, snowd_lnd, snowd_ice, tprcp, tprcp_wat, &
3435
tprcp_lnd, tprcp_ice, uustar, uustar_wat, uustar_lnd, uustar_ice, &
@@ -40,10 +41,11 @@ subroutine GFS_surface_composites_pre_run (im, flag_init, flag_restart, lkm, fra
4041
implicit none
4142

4243
! Interface variables
43-
integer, intent(in ) :: im, lkm, kdt
44-
logical, intent(in ) :: flag_init, flag_restart, frac_grid, cplflx, cplice, cplwav2atm
44+
integer, intent(in ) :: im, lkm, kdt, lsm, lsm_ruc
45+
logical, intent(in ) :: flag_init, lsm_cold_start, frac_grid, cplflx, cplice, cplwav2atm
4546
logical, dimension(:), intent(inout) :: flag_cice
4647
logical, dimension(:), intent(inout) :: dry, icy, lake, use_flake, wet
48+
real(kind=kind_phys), dimension(:), intent(in ) :: xlat_d, xlon_d
4749
real(kind=kind_phys), dimension(:), intent(in ) :: landfrac, lakefrac, lakedepth, oceanfrac
4850
real(kind=kind_phys), dimension(:), intent(inout) :: cice, hice
4951
real(kind=kind_phys), dimension(:), intent( out) :: frland
@@ -201,12 +203,13 @@ subroutine GFS_surface_composites_pre_run (im, flag_init, flag_restart, lkm, fra
201203
endif
202204
endif
203205
enddo
204-
endif
206+
endif ! frac_grid
205207

206208
do i=1,im
207209
tprcp_wat(i) = tprcp(i)
208210
tprcp_lnd(i) = tprcp(i)
209211
tprcp_ice(i) = tprcp(i)
212+
210213
if (wet(i)) then ! Water
211214
uustar_wat(i) = uustar(i)
212215
tsfc_wat(i) = tsfco(i)
@@ -219,7 +222,7 @@ subroutine GFS_surface_composites_pre_run (im, flag_init, flag_restart, lkm, fra
219222
endif
220223
if (dry(i)) then ! Land
221224
uustar_lnd(i) = uustar(i)
222-
weasd_lnd(i) = weasd(i)
225+
if(lsm /= lsm_ruc) weasd_lnd(i) = weasd(i)
223226
tsurf_lnd(i) = tsfcl(i)
224227
! DH*
225228
else
@@ -230,7 +233,7 @@ subroutine GFS_surface_composites_pre_run (im, flag_init, flag_restart, lkm, fra
230233
endif
231234
if (icy(i)) then ! Ice
232235
uustar_ice(i) = uustar(i)
233-
weasd_ice(i) = weasd(i)
236+
if(lsm /= lsm_ruc) weasd_ice(i) = weasd(i)
234237
tsurf_ice(i) = tisfc(i)
235238
ep1d_ice(i) = zero
236239
gflx_ice(i) = zero
@@ -279,7 +282,17 @@ subroutine GFS_surface_composites_pre_run (im, flag_init, flag_restart, lkm, fra
279282
endif
280283
enddo
281284
else
285+
if(lsm /= lsm_ruc) then ! do not do snow initialization with RUC lsm
282286
do i=1,im
287+
!-- print ice point
288+
!if ( (xlon_d(i) > 298.6) .and. (xlon_d(i) < 298.7) .and. &
289+
! (xlat_d(i) > 68.6 ) .and. (xlat_d(i) < 68.7 )) then
290+
! print *,'Composit weasd_ice(i),snowd_ice',kdt,i,xlat_d(i),xlon_d(i),weasd_ice(i),snowd_ice(i)
291+
!endif
292+
!if ( (xlon_d(i) > 284.35) .and. (xlon_d(i) < 284.6) .and. &
293+
! (xlat_d(i) > 41.0 ) .and. (xlat_d(i) < 41.2 )) then
294+
! print *,'Composit2 weasd_lnd(i),snowd_lnd',kdt,i,xlat_d(i),xlon_d(i),weasd_lnd(i),snowd_lnd(i)
295+
!endif
283296
if (icy(i)) then
284297
if (kdt == 1 .or. (.not. cplflx .or. lakefrac(i) > zero)) then
285298
snowd_lnd(i) = zero
@@ -290,6 +303,7 @@ subroutine GFS_surface_composites_pre_run (im, flag_init, flag_restart, lkm, fra
290303
endif
291304
endif
292305
enddo
306+
endif ! lsm/=lsm_ruc
293307
endif
294308

295309
! write(0,*)' minmax of ice snow=',minval(snowd_ice),maxval(snowd_ice)
@@ -644,6 +658,7 @@ subroutine GFS_surface_composites_post_run (
644658

645659
do i=1,im
646660
if (islmsk(i) == 1) then
661+
!-- land
647662
zorl(i) = zorll(i)
648663
cd(i) = cd_lnd(i)
649664
cdq(i) = cdq_lnd(i)
@@ -669,6 +684,7 @@ subroutine GFS_surface_composites_post_run (
669684
hice(i) = zero
670685
cice(i) = zero
671686
elseif (islmsk(i) == 0) then
687+
!-- water
672688
zorl(i) = zorlo(i)
673689
cd(i) = cd_wat(i)
674690
cdq(i) = cdq_wat(i)
@@ -695,6 +711,7 @@ subroutine GFS_surface_composites_post_run (
695711
hice(i) = zero
696712
cice(i) = zero
697713
else ! islmsk(i) == 2
714+
!-- ice
698715
zorl(i) = zorli(i)
699716
cd(i) = cd_ice(i)
700717
cdq(i) = cdq_ice(i)

physics/GFS_surface_composites.meta

+33-3
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,32 @@
1414
dimensions = ()
1515
type = integer
1616
intent = in
17+
[xlat_d]
18+
standard_name = latitude_in_degree
19+
long_name = latitude in degree north
20+
units = degree_north
21+
dimensions = (horizontal_loop_extent)
22+
type = real
23+
kind = kind_phys
24+
intent = in
25+
[xlon_d]
26+
standard_name = longitude_in_degree
27+
long_name = longitude in degree east
28+
units = degree_east
29+
dimensions = (horizontal_loop_extent)
30+
type = real
31+
kind = kind_phys
32+
intent = in
1733
[flag_init]
1834
standard_name = flag_for_first_timestep
1935
long_name = flag signaling first time step for time integration loop
2036
units = flag
2137
dimensions = ()
2238
type = logical
2339
intent = in
24-
[flag_restart]
25-
standard_name = flag_for_restart
26-
long_name = flag for restart (warmstart) or coldstart
40+
[lsm_cold_start]
41+
standard_name = do_lsm_cold_start
42+
long_name = flag to signify LSM is cold-started
2743
units = flag
2844
dimensions = ()
2945
type = logical
@@ -70,6 +86,20 @@
7086
dimensions = ()
7187
type = logical
7288
intent = in
89+
[lsm]
90+
standard_name = control_for_land_surface_scheme
91+
long_name = flag for land surface model
92+
units = flag
93+
dimensions = ()
94+
type = integer
95+
intent = in
96+
[lsm_ruc]
97+
standard_name = identifier_for_ruc_land_surface_scheme
98+
long_name = flag for RUC land surface model
99+
units = flag
100+
dimensions = ()
101+
type = integer
102+
intent = in
73103
[landfrac]
74104
standard_name = land_area_fraction
75105
long_name = fraction of horizontal grid area occupied by land

physics/drag_suite.F90

+13-25
Original file line numberDiff line numberDiff line change
@@ -589,17 +589,8 @@ subroutine drag_suite_run( &
589589
endif
590590
enddo
591591

592-
do i=1,im
593-
if ( dx(i) .ge. dxmax_ss ) then
594-
ss_taper(i) = 1.
595-
else
596-
if ( dx(i) .le. dxmin_ss) then
597-
ss_taper(i) = 0.
598-
else
599-
ss_taper(i) = dxmax_ss * (1. - dxmin_ss/dx(i))/(dxmax_ss-dxmin_ss)
600-
endif
601-
endif
602-
enddo
592+
! Remove ss_tapering
593+
ss_taper(:) = 1.
603594

604595
! SPP, if spp_gwd is 0, no perturbations are applied.
605596
if ( spp_gwd==1 ) then
@@ -986,13 +977,11 @@ subroutine drag_suite_run( &
986977
enddo
987978
if((xland(i)-1.5).le.0. .and. 2.*varss_stoch(i).le.hpbl(i))then
988979
if(br1(i).gt.0. .and. thvx(i,kpbl2)-thvx(i,kts) > 0.)then
989-
cleff_ss = sqrt(dxy(i)**2 + dxyp(i)**2) ! WRF
980+
! Modify xlinv to represent wave number of "typical" small-scale topography
990981
! cleff_ss = 3. * max(dx(i),cleff_ss)
991982
! cleff_ss = 10. * max(dxmax_ss,cleff_ss)
992-
cleff_ss = 0.1 * max(dxmax_ss,cleff_ss) ! WRF
993983
! cleff_ss = 0.1 * 12000.
994-
coefm_ss(i) = (1. + olss(i)) ** (oass(i)+1.)
995-
xlinv(i) = coefm_ss(i) / cleff_ss
984+
xlinv(i) = 0.001*pi ! 2km horizontal wavelength
996985
!govrth(i)=g/(0.5*(thvx(i,kpbl(i))+thvx(i,kts)))
997986
govrth(i)=g/(0.5*(thvx(i,kpbl2)+thvx(i,kts)))
998987
!XNBV=sqrt(govrth(i)*(thvx(i,kpbl(i))-thvx(i,kts))/hpbl(i))
@@ -1003,8 +992,8 @@ subroutine drag_suite_run( &
1003992
!tauwavex0=0.5*XNBV*xlinv(i)*(2*MIN(varss(i),75.))**2*ro(i,kts)*u1(i,kpbl(i))
1004993
!tauwavex0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*u1(i,kpbl2)
1005994
!tauwavex0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*u1(i,3)
1006-
var_temp = MIN(varss_stoch(i),varmax_ss_stoch(i)) + &
1007-
MAX(0.,beta_ss*(varss_stoch(i)-varmax_ss_stoch(i)))
995+
! Remove limit on varss_stoch
996+
var_temp = varss_stoch(i)
1008997
! Note: This is a semi-implicit treatment of the time differencing
1009998
var_temp2 = 0.5*XNBV*xlinv(i)*(2.*var_temp)**2*ro(i,kvar) ! this is greater than zero
1010999
tauwavex0=var_temp2*u1(i,kvar)/(1.+var_temp2*deltim)
@@ -1018,8 +1007,8 @@ subroutine drag_suite_run( &
10181007
!tauwavey0=0.5*XNBV*xlinv(i)*(2*MIN(varss(i),75.))**2*ro(i,kts)*v1(i,kpbl(i))
10191008
!tauwavey0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*v1(i,kpbl2)
10201009
!tauwavey0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*v1(i,3)
1021-
var_temp = MIN(varss_stoch(i),varmax_ss_stoch(i)) + &
1022-
MAX(0.,beta_ss*(varss_stoch(i)-varmax_ss_stoch(i)))
1010+
! Remove limit on varss_stoch
1011+
var_temp = varss_stoch(i)
10231012
! Note: This is a semi-implicit treatment of the time differencing
10241013
var_temp2 = 0.5*XNBV*xlinv(i)*(2.*var_temp)**2*ro(i,kvar) ! this is greater than zero
10251014
tauwavey0=var_temp2*v1(i,kvar)/(1.+var_temp2*deltim)
@@ -1083,17 +1072,16 @@ subroutine drag_suite_run( &
10831072

10841073
IF ((xland(i)-1.5) .le. 0.) then
10851074
!(IH*kflt**n1)**-1 = (0.00102*0.00035**-1.9)**-1 = 0.00026615161
1086-
var_temp = MIN(varss_stoch(i),varmax_fd_stoch(i)) + &
1087-
MAX(0.,beta_fd*(varss_stoch(i)-varmax_fd_stoch(i)))
1088-
var_temp = MIN(var_temp, 250.)
1075+
! Remove limit on varss_stoch
1076+
var_temp = varss_stoch(i)
1077+
!var_temp = MIN(var_temp, 250.)
10891078
a1=0.00026615161*var_temp**2
10901079
! a1=0.00026615161*MIN(varss(i),varmax)**2
10911080
! a1=0.00026615161*(0.5*varss(i))**2
10921081
! k1**(n1-n2) = 0.003**(-1.9 - -2.8) = 0.003**0.9 = 0.005363
10931082
a2=a1*0.005363
1094-
! Revise e-folding height based on PBL height and topographic std. dev. -- M. Toy 3/12/2018
1095-
H_efold = max(2*varss_stoch(i),hpbl(i))
1096-
H_efold = min(H_efold,1500.)
1083+
! Beljaars H_efold
1084+
H_efold = 1500.
10971085
DO k=kts,km
10981086
wsp=SQRT(u1(i,k)**2 + v1(i,k)**2)
10991087
! alpha*beta*Cmd*Ccorr*2.109 = 12.*1.*0.005*0.6*2.109 = 0.0759

physics/module_sf_mynn.F90

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ MODULE module_sf_mynn
112112
!1: check input
113113
!2: everything - heavy I/O
114114
LOGICAL, PARAMETER :: compute_diag = .false.
115-
LOGICAL, PARAMETER :: compute_flux = .false. !shouldn't need compute
115+
LOGICAL, PARAMETER :: compute_flux = .true. !shouldn't need compute
116116
! these in FV3. They will be written over anyway.
117117
! Computing the fluxes here is leftover from the WRF world.
118118

physics/module_sf_ruclsm.F90

+2-1
Original file line numberDiff line numberDiff line change
@@ -2595,7 +2595,8 @@ SUBROUTINE SOIL (debug_print, &
25952595
! 3feb21 - in RRFS testing (fv3-based), ref*0.5 gives too much direct
25962596
! evaporation. Therefore , it is replaced with ref*0.7.
25972597
!fc=max(qmin,ref*0.5)
2598-
fc=max(qmin,ref*0.7)
2598+
!fc=max(qmin,ref*0.7)
2599+
fc=ref
25992600
fex_fc=1.
26002601
if((soilmois(1)+qmin) > fc .or. (qvatm-qvg) > 0.) then
26012602
soilres = 1.

0 commit comments

Comments
 (0)