Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 44 additions & 42 deletions bld/namelist_files/namelist_defaults_cam.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2496,55 +2496,57 @@
<molec_diff_bot_press> 50.D0 </molec_diff_bot_press>

<!-- dust emission tuning factor -->
<!-- NOTE: by default cam7 uses dust_emis_method=Leung_2023, otherwise dust_emis_method = Zender_2003 -->
<!-- if, e.g., one uses cam6 but selects Leung_2023, dust_emis_fact will need to be rechanged -->
<dust_emis_fact >0.37D0</dust_emis_fact>
<dust_emis_fact phys="cam5" >0.35D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" phys="cam5" >0.45D0</dust_emis_fact>
<dust_emis_fact hgrid="0.23x0.31" phys="cam5" >0.45D0</dust_emis_fact>
<dust_emis_fact phys="cam6" >0.35D0</dust_emis_fact>
<dust_emis_fact phys="cam7" >2.30D0</dust_emis_fact>
<dust_emis_fact phys="cam6" silhs="1" >0.30D0</dust_emis_fact>
<dust_emis_fact phys="cam7" silhs="1" >2.30D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" phys="cam6" >0.45D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" phys="cam7" >2.30D0</dust_emis_fact>
<dust_emis_fact hgrid="0.23x0.31" phys="cam6" >0.45D0</dust_emis_fact>
<dust_emis_fact hgrid="0.23x0.31" phys="cam7" >2.30D0</dust_emis_fact>
<dust_emis_fact phys="cam6" >0.88D0</dust_emis_fact>
<dust_emis_fact phys="cam7" >4.00D0</dust_emis_fact>
<dust_emis_fact phys="cam6" silhs="1" >0.75D0</dust_emis_fact>
<dust_emis_fact phys="cam7" silhs="1" >4.00D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" phys="cam6" >1.13D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" phys="cam7" >4.00D0</dust_emis_fact>
<dust_emis_fact hgrid="0.23x0.31" phys="cam6" >1.13D0</dust_emis_fact>
<dust_emis_fact hgrid="0.23x0.31" phys="cam7" >4.00D0</dust_emis_fact>

<dust_emis_fact dyn="se" phys="cam5" >0.55D0</dust_emis_fact>
<dust_emis_fact dyn="fv" phys="cam5" clubb_sgs="1" >0.22D0</dust_emis_fact>
<dust_emis_fact dyn="se" phys="cam6" >0.70D0</dust_emis_fact>
<dust_emis_fact dyn="se" phys="cam7" >2.30D0</dust_emis_fact>
<dust_emis_fact dyn="mpas" phys="cam7" >2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam4_vbs">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam4_vbs">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam4_vbs">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam4_vbs">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam4_ts1">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam4_ts1">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam4_tst">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam4_tst">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam5_vbs">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam5_vbs">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam5_vbs">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam5_vbs">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam5_ts1">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam5_ts1">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam5_tst">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam5_tst">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" waccm_phys="1">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" waccm_phys="1">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" waccm_phys="1">0.8D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" waccm_phys="1">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="fv" phys="cam6" >0.70D0</dust_emis_fact>
<dust_emis_fact dyn="fv" phys="cam7" >2.300D0</dust_emis_fact>

<dust_emis_fact hgrid="1.9x2.5" phys="cam6" ver="chem">0.26D0</dust_emis_fact>
<dust_emis_fact hgrid="1.9x2.5" phys="cam7" ver="chem">2.30D0</dust_emis_fact>
<dust_emis_fact hgrid="0.9x1.25" phys="cam6" ver="chem">0.7D0</dust_emis_fact>
<dust_emis_fact hgrid="0.9x1.25" phys="cam7" ver="chem">2.30D0</dust_emis_fact>
<dust_emis_fact hgrid="1.9x2.5" offline_dyn="1" phys="cam6" ver="chem">0.24D0</dust_emis_fact>
<dust_emis_fact hgrid="1.9x2.5" offline_dyn="1" phys="cam7" ver="chem">2.30D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" offline_dyn="1" phys="cam6" ver="chem">0.9D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" offline_dyn="1" phys="cam7" ver="chem">2.30D0</dust_emis_fact>
<dust_emis_fact dyn="se" phys="cam6" >1.75D0</dust_emis_fact>
<dust_emis_fact dyn="se" phys="cam7" >4.00D0</dust_emis_fact>
<dust_emis_fact dyn="mpas" phys="cam7" >4.00D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam4_vbs">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam4_vbs">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam4_vbs">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam4_vbs">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam4_ts1">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam4_ts1">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam4_tst">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam4_tst">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam5_vbs">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam5_vbs">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam5_vbs">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam5_vbs">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" chem="trop_strat_mam5_ts1">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" chem="trop_strat_mam5_ts1">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" chem="trop_strat_mam5_tst">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" chem="trop_strat_mam5_tst">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam6" waccm_phys="1">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne30np4" phys="cam7" waccm_phys="1">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam6" waccm_phys="1">2.0D0</dust_emis_fact>
<dust_emis_fact dyn="se" hgrid="ne0np4CONUS.ne30x8" phys="cam7" waccm_phys="1">4.0D0</dust_emis_fact>
<dust_emis_fact dyn="fv" phys="cam6" >1.75D0</dust_emis_fact>
<dust_emis_fact dyn="fv" phys="cam7" >4.0D0</dust_emis_fact>

<dust_emis_fact hgrid="1.9x2.5" phys="cam6" ver="chem">0.65D0</dust_emis_fact>
<dust_emis_fact hgrid="1.9x2.5" phys="cam7" ver="chem">4.0D0</dust_emis_fact>
<dust_emis_fact hgrid="0.9x1.25" phys="cam6" ver="chem">1.75D0</dust_emis_fact>
<dust_emis_fact hgrid="0.9x1.25" phys="cam7" ver="chem">4.0D0</dust_emis_fact>
<dust_emis_fact hgrid="1.9x2.5" offline_dyn="1" phys="cam6" ver="chem">0.6D0</dust_emis_fact>
<dust_emis_fact hgrid="1.9x2.5" offline_dyn="1" phys="cam7" ver="chem">4.0D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" offline_dyn="1" phys="cam6" ver="chem">2.25D0</dust_emis_fact>
<dust_emis_fact hgrid="0.47x0.63" offline_dyn="1" phys="cam7" ver="chem">4.0D0</dust_emis_fact>

<!-- dust emissions method -->
<dust_emis_method> Zender_2003</dust_emis_method>
Expand Down
54 changes: 45 additions & 9 deletions src/chemistry/modal_aero/aero_model.F90
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ module aero_model

type(modal_aerosol_properties), pointer :: aero_props=>null()

integer :: n_coarse_dust=-1 ! dmleung added n_coarse_dust to determine the index for the
! coarse dust mode for different MAM versions. 29 Oct 2025

contains

!=============================================================================
Expand Down Expand Up @@ -510,6 +513,11 @@ subroutine aero_model_init( pbuf2d )
endif
enddo
endif

! determine coarse dust mode number
if (mode_type=='coarse' .or. mode_type=='coarse_dust') then
n_coarse_dust = n
end if
enddo

if (has_sox) then
Expand Down Expand Up @@ -617,6 +625,8 @@ subroutine aero_model_drydep ( state, pbuf, obklen, ustar, cam_in, dt, cam_out,
real(r8), pointer :: wetdens(:,:,:)
real(r8), pointer :: qaerwat(:,:,:)

logical :: aspherical

landfrac => cam_in%landfrac(:)
icefrac => cam_in%icefrac(:)
ocnfrac => cam_in%ocnfrac(:)
Expand Down Expand Up @@ -653,17 +663,15 @@ subroutine aero_model_drydep ( state, pbuf, obklen, ustar, cam_in, dt, cam_out,
rad_drop(:,:) = 5.0e-6_r8
dens_drop(:,:) = rhoh2o
sg_drop(:,:) = 1.46_r8
jvlc = 3
jvlc = 3 ! dmleung: jvlc = 3, moment = 0 => dry dep velocity for number of cloud-borne aerosols
call modal_aero_depvel_part( ncol,state%t(:,:), state%pmid(:,:), ram1, fv, &
vlc_dry(:,:,jvlc), vlc_trb(:,jvlc), vlc_grv(:,:,jvlc), &
rad_drop(:,:), dens_drop(:,:), sg_drop(:,:), 0, lchnk)
jvlc = 4
jvlc = 4 ! jvlc = 4, moment = 3 => dry dep velocity for vol/mass of cloud-borne aerosols
call modal_aero_depvel_part( ncol,state%t(:,:), state%pmid(:,:), ram1, fv, &
vlc_dry(:,:,jvlc), vlc_trb(:,jvlc), vlc_grv(:,:,jvlc), &
rad_drop(:,:), dens_drop(:,:), sg_drop(:,:), 3, lchnk)



do m = 1, ntot_amode ! main loop over aerosol modes

do lphase = 1, 2 ! loop over interstitial / cloud-borne forms
Expand All @@ -678,14 +686,24 @@ subroutine aero_model_drydep ( state, pbuf, obklen, ustar, cam_in, dt, cam_out,
dens_aer(1:ncol,:) = wetdens(1:ncol,:,m)
sg_aer(1:ncol,:) = sigmag_amode(m)

jvlc = 1
! dmleung 20 Oct 2025 ++
! dmleung: adding asphericity effect on slowing down gravitational settling velocity
! for internally mixed coarse-mode aerosols (Yue Huang et al., 2020)
! Huang et al. (2020) showed that aspherical dust has reduced gravitational settling by 15-20 %.
! Since (1) MAM modes are internally mixed, and (2) sea spray aerosols are also aspherical,
! for now dmleung applies asphericity correction to grav. set. velocity for the whole coarse mode.

aspherical = (m == n_coarse_dust)

jvlc = 1 ! dmleung: jvlc = 1, moment = 0 => dry dep velocity for number of interstitial aerosols
call modal_aero_depvel_part( ncol, state%t(:,:), state%pmid(:,:), ram1, fv, &
vlc_dry(:,:,jvlc), vlc_trb(:,jvlc), vlc_grv(:,:,jvlc), &
rad_aer(:,:), dens_aer(:,:), sg_aer(:,:), 0, lchnk)
jvlc = 2
rad_aer(:,:), dens_aer(:,:), sg_aer(:,:), 0, lchnk, aspherical=aspherical)
jvlc = 2 ! jvlc = 2, moment = 3 => dry dep velocity for vol/mass of interstitial aerosols
call modal_aero_depvel_part( ncol, state%t(:,:), state%pmid(:,:), ram1, fv, &
vlc_dry(:,:,jvlc), vlc_trb(:,jvlc), vlc_grv(:,:,jvlc), &
rad_aer(:,:), dens_aer(:,:), sg_aer(:,:), 3, lchnk)
rad_aer(:,:), dens_aer(:,:), sg_aer(:,:), 3, lchnk, aspherical=aspherical)

end if

do lspec = 0, nspec_amode(m)+1 ! loop over number + constituents + water
Expand Down Expand Up @@ -1443,7 +1461,7 @@ end subroutine modal_aero_bcscavcoef_init
!===============================================================================
!===============================================================================
subroutine modal_aero_depvel_part( ncol, t, pmid, ram1, fv, vlc_dry, vlc_trb, vlc_grv, &
radius_part, density_part, sig_part, moment, lchnk )
radius_part, density_part, sig_part, moment, lchnk, aspherical ) ! dmleung added aspherical flag 20 Oct 2025

! calculates surface deposition velocity of particles
! L. Zhang, S. Gong, J. Padro, and L. Barrie
Expand Down Expand Up @@ -1476,6 +1494,9 @@ subroutine modal_aero_depvel_part( ncol, t, pmid, ram1, fv, vlc_dry, vlc_trb, vl
real(r8), intent(out) :: vlc_trb(pcols) !Turbulent deposn velocity (m/s)
real(r8), intent(out) :: vlc_grv(pcols,pver) !grav deposn velocity (m/s)
real(r8), intent(out) :: vlc_dry(pcols,pver) !dry deposn velocity (m/s)
logical, intent(in), OPTIONAL :: aspherical ! dmleung: asphericity is strong for coarse-mode interstitial
! aerosols only, mostly dust and seasalt. For coarse mode aerosols, asphericity reduces coarse-mode gravitational
! settling velocity by 20 % following Fig. 4 of Yue Huang et al. (2020).
!------------------------------------------------------------------------

!------------------------------------------------------------------------
Expand Down Expand Up @@ -1505,6 +1526,11 @@ subroutine modal_aero_depvel_part( ncol, t, pmid, ram1, fv, vlc_dry, vlc_trb, vl
real(r8) :: wrk1, wrk2, wrk3

! constants

real(r8), parameter :: asphericaldust_drydep = 0.8_r8 ! dmleung added 20 Oct 2025: aspherical dust reduces
! gravitational settling velocity by 15-20 %. Yue Huang et al. (2020)
! Climate Models and Remote Sensing Retrievals Neglect Substantial Desert Dust Asphericity

real(r8) gamma(11) ! exponent of schmidt number
! data gamma/0.54d+00, 0.56d+00, 0.57d+00, 0.54d+00, 0.54d+00, &
! 0.56d+00, 0.54d+00, 0.54d+00, 0.54d+00, 0.56d+00, &
Expand Down Expand Up @@ -1573,6 +1599,16 @@ subroutine modal_aero_depvel_part( ncol, t, pmid, ram1, fv, vlc_dry, vlc_trb, vl
gravit*slp_crc(i,k) / vsc_dyn_atm(i,k) ![m s-1] Stokes' settling velocity SeP97 p. 466
vlc_grv(i,k) = vlc_grv(i,k) * dispersion

! dmleung edited 20 Oct 2025 based on Longlei Li's edits ++
! asphericity reduces gravitational settling velocity of coarse-mode aerosols by 20 %.
! scale flag is only true for coarse mode (m == n_coarse_dust).
if (present(aspherical)) then
if(aspherical) then
vlc_grv(i,k) = vlc_grv(i,k) * asphericaldust_drydep
end if
end if
! dmleung --

vlc_dry(i,k)=vlc_grv(i,k)
enddo
enddo
Expand Down
22 changes: 16 additions & 6 deletions src/chemistry/modal_aero/dust_model.F90
Original file line number Diff line number Diff line change
Expand Up @@ -122,16 +122,26 @@ subroutine dust_init()
allocate( dust_dmt_vwr(ndst) )
allocate( dust_stk_crc(ndst) )

! dmleung edited the mass fraction of the emitted dust size distribution. 27 Oct 2025 ++
! The new mass fraction comes from Jun Meng et al. (2022) and MERRA-2.
! Jun Meng's table indicates 2.1 % mass for 0.1-1 um and 97.9 % mass for 1-10 um.
! ref: https://zenodo.org/records/6344524
! MERRA-2 dust emissions indicate 6 % mass for 0.1-1 um (bin1) and 94 % for 1-10 um (bin2-5).
! dmleung adopts 2.1 % mass for 0.1-1 um and 97.9 % mass for 1-10 um for dust.
! Distributing more mass to accumulation mode allows a longer lifetime of dust, reducing
! low dust biases over remote oceans and reducing high dust biases over the Sahara.
! This change impacts both Zender_2003 dust and Leung_2023 dust.
if ( ntot_amode == 3 ) then
dust_dmt_grd(:) = (/ 0.1e-6_r8, 1.0e-6_r8, 10.0e-6_r8/)
dust_emis_sclfctr(:) = (/ 0.011_r8,0.989_r8 /)
dust_emis_sclfctr(:) = (/ 0.021_r8,0.979_r8 /)
elseif ( ntot_amode == 4 .or. ntot_amode == 5 ) then
dust_dmt_grd(:) = (/ 0.01e-6_r8, 0.1e-6_r8, 1.0e-6_r8, 10.0e-6_r8 /) ! Aitken dust
dust_emis_sclfctr(:) = (/ 1.65E-05_r8, 0.011_r8, 0.989_r8 /) ! Aitken dust
dust_dmt_grd(:) = (/ 0.01e-6_r8, 0.1e-6_r8, 1.0e-6_r8, 10.0e-6_r8 /)
dust_emis_sclfctr(:) = (/ 1.65E-05_r8, 0.021_r8, 0.979_r8 /)
else if( ntot_amode == 7 ) then
dust_dmt_grd(:) = (/ 0.1e-6_r8, 2.0e-6_r8, 10.0e-6_r8/)
dust_emis_sclfctr(:) = (/ 0.13_r8, 0.87_r8 /)
dust_emis_sclfctr(:) = (/ 0.12_r8, 0.88_r8 /)
endif
! dmleung --

ndx = 0
do mm = 1, ntot_amode
Expand Down Expand Up @@ -181,7 +191,7 @@ subroutine dust_emis( ncol, lchnk, dust_flux_in, cflx, soil_erod )

! set dust emissions

if (is_zender_soil_erod_from_atm()) then
if (is_zender_soil_erod_from_atm()) then ! Zender_2003 dust emissions
col_loop1: do i = 1,ncol
soil_erod(i) = soil_erodibility( i, lchnk )
if( soil_erod(i) .lt. soil_erod_threshold ) soil_erod(i) = 0._r8
Expand All @@ -196,7 +206,7 @@ subroutine dust_emis( ncol, lchnk, dust_flux_in, cflx, soil_erod )
cflx(i,inum) = cflx(i,idst)*x_mton
enddo
enddo col_loop1
else ! Leung emissions
else ! Leung_2023 dust emissions

col_loop2: do i = 1,ncol
! rebin and adjust dust emissons.
Expand Down
Loading