diff --git a/bld/build-namelist b/bld/build-namelist
index 5e2b07523f..861beda5c2 100755
--- a/bld/build-namelist
+++ b/bld/build-namelist
@@ -578,6 +578,14 @@ if ($cfg->get('debug')) {
my $prescribe_aerosols = $TRUE;
if ($simple_phys) {$prescribe_aerosols = $FALSE;}
+# CTSM Dust emissions scheme
+my $soil_erod_atm = $FALSE;
+add_default($nl, 'dust_emis_method');
+if ( $nl->get_value('dust_emis_method') =~ /Zender/ ) {
+ add_default($nl, 'zender_soil_erod_source');
+ if ($nl->get_value('zender_soil_erod_source') =~ /atm/) {$soil_erod_atm = $TRUE;}
+}
+
# Chemistry deposition lists
if ( ($chem ne 'none') or ( $prog_species ) ){
my $chem_proc_src = $cfg->get('chem_proc_src');
@@ -1801,7 +1809,7 @@ if ( $prog_species ) {
add_default($nl, 'ghg_chem', 'val'=>".true.");
add_default($nl, 'bndtvg');
}
- if ( $prog_species =~ /DST/ ) {
+ if ( $prog_species =~ /DST/ and $soil_erod_atm =~ /$TRUE/) {
add_default($nl, 'soil_erod_file' );
}
@@ -2091,9 +2099,11 @@ if ($chem =~ /geoschem/) {
add_default($nl, 'flbc_cycle_yr', 'val'=>'2000');
}
- my @files;
# Datasets
- @files = ( 'soil_erod_file', 'flbc_file' );
+ my @files = ( 'flbc_file' );
+ if ($soil_erod_atm =~ /$TRUE/) {
+ @files = ( @files, 'soil_erod_file' );
+ }
foreach my $file (@files) {
add_default($nl, $file);
}
@@ -2132,12 +2142,15 @@ if ($chem =~ /trop_mozart/ or $chem =~ /trop_strat/ or $chem =~ /waccm_tsmlt/) {
my @files;
# Datasets
if ($chem =~ /trop_strat/ or $chem =~ /waccm_tsmlt/) {
- @files = ( 'soil_erod_file', 'flbc_file',
+ @files = ( 'flbc_file',
'xs_coef_file','xs_short_file','xs_long_file', 'rsf_file' );
} else {
- @files = ( 'soil_erod_file', 'flbc_file',
+ @files = ( 'flbc_file',
'xs_coef_file','xs_short_file','xs_long_file', 'rsf_file', 'exo_coldens_file', 'sulf_file' );
}
+ if ($soil_erod_atm =~ /$TRUE/) {
+ @files = ( @files, 'soil_erod_file' );
+ }
foreach my $file (@files) {
add_default($nl, $file);
}
@@ -2235,8 +2248,10 @@ if ($chem eq 'trop_mam3') {
add_default($nl, 'flbc_list', 'val'=>"' '");
# Datasets
- my @files = ('soil_erod_file',
- 'xs_long_file', 'rsf_file', 'exo_coldens_file' );
+ my @files = ( 'xs_long_file', 'rsf_file', 'exo_coldens_file' );
+ if ($soil_erod_atm =~ /$TRUE/) {
+ @files = ( @files, 'soil_erod_file' );
+ }
foreach my $file (@files) {
add_default($nl, $file);
}
@@ -2740,8 +2755,10 @@ if (($chem eq 'trop_mam4') or ($chem eq 'waccm_sc_mam4') or ($chem eq 'ghg_mam4'
add_default($nl, 'flbc_list', 'val'=>"' '");
# Datasets
- my @files = ('soil_erod_file',
- 'xs_long_file', 'rsf_file', 'exo_coldens_file' );
+ my @files = ('xs_long_file', 'rsf_file', 'exo_coldens_file' );
+ if ($soil_erod_atm =~ /$TRUE/) {
+ @files = ( @files, 'soil_erod_file' );
+ }
foreach my $file (@files) {
add_default($nl, $file);
}
@@ -2829,8 +2846,10 @@ if ($chem eq 'trop_mam7') {
add_default($nl, 'flbc_list', 'val'=>"' '");
# Datasets
- my @files = ('soil_erod_file',
- 'xs_long_file', 'rsf_file', 'exo_coldens_file' );
+ my @files = ('xs_long_file', 'rsf_file', 'exo_coldens_file' );
+ if ($soil_erod_atm =~ /$TRUE/) {
+ @files = ( @files, 'soil_erod_file' );
+ }
foreach my $file (@files) {
add_default($nl, $file);
}
@@ -2889,8 +2908,10 @@ if ($chem =~ /waccm_ma/ or $chem =~ /waccm_tsmlt/) {
'photon_file', 'electron_file', 'igrf_geomag_coefs_file',
'euvac_file', 'solar_parms_data_file',
'depvel_lnd_file',
- 'xs_coef_file', 'xs_short_file','xs_long_file', 'rsf_file',
- 'soil_erod_file' );
+ 'xs_coef_file', 'xs_short_file','xs_long_file', 'rsf_file' );
+ if ($soil_erod_atm =~ /$TRUE/) {
+ @files = ( @files, 'soil_erod_file' );
+ }
if (!$waccmx) { @files = (@files, 'tgcm_ubc_file', 'snoe_ubc_file' ); }
@@ -3728,19 +3749,15 @@ if ($cfg->get('microphys') eq 'rk') {
}
# Dust emissions tuning factor
-# If dust is prognostic ==> supply the tuning factor
-if ( length($nl->get_value('soil_erod_file'))>0 ) {
- # check whether turbulent mountain stress parameterization is on
- if ($nl->get_value('do_tms') =~ /$TRUE/io) {
- add_default($nl, 'dust_emis_fact', 'tms'=>'1');
+# check whether turbulent mountain stress parameterization is on
+if ($nl->get_value('do_tms') =~ /$TRUE/io) {
+ add_default($nl, 'dust_emis_fact', 'tms'=>'1');
+} else {
+ if ($chem =~ /trop_strat/ or $chem =~ /geoschem/ or $chem =~ /waccm_ma/ or $chem =~ /waccm_tsmlt/ or $chem =~ /trop_mozart/) {
+ add_default($nl, 'dust_emis_fact', 'ver'=>'chem');
}
else {
- if ($chem =~ /trop_strat/ or $chem =~ /geoschem/ or $chem =~ /waccm_ma/ or $chem =~ /waccm_tsmlt/ or $chem =~ /trop_mozart/) {
- add_default($nl, 'dust_emis_fact', 'ver'=>'chem');
- }
- else {
- add_default($nl, 'dust_emis_fact');
- }
+ add_default($nl, 'dust_emis_fact');
}
}
if (chem_has_species($cfg, 'NO')) {
@@ -4449,7 +4466,7 @@ my %nl_group = ();
foreach my $name (@nl_groups) { $nl_group{$name} = ''; }
# Dry deposition, MEGAN VOC emis and ozone namelists
-@comp_groups = qw(drydep_inparm megan_emis_nl fire_emis_nl carma_inparm ndep_inparm ozone_coupling_nl lightning_coupling_nl);
+@comp_groups = qw(drydep_inparm megan_emis_nl fire_emis_nl carma_inparm ndep_inparm ozone_coupling_nl lightning_coupling_nl dust_emis_inparm);
$outfile = "$opts{'dir'}/drv_flds_in";
$nl->write($outfile, 'groups'=>\@comp_groups);
diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml
index 8a8f649839..e11f21e5a1 100644
--- a/bld/namelist_files/namelist_defaults_cam.xml
+++ b/bld/namelist_files/namelist_defaults_cam.xml
@@ -2543,6 +2543,10 @@
0.9D0
0.9D0
+
+Zender_2003
+atm
+
1.35D0
diff --git a/bld/namelist_files/namelist_definition.xml b/bld/namelist_files/namelist_definition.xml
index 022b520ee6..b1167e987b 100644
--- a/bld/namelist_files/namelist_definition.xml
+++ b/bld/namelist_files/namelist_definition.xml
@@ -7704,6 +7704,21 @@ List of fluxes needed by the CARMA model, from CLM to CAM.
Default: set by build-namelist.
+
+Which dust emission method is going to be used.
+Either the Zender 2003 scheme or the Leung 2023 scheme.
+Default: Zender_2003
+
+
+
+Option only applying for the Zender_2003 method for whether the soil erodibility
+file is handled in the active LAND model or in the ATM model.
+(only used when dust_emis_method is Zender_2003)
+Default: atm
+
+
+
+
+ FALSE
+
+
+
diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml
index 68a0ddbac3..2865df7aae 100644
--- a/cime_config/testdefs/testlist_cam.xml
+++ b/cime_config/testdefs/testlist_cam.xml
@@ -1514,7 +1514,7 @@
-
+
@@ -2023,7 +2023,7 @@
-
+
@@ -2263,7 +2263,7 @@
-
+
diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/shell_commands b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/shell_commands
new file mode 100644
index 0000000000..eb40ad83e0
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/shell_commands
@@ -0,0 +1,2 @@
+./xmlchange ROF_NCPL=\$ATM_NCPL
+./xmlchange GLC_NCPL=\$ATM_NCPL
diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_cam
new file mode 100644
index 0000000000..351fe92801
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_cam
@@ -0,0 +1,9 @@
+dust_emis_method = 'Leung_2023'
+
+fincl2 = 'dst_a1SF', 'dst_a2SF', 'dst_a3SF'
+
+mfilt=1,1,1,1,1,1
+ndens=1,1,1,1,1,1
+nhtfrq=9,9,9,9,9,9
+write_nstep0=.true.
+inithist='ENDOFRUN'
diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_clm b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_clm
new file mode 100644
index 0000000000..0d83b5367b
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_clm
@@ -0,0 +1,27 @@
+!----------------------------------------------------------------------------------
+! Users should add all user specific namelist changes below in the form of
+! namelist_var = new_namelist_value
+!
+! Include namelist variables for drv_flds_in ONLY if -megan and/or -drydep options
+! are set in the CLM_NAMELIST_OPTS env variable.
+!
+! EXCEPTIONS:
+! Set use_cndv by the compset you use and the CLM_BLDNML_OPTS -dynamic_vegetation setting
+! Set use_vichydro by the compset you use and the CLM_BLDNML_OPTS -vichydro setting
+! Set use_cn by the compset you use and CLM_BLDNML_OPTS -bgc setting
+! Set use_crop by the compset you use and CLM_BLDNML_OPTS -crop setting
+! Set spinup_state by the CLM_BLDNML_OPTS -bgc_spinup setting
+! Set irrigate by the CLM_BLDNML_OPTS -irrig setting
+! Set dtime with L_NCPL option
+! Set fatmlndfrc with LND_DOMAIN_PATH/LND_DOMAIN_FILE options
+! Set finidat with RUN_REFCASE/RUN_REFDATE/RUN_REFTOD options for hybrid or branch cases
+! (includes $inst_string for multi-ensemble cases)
+! Set glc_grid with CISM_GRID option
+! Set glc_smb with GLC_SMB option
+! Set maxpatch_glcmec with GLC_NEC option
+! Set glc_do_dynglacier with GLC_TWO_WAY_COUPLING env variable
+!----------------------------------------------------------------------------------
+hist_nhtfrq = 9
+hist_mfilt = 1
+hist_ndens = 1
+
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 547c184bb2..391de001e2 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,5 +1,190 @@
===============================================================
+Tag name: cam6_4_028
+Originator(s): fvitt
+Date: 4 Sep 2024
+One-line Summary: Add capability to use Leung dust emission scheme
+Github PR URL: https://github.com/ESCOMP/CAM/pull/1104
+
+Purpose of changes (include the issue number and title text for each relevant GitHub issue):
+
+ Add the capability to use Leung_2023 land model dust emission scheme.
+ Zender_2003 is the default scheme for all F compsets.
+ (issues #141 and #654)
+
+ NOTE: This reverts cam7 compsets back to Zender_2003 dust emissions.
+ In tag cam6_4_027 cam7 compsets dust emissions scheme defaulted to
+ Leung_2023 and where not properly scaled.
+
+Describe any changes made to build system: N/A
+
+Describe any changes made to the namelist: N/A
+
+List any changes to the defaults for the boundary datasets: N/A
+
+Describe any substantial timing or memory changes: N/A
+
+Code reviewed by: ekluzek, cacraigucar
+
+List all files eliminated: N/A
+
+List all files added and what they do:
+A cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/shell_commands
+A cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_cam
+A cime_config/testdefs/testmods_dirs/cam/outfrq9s_Leung_dust/user_nl_clm
+ - add test for Leung_2023 dust emis scheme
+
+List all existing files that have been modified, and describe the changes:
+M bld/build-namelist
+M bld/namelist_files/namelist_defaults_cam.xml
+ - set default dust emis namelist settings (Zender_2003 is the default scheme)
+
+M bld/namelist_files/namelist_definition.xml
+ - new dust emis namelist vars:
+ . dust_emis_method ('Zender_2003' or 'Leung_2023')
+ . zend_soil_erod_source ('atm' or 'lnd')
+
+M cime_config/config_compsets.xml
+ - override the 'LND_SETS_DUST_EMIS_DRV_FLDS' xml setting to be FALSE for cam7/clm6 F compsets
+
+M cime_config/testdefs/testlist_cam.xml
+ - increase time for aux_cam HEMCO test
+ - regression test Leung_2023 dust emis scheme
+
+M src/chemistry/bulk_aero/dust_model.F90
+M src/chemistry/modal_aero/dust_model.F90
+ - use soil_erod only if Zender scheme is used
+
+If there were any failures reported from running test_driver.sh on any test
+platform, and checkin with these failures has been OK'd by the gatekeeper,
+then copy the lines from the td.*.status files for the failed tests to the
+appropriate machine below. All failed tests must be justified.
+
+derecho/intel/aux_cam:
+ PEND SMS_D_Ln9_P1280x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.derecho_intel.cam-outfrq9s
+ - pre-existing failures -- need fix in CLM external
+
+ FAIL ERP_Ln9.f09_f09_mg17.FCSD_HCO.derecho_intel.cam-outfrq9s COMPARE_base_rest
+ - pre-existing failure due to HEMCO not having reproducible results issues #1018 and #856
+
+ DIFF ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.derecho_intel.cam-outfrq9s
+ DIFF ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.derecho_intel.cam-outfrq9s_rrtmgp
+ DIFF SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FCts4MTHIST.derecho_intel.cam-outfrq9s
+ DIFF SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.derecho_intel.cam-outfrq9s
+ - differences due to switching dust emis scheme from Leung_2023 to Zender_2003
+
+ DIFF SMS_D_Ln9_P1280x1.ne30pg3_ne30pg3_mg17.FCLTHIST.derecho_intel.cam-outfrq9s_Leung_dust
+ - new reg test -- no baseline to compare against
+
+ NLFAIL ERC_D_Ln9.f19_f19_mg17.QPC6.derecho_intel.cam-outfrq3s_cosp
+ NLFAIL ERC_D_Ln9.f19_f19_mg17.QPMOZ.derecho_intel.cam-outfrq3s
+ NLFAIL ERC_D_Ln9.f19_f19_mg17.QPX2000.derecho_intel.cam-outfrq3s
+ NLFAIL ERC_D_Ln9.ne16_ne16_mg17.FADIAB.derecho_intel.cam-terminator
+ NLFAIL ERC_D_Ln9.ne16_ne16_mg17.QPC5HIST.derecho_intel.cam-outfrq3s_usecase
+ NLFAIL ERC_D_Ln9_P144x1.ne16pg3_ne16pg3_mg17.QPC6HIST.derecho_intel.cam-outfrq3s_ttrac_usecase
+ NLFAIL ERC_D_Ln9.T42_T42_mg17.FDABIP04.derecho_intel.cam-outfrq3s_usecase
+ NLFAIL ERC_D_Ln9.T42_T42_mg17.FHS94.derecho_intel.cam-outfrq3s_usecase
+ NLFAIL ERI_D_Ln18.f45_f45_mg37.QPC41850.derecho_intel.cam-co2rmp_usecase
+ NLFAIL ERP_D_Ln9.f19_f19_mg17.QPC6.derecho_intel.cam-outfrq9s
+ NLFAIL ERP_D_Ln9_P64x2.f09_f09_mg17.QSC6.derecho_intel.cam-outfrq9s
+ NLFAIL ERP_Ln9_P24x3.f45_f45_mg37.QPWmaC6.derecho_intel.cam-outfrq9s_mee_fluxes
+ NLFAIL ERS_Ln9.f19_f19_mg17.FSPCAMS.derecho_intel.cam-outfrq9s
+ NLFAIL ERS_Ln9.ne0TESTONLYne5x4_ne0TESTONLYne5x4_mg37.FADIAB.derecho_intel.cam-outfrq3s_refined
+ NLFAIL SCT_D_Ln7.ne3_ne3_mg37.QPC5.derecho_intel.cam-scm_prep
+ NLFAIL SCT_D_Ln7.T42_T42_mg17.QPC5.derecho_intel.cam-scm_prep
+ NLFAIL SMS_D_Ld2.f19_f19_mg17.QPC5HIST.derecho_intel.cam-volc_usecase
+ NLFAIL SMS_D_Ld5.f19_f19_mg17.PC4.derecho_intel.cam-cam4_port5d
+ NLFAIL SMS_D_Ln9.f19_f19_mg17.QPC2000climo.derecho_intel.cam-outfrq3s_usecase
+ NLFAIL SMS_D_Ln9.f19_f19_mg17.QPC5M7.derecho_intel.cam-outfrq9s
+ NLFAIL SMS_D_Ln9.ne16_ne16_mg17.QPX2000.derecho_intel.cam-outfrq9s
+ NLFAIL SMS_Ld5.f09_f09_mg17.PC6.derecho_intel.cam-cam6_port_f09
+ NLFAIL SMS_Ln9.f19_f19_mg17.FHIST.derecho_intel.cam-outfrq9s_nochem
+ - namelist compare failures due to dust_emis_inparm namelist in drv_flds_in
+ otherwise bit-for-bit
+
+derecho/nvhpc/aux_cam:
+ DIFF ERS_Ln9_G4-a100-openacc.ne30pg3_ne30pg3_mg17.F2000dev.derecho_nvhpc.cam-outfrq9s_mg3_default
+ - difference due to switching dust emis scheme from Leung_2023 to Zender_2003
+
+izumi/nag/aux_cam:
+ FAIL DAE.f45_f45_mg37.FHS94.izumi_nag.cam-dae
+ - pre-existing failure - issue #670
+
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QSPCAMS.izumi_nag.cam-outfrq3s
+ NLFAIL ERC_D_Ln9.mpasa480z32_mpasa480.FHS94.izumi_nag.cam-outfrq3s_usecase
+ NLFAIL ERC_D_Ln9.ne16_ne16_mg17.QPC4.izumi_nag.cam-outfrq3s_usecase
+ NLFAIL ERC_D_Ln9.ne16pg3_ne16pg3_mg17.QPC4.izumi_nag.cam-outfrq3s_usecase
+ NLFAIL ERC_D_Ln9.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac
+ NLFAIL ERC_D_Ln9.T5_T5_mg37.QPC4.izumi_nag.cam-outfrq3s_usecase
+ NLFAIL ERI_D_Ln18.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac
+ NLFAIL ERI_D_Ln18.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8
+ NLFAIL ERI_D_Ln18.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq3s_bwic
+ NLFAIL ERI_D_Ln18.ne5pg3_ne5pg3_mg37.FADIAB.izumi_nag.cam-outfrq3s_bwic
+ NLFAIL ERP_Ln9.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf
+ NLFAIL ERS_Ln27.ne5pg3_ne5pg3_mg37.FKESSLER.izumi_nag.cam-outfrq9s
+ NLFAIL ERS_Ln9.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq9s
+ NLFAIL PEM_D_Ln9.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq3s
+ NLFAIL PLB_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0
+ NLFAIL PLB_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1
+ NLFAIL PLB_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3
+ NLFAIL PLB_D_Ln9.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0
+ NLFAIL PLB_D_Ln9.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1
+ NLFAIL PLB_D_Ln9.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3
+ NLFAIL SMS_D_Ld2.f45_f45_mg37.PC5.izumi_nag.cam-outfrq24h_port
+ NLFAIL SMS_D_Ln3.ne5pg3_ne5pg3_mg37.QPX2000.izumi_nag.cam-outfrq3s
+ NLFAIL SMS_D_Ln6.ne5_ne5_mg37.QPWmaC4.izumi_nag.cam-outfrq3s_physgrid_tem
+ NLFAIL SMS_D_Ln7.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm
+ NLFAIL SMS_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam
+ NLFAIL SMS_D_Ln9.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_ba
+ NLFAIL SMS_D_Ln9_P1x1.ne5_ne5_mg37.FADIAB.izumi_nag.cam-outfrq3s
+ NLFAIL SMS_P48x1_D_Ln3.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase
+ NLFAIL SUB_D_Ln9.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s
+ NLFAIL TMC_D.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac
+ NLFAIL TMC_D.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8
+ - namelist compare failures due to dust_emis_inparm namelist in drv_flds_in
+ otherwise bit-for-bit
+
+izumi/gnu/aux_cam:
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.FADIAB.izumi_gnu.cam-terminator
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPC5.izumi_gnu.cam-rad_diag
+ NLFAIL ERC_D_Ln9.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s
+ NLFAIL ERC_D_Ln9.ne5_ne5_mg37.QPC4.izumi_gnu.cam-outfrq3s_nudging_ne5_L26
+ NLFAIL ERC_D_Ln9.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq3s_ba
+ NLFAIL ERC_D_Ln9.ne5pg2_ne5pg2_mg37.FADIAB.izumi_gnu.cam-outfrq3s
+ NLFAIL ERC_D_Ln9.ne5pg3_ne5pg3_mg37.FADIAB.izumi_gnu.cam-outfrq3s
+ NLFAIL ERI_D_Ln18.T5_T5_mg37.QPC4.izumi_gnu.cam-co2rmp
+ NLFAIL ERP_D_Ln9.C48_C48_mg17.QPC6.izumi_gnu.cam-outfrq9s
+ NLFAIL ERP_D_Ln9.ne3pg3_ne3pg3_mg37.QPC6.izumi_gnu.cam-outfrq9s_rrtmgp
+ NLFAIL ERP_Ln9.ne5_ne5_mg37.FHS94.izumi_gnu.cam-outfrq9s
+ NLFAIL ERP_Ln9.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s
+ NLFAIL PEM_D_Ln9.ne5pg3_ne5pg3_mg37.FADIAB.izumi_gnu.cam-outfrq3s
+ NLFAIL PLB_D_Ln9.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0
+ NLFAIL PLB_D_Ln9.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1
+ NLFAIL PLB_D_Ln9.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3
+ NLFAIL SCT_D_Ln7.ne3_ne3_mg37.QPC6.izumi_gnu.cam-scm_prep_c6
+ NLFAIL SCT_D_Ln7.T42_T42_mg17.QPC4.izumi_gnu.cam-scm_prep
+ NLFAIL SCT_D_Ln7.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6
+ NLFAIL SMS_D_Ln3.f10_f10_mg37.QPMOZ.izumi_gnu.cam-outfrq3s_chemproc
+ NLFAIL SMS_D_Ln9.f10_f10_mg37.QPWmaC4.izumi_gnu.cam-outfrq9s_apmee
+ NLFAIL SMS_D_Ln9.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac
+ NLFAIL SMS_Ld5.f09_f09_mg17.PC6.izumi_gnu.cam-cam6_port_f09_rrtmgp
+ - namelist compare failures due to dust_emis_inparm namelist in drv_flds_in
+ otherwise bit-for-bit
+
+Summarize any changes to answers: larger than roundoff for cam7, otherwise bit-for-bit
+
+===============================================================
+===============================================================
+
Tag name: cam6_4_027
Originator(s): fvitt
Date: 3 Sep 2024
diff --git a/src/chemistry/bulk_aero/dust_model.F90 b/src/chemistry/bulk_aero/dust_model.F90
index 1a0ff4c5aa..6b559200c6 100644
--- a/src/chemistry/bulk_aero/dust_model.F90
+++ b/src/chemistry/bulk_aero/dust_model.F90
@@ -1,10 +1,12 @@
!===============================================================================
! Dust for Bulk Aerosol Model
!===============================================================================
-module dust_model
+module dust_model
use shr_kind_mod, only: r8 => shr_kind_r8, cl => shr_kind_cl
use spmd_utils, only: masterproc
use cam_abortutils, only: endrun
+ use cam_logfile, only: iulog
+ use shr_dust_emis_mod,only: is_dust_emis_zender, is_zender_soil_erod_from_atm
implicit none
private
@@ -34,8 +36,9 @@ module dust_model
real(r8) :: dust_dmt_vwr(dust_nbin)
real(r8) :: dust_stk_crc(dust_nbin)
- real(r8) :: dust_emis_fact = -1.e36_r8 ! tuning parameter for dust emissions
- character(len=cl) :: soil_erod_file = 'soil_erod_file' ! full pathname for soil erodibility dataset
+ real(r8) :: dust_emis_fact = -1.e36_r8 ! tuning parameter for dust emissions
+ character(len=cl) :: soil_erod_file = 'none' ! full pathname for soil erodibility dataset
+
contains
!=============================================================================
@@ -44,8 +47,8 @@ module dust_model
subroutine dust_readnl(nlfile)
use namelist_utils, only: find_group_name
- use units, only: getunit, freeunit
- use mpishorthand
+ use spmd_utils, only: mpicom, masterprocid, mpi_character, mpi_real8, mpi_success
+ use shr_dust_emis_mod, only: shr_dust_emis_readnl
character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input
@@ -59,8 +62,7 @@ subroutine dust_readnl(nlfile)
! Read namelist
if (masterproc) then
- unitn = getunit()
- open( unitn, file=trim(nlfile), status='old' )
+ open( newunit=unitn, file=trim(nlfile), status='old' )
call find_group_name(unitn, 'dust_nl', status=ierr)
if (ierr == 0) then
read(unitn, dust_nl, iostat=ierr)
@@ -69,14 +71,34 @@ subroutine dust_readnl(nlfile)
end if
end if
close(unitn)
- call freeunit(unitn)
end if
-#ifdef SPMD
! Broadcast namelist variables
- call mpibcast(dust_emis_fact, 1, mpir8, 0, mpicom)
- call mpibcast(soil_erod_file, len(soil_erod_file), mpichar, 0, mpicom)
-#endif
+ call mpi_bcast(soil_erod_file, len(soil_erod_file), mpi_character, masterprocid, mpicom, ierr)
+ if (ierr/=mpi_success) then
+ call endrun(subname//' MPI_BCAST ERROR: soil_erod_file')
+ end if
+ call mpi_bcast(dust_emis_fact, 1, mpi_real8, masterprocid, mpicom, ierr)
+ if (ierr/=mpi_success) then
+ call endrun(subname//' MPI_BCAST ERROR: dust_emis_fact')
+ end if
+
+ call shr_dust_emis_readnl(mpicom, 'drv_flds_in')
+
+ if ((soil_erod_file /= 'none') .and. (.not.is_zender_soil_erod_from_atm())) then
+ call endrun(subname//': should not specify soil_erod_file if Zender soil erosion is not in CAM')
+ end if
+
+ if (masterproc) then
+ if (is_dust_emis_zender()) then
+ write(iulog,*) subname,': Zender_2003 dust emission method is being used.'
+ end if
+ if (is_zender_soil_erod_from_atm()) then
+ write(iulog,*) subname,': Zender soil erod file is handled in atm'
+ write(iulog,*) subname,': soil_erod_file = ',trim(soil_erod_file)
+ write(iulog,*) subname,': dust_emis_fact = ',dust_emis_fact
+ end if
+ end if
end subroutine dust_readnl
@@ -95,7 +117,9 @@ subroutine dust_init()
dust_active = any(dust_indices(:) > 0)
if (.not.dust_active) return
- call soil_erod_init( dust_emis_fact, soil_erod_file )
+ if (is_zender_soil_erod_from_atm()) then
+ call soil_erod_init( dust_emis_fact, soil_erod_file )
+ endif
call dust_set_params( dust_nbin, dust_dmt_grd, dust_dmt_vwr, dust_stk_crc )
@@ -106,6 +130,7 @@ end subroutine dust_init
subroutine dust_emis( ncol, lchnk, dust_flux_in, cflx, soil_erod )
use soil_erod_mod, only : soil_erod_fact
use soil_erod_mod, only : soil_erodibility
+ use cam_history_support, only : fillvalue
! args
integer, intent(in) :: ncol, lchnk
@@ -115,25 +140,44 @@ subroutine dust_emis( ncol, lchnk, dust_flux_in, cflx, soil_erod )
! local vars
integer :: i, m, idst
+ real(r8) :: erodfctr(ncol)
real(r8), parameter :: dust_emis_sclfctr(dust_nbin) &
= (/ 0.011_r8/0.032456_r8, 0.087_r8/0.174216_r8, 0.277_r8/0.4085517_r8, 0.625_r8/0.384811_r8 /)
! set dust emissions
- col_loop: do i =1,ncol
+ if (is_zender_soil_erod_from_atm()) then
+
+ col_loop1: do i =1,ncol
+
+ soil_erod(i) = soil_erodibility( i, lchnk )
+
+ ! adjust emissions
+ do m = 1,dust_nbin
+
+ idst = dust_indices(m)
+ cflx(i,idst) = -dust_flux_in(i,m) &
+ * dust_emis_sclfctr(m)*soil_erod(i)/dust_emis_fact*1.15_r8
- soil_erod(i) = soil_erodibility( i, lchnk )
+ enddo
- ! adjust emissions based on soil erosion
- do m = 1,dust_nbin
+ end do col_loop1
- idst = dust_indices(m)
- cflx(i,idst) = -dust_flux_in(i,m) &
- * dust_emis_sclfctr(m)*soil_erod(i)/soil_erod_fact*1.15_r8
+ else
- enddo
+ col_loop2: do i =1,ncol
- end do col_loop
+ ! adjust emissions
+ do m = 1,dust_nbin
+
+ idst = dust_indices(m)
+ cflx(i,idst) = -dust_flux_in(i,m) * dust_emis_sclfctr(m) / dust_emis_fact
+
+ enddo
+
+ end do col_loop2
+
+ end if
end subroutine dust_emis
diff --git a/src/chemistry/modal_aero/dust_model.F90 b/src/chemistry/modal_aero/dust_model.F90
index 923ab9e3db..6213c47636 100644
--- a/src/chemistry/modal_aero/dust_model.F90
+++ b/src/chemistry/modal_aero/dust_model.F90
@@ -6,6 +6,8 @@ module dust_model
use spmd_utils, only: masterproc
use cam_abortutils, only: endrun
use modal_aero_data, only: ntot_amode, ndst=>nDust
+ use cam_logfile, only: iulog
+ use shr_dust_emis_mod,only: is_dust_emis_zender, is_zender_soil_erod_from_atm
implicit none
private
@@ -30,8 +32,8 @@ module dust_model
real(r8), allocatable :: dust_dmt_vwr(:)
real(r8), allocatable :: dust_stk_crc(:)
- real(r8) :: dust_emis_fact = -1.e36_r8 ! tuning parameter for dust emissions
- character(len=cl) :: soil_erod_file = 'soil_erod_file' ! full pathname for soil erodibility dataset
+ real(r8) :: dust_emis_fact = 0._r8 ! tuning parameter for dust emissions
+ character(len=cl) :: soil_erod_file = 'none' ! full pathname for soil erodibility dataset
logical :: dust_active = .false.
@@ -43,8 +45,8 @@ module dust_model
subroutine dust_readnl(nlfile)
use namelist_utils, only: find_group_name
- use units, only: getunit, freeunit
- use mpishorthand
+ use spmd_utils, only: mpicom, masterprocid, mpi_character, mpi_real8, mpi_success
+ use shr_dust_emis_mod, only: shr_dust_emis_readnl
character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input
@@ -58,8 +60,7 @@ subroutine dust_readnl(nlfile)
! Read namelist
if (masterproc) then
- unitn = getunit()
- open( unitn, file=trim(nlfile), status='old' )
+ open( newunit=unitn, file=trim(nlfile), status='old' )
call find_group_name(unitn, 'dust_nl', status=ierr)
if (ierr == 0) then
read(unitn, dust_nl, iostat=ierr)
@@ -68,14 +69,34 @@ subroutine dust_readnl(nlfile)
end if
end if
close(unitn)
- call freeunit(unitn)
end if
-#ifdef SPMD
! Broadcast namelist variables
- call mpibcast(dust_emis_fact, 1, mpir8, 0, mpicom)
- call mpibcast(soil_erod_file, len(soil_erod_file), mpichar, 0, mpicom)
-#endif
+ call mpi_bcast(soil_erod_file, len(soil_erod_file), mpi_character, masterprocid, mpicom, ierr)
+ if (ierr/=mpi_success) then
+ call endrun(subname//' MPI_BCAST ERROR: soil_erod_file')
+ end if
+ call mpi_bcast(dust_emis_fact, 1, mpi_real8, masterprocid, mpicom, ierr)
+ if (ierr/=mpi_success) then
+ call endrun(subname//' MPI_BCAST ERROR: dust_emis_fact')
+ end if
+
+ call shr_dust_emis_readnl(mpicom, 'drv_flds_in')
+
+ if ((soil_erod_file /= 'none') .and. (.not.is_zender_soil_erod_from_atm())) then
+ call endrun(subname//': should not specify soil_erod_file if Zender soil erosion is not in CAM')
+ end if
+
+ if (masterproc) then
+ if (is_dust_emis_zender()) then
+ write(iulog,*) subname,': Zender_2003 dust emission method is being used.'
+ end if
+ if (is_zender_soil_erod_from_atm()) then
+ write(iulog,*) subname,': Zender soil erod file is handled in atm'
+ write(iulog,*) subname,': soil_erod_file = ',trim(soil_erod_file)
+ write(iulog,*) subname,': dust_emis_fact = ',dust_emis_fact
+ end if
+ end if
end subroutine dust_readnl
@@ -131,7 +152,9 @@ subroutine dust_init()
dust_active = any(dust_indices(:) > 0)
if (.not.dust_active) return
- call soil_erod_init( dust_emis_fact, soil_erod_file )
+ if (is_zender_soil_erod_from_atm()) then
+ call soil_erod_init( dust_emis_fact, soil_erod_file )
+ end if
call dust_set_params( dust_nbin, dust_dmt_grd, dust_dmt_vwr, dust_stk_crc )
@@ -158,29 +181,36 @@ subroutine dust_emis( ncol, lchnk, dust_flux_in, cflx, soil_erod )
! set dust emissions
- col_loop: do i =1,ncol
-
- soil_erod(i) = soil_erodibility( i, lchnk )
-
- if( soil_erod(i) .lt. soil_erod_threshold ) soil_erod(i) = 0._r8
-
- ! rebin and adjust dust emissons..
- do m = 1,dust_nbin
-
- idst = dust_indices(m)
-
- cflx(i,idst) = sum( -dust_flux_in(i,:) ) &
- * dust_emis_sclfctr(m)*soil_erod(i)/soil_erod_fact*1.15_r8
-
- x_mton = 6._r8 / (pi * dust_density * (dust_dmt_vwr(m)**3._r8))
-
- inum = dust_indices(m+dust_nbin)
-
- cflx(i,inum) = cflx(i,idst)*x_mton
-
- enddo
-
- end do col_loop
+ if (is_zender_soil_erod_from_atm()) then
+ 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
+
+ ! rebin and adjust dust emissons.
+ do m = 1,dust_nbin
+ idst = dust_indices(m)
+ cflx(i,idst) = sum( -dust_flux_in(i,:) ) &
+ * dust_emis_sclfctr(m)*soil_erod(i)/dust_emis_fact*1.15_r8
+ x_mton = 6._r8 / (pi * dust_density * (dust_dmt_vwr(m)**3._r8))
+ inum = dust_indices(m+dust_nbin)
+ cflx(i,inum) = cflx(i,idst)*x_mton
+ enddo
+ enddo col_loop1
+ else ! Leung emissions
+
+ col_loop2: do i = 1,ncol
+ ! rebin and adjust dust emissons.
+ do m = 1,dust_nbin
+ idst = dust_indices(m)
+
+ cflx(i,idst) = sum( -dust_flux_in(i,:) ) &
+ * dust_emis_sclfctr(m) / dust_emis_fact
+ x_mton = 6._r8 / (pi * dust_density * (dust_dmt_vwr(m)**3._r8))
+ inum = dust_indices(m+dust_nbin)
+ cflx(i,inum) = cflx(i,idst)*x_mton
+ enddo
+ enddo col_loop2
+ end if
end subroutine dust_emis