CTSM icon indicating copy to clipboard operation
CTSM copied to clipboard

A new physically based dust emission scheme with more aeolian physics (updated)

Open dmleung opened this issue 3 years ago • 9 comments

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

dmleung avatar Nov 10 '22 22:11 dmleung

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

ekluzek avatar Apr 28 '23 18:04 ekluzek

@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)

ekluzek avatar May 26 '23 22:05 ekluzek

@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.

ekluzek avatar Feb 14 '24 17:02 ekluzek

Ok I'm closing as a wontfix for now.

ekluzek avatar Feb 22 '24 23:02 ekluzek

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.

ekluzek avatar May 30 '24 18:05 ekluzek

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

ekluzek avatar Jun 20 '24 21:06 ekluzek

OK, the above test passed in branch_tags/dustemisdev.n05_ctsm5.1.dev166, so will bisect to find where it fails.

ekluzek avatar Jun 21 '24 20:06 ekluzek

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.

ekluzek avatar Jun 22 '24 03:06 ekluzek

Adding OBU to the restart file fixes the restart issue. So I'm now rerunning the full test list on Derecho and Izumi.

ekluzek avatar Jun 24 '24 22:06 ekluzek

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.

Screenshot 2024-07-08 at 3 15 21 PM

dmleung avatar Jul 08 '24 22:07 dmleung

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.

Screenshot 2024-07-08 at 6 23 38 PM

dmleung avatar Jul 09 '24 00:07 dmleung

All the tests with the latest code are failing, so I'll dig in and figure it out.

ekluzek avatar Jul 11 '24 22:07 ekluzek

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...

ekluzek avatar Jul 17 '24 14:07 ekluzek

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.

ekluzek avatar Aug 09 '24 21:08 ekluzek

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.

ekluzek avatar Aug 11 '24 15:08 ekluzek