Skip to content

Commit

Permalink
Implement the GOCART aerosols as aero_aware into the Thompson scheme
Browse files Browse the repository at this point in the history
  • Loading branch information
zhanglikate committed Aug 23, 2024
1 parent 7f4dc39 commit 10e8817
Show file tree
Hide file tree
Showing 18 changed files with 530 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ module GFS_PBL_generic_common
contains

subroutine set_aerosol_tracer_index(imp_physics, imp_physics_wsm6, &
imp_physics_thompson, ltaerosol,mraerosol, &
imp_physics_thompson,ltaerosol, &
mraerosol,gtaerosol, &
imp_physics_mg, ntgl, imp_physics_gfdl, &
imp_physics_zhao_carr, imp_physics_nssl,&
nssl_hail_on, nssl_ccn_on, kk, &
Expand All @@ -23,7 +24,7 @@ subroutine set_aerosol_tracer_index(imp_physics, imp_physics_wsm6, &
imp_physics_thompson, &
imp_physics_mg, ntgl, imp_physics_gfdl, &
imp_physics_zhao_carr,imp_physics_nssl
logical, intent(in ) :: ltaerosol, mraerosol, nssl_hail_on, nssl_ccn_on
logical, intent(in ) :: ltaerosol, mraerosol, gtaerosol, nssl_hail_on, nssl_ccn_on
integer, intent(out) :: kk
character(len=*), intent(out) :: errmsg
integer, intent(out) :: errflg
Expand All @@ -38,7 +39,7 @@ subroutine set_aerosol_tracer_index(imp_physics, imp_physics_wsm6, &
! Thompson
if(ltaerosol) then
kk = 12
else if(mraerosol) then
else if(mraerosol .or. gtaerosol) then
kk = 10
else
kk = 9
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ subroutine GFS_PBL_generic_post_run (im, levs, nvdiff, ntrac,
ntqv, ntcw, ntiw, ntrw, ntsw, ntlnc, ntinc, ntrnc, ntsnc, ntgnc, ntwa, ntia, ntgl, ntoz, ntke, ntkev,nqrimef, &
trans_aero, ntchs, ntchm, ntccn, nthl, nthnc, ntgv, nthv, ntrz, ntgz, nthz, &
imp_physics, imp_physics_gfdl, imp_physics_thompson, imp_physics_wsm6, imp_physics_zhao_carr, imp_physics_mg, &
imp_physics_fer_hires, imp_physics_nssl, nssl_ccn_on, ltaerosol, mraerosol, nssl_hail_on, nssl_3moment, &
imp_physics_fer_hires, imp_physics_nssl, nssl_ccn_on, ltaerosol, mraerosol, gtaerosol, nssl_hail_on, nssl_3moment, &
cplflx, cplaqm, cplchm,cplchp, lssav, flag_for_pbl_generic_tend, ldiag3d, lsidea, hybedmf, do_shoc, satmedmf, &
shinhong, do_ysu, dvdftra, dusfc1, dvsfc1, dtsfc1, dqsfc1, dtf, dudt, dvdt, dtdt, htrsw, htrlw, xmu, &
dqdt, dusfc_cpl, dvsfc_cpl, dtsfc_cpl, dtend, dtidx, index_of_temperature, index_of_x_wind, index_of_y_wind, &
Expand All @@ -36,7 +36,7 @@ subroutine GFS_PBL_generic_post_run (im, levs, nvdiff, ntrac,
integer, intent(in) :: imp_physics_zhao_carr, imp_physics_mg, imp_physics_fer_hires
integer, intent(in) :: imp_physics_nssl
logical, intent(in) :: nssl_ccn_on, nssl_hail_on, nssl_3moment
logical, intent(in) :: ltaerosol, cplflx, cplaqm, cplchm,cplchp, lssav, ldiag3d, lsidea, use_med_flux, mraerosol
logical, intent(in) :: ltaerosol, cplflx, cplaqm, cplchm,cplchp, lssav, ldiag3d, lsidea, use_med_flux, mraerosol, gtaerosol
logical, intent(in) :: hybedmf, do_shoc, satmedmf, shinhong, do_ysu

logical, intent(in) :: flag_for_pbl_generic_tend
Expand Down Expand Up @@ -105,7 +105,8 @@ subroutine GFS_PBL_generic_post_run (im, levs, nvdiff, ntrac,
if (trans_aero) then
! Set kk if chemistry-aerosol tracers are diffused
call set_aerosol_tracer_index(imp_physics, imp_physics_wsm6, &
imp_physics_thompson, ltaerosol,mraerosol, &
imp_physics_thompson, ltaerosol, &
mraerosol, gtaerosol, &
imp_physics_mg, ntgl, imp_physics_gfdl, &
imp_physics_zhao_carr, imp_physics_nssl,&
nssl_hail_on, nssl_ccn_on, kk, &
Expand Down Expand Up @@ -166,7 +167,7 @@ subroutine GFS_PBL_generic_post_run (im, levs, nvdiff, ntrac,
dqdt(i,k,ntia) = dvdftra(i,k,12)
enddo
enddo
else if(mraerosol) then
else if(mraerosol .or. gtaerosol) then
do k=1,levs
do i=1,im
dqdt(i,k,ntqv) = dvdftra(i,k,1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,13 @@
dimensions = ()
type = logical
intent = in
[gtaerosol]
standard_name = do_gocart_aerosol_awareness
long_name = flag for gocart aerosol-aware physics for example the thompson microphysics
units = flag
dimensions = ()
type = logical
intent = in
[nssl_ccn_on]
standard_name = nssl_ccn_on
long_name = CCN activation flag in NSSL micro
Expand Down
9 changes: 5 additions & 4 deletions physics/Interstitials/UFS_SCM_NEPTUNE/GFS_PBL_generic_pre.F90
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ subroutine GFS_PBL_generic_pre_run (im, levs, nvdiff, ntrac, rtg_ozone_index,
ntccn, nthl, nthnc, ntgv, nthv, ntrz, ntgz, nthz, &
imp_physics, imp_physics_gfdl, imp_physics_thompson, imp_physics_wsm6, &
imp_physics_zhao_carr, imp_physics_mg, imp_physics_fer_hires, imp_physics_nssl, &
ltaerosol, cplchp, mraerosol, nssl_ccn_on, nssl_hail_on, nssl_3moment, &
ltaerosol, cplchp, mraerosol, gtaerosol, nssl_ccn_on, nssl_hail_on, nssl_3moment,&
hybedmf, do_shoc, satmedmf, qgrs, vdftra, save_u, save_v, save_t, save_q, &
flag_for_pbl_generic_tend, ldiag3d, qdiag3d, lssav, ugrs, vgrs, tgrs, errmsg, errflg)

Expand All @@ -33,7 +33,7 @@ subroutine GFS_PBL_generic_pre_run (im, levs, nvdiff, ntrac, rtg_ozone_index,
logical, intent(in) :: trans_aero, ldiag3d, qdiag3d, lssav
integer, intent(in) :: imp_physics, imp_physics_gfdl, imp_physics_thompson, imp_physics_wsm6
integer, intent(in) :: imp_physics_zhao_carr, imp_physics_mg, imp_physics_fer_hires
logical, intent(in) :: ltaerosol, hybedmf, do_shoc, satmedmf, flag_for_pbl_generic_tend, mraerosol
logical, intent(in) :: ltaerosol, hybedmf, do_shoc, satmedmf, flag_for_pbl_generic_tend, mraerosol, gtaerosol
integer, intent(in) :: imp_physics_nssl
logical, intent(in) :: nssl_hail_on, nssl_ccn_on, nssl_3moment
logical, intent(in) :: cplchp
Expand Down Expand Up @@ -108,7 +108,7 @@ subroutine GFS_PBL_generic_pre_run (im, levs, nvdiff, ntrac, rtg_ozone_index,
enddo
enddo
rtg_ozone_index = 10
elseif(mraerosol) then
elseif(mraerosol .or. gtaerosol) then
do k=1,levs
do i=1,im
vdftra(i,k,1) = qgrs(i,k,ntqv)
Expand Down Expand Up @@ -273,7 +273,8 @@ subroutine GFS_PBL_generic_pre_run (im, levs, nvdiff, ntrac, rtg_ozone_index,
!
if (trans_aero) then
call set_aerosol_tracer_index(imp_physics, imp_physics_wsm6, &
imp_physics_thompson, ltaerosol,mraerosol, &
imp_physics_thompson, ltaerosol, &
mraerosol, gtaerosol, &
imp_physics_mg, ntgl, imp_physics_gfdl, &
imp_physics_zhao_carr, imp_physics_nssl,&
nssl_hail_on, nssl_ccn_on, kk, &
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,13 @@
dimensions = ()
type = logical
intent = in
[gtaerosol]
standard_name = do_gocart_aerosol_awareness
long_name = flag for gocart aerosol-aware physics for example the thompson microphysics
units = flag
dimensions = ()
type = logical
intent = in
[nssl_ccn_on]
standard_name = nssl_ccn_on
long_name = CCN activation flag in NSSL micro
Expand Down
24 changes: 19 additions & 5 deletions physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_pre.F90
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
imp_physics_fer_hires, iovr, iovr_rand, iovr_maxrand, iovr_max, &
iovr_dcorr, iovr_exp, iovr_exprand, idcor, idcor_con, idcor_hogan, &
idcor_oreopoulos, dcorr_con, julian, yearlen, lndp_var_list, lsswr, &
lslwr, ltaerosol, mraerosol, lgfdlmprad, uni_cld, effr_in, do_mynnedmf,&
lslwr, ltaerosol, mraerosol, gtaerosol, lgfdlmprad, uni_cld, effr_in, do_mynnedmf,&
lmfshal, lcnorm, lmfdeep2, lcrick, fhswr, fhlwr, solhr, sup, con_eps, &
epsm1, fvirt, rog, rocp, con_rd, xlat_d, xlat, xlon, coslat, sinlat, &
tsfc, slmsk, prsi, prsl, prslk, tgrs, sfc_wts, mg_cld, effrr_in, &
Expand Down Expand Up @@ -128,7 +128,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
logical, intent(in) :: lsswr, lslwr, ltaerosol, lgfdlmprad, &
uni_cld, effr_in, do_mynnedmf, &
lmfshal, lmfdeep2, pert_clds, lcrick,&
lcnorm, top_at_1, lextop, mraerosol
lcnorm, top_at_1, lextop, mraerosol, gtaerosol
logical, intent(in) :: rrfs_sd, aero_dir_fdb, xr_cnvcld

logical, intent(in) :: nssl_ccn_on, nssl_invertccn
Expand Down Expand Up @@ -230,7 +230,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
! for Thompson MP
real(kind=kind_phys), dimension(im,lm+LTP) :: &
qv_mp, qc_mp, qi_mp, qs_mp, &
nc_mp, ni_mp, nwfa
nc_mp, ni_mp, nwfa, gtnwfa
real (kind=kind_phys), dimension(lm) :: cldfra1d, qv1d, &
& qc1d, qi1d, qs1d, dz1d, p1d, t1d

Expand Down Expand Up @@ -375,6 +375,16 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
tracer1(:,k1,j) = max(0.0, qgrs(:,k2,j))
enddo
enddo

if (gtaerosol) then
do k = 1, LM
k1 = k + kd
k2 = k + lsk
gtnwfa(:,k1)=((qgrs(:,k2,ntss1)/0.0045435214+qgrs(:,k2,ntss2)/0.2907854+qgrs(:,k2,ntss3)/12.91224+ &
qgrs(:,k2,ntss4)/206.2216+qgrs(:,k2,ntss5)/4326.23)*9.+qgrs(:,k2,ntsu)/0.3053104*5+ &
qgrs(:,k2,ntocl)/0.3232698*8)*1.e6
enddo
endif
!
if (top_at_1) then ! input data from toa to sfc
if (lsk > 0) then
Expand Down Expand Up @@ -736,7 +746,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
enddo
enddo
! for Thompson MP - prepare variables for calc_effr
if_thompson: if (imp_physics == imp_physics_thompson .and. (ltaerosol .or. mraerosol)) then
if_thompson: if (imp_physics == imp_physics_thompson .and. (ltaerosol .or. mraerosol .or. gtaerosol)) then
do k=1,LMK
do i=1,IM
qvs = qlyr(i,k)
Expand All @@ -748,7 +758,11 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
qs_mp (i,k) = tracer1(i,k,ntsw)/(1.-qvs)
nc_mp (i,k) = tracer1(i,k,ntlnc)/(1.-qvs)
ni_mp (i,k) = tracer1(i,k,ntinc)/(1.-qvs)
if (gtaerosol) then
nwfa (i,k) = gtnwfa (i,k)
else
nwfa (i,k) = tracer1(i,k,ntwa)
endif
enddo
enddo
elseif (imp_physics == imp_physics_thompson) then
Expand Down Expand Up @@ -884,7 +898,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,&
! Update number concentration, consistent with sub-grid clouds (GF, MYNN) or without (all others)
do k=1,lm
do i=1,im
if ((ltaerosol .or. mraerosol) .and. qc_mp(i,k)>1.e-12 .and. nc_mp(i,k)<100.) then
if ((ltaerosol .or. mraerosol .or. gtaerosol) .and. qc_mp(i,k)>1.e-12 .and. nc_mp(i,k)<100.) then
nc_mp(i,k) = make_DropletNumber(qc_mp(i,k)*rho(i,k), nwfa(i,k)*rho(i,k)) * orho(i,k)
endif
if (qi_mp(i,k)>1.e-12 .and. ni_mp(i,k)<100.) then
Expand Down
7 changes: 7 additions & 0 deletions physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_pre.meta
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,13 @@
dimensions = ()
type = logical
intent = in
[gtaerosol]
standard_name = do_gocart_aerosol_awareness
long_name = flag for gocart aerosol-aware physics for example the thompson microphysics
units = flag
dimensions = ()
type = logical
intent = in
[lgfdlmprad]
standard_name = flag_for_GFDL_microphysics_radiation_interaction
long_name = flag for GFDL microphysics-radiation interaction
Expand Down
26 changes: 19 additions & 7 deletions physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_cloud_mp.F90
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ module GFS_rrtmgp_cloud_mp
subroutine GFS_rrtmgp_cloud_mp_run(nCol, nLev, nTracers, ncnd, i_cldliq, i_cldice, &
i_cldrain, i_cldsnow, i_cldgrpl, i_cldtot, i_cldliq_nc, i_cldice_nc, i_twa, kdt, &
imfdeepcnv, imfdeepcnv_gf, imfdeepcnv_samf, doSWrad, doLWrad, effr_in, lmfshal, &
ltaerosol,mraerosol, icloud, imp_physics, imp_physics_thompson, imp_physics_gfdl, &
ltaerosol, mraerosol, gtaerosol, icloud, imp_physics, imp_physics_thompson, imp_physics_gfdl, &
lgfdlmprad, do_mynnedmf, uni_cld, lmfdeep2, p_lev, p_lay, t_lay, qs_lay, q_lay, &
ntss1, ntss2,ntss3, ntss4,ntss5, ntsu, ntocl, &
relhum, lsmask, xlon, xlat, dx, tv_lay, effrin_cldliq, effrin_cldice, &
effrin_cldrain, effrin_cldsnow, tracer, cnv_mixratio, cld_cnv_frac, qci_conv, &
deltaZ, deltaZc, deltaP, qc_mynn, qi_mynn, cld_pbl_frac, con_g, con_rd, con_eps, &
Expand All @@ -63,7 +64,9 @@ subroutine GFS_rrtmgp_cloud_mp_run(nCol, nLev, nTracers, ncnd, i_cldliq, i_cldic
nCol, & ! Number of horizontal grid points
nLev, & ! Number of vertical layers
ncnd, & ! Number of cloud condensation types.
nTracers, & ! Number of tracers from model.
nTracers, & ! Number of tracers from model.
ntss1, ntss2,ntss3,ntss4, & ! gocart tracer number
ntss5, ntsu,ntocl, & ! gocart tracer number
i_cldliq, & ! Index into tracer array for cloud liquid.
i_cldice, & ! Index into tracer array for cloud ice.
i_cldrain, & ! Index into tracer array for cloud rain.
Expand All @@ -88,6 +91,7 @@ subroutine GFS_rrtmgp_cloud_mp_run(nCol, nLev, nTracers, ncnd, i_cldliq, i_cldic
lmfshal, & ! Flag for mass-flux shallow convection scheme used by Xu-Randall
ltaerosol, & ! Flag for aerosol option
mraerosol, & ! Flag for aerosol option
gtaerosol, & ! Flag for aerosol option
lgfdlmprad, & ! Flag for GFDLMP radiation interaction
do_mynnedmf, & ! Flag to activate MYNN-EDMF
uni_cld, & ! Flag for unified cloud scheme
Expand Down Expand Up @@ -258,7 +262,7 @@ subroutine GFS_rrtmgp_cloud_mp_run(nCol, nLev, nTracers, ncnd, i_cldliq, i_cldic
! Update particle size using modified mixing-ratios from Thompson.
call cmp_reff_Thompson(nLev, nCol, i_cldliq, i_cldice, i_cldsnow, i_cldice_nc, &
i_cldliq_nc, i_twa, q_lay, p_lay, t_lay, tracer, con_eps, con_rd, ltaerosol,&
mraerosol, lsmask, effrin_cldliq, effrin_cldice, effrin_cldsnow)
mraerosol, gtaerosol, lsmask, effrin_cldliq, effrin_cldice, effrin_cldsnow)
cld_reliq = effrin_cldliq
cld_reice = effrin_cldice
cld_resnow = effrin_cldsnow
Expand Down Expand Up @@ -842,13 +846,15 @@ function cld_frac_XuRandall(p_lay, qs_lay, relhum, cld_mr, alpha)
! ######################################################################################
subroutine cmp_reff_Thompson(nLev, nCol, i_cldliq, i_cldice, i_cldsnow, i_cldice_nc, &
i_cldliq_nc, i_twa, q_lay, p_lay, t_lay, tracer, con_eps, con_rd, ltaerosol, &
mraerosol, lsmask, effrin_cldliq, effrin_cldice, effrin_cldsnow)
mraerosol, gtaerosol, lsmask, effrin_cldliq, effrin_cldice, effrin_cldsnow, &
ntss1, ntss2,ntss3,ntss4, ntss5, ntsu,ntocl)
implicit none

! Inputs
integer, intent(in) :: nLev, nCol, i_cldliq, i_cldice, i_cldsnow, i_cldice_nc, &
i_cldliq_nc, i_twa
logical, intent(in) :: ltaerosol, mraerosol
integer, intent(in) :: ntss1, ntss2,ntss3,ntss4, ntss5, ntsu,ntocl
logical, intent(in) :: ltaerosol, mraerosol, gtaerosol
real(kind_phys), intent(in) :: con_eps,con_rd
real(kind_phys), dimension(:,:),intent(in) :: q_lay, p_lay, t_lay
real(kind_phys), dimension(:,:,:),intent(in) :: tracer
Expand All @@ -862,7 +868,7 @@ subroutine cmp_reff_Thompson(nLev, nCol, i_cldliq, i_cldice, i_cldsnow, i_cldice
integer :: iCol, iLay
real(kind_phys) :: rho, orho
real(kind_phys),dimension(nCol,nLev) :: qv_mp, qc_mp, qi_mp, qs_mp, ni_mp, nc_mp, &
nwfa, re_cloud, re_ice, re_snow
nwfa,gtnwfa, re_cloud, re_ice, re_snow
integer :: ilsmask

! Prepare cloud mixing-ratios and number concentrations for calc_effectRa
Expand All @@ -875,9 +881,15 @@ subroutine cmp_reff_Thompson(nLev, nCol, i_cldliq, i_cldice, i_cldsnow, i_cldice
qi_mp(iCol,iLay) = tracer(iCol,iLay,i_cldice) / (1.-q_lay(iCol,iLay))
qs_mp(iCol,iLay) = tracer(iCol,iLay,i_cldsnow) / (1.-q_lay(iCol,iLay))
ni_mp(iCol,iLay) = tracer(iCol,iLay,i_cldice_nc) / (1.-q_lay(iCol,iLay))
if (ltaerosol .or. mraerosol) then
if (ltaerosol .or. mraerosol .or. gtaerosol,) then
nc_mp(iCol,iLay) = tracer(iCol,iLay,i_cldliq_nc) / (1.-q_lay(iCol,iLay))
if (gtaerosol) then
nwfa(iCol,iLay) = ((tracer(iCol,iLay,ntss1)/0.0045435214+tracer(iCol,iLay,ntss2)/0.2907854+tracer(iCol,iLay,ntss3)/12.91224+ &
tracer(iCol,iLay,ntss4)/206.2216+tracer(iCol,iLay,ntss5)/4326.23)*9.+tracer(iCol,iLay,ntsu)/0.3053104*5+ &
tracer(iCol,iLay,ntocl)/0.3232698*8)*1.e6
else
nwfa(iCol,iLay) = tracer(iCol,iLay,i_twa)
endif
if (qc_mp(iCol,iLay) > 1.e-12 .and. nc_mp(iCol,iLay) < 100.) then
nc_mp(iCol,iLay) = make_DropletNumber(qc_mp(iCol,iLay)*rho, nwfa(iCol,iLay)*rho) * orho
endif
Expand Down
56 changes: 56 additions & 0 deletions physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_cloud_mp.meta
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,13 @@
dimensions = ()
type = logical
intent = in
[gtaerosol]
standard_name = do_gocart_aerosol_awareness
long_name = flag for gocart aerosol-aware physics for example the thompson microphysics
units = flag
dimensions = ()
type = logical
intent = in
[imfdeepcnv]
standard_name = control_for_deep_convection_scheme
long_name = flag for mass-flux deep convection scheme
Expand Down Expand Up @@ -307,6 +314,55 @@
type = real
kind = kind_phys
intent = in
[ntss1]
standard_name = index_for_seasalt_bin1
long_name = index for seasalt bin1
units = index
dimensions = ()
type = integer
intent = in
[ntss2]
standard_name = index_for_seasalt_bin2
long_name = index for seasalt bin2
units = index
dimensions = ()
type = integer
intent = in
[ntss3]
standard_name = index_for_seasalt_bin3
long_name = index for seasalt bin3
units = index
dimensions = ()
type = integer
intent = in
[ntss4]
standard_name = index_for_seasalt_bin4
long_name = index for seasalt bin4
units = index
dimensions = ()
type = integer
intent = in
[ntss5]
standard_name = index_for_seasalt_bin5
long_name = index for seasalt bin5
units = index
dimensions = ()
type = integer
intent = in
[ntsu]
standard_name = index_for_sulfate
long_name = index for sulfate
units = index
dimensions = ()
type = integer
intent = in
[ntocl]
standard_name = index_for_ocphilic
long_name = index for ocphilic
units = index
dimensions = ()
type = integer
intent = in
[relhum]
standard_name = relative_humidity
long_name = layer relative humidity
Expand Down
Loading

0 comments on commit 10e8817

Please sign in to comment.