Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/fengsha moist #253

Merged
merged 9 commits into from
Sep 25, 2023
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
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
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,22 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [2.2.2] - 2023-09-19
mathomp4 marked this conversation as resolved.
Show resolved Hide resolved

### Fixed

- Corrected the units of the gravimetric soil moisture to percent instead of fractional in the FENGSHA dust scheme.

### Added

- Additional tuning parameters for the soil moisture and drylimit calculations for application specific tuning.

### Changed

- Correct soil moisture parameterization in FENGSHA
- Add `soil_moisture_factor` to the DU2G_GridComp.rc and DU2G_GridCompMod.F90 files for FENGSHA
- Add `soil_drylimit_factor` to the DU2G_GridComp.rc and DU2G_GridCompMod.F90 files for FENGSHA

## [v2.2.1] - 2023-05-30

### Fixed
Expand Down
7 changes: 6 additions & 1 deletion ESMF/GOCART2G_GridComp/DU2G_GridComp/DU2G_GridCompMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ module DU2G_GridCompMod
real :: alpha ! FENGSHA scaling factor
real :: gamma ! FENGSHA tuning exponent
real :: kvhmax ! FENGSHA max. vertical/horizontal mass flux ratio [1]
real :: f_sdl ! FENGSHA drylimit tuning factor
real :: Ch_DU_res(NHRES) ! resolutions used for Ch_DU
real :: Ch_DU ! dust emission tuning coefficient [kg s2 m-5].
logical :: maringFlag=.false. ! maring settling velocity correction
Expand Down Expand Up @@ -183,6 +184,8 @@ subroutine SetServices (GC, RC)
case ('fengsha')
call ESMF_ConfigGetAttribute (cfg, self%alpha, label='alpha:', __RC__)
call ESMF_ConfigGetAttribute (cfg, self%gamma, label='gamma:', __RC__)
call ESMF_ConfigGetAttribute (cfg, self%f_swc, label='soil_moisture_factor:', __RC__)
call ESMF_ConfigGetAttribute (cfg, self%f_sdl, label='soil_drylimit_factor:', __RC__)
call ESMF_ConfigGetAttribute (cfg, self%kvhmax, label='vertical_to_horizontal_flux_ratio_limit:', __RC__)
case ('k14')
call ESMF_ConfigGetAttribute (cfg, self%clayFlag, label='clayFlag:', __RC__)
Expand Down Expand Up @@ -794,10 +797,12 @@ subroutine Run1 (GC, import, export, clock, RC)
if (associated(DU_EROD)) DU_EROD = f_erod_

case ('fengsha')

call DustEmissionFENGSHA (frlake, frsnow, lwi, slc, du_clay, du_sand, du_silt, &
du_ssm, du_rdrag, airdens(:,:,self%km), ustar, du_uthres, &
self%alpha, self%gamma, self%kvhmax, MAPL_GRAV, &
self%rhop, self%sdist, emissions_surface, __RC__)
self%rhop, self%sdist, self%f_sdl, self%f_swc, emissions_surface, __RC__)

case ('ginoux')

call DustEmissionGOCART2G(self%radius*1.e-6, frlake, wet1, lwi, u10m, v10m, &
Expand Down
54 changes: 28 additions & 26 deletions Process_Library/GOCART2G_Process.F90
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,14 @@ end subroutine DustAerosolDistributionKok
! !IROUTINE: soilMoistureConvertVol2Grav - volumetric to gravimetric soil moisture
!
! !INTERFACE:
real function soilMoistureConvertVol2Grav(vsoil, sandfrac, rhop)
real function soilMoistureConvertVol2Grav(vsoil, sandfrac)

! !USES:
implicit NONE

! !INPUT PARAMETERS:
real, intent(in) :: vsoil ! volumetric soil moisture fraction [1]
real, intent(in) :: sandfrac ! fractional sand content [1]
real, intent(in) :: rhop ! dry dust density [kg m-3]

! !DESCRIPTION: Convert soil moisture fraction from volumetric to gravimetric.
!
Expand All @@ -200,16 +199,16 @@ real function soilMoistureConvertVol2Grav(vsoil, sandfrac, rhop)

! !CONSTANTS:
real, parameter :: rhow = 1000. ! density of water [kg m-3]

real, parameter :: rhop = 1700.
!EOP
!-------------------------------------------------------------------------
! Begin...

! Saturated volumetric water content (sand-dependent) ! [m3 m-3]
vsat = 0.489 - 0.00126 * ( 100. * sandfrac )
vsat = 0.489 - 0.126 * sandfrac

! Gravimetric soil content
soilMoistureConvertVol2Grav = vsoil * rhow / (rhop * (1. - vsat))
soilMoistureConvertVol2Grav = 100. * vsoil * rhow / (rhop * (1. - vsat))

end function soilMoistureConvertVol2Grav

Expand All @@ -219,7 +218,7 @@ end function soilMoistureConvertVol2Grav
! !IROUTINE: moistureCorrectionFecan - Correction factor for Fecan soil moisture
!
! !INTERFACE:
real function moistureCorrectionFecan(slc, sand, clay, rhop)
real function moistureCorrectionFecan(slc, sand, clay, b)

! !USES:
implicit NONE
Expand All @@ -228,7 +227,7 @@ real function moistureCorrectionFecan(slc, sand, clay, rhop)
real, intent(in) :: slc ! liquid water content of top soil layer, volumetric fraction [1]
real, intent(in) :: sand ! fractional sand content [1]
real, intent(in) :: clay ! fractional clay content [1]
real, intent(in) :: rhop ! dry dust density [kg m-3]
real, intent(in) :: b ! drylimit factor from zender 2003

! !DESCRIPTION: Compute correction factor to account for Fecal soil moisture
!
Expand All @@ -246,10 +245,10 @@ real function moistureCorrectionFecan(slc, sand, clay, rhop)
! Begin...

! Convert soil moisture from volumetric to gravimetric
grvsoilm = soilMoistureConvertVol2Grav(slc, sand, rhop)
grvsoilm = soilMoistureConvertVol2Grav(slc, sand)

! Compute fecan dry limit
drylimit = clay * (14.0 * clay + 17.0)
drylimit = b * clay * (14.0 * clay + 17.0)

! Compute soil moisture correction
moistureCorrectionFecan = sqrt(1.0 + 1.21 * max(0., grvsoilm - drylimit)**0.68)
Expand Down Expand Up @@ -303,7 +302,7 @@ end function DustFluxV2HRatioMB95
! !INTERFACE:
subroutine DustEmissionFENGSHA(fraclake, fracsnow, oro, slc, clay, sand, silt, &
ssm, rdrag, airdens, ustar, uthrs, alpha, gamma, &
kvhmax, grav, rhop, distribution, emissions, rc)
kvhmax, grav, rhop, distribution, drylimit_factor, moist_correct, emissions, rc)

! !USES:
implicit NONE
Expand All @@ -327,7 +326,8 @@ subroutine DustEmissionFENGSHA(fraclake, fracsnow, oro, slc, clay, sand, silt,
real, intent(in) :: grav ! gravity [m/sec^2]
real, dimension(:), intent(in) :: rhop ! soil class density [kg/m^3]
real, dimension(:), intent(in) :: distribution ! normalized dust binned distribution [1]

real, intent(in) :: drylimit_factor ! drylimit tuning factor from zender2003
real, intent(in) :: moist_correct ! moisture correction factor
! !OUTPUT PARAMETERS:
real, intent(out) :: emissions(:,:,:) ! binned surface emissions [kg/(m^2 sec)]
integer, intent(out) :: rc ! Error return code: __SUCCESS__ or __FAIL__
Expand All @@ -352,6 +352,7 @@ subroutine DustEmissionFENGSHA(fraclake, fracsnow, oro, slc, clay, sand, silt,
real :: rustar
real :: total_emissions
real :: u_sum, u_thresh
real :: smois

! !CONSTANTS:
real, parameter :: ssm_thresh = 1.e-02 ! emit above this erodibility threshold [1]
Expand Down Expand Up @@ -405,24 +406,25 @@ subroutine DustEmissionFENGSHA(fraclake, fracsnow, oro, slc, clay, sand, silt,
! Compute threshold wind friction velocity using drag partition
! -------------------------------------------------------------
rustar = rdrag(i,j) * ustar(i,j)


! Fecan moisture correction
! -------------------------
smois = slc(i,j) * moist_correct
h = moistureCorrectionFecan(smois, sand(i,j), clay(i,j), drylimit_factor)

! Adjust threshold
! ----------------
u_thresh = uthrs(i,j) * h

u_sum = rustar + u_thresh

! Compute Horizontal Saltation Flux according to Eq (9) in Webb et al. (2020)
! ---------------------------------------------------------------------------
q = max(0., rustar - u_thresh) * u_sum * u_sum

! Now compute size-dependent total emission flux
! ----------------------------------------------
do n = 1, nbins
! Fecan moisture correction
! -------------------------
h = moistureCorrectionFecan(slc(i,j), sand(i,j), clay(i,j), rhop(n))

! Adjust threshold
! ----------------
u_thresh = uthrs(i,j) * h

u_sum = rustar + u_thresh

! Compute Horizontal Saltation Flux according to Eq (9) in Webb et al. (2020)
! ---------------------------------------------------------------------------
q = max(0., rustar - u_thresh) * u_sum * u_sum

! Distribute emissions to bins and convert to mass flux (kg s-1)
! --------------------------------------------------------------
emissions(i,j,n) = distribution(n) * total_emissions * q
Expand Down
Loading