Skip to content

Commit 2bdc870

Browse files
Merge pull request #147 from haiqinli/gsl/develop-smoke
gsl/develop RRFS-Smoke
2 parents 8293f36 + 8b4ee36 commit 2bdc870

31 files changed

+9468
-35
lines changed

physics/GFS_rrtmg_pre.F90

+12
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, &
3636
gasvmr_ccl4, gasvmr_cfc113, aerodp, clouds6, clouds7, clouds8, &
3737
clouds9, cldsa, cldfra, cldfra2d, lwp_ex,iwp_ex, lwp_fc,iwp_fc, &
3838
faersw1, faersw2, faersw3, faerlw1, faerlw2, faerlw3, alpha, &
39+
aero_dir_fdb, smoke_ext, dust_ext, &
3940
spp_wts_rad, spp_rad, errmsg, errflg)
4041

4142
use machine, only: kind_phys
@@ -103,6 +104,8 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, &
103104
logical, intent(in) :: lsswr, lslwr, ltaerosol, lgfdlmprad, &
104105
uni_cld, effr_in, do_mynnedmf, &
105106
lmfshal, lmfdeep2, pert_clds
107+
logical, intent(in) :: aero_dir_fdb
108+
real(kind=kind_phys), dimension(:,:), intent(in) :: smoke_ext, dust_ext
106109

107110
integer, intent(in) :: spp_rad
108111
real(kind_phys), intent(in) :: spp_wts_rad(:,:)
@@ -601,6 +604,15 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, &
601604
enddo
602605
enddo
603606

607+
if(aero_dir_fdb) then ! add smoke/dust extinctions
608+
do k = 1, LMK
609+
do i = 1, IM
610+
! 550nm (~18000/cm)
611+
faersw1(i,k,10) = faersw1(i,k,10) + MIN(4.,smoke_ext(i,k) + dust_ext(i,k))
612+
enddo
613+
enddo
614+
endif
615+
604616
do j = 1,NBDLW
605617
do k = 1, LMK
606618
do i = 1, IM

physics/GFS_rrtmg_pre.meta

+23
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,29 @@
10821082
type = real
10831083
kind = kind_phys
10841084
intent = out
1085+
[aero_dir_fdb]
1086+
standard_name = rrfs_smoke_dust_rad_fdb_opt
1087+
long_name = flag for rrfs smoke dust rad feedback
1088+
units = flag
1089+
dimensions = ()
1090+
type = logical
1091+
intent = in
1092+
[smoke_ext]
1093+
standard_name = smoke_ext
1094+
long_name = smoke optical extinction
1095+
units = various
1096+
dimensions = (horizontal_loop_extent,vertical_layer_dimension)
1097+
type = real
1098+
kind = kind_phys
1099+
intent = in
1100+
[dust_ext]
1101+
standard_name = dust_ext
1102+
long_name = dust optical extinction
1103+
units = various
1104+
dimensions = (horizontal_loop_extent,vertical_layer_dimension)
1105+
type = real
1106+
kind = kind_phys
1107+
intent = in
10851108
[spp_wts_rad]
10861109
standard_name = spp_weights_for_radiation_scheme
10871110
long_name = spp weights for radiation scheme

physics/module_MYNNPBL_wrapper.F90

+8-32
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ SUBROUTINE mynnedmf_wrapper_run( &
159159
& icloud_bl, do_mynnsfclay, &
160160
& imp_physics, imp_physics_gfdl, &
161161
& imp_physics_thompson, imp_physics_wsm6, &
162+
& chem3d, frp, mix_chem, fire_turb, nchem, ndvel, &
162163
& ltaerosol, spp_wts_pbl, spp_pbl, lprnt, huge, errmsg, errflg )
163164

164165
! should be moved to inside the mynn:
@@ -179,11 +180,8 @@ SUBROUTINE mynnedmf_wrapper_run( &
179180
logical, intent(in) :: cplflx
180181

181182
!smoke/chem
182-
!logical, intent(in) :: mix_chem, fire_turb
183-
!integer, intent(in) :: nchem, ndvel, kdvel
184-
!for testing only:
185-
logical, parameter :: mix_chem=.false., fire_turb=.false.
186-
integer, parameter :: nchem=2, ndvel=2, kdvel=1
183+
integer, intent(in) :: nchem, ndvel
184+
integer, parameter :: kdvel=1
187185

188186
! NAMELIST OPTIONS (INPUT):
189187
logical, intent(in) :: &
@@ -285,17 +283,11 @@ SUBROUTINE mynnedmf_wrapper_run( &
285283
real(kind=kind_phys), allocatable :: old_ozone(:,:)
286284

287285
!smoke/chem arrays
288-
! real(kind=kind_phys), dimension(:,:), intent(inout), optional :: &
289-
! & qgrs_smoke_conc, qgrs_dust_conc
290-
! real(kind=kind_phys), allocatable, dimension(:,:,:) :: chem3d
291-
! real(kind=kind_phys), dimension(:,:), intent(in), optional :: vdep
292-
! real(kind=kind_phys), dimension(:), intent(in), optional :: frp, emis_ant_no
293-
!for testing only
294-
real(kind=kind_phys), dimension(im,levs) :: &
295-
& qgrs_smoke_conc, qgrs_dust_conc
296-
real(kind=kind_phys), allocatable, dimension(:,:,:) :: chem3d
297-
real(kind=kind_phys), dimension(im,ndvel) :: vdep !not passed in yet???
298-
real(kind=kind_phys), dimension(im) :: frp, emis_ant_no
286+
real(kind_phys), dimension(:), intent(inout) :: frp
287+
logical, intent(in) :: mix_chem, fire_turb
288+
real(kind=kind_phys), dimension(:,:,:), intent(inout) :: chem3d
289+
real(kind=kind_phys), dimension(im) :: emis_ant_no
290+
real(kind=kind_phys), dimension(im,ndvel) :: vdep
299291

300292
!MYNN-2D
301293
real(kind=kind_phys), dimension(:), intent(in) :: &
@@ -361,20 +353,8 @@ SUBROUTINE mynnedmf_wrapper_run( &
361353
endif
362354

363355
!initialize arrays for test
364-
qgrs_smoke_conc = 1.0
365-
qgrs_dust_conc = 1.0
366-
FRP = 0.
367356
EMIS_ANT_NO = 0.
368357
vdep = 0. ! hli for chem dry deposition, 0 temporarily
369-
if (mix_chem) then
370-
allocate ( chem3d(im,levs,nchem) )
371-
do k=1,levs
372-
do i=1,im
373-
chem3d(i,k,1)=qgrs_smoke_conc(i,k)
374-
chem3d(i,k,2)=qgrs_dust_conc (i,k)
375-
enddo
376-
enddo
377-
endif
378358

379359
! Check incoming moist species to ensure non-negative values
380360
! First, create height (dz) and pressure differences (delp)
@@ -966,10 +946,6 @@ SUBROUTINE mynnedmf_wrapper_run( &
966946
deallocate(save_qke_adv)
967947
endif
968948

969-
if(allocated(chem3d))then
970-
deallocate(chem3d)
971-
endif
972-
973949
CONTAINS
974950

975951
SUBROUTINE dtend_helper(itracer,field,mult)

physics/module_MYNNPBL_wrapper.meta

+44
Original file line numberDiff line numberDiff line change
@@ -1313,6 +1313,50 @@
13131313
dimensions = ()
13141314
type = integer
13151315
intent = in
1316+
[chem3d]
1317+
standard_name = chem3d_mynn_pbl_transport
1318+
long_name = mynn pbl transport of smoke and dust
1319+
units = various
1320+
dimensions = (horizontal_loop_extent,vertical_layer_dimension,2)
1321+
type = real
1322+
kind = kind_phys
1323+
intent = inout
1324+
[frp]
1325+
standard_name = frp_hourly
1326+
long_name = hourly frp
1327+
units = mw
1328+
dimensions = (horizontal_loop_extent)
1329+
type = real
1330+
kind = kind_phys
1331+
intent = inout
1332+
[mix_chem]
1333+
standard_name = rrfs_smoke_mynn_tracer_mixing
1334+
long_name = flag for rrfs smoke mynn tracer mixing
1335+
units = flag
1336+
dimensions = ()
1337+
type = logical
1338+
intent = in
1339+
[fire_turb]
1340+
standard_name = rrfs_smoke_mynn_enh_vermix
1341+
long_name = flag for rrfs smoke mynn enh vermix
1342+
units = flag
1343+
dimensions = ()
1344+
type = logical
1345+
intent = in
1346+
[nchem]
1347+
standard_name = number_of_chemical_species_vertically_mixed
1348+
long_name = number of chemical vertically mixed
1349+
units = count
1350+
dimensions = ()
1351+
type = integer
1352+
intent = in
1353+
[ndvel]
1354+
standard_name = number_of_chemical_species_deposited
1355+
long_name = number of chemical pbl deposited
1356+
units = count
1357+
dimensions = ()
1358+
type = integer
1359+
intent = in
13161360
[ltaerosol]
13171361
standard_name = flag_for_aerosol_physics
13181362
long_name = flag for aerosol physics

physics/module_bl_mynn.F90

+2-1
Original file line numberDiff line numberDiff line change
@@ -5348,7 +5348,7 @@ SUBROUTINE mynn_mix_chem(kts,kte,i, &
53485348
REAL, DIMENSION(kts:kte) :: rhoinv
53495349
REAL, DIMENSION(kts:kte+1) :: rhoz,khdz
53505350
REAL, PARAMETER :: no_threshold = 0.1
5351-
REAL, PARAMETER :: frp_threshold = 1.0 ! JLS 12/21/21
5351+
REAL, PARAMETER :: frp_threshold = 10.0 ! RAR 02/11/22: I increased the frp threshold to enhance mixing
53525352
REAL, PARAMETER :: pblh_threshold = 250.0
53535353

53545354
dztop=.5*(dz(kte)+dz(kte-1))
@@ -5362,6 +5362,7 @@ SUBROUTINE mynn_mix_chem(kts,kte,i, &
53625362
rhoz(kts) =rho(kts)
53635363
rhoinv(kts)=1./rho(kts)
53645364
khdz(kts) =rhoz(kts)*dfh(kts)
5365+
53655366
DO k=kts+1,kte
53665367
rhoz(k) =(rho(k)*dz(k-1) + rho(k-1)*dz(k))/(dz(k-1)+dz(k))
53675368
rhoz(k) = MAX(rhoz(k),1E-4)

physics/module_mp_thompson.F90

+4-1
Original file line numberDiff line numberDiff line change
@@ -968,7 +968,7 @@ END SUBROUTINE thompson_init
968968
!> @{
969969
SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
970970
nwfa, nifa, nwfa2d, nifa2d, &
971-
tt, th, pii, &
971+
aero_ind_fdb, tt, th, pii, &
972972
p, w, dz, dt_in, dt_inner, &
973973
sedi_semi, decfl, &
974974
RAINNC, RAINNCV, &
@@ -1023,6 +1023,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
10231023
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), OPTIONAL, INTENT(INOUT):: &
10241024
nc, nwfa, nifa
10251025
REAL, DIMENSION(ims:ime, jms:jme), OPTIONAL, INTENT(IN):: nwfa2d, nifa2d
1026+
LOGICAL, OPTIONAL, INTENT(IN):: aero_ind_fdb
10261027
REAL, DIMENSION(ims:ime, kms:kme, jms:jme), OPTIONAL, INTENT(INOUT):: &
10271028
re_cloud, re_ice, re_snow
10281029
INTEGER, INTENT(IN) :: rand_perturb_on, kme_stoch
@@ -1446,8 +1447,10 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
14461447
!.. Changed 13 May 2013 to fake emissions in which nwfa2d is aerosol
14471448
!.. number tendency (number per kg per second).
14481449
if (is_aerosol_aware) then
1450+
if ( .not. aero_ind_fdb) then
14491451
nwfa1d(kts) = nwfa1d(kts) + nwfa2d(i,j)*dt
14501452
nifa1d(kts) = nifa1d(kts) + nifa2d(i,j)*dt
1453+
endif
14511454

14521455
do k = kts, kte
14531456
nc(i,k,j) = nc1d(k)

physics/mp_thompson.F90

+3-1
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, &
300300
con_eps, convert_dry_rho, &
301301
spechum, qc, qr, qi, qs, qg, ni, nr, &
302302
is_aerosol_aware, nc, nwfa, nifa, &
303-
nwfa2d, nifa2d, &
303+
nwfa2d, nifa2d, aero_ind_fdb, &
304304
tgrs, prsl, phii, omega, &
305305
sedi_semi, decfl, dtp, dt_inner, &
306306
first_time_step, istep, nsteps, &
@@ -339,6 +339,7 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, &
339339
real(kind_phys), optional, intent(inout) :: nifa(:,:)
340340
real(kind_phys), optional, intent(in ) :: nwfa2d(:)
341341
real(kind_phys), optional, intent(in ) :: nifa2d(:)
342+
logical, optional, intent(in ) :: aero_ind_fdb
342343
! State variables and timestep information
343344
real(kind_phys), intent(inout) :: tgrs(:,:)
344345
real(kind_phys), intent(in ) :: prsl(:,:)
@@ -634,6 +635,7 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, &
634635
if (is_aerosol_aware) then
635636
call mp_gt_driver(qv=qv, qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
636637
nc=nc, nwfa=nwfa, nifa=nifa, nwfa2d=nwfa2d, nifa2d=nifa2d, &
638+
aero_ind_fdb=aero_ind_fdb, &
637639
tt=tgrs, p=prsl, w=w, dz=dz, dt_in=dtstep, dt_inner=dt_inner, &
638640
sedi_semi=sedi_semi, decfl=decfl, &
639641
rainnc=rain_mp, rainncv=delta_rain_mp, &

physics/mp_thompson.meta

+7
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,13 @@
435435
type = real
436436
kind = kind_phys
437437
intent = in
438+
[aero_ind_fdb]
439+
standard_name = rrfs_smoke_aero_ind_fdb_opt
440+
long_name = flag for rrfs wfa ifa emission
441+
units = flag
442+
dimensions = ()
443+
type = logical
444+
intent = in
438445
[tgrs]
439446
standard_name = air_temperature_of_new_state
440447
long_name = model layer mean temperature

0 commit comments

Comments
 (0)