A new physically based dust emission scheme with more aeolian physics (updated)
This is an updated version of proposed code changes based on the recent ctsm version (ctsm5.1.dev106-7). This PR will replace the previous PR (#1712) with code changes based on the older clm version (release-clm5.0.35-14). PR #1712 will be closed later. The descriptions below are slightly modified but largely the same as those in PR #1712.
Description of changes This is a scheme that builds upon issue https://github.com/ESCOMP/CTSM/issues/1230 and https://github.com/ESCOMP/CTSM/issues/1604 which switched CESM2's default dust emission scheme (Zender et al., 2003) to @jfkok's more physical and less empirical one (Kok et al., 2014). Based on https://github.com/ESCOMP/CTSM/issues/1230 's edits, https://github.com/ESCOMP/CTSM/issues/1604 's modifications add new aeolian physics to the Kok's scheme, most notably, by adding the roughness effect (or called drag partition effect) which discounts surface soil erosion by winds due to the presence of local-scale land-surface roughness elements (mostly plants and rocks). We use a hybrid approach to account for both roughness from rocks (with a 2-D time-invariant dataset provided by Prigent et al., 2005; 2012) and roughness from plants (time-varying, as a function of CLM's LAI). We further include the dust emission intermittency effects due to boundary-layer turbulence.
Changes in files mainly include: src/biogeochem/DUSTMod.F90 src/biogeophys/SoilStateInitTimeConstMod.F90 (Updates on 3 Feb 2023: Current method: reading in Prigent's small-scale roughness dataset following the streams approach) src/cpl/share_esmf/PrigentRoughnessStreamType.F90 src/main/clm_inst.F90 bld/namelist_files/namelist_defaults_ctsm.xml bld/CLMBuildNamelist.pm bld/namelist_files/namelist_definition_ctsm.xml
(Old method to be removed: reading in Prigent's small-scale roughness dataset following the fsurdat approach) src/biogeophys/SoilStateType.F90 src/main/controlMod.F90 src/main/clm_varctl.F90 bld/namelist_files/namelist_definition_ctsm.xml user_nl_cam user_nl_clm
Specific notes CAM applies a source function (for Charlie Zender’s scheme) to the CLM dust emissions. In CESM, the dust emission calculation isn’t finished in CLM and is further processed in CAM before CAM calculates the transport. Because of this, when changing from Zender's scheme to our scheme one also needs to comment out the code block in CAM relevant to the source function. The relevant changes should be made in this file: cam/src/chemistry/modal_aero/dust_model.F90 We also posted an issue (#1836 and https://github.com/ESCOMP/CAM/issues/651) to propose moving the source function from CAM to CLM. Francis Vitt has posted a PR (https://github.com/ESCOMP/CAM/pull/748) to remove Zender's source function and global tuning factor from CAM (Updated on 3 Feb 2023).
Contributors other than yourself, if any: @ekluzek
CTSM Issues Fixed (include github issue #): Fixes https://github.com/ESCOMP/CTSM/issues/1604 Are answers expected to change (and if so in what way)? Yes
Any User Interface Changes (namelist or namelist defaults changes)? Yes. For now, mainly bld/namelist_files/namelist_definition_ctsm.xml
Testing performed, if any: The changes above were used to simulate an I case (using GSWP3 met fields) and an F case (CAM6 nudged toward MERRA-2 met fields). They have not been tested following the guideline yet.
Definition of ready:
- [x] Create a dataset based on the Prigent raw data
- [x] Move surface roughness data from surface dataset to streams file using above data
- [x] Convert the surface roughness units from the raw Prigent format to the drag partition needed
- [ ] Make sure can turn new scheme on or off
- [ ] Add testing for the new scheme
- [ ] Normal testing standards, and updated to latest, and schedule when to come in
I ran the test list for the PR as it is, and ran into a bunch of problems on cheyenne, that will need to be resolved. Hopefully, most of these issues are cascading errors from one or two problems and not a long list of individual problems. There was 57 tests that passed, do
In this iteration the new scheme is hardcoded to on, so we don't have to have special tests for the new scheme. But, we want to ensure that the new scheme works in all cases so it's a good to run it in all configurations to see what it fails in.
================================================================================
These tests are pending (some tests may fail in the pending state)
================================================================================
ERP_P36x2_D_Ld5.f10_f10_mg37.I2000Ctsm50NwpSpGswp.cheyenne_intel.clm-default
ERP_P36x2_Ld30.f45_f45_mg37.I2000Clm51FatesSpCruRsGs.cheyenne_intel.clm-FatesColdDefReducedComplexSatPhen
FSURDATMODIFYCTSM_D_Mmpi-serial_Ld1.5x5_amazon.I2000Clm50SpRs.cheyenne_intel
FUNITCTSM_P1x1.f10_f10_mg37.I2000Clm50Sp.cheyenne_intel
LILACSMOKE_D_Ld2.f10_f10_mg37.I2000Ctsm50NwpSpAsRs.cheyenne_intel.clm-lilac
PFS_Ld10_PS.f19_g17.I2000Clm50BgcCrop.cheyenne_intel
SMS_Lm1_D.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-output_crop_highfreq
SMS_Ly1_Mmpi-serial.1x1_brazil.IHistClm50BgcQianRs.cheyenne_intel.clm-output_bgc_highfreq
================================================================================
These tests failed
================================================================================
DAE_C2_D_Lh12.f10_f10_mg37.I2000Clm50BgcCrop.cheyenne_intel.clm-DA_multidrv
DAE_N2_D_Lh12_Vmct.f10_f10_mg37.I2000Clm50BgcCrop.cheyenne_intel.clm-DA_multidrv
ERI_D_Ld9.T31_g37.I2000Clm50Sp.cheyenne_intel.clm-SNICARFRC
ERI_D_Ld9.f10_f10_mg37.I1850Clm45Bgc.cheyenne_gnu.clm-default
ERI_D_Ld9.f10_f10_mg37.I1850Clm51Bgc.cheyenne_gnu.clm-default
ERI_D_Ld9.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_gnu.clm-default
ERI_D_Ld9.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-default
ERI_D_Ld9.ne30_g17.I2000Clm50BgcCru.cheyenne_intel.clm-vrtlay
ERP_D.f10_f10_mg37.IHistClm51Bgc.cheyenne_gnu.clm-decStart
ERP_D.f10_f10_mg37.IHistClm51Bgc.cheyenne_intel.clm-decStart
ERP_D_Ld10.f10_f10_mg37.I1850Clm51BgcCrop.cheyenne_intel.clm-ADspinup
ERP_D_Ld10_P36x2.f10_f10_mg37.IHistClm51BgcCrop.cheyenne_intel.clm-ciso_decStart
ERP_D_Ld10_P36x2_Vmct.f10_f10_mg37.IHistClm51BgcCrop.cheyenne_intel.clm-ciso_decStart
ERP_D_Ld3_P36x2.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_gnu.clm-default
ERP_D_Ld3_P36x2.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-default
ERP_D_Ld3_PS.f09_g17.I2000Clm50Sp.cheyenne_intel.clm-prescribed
ERP_D_Ld3_Vmct_PS.f09_g17.I2000Clm50Sp.cheyenne_intel.clm-prescribed
ERP_D_Ld5.f10_f10_mg37.I1850Clm50Bgc.cheyenne_gnu.clm-drydepnomegan
ERP_D_Ld5.f10_f10_mg37.I1850Clm50BgcCropG.cheyenne_gnu.clm-glcMEC_changeFlags
ERP_D_Ld5.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_gnu.clm-ciso_flexCN_FUN
ERP_D_Ld5.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_gnu.clm-fire_emis
ERP_D_Ld5.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-anoxia
ERP_D_Ld5.f10_f10_mg37.I2000Clm50Sp.cheyenne_gnu.clm-reduceOutput
ERP_D_Ld5.f10_f10_mg37.I2000Clm50Sp.cheyenne_intel.clm-reduceOutput
ERP_D_Ld5.f10_f10_mg37.I2000Clm50Vic.cheyenne_intel.clm-vrtlay
ERP_D_Ld5.f10_f10_mg37.I2000Clm51Sp.cheyenne_intel.clm-decStart
ERP_D_Ld5.f10_f10_mg37.IHistClm45Sp.cheyenne_intel.clm-decStart
ERP_D_Ld5.f10_f10_mg37.IHistClm50BgcCrop.cheyenne_intel.clm-allActive
ERP_D_Ld5.f10_f10_mg37.IHistClm50SpCru.cheyenne_gnu.clm-drydepnomegan
ERP_D_Ld5.f10_f10_mg37.IHistClm51Sp.cheyenne_intel.clm-default
ERP_D_P36x2_Ld3.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_gnu.clm-default
ERP_D_P36x2_Ld3.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-default
ERP_D_P36x2_Ld3.f10_f10_mg37.I1850Clm51BgcCrop.cheyenne_gnu.clm-mimics
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm45BgcCrop.cheyenne_gnu.clm-no_subgrid_fluxes
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_gnu.clm-default
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_gnu.clm-snowveg_norad
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-cn_conly
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-default
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-flexCN_FUN
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-luna
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-noFUN_flexCN
ERP_D_P36x2_Ld3.f10_f10_mg37.I2000Clm51BgcCrop.cheyenne_intel.clm-coldStart
ERP_D_P36x2_Ld30.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-default
ERP_D_P36x2_Ld5.f10_f10_mg37.I2000Clm50BgcCropRtm.cheyenne_intel.clm-irrig_spunup
ERP_D_P36x2_Ld5.f10_f10_mg37.I2000Clm51BgcCrop.cheyenne_intel.clm-irrig_spunup
ERP_P36x2_D.f10_f10_mg37.I2000Clm50SpRtmFl.cheyenne_intel.clm-default
ERP_P36x2_D_Ld10.f10_f10_mg37.IHistClm50SpG.cheyenne_intel.clm-glcMEC_decrease
ERP_P36x2_D_Ld3.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_gnu.clm-extra_outputs
ERP_P36x2_D_Ld5.f10_f10_mg37.I1850Clm45BgcCrop.cheyenne_intel.clm-crop
ERP_P36x2_D_Ld5.f10_f10_mg37.I1850Clm45BgcCru.cheyenne_intel.clm-default
ERP_P36x2_D_Ld5.f10_f10_mg37.I1850Clm50Bgc.cheyenne_intel.clm-ciso
ERP_P36x2_D_Ld5.f10_f10_mg37.I2000Clm45Sp.cheyenne_intel.clm-default
ERP_P36x2_D_Ld5.f10_f10_mg37.I2000Clm50Sp.cheyenne_gnu.clm-default
ERP_P36x2_D_Ld5.f10_f10_mg37.I2000Ctsm50NwpBgcCropGswp.cheyenne_intel.clm-default
ERP_P36x2_D_Ld5.f10_f10_mg37.IHistClm45BgcCru.cheyenne_intel.clm-decStart
ERP_P72x2_D_Ld5.f19_g17_gris4.I1850Clm50BgcCropG.cheyenne_intel.clm-glcMEC_increase
ERP_P72x2_Lm7_Vmct.f10_f10_mg37.I2000Clm50BgcCrop.cheyenne_intel.clm-irrig_alternate_monthly
ERS_D.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-reseedresetsnow
ERS_D_Ld10.f10_f10_mg37.IHistClm50Sp.cheyenne_intel.clm-collapse_pfts_78_to_16_decStart_f10
ERS_D_Ld12.f10_f10_mg37.I1850Clm50BgcCropG.cheyenne_intel.clm-glcMEC_spunup_inc_dec_bgc
ERS_D_Ld3.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_gnu.clm-default
ERS_D_Ld3.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-clm50dynroots
ERS_D_Ld3.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-default
ERS_D_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-deepsoil_bedrock
ERS_D_Ld3_PS.f09_g17.I2000Clm50FatesRs.cheyenne_intel.clm-FatesColdDef
ERS_D_Ld5.f10_f10_mg37.I2000Clm50BgcCropRtm.cheyenne_intel.rtm-rtmOnFloodOnEffvelOn
ERS_D_Ld5.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-default
ERS_D_Ld5.f10_f10_mg37.I2000Clm50Fates.cheyenne_intel.clm-FatesColdDef
ERS_D_Ld5.f10_f10_mg37.IHistClm50BgcQian.cheyenne_intel.clm-ciso_bombspike1963DecStart
ERS_D_Ld5_Mmpi-serial.1x1_mexicocityMEX.I1PtClm50SpRs.cheyenne_gnu.clm-CLM1PTStartDate
ERS_D_Ld5_Vmct.f10_f10_mg37.I2000Clm50BgcCropRtm.cheyenne_intel.rtm-rtmOnFloodOnEffvelOn
ERS_D_Ld6.f10_f10_mg37.I1850Clm45BgcCrop.cheyenne_gnu.clm-clm50CMIP6frc
ERS_D_Ld6.f10_f10_mg37.I1850Clm45BgcCrop.cheyenne_intel.clm-clm50CMIP6frc
ERS_D_Mmpi-serial_Ld5.1x1_brazil.I2000Clm50FatesRs.cheyenne_gnu.clm-FatesColdDef
ERS_D_Mmpi-serial_Ld5.5x5_amazon.I2000Clm50FatesRs.cheyenne_intel.clm-FatesColdDef
ERS_D_Mmpi-serial_Ld5.5x5_amazon.I2000Clm51FatesRs.cheyenne_intel.clm-FatesColdDef
ERS_Ld3_D.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_gnu.clm-rad_hrly_light_res_half
ERS_Ly3_P72x2_Vmct.f10_f10_mg37.IHistClm50BgcCropG.cheyenne_intel.clm-cropMonthOutput
LII2FINIDATAREAS_D_P72x2_Ld1.f09_g17.I1850Clm50BgcCrop.cheyenne_intel.clm-default
LII_D_Ld3_PS.f19_g17.I2000Clm50BgcCrop.cheyenne_intel.clm-default
LVG_Ld5_D.f10_f10_mg37.I1850Clm51Bgc.cheyenne_intel.clm-no_vector_output
PEM_D_Ld5.ne30_g17.I2000Clm50BgcCru.cheyenne_intel.clm-default
PET_P36x2_D.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-default
REUSEINITFILES_D_Ld1.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_gnu.clm-default
SMS_C2_D_Lh12.f10_f10_mg37.I2000Clm50Sp.cheyenne_intel.clm-pauseResume
SMS_D.1x1_brazil.I2000Clm51FatesSpCruRsGs.cheyenne_gnu.clm-FatesColdDefDryDepReducedComplexSatPhen
SMS_D.1x1_brazil.I2000Clm51FatesSpCruRsGs.cheyenne_gnu.clm-FatesColdDefMeganReducedComplexSatPhen
SMS_D.f10_f10_mg37.I2000Clm51BgcCrop.cheyenne_nvhpc.clm-crop EXPECTED
SMS_D_Ld1_Mmpi-serial.f45_f45_mg37.I2000Clm50SpRs.cheyenne_intel.clm-ptsRLA
SMS_D_Ld1_PS.f09_g17.I1850Clm50BgcSpinup.cheyenne_intel.clm-cplhist
SMS_D_Ld1_PS.f09_g17.I1850Clm50Sp.cheyenne_intel.clm-default
SMS_D_Ld1_PS.f19_f19_mg17.I2010Clm50Sp.cheyenne_intel.clm-clm50cam6LndTuningMode
SMS_D_Ld3.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-default
SMS_D_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_gnu.clm-default
SMS_D_Ld3.f10_f10_mg37.I2000Clm50BgcCru.cheyenne_intel.clm-default
SMS_D_Ld3_PS.f09_g17.I1850Clm50BgcNoAnthro.cheyenne_intel.clm-decStart1851_noinitial
SMS_D_Ld5.f10_f10_mg37.I2000Clm45Fates.cheyenne_intel.clm-FatesColdDef
SMS_D_Ld5.f10_f10_mg37.I2000Clm50FatesRs.cheyenne_gnu.clm-FatesColdDef
SMS_D_Ld5.f10_f10_mg37.I2000Clm50FatesRs.cheyenne_intel.clm-FatesColdDef
SMS_D_Ld5.f10_f10_mg37.ISSP126Clm50BgcCrop.cheyenne_intel.clm-datm_ssp126_anom_forc
SMS_D_Lm1_Mmpi-serial.CLM_USRDAT.I1PtClm50SpRs.cheyenne_intel.clm-USUMB_nuopc
SMS_D_Lm6_P144x1.f45_f45_mg37.I2000Clm50FatesRs.cheyenne_intel.clm-FatesColdDef
SMS_D_Ln9_P36x3.f19_g17.IHistClm50Sp.cheyenne_intel.clm-waccmx_offline
SMS_D_Ln9_P36x3_Vmct.f19_g17.IHistClm50Sp.cheyenne_intel.clm-waccmx_offline
SMS_D_Vmct_Lm1_Mmpi-serial.CLM_USRDAT.I1PtClm50SpRs.cheyenne_intel.clm-USUMB_mct
SMS_Ld2_D_PS.f09_g17.I1850Clm50BgcCropCmip6.cheyenne_intel.clm-basic_interp
SMS_Vmct_D_Ld1_PS.f09_g17.I1850Clm50BgcSpinup.cheyenne_intel.clm-cplhist
SSP_D_Ld10.f10_f10_mg37.I1850Clm51Bgc.cheyenne_intel.clm-rtmColdSSP
SSP_D_Ld4.f10_f10_mg37.I1850Clm50BgcCrop.cheyenne_intel.clm-ciso_rtmColdSSP
@dmleung and I went over this today. I'm getting a floating point exception in the following line in the code when DEBUG=TRUE. As you can see at the top a divide by zero is already protected against. We are both going to work on this and come up with a solution that we'll agree on...
if ((12_r8 - 0.5_r8 * stblty(p)) .GE. 0.001_r8) then
u_sd_slt(p) = wnd_frc_slt * (12_r8 - 0.5_r8 * stblty(p))**0.333_r8
else
u_sd_slt(p) = 0.001_r8 ! should have used 0 theoretically; used 0.001 here to avoid undefined values
end if
! threshold velocities
! Here wnd_frc_thr_slt is the fluid threshold; wnd_frc_thr_dry(p) is the dry fluid threshold; B_it*wnd_frc_thr_dry(p) is the impact threshold, -dml, 1 Mar 2021
! fluid threshold wind at 0.1 m saltation height
u_fld_thr(p) = (wnd_frc_thr_slt/k) * log(0.1_r8 / 1e-4_r8)
! impact threshold wind at 0.1 m saltation height
u_impct_thr(p) = (wnd_frc_thr_slt_it/k) * log(0.1_r8 / 1e-4_r8) ! to avoid model error
! threshold crossing rate
thr_crs_rate(p) = (exp((u_fld_thr(p)**2_r8 - u_impct_thr(p)**2_r8 - 2_r8 * u_mean_slt(p) * (u_fld_thr(p) - u_impct_thr(p))) / (2_r8 * u_sd_slt(p)**2_r8)) + 1_r8)**(-1_r8)
@dmleung this is an issue in the base Zender code as well, but wanted to point it out to you as well to make sure I understand it.
The following two things are put together as module data
real(r8) tmp1 !Factor in saltation computation (named as in Charlie's code)
real(r8) dns_aer
The first one (tmp1) should just be local to the one subroutine that uses it. In the Zender code it's used in more than one place, so it might need to handled differently. But, for Leung2023 we might as well make it local to the one place it's used.
The second one (dns_aer) seems to just be a constant and should be made into a parameter.
Let me know if that sounds right.
Ok I'm closing as a wontfix for now.
This will come in as a new capability, but default off for clm6_0 physics. So answers will be bfb for purposes of the tag. But, #2568 will turn it on by default for clm6_0 physics. We likely will do some assessment that the improvements with the new scheme are as expected.
In my latest testing of aux_clm there are a bunch of exact restart tests that fail the comparison of the restart run to the continuous one. For example with this test these fields change:
grep RMS /glade/derecho/scratch/erik/tests_ctsm51D166dustn6acl/ERS_D_Ld10.f10_f10_mg37.IHistClm50Sp.derecho_intel.clm-collapse_pfts_78_to_16_decStart_f10.GC.ctsm51D166dustn6acl_int/run/ERS_D_Ld10.f10_f10_mg37.IHistClm50Sp.derecho_intel.clm-collapse_pfts_78_to_16_decStart_f10.GC.ctsm51D166dustn6acl_int.clm2.h0.2002-01-09-00000.nc.base.cprnc.out
RMS ALPHA_TC_RATE 6.6796E-04 NORMALIZED 4.2737E-02
RMS DSTFLXT 3.4263E-25 NORMALIZED 7.0092E-16
RMS ETA 7.3095E-05 NORMALIZED 4.6776E-03
RMS P_FT 3.6373E-05 NORMALIZED 9.6227E-05
RMS P_IT 7.9064E-04 NORMALIZED 2.3854E-03
RMS U_S_SIGMA 6.7485E-03 NORMALIZED 6.5794E-02
RMS ZETAOBU 5.4465E+00 NORMALIZED 5.7689E-01
And for the cpl file:
grep RMS /glade/derecho/scratch/erik/tests_ctsm51D166dustn6acl/ERS_D_Ld10.f10_f10_mg37.IHistClm50Sp.derecho_intel.clm-collapse_pfts_78_to_16_decStart_f10.GC.ctsm51D166dustn6acl_int/run/ERS_D_Ld10.f10_f10_mg37.IHistClm50Sp.derecho_intel.clm-collapse_pfts_78_to_16_decStart_f10.GC.ctsm51D166dustn6acl_int.cpl.hi.2002-01-09-00000.nc.base.cprnc.out
RMS lndImp_Fall_flxdst1 1.7394E-29 NORMALIZED 1.6879E-18
RMS lndImp_Fall_flxdst2 9.3368E-29 NORMALIZED 1.6879E-18
RMS lndImp_Fall_flxdst3 2.1894E-28 NORMALIZED 1.6879E-18
RMS lndImp_Fall_flxdst4 2.0623E-28 NORMALIZED 1.6879E-18
OK, the above test passed in branch_tags/dustemisdev.n05_ctsm5.1.dev166, so will bisect to find where it fails.
OK, git bisect shows the first commit with the problem as: f488309777bd6cd3ba8ac61bc1d60c4448e905f2. The change is for the stability term used in dust emission to be based on Monin-Obukhov length (obu) as...
stblty(p) = zii / obu(p)
which likely just means that obu needs to be saved to the restart file. It currently isn't so this is very likely the issue.
Adding OBU to the restart file fixes the restart issue. So I'm now rerunning the full test list on Derecho and Izumi.
We recently updated the dustemis_dev branch to dustemisdev.n06_ctsm5.2.006, which uses the updated WISE surface dataset. One issue I saw was that the dust emissions over El Djouf (western Sahara), a main dust source, reduced to a pretty low level, much lower than its surrounding areas (see the left panel below for El Djouf inside a rectangular box; upper panel is dust emission flux and lower panel is dust AOD).
I went back to the code and found out that this change in El Djouf emission is due to the changing clay fraction f_clay using WISE (the older f_clay came from the FAO dataset). f_clay' (f_clay but capped at 0.2 by C. Zender) is a scaling factor of the Leung et al. 2023 dust emission, i.e., flx_mss_vrt_dst_ttl is proportional to mss_frc_cly_vld_col = f_clay' in DUSTMod. El Djouf as a major desert has an f_clay = 0.01 in WISE, constrasting a f_clay = 0.04 in FAO, resulting in a 4-fold reduction in El Djouf dust emissions. Meanwhile, other major deserts have rather little or no change in f_clay from FAO to WISE. So, this abnormally low El Djouf emission is seen in current the CTSM tag.
I thought we need a little tuning to avoid this issue. My thought was to weaken dust emission's clay dependence with some tuning (there were no first principles to justify this change). I finally chose to add a line in the code to limit the scaling factor to vary between 0.1 and 0.2. To do this, I let flx_mss_vrt_dst_ttl to be proportional to (0.1 + f_clay' / 2 ) instead of f_clay' itself. This change is added inside SoilStateInitTimeConstMod.F90 for initialization, and later the scaling factor mss_frc_cly_vld_col = (0.1 + f_clay' / 2 ) is used in DUSTMod.F90. See the new commit (1356d0b). The scaling factor (0.1 + f_clay' / 2 ) still depends on clay fraction but only varies from 0.1-0.2 instead of 0-0.2. Hence, with a more or less globally constant scaling factor that is weakly f_clay' -dependent, the low El Djouf emissions are gone (right panel).
My idea doing this was to reduce but still allow some weak clay dependence, following the spirit of Zender's DEAD scheme and Kok et al. (2014) scheme that dust emission should scale with f_clay'. Zender capped f_clay' at 0.2 as part of the tuning since he did not believe that the clay dataset or the dust emission scheme was good enough to allow full dependence of emission on f_clay. Now, this extra line is also a tuning move, specifically for CESM and not for other models. These tuning measures from Zender and me should be reconsidered to relax (or tighten) every time there are major CESM updates. If we are rewriting the CTSM tech note later, we should state clearly which lines belong to the scheme and which moves are part of the tuning.
I add a plot here to visualize how clay fraction changes from FAO to WISE. f_clay dropped from 0.04 in FAO to 0.01 in WISE.
All the tests with the latest code are failing, so I'll dig in and figure it out.
Testing is passing as expected on Izumi, with only two dust fields that change answers for most tests (56 of the 62 tests change answers, with 4 fails):
RMS DSTFLXT 4.9018E-09 NORMALIZED 7.9843E+00
RMS WND_FRC_SOIL 2.9157E-01 NORMALIZED 2.3801E+00
So this is as expected based on the changes that Danny put in.
Testing on Derecho is basically paused while we wait for Derecho nodes to come back up...
Answers are identical for Zender for the cases:
SMS_Ln9.f09_f09_mg17.I1850Clm45Bgc.derecho_intel.clm-clm45cam4LndTuningModeZDustSoilErod.GC.ctsm5218dustn7acl_int SMS_Ln9.f10_f10_mg37.I1850Clm45Bgc.derecho_intel.clm-clm45cam4LndTuningModeZDustSoilErod.GC.ctsm5218dustn7acl_int SMS_Ln9.f10_f10_mg37.I2000Clm50Sp.derecho_gnu.clm-clm50cam5LndTuningModeZDustSoilErod.GC.ctsm5218dustn7acl_gnu
compared to ctsm5.2.018 with branch_tags/dustemisdev.n07_ctsm5.2.018 using:
$MYGITWORK/dust_dev/cime/CIME/Tools/component_compare_baseline -b $BASELINE/ctsm5.2.018/$case
in each test CASEDIR where case is the name of the baseline directory above. This is an important reassurance that Zender is giving the identical answers.
Tests look as expected. Izumi finished, while Derecho has some tests in the develop queue still running, but I'll let them finish and report on any problems afterwards.