diff --git a/.gitmodules b/.gitmodules
index 69ace57fc3..7d566e63ca 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -68,7 +68,7 @@ fxDONOTUSEurl = https://github.com/ESCOMP/mizuRoute
[submodule "ccs_config"]
path = ccs_config
url = https://github.com/ESMCI/ccs_config_cesm.git
-fxtag = ccs_config_cesm1.0.61
+fxtag = ccs_config_cesm1.0.61_add_domain_ne3np4.pg2_1
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESMCI/ccs_config_cesm.git
diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm
index 1071ec1e72..a205dd8ef3 100755
--- a/bld/CLMBuildNamelist.pm
+++ b/bld/CLMBuildNamelist.pm
@@ -735,6 +735,14 @@ sub setup_cmdl_resolution {
$log->verbose_message( "This is NOT a NEON site" );
}
+ #
+ # To determine CMIP era
+ # TODO slevis: Ideally this line would occupy a new subroutine, e.g.
+ # subr. process_envxml_flags that would get called from
+ # process_namelist_user_input. This would allow other such
+ # XML variables to be set in the same place in the future (issue #3547).
+ $nl_flags->{'cmip_era'} = $envxml_ref->{'CLM_CMIP_ERA'};
+
}
#-------------------------------------------------------------------------------
@@ -2367,6 +2375,7 @@ sub setup_logic_urban {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'urban_hac');
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'urban_explicit_ac');
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'urban_traffic');
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'init_interp_fill_missing_urban_with_HD');
}
#-------------------------------------------------------------------------------
@@ -2513,11 +2522,13 @@ sub setup_logic_demand {
# For landuse.timeseries try with crop on first eise try with exact settings
# Logic for this is identical for fsurdat
if ( $item eq "flanduse_timeseries" ) {
+ $settings{'cmip_era'} = $nl_flags->{'cmip_era'};
$settings{'use_crop'} = ".true.";
$settings{'nofail'} = 1;
}
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $item, %settings );
if ( $item eq "flanduse_timeseries" ) {
+ $settings{'cmip_era'} = $nl_flags->{'cmip_era'};
$settings{'nofail'} = 0;
$settings{'use_crop'} = $nl_flags->{'use_crop'};
if ( ! defined($nl->get_value( $item )) ) {
@@ -2567,6 +2578,7 @@ sub setup_logic_surface_dataset {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $var,
'hgrid'=>$nl_flags->{'res'}, 'ssp_rcp'=>$nl_flags->{'ssp_rcp'},
'neon'=>$nl_flags->{'neon'}, 'neonsite'=>$nl_flags->{'neonsite'},
+ 'cmip_era'=>$nl_flags->{'cmip_era'},
'sim_year'=>$nl_flags->{'sim_year'}, 'use_vichydro'=>$nl_flags->{'use_vichydro'},
'use_crop'=>".true.", 'use_fates'=>$nl_flags->{'use_fates'}, 'nofail'=>1);
}
@@ -2580,6 +2592,7 @@ sub setup_logic_surface_dataset {
'hgrid'=>$nl_flags->{'res'}, 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'use_vichydro'=>$nl_flags->{'use_vichydro'},
'sim_year'=>$nl_flags->{'sim_year'}, 'use_fates'=>$nl_flags->{'use_fates'},
'neon'=>$nl_flags->{'neon'}, 'neonsite'=>$nl_flags->{'neonsite'},
+ 'cmip_era'=>$nl_flags->{'cmip_era'},
'use_crop'=>$nl_flags->{'use_crop'} );
}
#
@@ -3746,6 +3759,8 @@ sub setup_logic_c_isotope {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_c14',
'bgc_mode'=>$nl_flags->{'bgc_mode'}, 'phys'=>$nl_flags->{'phys'},
'lnd_tuning_mode'=>$nl_flags->{'lnd_tuning_mode'}, ssp_rcp=>$nl_flags->{'ssp_rcp'} );
+ &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13" );
+ &add_logical_to_nl_flags( $nl_flags, $nl, "use_c14" );
my $use_c13 = $nl->get_value('use_c13');
my $use_c14 = $nl->get_value('use_c14');
if ( $nl_flags->{'bgc_mode'} ne "sp" && $nl_flags->{'bgc_mode'} ne "fates" ) {
@@ -3764,14 +3779,14 @@ sub setup_logic_c_isotope {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_c14_bombspike', 'use_c14'=>$use_c14 );
$use_c14_bombspike = $nl->get_value('use_c14_bombspike');
if ( &value_is_true($use_c14_bombspike) ) {
- if ( defined($stream_fldfilename_atm_c14) ) {
- setup_logic_c14_streams($opts, $nl_flags, $definition, $defaults, $nl);
- } else {
+ &add_logical_to_nl_flags( $nl_flags, $nl, "use_c14_bombspike" );
+ setup_logic_c14_streams($opts, $nl_flags, $definition, $defaults, $nl);
+ $stream_fldfilename_atm_c14 = $nl->get_value('stream_fldfilename_atm_c14');
+ if ( ! defined($stream_fldfilename_atm_c14) ) {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'atm_c14_filename',
'use_c14'=>$use_c14, 'use_cn'=>$nl_flags->{'use_cn'}, 'use_c14_bombspike'=>$nl->get_value('use_c14_bombspike'),
- 'ssp_rcp'=>$nl_flags->{'ssp_rcp'} );
+ 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'cmip_era'=>$nl_flags->{'cmip_era'} );
}
- $stream_fldfilename_atm_c14 = $nl->get_value('stream_fldfilename_atm_c14');
$atm_c14_filename = $nl->get_value('atm_c14_filename');
if ( defined($stream_fldfilename_atm_c14) && defined($atm_c14_filename) ) {
$log->fatal_error("Both stream_fldfilename_atm_c14 and atm_c14_filename set, only one should be set");
@@ -3784,6 +3799,8 @@ sub setup_logic_c_isotope {
$log->fatal_error("use_c14 is FALSE and use_c14_bombspike, stream_fldfilename_atm_c14 or atm_c14_filename set");
}
}
+ &add_logical_to_nl_flags( $nl_flags, $nl, "use_c14_bombspike" );
+
my $use_c13_timeseries = $nl->get_value('use_c13_timeseries');
my $stream_fldfilename_atm_c13 = $nl->get_value('stream_fldfilename_atm_c13');
my $atm_c13_filename = $nl->get_value('atm_c13_filename');
@@ -3791,14 +3808,14 @@ sub setup_logic_c_isotope {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_c13_timeseries', 'use_c13'=>$use_c13 );
$use_c13_timeseries = $nl->get_value('use_c13_timeseries');
if ( &value_is_true($use_c13_timeseries) ) {
- if ( defined($stream_fldfilename_atm_c13) ) {
- setup_logic_c13_streams($opts, $nl_flags, $definition, $defaults, $nl);
- } else {
+ &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13_timeseries" );
+ setup_logic_c13_streams($opts, $nl_flags, $definition, $defaults, $nl);
+ $stream_fldfilename_atm_c13 = $nl->get_value('stream_fldfilename_atm_c13');
+ if ( ! defined($nl->get_value('stream_fldfilename_atm_c13')) ) {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'atm_c13_filename',
'use_c13'=>$use_c13, 'use_cn'=>$nl_flags->{'use_cn'}, 'use_c13_timeseries'=>$nl->get_value('use_c13_timeseries'),
'ssp_rcp'=>$nl_flags->{'ssp_rcp'} );
}
- $stream_fldfilename_atm_c13 = $nl->get_value('stream_fldfilename_atm_c13');
$atm_c13_filename = $nl->get_value('atm_c13_filename');
if ( defined($stream_fldfilename_atm_c13) && defined($atm_c13_filename) ) {
$log->fatal_error("Both stream_fldfilename_atm_c13 and atm_c13_filename set, only one should be set");
@@ -3823,6 +3840,8 @@ sub setup_logic_c_isotope {
$log->fatal_error("bgc=sp and C isotope namelist variables were set, both can't be used at the same time");
}
}
+ &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13_timeseries" );
+ &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13_bombspike" );
}
#-------------------------------------------------------------------------------
@@ -3832,6 +3851,27 @@ sub setup_logic_c13_streams {
#
# C13 stream file settings
#
+ # Just return if use_c13 and use_c13_timeseries aren't both TRUE
+ if ( ! &value_is_true($nl_flags->{'use_c13'}) ) { return; }
+ if ( ! &value_is_true($nl_flags->{'use_c13_timeseries'}) ) { return; }
+
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_atm_c13',
+ 'use_c13'=>$nl_flags->{'use_c13'}, 'use_c13_timeseries'=>$nl_flags->{'use_c13_timeseries'},
+ 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'cmip_era'=>$nl_flags->{'cmip_era'}, 'nofail'=>1);
+ # If stream_fldfilename_atm_c13 is not defined then return and get the cmip6 file format version
+ if ( ! defined( $nl->get_value( "stream_fldfilename_atm_c13") ) ) {
+ return;
+ }
+
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_first_atm_c13',
+ 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'});
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_last_atm_c13',
+ 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'});
+ # Set align year, if first and last years are different
+ if ( $nl->get_value('stream_year_first_atm_c13') != $nl->get_value('stream_year_last_atm_c13') ) {
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_model_year_align_atm_c13',
+ 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'});
+ }
}
#-------------------------------------------------------------------------------
@@ -3841,6 +3881,33 @@ sub setup_logic_c14_streams {
#
# C14 stream file settings
#
+ # Just return if use_c14 and use_c14_bombspike aren't both TRUE
+ if ( ! &value_is_true($nl_flags->{'use_c14'}) ) { return; }
+ if ( ! &value_is_true($nl_flags->{'use_c14_bombspike'}) ) { return; }
+
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_atm_c14',
+ 'use_c14'=>$nl_flags->{'use_c14'}, 'use_c14_bombspike'=>$nl_flags->{'use_c14_bombspike'},
+ 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'nofail'=>1);
+ # If stream_fldfilename_atm_c14 is not defined then return and get the cmip6 file format version
+ if ( ! defined( $nl->get_value( "stream_fldfilename_atm_c14") ) ) {
+ return;
+ }
+
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_meshfile_atm_c14',
+ 'use_c14'=>$nl_flags->{'use_c14'}, 'use_c14_bombspike'=>$nl_flags->{'use_c14_bombspike'});
+ if ( &remove_leading_and_trailing_quotes( $nl->get_value( "stream_meshfile_atm_c14") ) eq "none" ) {
+ $log->fatal_error( "stream_meshfile_atm_c14 is set to 'none' which will only copy the first latitude to the globe")
+ }
+
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_first_atm_c14',
+ 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'});
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_last_atm_c14',
+ 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'});
+ # Set align year, if first and last years are different
+ if ( $nl->get_value('stream_year_first_atm_c14') != $nl->get_value('stream_year_last_atm_c14') ) {
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_model_year_align_atm_c14',
+ 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'});
+ }
}
#-------------------------------------------------------------------------------
@@ -4430,7 +4497,9 @@ sub setup_logic_cropcal_streams {
if ( &value_is_true($cropcals_rx) or &value_is_true($cropcals_rx_adapt) ) {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldFileName_swindow_start');
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldFileName_swindow_end');
- add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_cultivar_gdds');
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_cultivar_gdds',
+ 'lnd_tuning_mode'=>$nl_flags->{'lnd_tuning_mode'}
+ );
if ( &value_is_true($cropcals_rx_adapt) ) {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldFileName_gdd20_baseline', 'stream_gdd20_seasons'=>$stream_gdd20_seasons);
}
@@ -5495,7 +5564,7 @@ sub add_default {
" Are defaults provided for this resolution and land mask?" );
} else {
$log->fatal_error("No default value found for $var.\n" .
- " Are defaults provided for this resolution and land mask?");
+ " Are defaults provided in namelist_defaults for this resolution, land mask, and CLM_CMIP_ERA (set in env_run.xml)?");
}
}
else {
@@ -5937,6 +6006,27 @@ sub logical_to_fortran {
#-------------------------------------------------------------------------------
+sub add_logical_to_nl_flags {
+ # Add a logical setting to the $nl_flsgs hash, so can be used in attribute checking
+ # This is important to do to make sure that the attribute is matched exactly as
+ # either: .true. or .false.
+ # Also sets nl_flags to .false. when the namelist variable is NOT set
+ my ($nl_flags, $nl, $var) = @_;
+
+ my $val = $nl->get_value($var);
+ if ( defined($val) ) {
+ if ( &value_is_true($val)) {
+ $nl_flags->{$var} = ".true.";
+ } else {
+ $nl_flags->{$var} = ".false.";
+ }
+ } else {
+ $nl_flags->{$var} = ".false.";
+ }
+}
+
+#-------------------------------------------------------------------------------
+
sub string_is_undef_or_empty {
# Return true if the given string is undefined or only spaces, false otherwise.
# A quoted empty string (' ' or " ") is treated as being empty.
diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml
index 1bb029844c..20b197a4a7 100644
--- a/bld/namelist_files/namelist_defaults_ctsm.xml
+++ b/bld/namelist_files/namelist_defaults_ctsm.xml
@@ -133,21 +133,73 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
.true.
-lnd/clm2/isotopes/atm_delta_C13_CMIP6_1850-2015_yearly_v2.0_c190528.nc
-lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP119_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP126_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP245_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP3B_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP534os_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP5B_1850-2100_yearly_c181209.nc
-
-lnd/clm2/isotopes/atm_delta_C14_CMIP6_3x1_global_1850-2015_yearly_v2.0_c190528.nc
-lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP119_3x1_global_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP126_3x1_global_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP245_3x1_global_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP3B_3x1_global_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP534os_3x1_global_1850-2100_yearly_c181209.nc
-lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP5B_3x1_global_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C13_CMIP6_1850-2015_yearly_v2.0_c190528.nc
+lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP119_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP126_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP245_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP3B_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP534os_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP5B_1850-2100_yearly_c181209.nc
+
+lnd/clm2/isotopes/atm_delta_C14_CMIP6_3x1_global_1850-2015_yearly_v2.0_c190528.nc
+lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP119_3x1_global_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP126_3x1_global_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP245_3x1_global_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP3B_3x1_global_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP534os_3x1_global_1850-2100_yearly_c181209.nc
+lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP5B_3x1_global_1850-2100_yearly_c181209.nc
+
+
+lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C14_CMIP7_360x720_1700-2023_yearly_v3.0_c251117.nc
+share/meshes/360x720_120830_ESMFmesh_c20210507.nc
+
+
+2018
+2018
+
+2010
+2010
+
+2000
+2000
+
+1850
+1850
+
+1850
+1850
+
+1700
+1700
+
+1700
+2023
+1700
+
+lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C13_CMIP7_global_1700-2023_yearly_v3.0_c251013.nc
+
+
+2018
+2018
+
+2010
+2010
+
+2000
+2000
+
+1850
+1850
+
+1850
+1850
+
+1700
+1700
+
+1700
+2023
+1700
.false.
@@ -280,11 +332,13 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
li2014qianfrc
90.d00
-4.0d00
1.8d00
0.3d00
1.0d00
+4.0d00
+3.0d00
+
30.0d00
80.0d00
0.3d00
@@ -383,7 +437,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
80.0d00
0.85d00
0.98d00
-0.01d00
+0.04d00
0.28d-4
0.010d00
0.71d-4
@@ -402,11 +456,11 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
85.0d00
0.85d00
0.98d00
-0.01d00
+0.03d00
0.28d-4
0.010d00
0.71d-4
-0.3d00
+0.34d00
0.33d00
75.d00
825.d00
@@ -570,7 +624,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
-lnd/clm2/paramdata/ctsm60_params_cal115_c250813.nc
+lnd/clm2/paramdata/clm60_params.ctsm6_li2024.c250822.nc
lnd/clm2/paramdata/clm50_params.c250311.nc
lnd/clm2/paramdata/clm45_params.c250311.nc
@@ -783,6 +837,8 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
maxpft="17" use_cn=".false." use_crop=".false." hgrid="ne0np4.ARCTIC.ne30x4" >.true.
.true.
+.true.
hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
+hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
+
hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
-hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
@@ -1199,21 +1259,22 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
>hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
-hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
-
-
hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
-
+
hgrid=ne120np4.pg3 maxpft=79 mask=tx0.1v3 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
+hgrid=ne120np4.pg3 maxpft=79 mask=tx0.1v3 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
+
+hgrid=ne120np4.pg3 maxpft=79 mask=tx0.1v3 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
+
@@ -1314,9 +1375,15 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
lnd/clm2/initdata_esmf/ctsm5.3/clmi.interp_from.I1850Clm50BgcCrop-ciso.1366-01-01.0.9x1.25_gx1v7_simyr1850_c240223.nc
+lnd/clm2/initdata_esmf/ctsm5.4/clmi.f09_interp_from.ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_pSASU.clm2.r.0161_c251118.nc
+
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_f09_121_1850.clm2.r.0041-01-01-00000.nc
+ phys="clm6_0"
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_f09_127_1850.clm2.r.0102-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_ne30_120_1850.clm2.r.0041-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_ne30_126_1850.clm2.r.0102-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_f09_121_HIST.clm2.r.2000-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_f09_127_HIST.clm2.r.2000-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_ne30_120_HIST.clm2.r.2000-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_ne30_126_HIST.clm2.r.2000-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_pSASU.clm2.r.0161-01-01-00000.nc
+ phys="clm6_0"
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_pSASU.clm2.r.0161-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_pSASU.clm2.r.0161-01-01-00000.nc
+ phys="clm6_0"
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_pSASU.clm2.r.0161-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm53065_54surfdata_PPEcal115_115_pSASU.clm2.r.0161-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f19_125_pSASU.clm2.r.0161-01-01-00000.nc
lnd/clm2/initdata_map/clmi.FHISTSp.1979-01-01.ARCTICGRIS_ne30x8_mt12_simyr1979_c200806.nc
-
+
+lnd/clm2/initdata_map/clmi.F2000.2000-01-01.ne120pg3_mt13_simyr2000_c200728.nc
+
lnd/clm2/initdata_map/clmi.F2000.2000-01-01.ne120pg3_mt13_simyr2000_c200728.nc
@@ -1522,14 +1589,14 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_HIST.clm2.r.2000-01-01-00000.nc
+ phys="clm6_0" use_init_interp=".true."
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_HIST.clm2.r.2000-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_HIST.clm2.r.2000-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_HIST_popDens.clm2.r.2000-01-01-00000.nc
@@ -1537,13 +1604,13 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
ic_ymd="20100101" sim_year="2010" use_excess_ice=".true."
ic_tod="0" glc_nec="10" use_crop=".true."
phys="clm6_0"
->lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_HIST.clm2.r.2010-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_HIST.clm2.r.2010-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_HIST.clm2.r.2010-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_HIST_popDens.clm2.r.2010-01-01-00000.nc
@@ -1571,14 +1638,14 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
ic_ymd="19790101" sim_year="1979" use_excess_ice=".true."
ic_tod="0" glc_nec="10" use_crop=".true."
phys="clm6_0"
->lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_HIST.clm2.r.1979-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_HIST.clm2.r.1979-01-01-00000.nc
lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_HIST.clm2.r.1979-01-01-00000.nc
+>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_HIST_popDens.clm2.r.1979-01-01-00000.nc
@@ -1725,158 +1792,190 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_hist_2000_16pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_hist_2000_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_2000_16pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_2000_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_10x15_hist_2000_16pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_2000_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_2000_16pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_2000_16pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_2000_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa60_hist_2000_16pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa60_hist_2000_16pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa30_hist_2000_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa15_hist_2000_16pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa15_hist_2000_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa3p75_hist_2000_16pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa3p75_hist_2000_16pfts_c251022.nc
-
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_hist_2000_78pfts_c251022.nc
+
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_hist_2000_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_10x15_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_brazil_hist_2000_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_brazil_hist_2000_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_5x5_amazon_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_5x5_amazon_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg2_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg2_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg3_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne16np4.pg3_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne16np4.pg3_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.125nldas2_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.125nldas2_hist_2000_78pfts_c251022.nc
-
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_T42_hist_2000_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_360x720cru_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_360x720cru_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_C96_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_C96_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_numaIA_hist_2000_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_numaIA_hist_2000_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa480_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa480_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa120_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa120_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4_hist_2000_78pfts_c240925.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4_hist_2000_78pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg2_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4.pg3_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg3_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne120np4.pg3_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne120np4.pg3_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_2000_78pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.NATL.ne30x8_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4CONUS.ne30x8_hist_2000_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4CONUS.ne30x8_hist_2000_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_vancouverCAN_hist_2000_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_vancouverCAN_hist_2000_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_mexicocityMEX_hist_2000_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_mexicocityMEX_hist_2000_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/surfdata_1x1_urbanc_alpha_synth_hist_2000_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/surfdata_1x1_urbanc_alpha_synth_hist_2000_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_1850_16pfts_c240926.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_1850_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_1850_16pfts_c241007.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_1850_16pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_1850_16pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_1850_16pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_1850_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_360x720cru_hist_1850_78pfts_c240908.nc
-
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_360x720cru_hist_1850_78pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_hist_1850_78pfts_c251022.nc
+
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_hist_1850_78pfts_c240908.nc
-
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_1850_78pfts_c251022.nc
+
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_1850_78pfts_c240908.nc
-
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_1850_78pfts_c251022.nc
+
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_10x15_hist_1850_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_1850_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa480_hist_1850_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa480_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa120_hist_1850_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa120_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4_hist_1850_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg2_hist_1850_78pfts_c240908.nc
-
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg2_hist_1850_78pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_1850_78pfts_c251022.nc
+
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg3_hist_1850_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4.pg3_hist_1850_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg3_hist_1850_78pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg2_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4_hist_1850_78pfts_c240925.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_C96_hist_1850_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_C96_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/surfdata_1x1_smallvilleIA_synth_hist_1850_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/surfdata_1x1_smallvilleIA_synth_hist_1850_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/surfdata_1x1_cidadinhoBR_synth_hist_2000_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/surfdata_1x1_cidadinhoBR_synth_hist_2000_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_brazil_hist_1850_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_brazil_hist_1850_78pfts_c251023.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne16np4.pg3_hist_1850_78pfts_c240908.nc
-
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne120np4.pg3_hist_1850_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne16np4.pg3_hist_1850_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_1979_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_1979_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_1979_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_1979_78pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.NATL.ne30x8_hist_1979_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_1979_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_1979_78pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4CONUS.ne30x8_hist_1979_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4CONUS.ne30x8_hist_1979_78pfts_c251022.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne120np4.pg3_hist_1979_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_PtVeg_nourb_1850_16pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_PtVeg_nourb_1850_16pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_PtVeg_nourb_1850_16pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne16np4.pg3_PtVeg_nourb_1850_16pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_PtVeg_nourb_1850_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/16PFT_mixed/surfdata_1x1_NEON_${NEONSITE}_hist_2000_16pfts_c240912.nc
+lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/16PFT_mixed/surfdata_1x1_NEON_${NEONSITE}_hist_2000_16pfts_c251023.nc
-lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_${NEONSITE}_hist_2000_78pfts_c240912.nc
+lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/surfdata_1x1_NEON_${NEONSITE}_hist_2000_78pfts_c251023.nc
@@ -1884,60 +1983,82 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1.9x2.5_hist_1850-2023_16pfts_c240926.nc
+ >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1.9x2.5_hist_1850-2023_16pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_4x5_hist_1850-2023_16pfts_c241007.nc
+ >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_4x5_hist_1850-2023_16pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1.9x2.5_hist_1850-2023_16pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_10x15_hist_1850-2023_16pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4.pg3_hist_1850-2023_16pfts_c251022.nc
-lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1.9x2.5_hist_1850-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1.9x2.5_SSP2-4.5_1850-2100_78pfts_c240908.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTICGRIS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.ARCTICGRIS.ne30x8_hist_1979-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTIC.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.ARCTIC.ne30x4_hist_1979-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.NATL.ne30x8_hist_1979-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.POLARCAP.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.POLARCAP.ne30x4_hist_1979-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4CONUS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4CONUS.ne30x8_hist_1979-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne120np4.pg3_hist_1979-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_4x5_SSP2-4.5_1850-2100_78pfts_c240908.nc
+ >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_4x5_hist_1850-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_10x15_SSP2-4.5_1850-2100_78pfts_c240908.nc
+ >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_10x15_hist_1850-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_360x720cru_SSP2-4.5_1850-2100_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_360x720cru_hist_1850-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1x1_brazil_SSP2-4.5_1850-2100_78pfts_c240912.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1x1_brazil_hist_1850-2023_78pfts_c251023.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_mpasa120_SSP2-4.5_1850-2100_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_mpasa120_hist_1850-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4_SSP2-4.5_1850-2100_78pfts_c240926.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne3np4_hist_1850-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne3np4.pg2_hist_1850-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne3np4.pg3_hist_1850-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne16np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne16np4.pg3_hist_1850-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4_hist_1850-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4.pg2_hist_1850-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4.pg3_hist_1850-2023_78pfts_c251022.nc
+lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne30np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_C96_SSP2-4.5_1850-2100_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_C96_hist_1850-2023_78pfts_c251022.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/landuse.timeseries_1x1_smallvilleIA_synth_1850-1855_78pfts_c240908.nc
+>lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/landuse.timeseries_1x1_smallvilleIA_synth_1850-1855_78pfts_c251023.nc
@@ -1945,61 +2066,52 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP1-2.6_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1.9x2.5_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_4x5_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_10x15_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_360x720cru_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1x1_brazil_SSP2-4.5_1850-2100_78pfts_c240912.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_mpasa120_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4_SSP2-4.5_1850-2100_78pfts_c240926.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne16np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne30np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_C96_SSP2-4.5_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTICGRIS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTIC.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.POLARCAP.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4CONUS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc
-
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP3-7.0_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP4-6.0_1850-2100_78pfts_c240908.nc
-lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP5-8.5_1850-2100_78pfts_c240908.nc
@@ -2169,20 +2281,29 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
2000
2000
+
+lnd/clm2/cropdata/calendars/processed/gdds_20250809_025305.tweaked_latlons.nc
+lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
+lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
+lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
+lnd/clm2/cropdata/calendars/processed/gdds_20250809_025305.tweaked_latlons.nc
+lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
+lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
+lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
+
lnd/clm2/cropdata/calendars/processed/swindow_starts_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/swindow_ends_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc
-lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/360x720_120830_ESMFmesh_c20210507_cdf5.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/swindow_starts_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/swindow_ends_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc
-lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/20230714_cropcals_pr2_1deg.actually2deg.1980-2009.from_GDDB20.interpd_halfdeg.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/gdd20bl.copied_from.gdds_20230829_161011.v2.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/sdates_ggcmi_crop_calendar_phase3_v1.01_nninterp-hcru_hcru_mt13.2000-2000.20230728_165845.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/hdates_ggcmi_crop_calendar_phase3_v1.01_nninterp-hcru_hcru_mt13.2000-2000.20230728_165845.tweaked_latlons.nc
lnd/clm2/cropdata/calendars/processed/360x720_120830_ESMFmesh_c20210507_cdf5.tweaked_latlons.nc
+
none
@@ -2276,8 +2397,8 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
lnd/clm2/firedata/clmforc.Li_2018_SSP2_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
-lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
-
+lnd/clm2/firedata/clmforc.Li_2025_CMIP7_SSP3CMIP6_hdm_0.5x0.5_simyr1850-2100_c250717.nc
+lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
@@ -2294,8 +2415,8 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
lnd/clm2/firedata/clmforc.Li_2018_SSP2_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
-lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
-
+lnd/clm2/firedata/clmforc.Li_2025_CMIP7_SSP3CMIP6_hdm_0.5x0.5_simyr1850-2100_c250717.nc
+lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc
@@ -2596,6 +2717,10 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
general
+
+.true.
+
diff --git a/bld/namelist_files/namelist_definition_ctsm.xml b/bld/namelist_files/namelist_definition_ctsm.xml
index 7a032b901f..75d43fb80a 100644
--- a/bld/namelist_files/namelist_definition_ctsm.xml
+++ b/bld/namelist_files/namelist_definition_ctsm.xml
@@ -1818,7 +1818,7 @@ First year to loop over for atmospheric C14 isotope delta data
-Last year to loop over for data atmospheric C14 isotope delta data
+Last year to loop over for atmospheric C14 isotope delta data
+
+Time interpolation method to use for atmospheric C14 delta data
+
+
+
+Time interpolation mode for atmospheric C14 delta data to determine how to handle data before and after the times in the file
+ cycle = Always cycle over the data
+ extend = Use the first time before the available data, and use the last time after the available data
+ limit = Only use the data within the times available -- abort if the model tries to go outside it
+
+
Filename of input stream data for atmospheric C14 isotope delta data
+
+Filename of input stream mesh for atmospheric C14 isotope delta data
+
+
First year to loop over for atmospheric C13 isotope delta data
@@ -1846,6 +1864,19 @@ Last year to loop over for data atmospheric C13 isotope delta data
Simulation year that aligns with stream_year_first_atm_c13 value
+
+Time interpolation method to use for atmospheric C13 delta data
+
+
+
+Time interpolation mode for atmospheric C13 delta data to determine how to handle data before and after the times in the file
+ cycle = Always cycle over the data
+ extend = Use the first time before the available data, and use the last time after the available data
+ limit = Only use the data within the times available -- abort if the model tries to go outside it
+
+
Filename of input stream data for atmospheric C13 isotope delta data
diff --git a/bld/unit_testers/build-namelist_test.pl b/bld/unit_testers/build-namelist_test.pl
index cc747cdc5f..8028b8d8ff 100755
--- a/bld/unit_testers/build-namelist_test.pl
+++ b/bld/unit_testers/build-namelist_test.pl
@@ -42,7 +42,7 @@ sub make_env_run {
my %settings = @_;
# Set default settings
- my %env_vars = ( DIN_LOC_ROOT=>"MYDINLOCROOT", GLC_TWO_WAY_COUPLING=>"FALSE", LND_SETS_DUST_EMIS_DRV_FLDS=>"TRUE", NEONSITE=>"", PLUMBER2SITE=>"" );
+ my %env_vars = ( DIN_LOC_ROOT=>"MYDINLOCROOT", GLC_TWO_WAY_COUPLING=>"FALSE", LND_SETS_DUST_EMIS_DRV_FLDS=>"TRUE", NEONSITE=>"", PLUMBER2SITE=>"", CLM_CMIP_ERA=>"cmip7" );
# Set any settings that came in from function call
foreach my $item ( keys(%settings) ) {
$env_vars{$item} = $settings{$item};
@@ -163,7 +163,7 @@ sub cat_and_create_namelistinfile {
#
# Figure out number of tests that will run
#
-my $ntests = 3400;
+my $ntests = 3405;
if ( defined($opts{'compare'}) ) {
$ntests += 2061;
@@ -261,7 +261,7 @@ sub cat_and_create_namelistinfile {
my $options = "-co2_ppmv 250 ";
$options .= " -res 10x15 -ssp_rcp SSP2-4.5 -envxml_dir .";
- &make_env_run();
+ &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" );
eval{ system( "$bldnml $options > $tempfile 2>&1 " ); };
is( $@, '', "options: $options" );
$cfiles->checkfilesexist( "default", $mode );
@@ -567,14 +567,35 @@ sub cat_and_create_namelistinfile {
$phys = "clm5_0";
$mode = "-phys $phys";
&make_config_cache($phys);
+# Four tests that require CLM_CMIP_ERA set to cmip6
foreach my $options (
"--res 0.9x1.25 --bgc sp --use_case 1850-2100_SSP2-4.5_transient --namelist '&a start_ymd=18501223/'",
+ "--res 1.9x2.5 --bgc bgc --use_case 1850-2100_SSP2-4.5_transient --namelist '&a start_ymd=19101023/'",
+ "--res 1.9x2.5 --bgc bgc --use_case 1850_control --namelist '&a start_ymd=18500101/'",
+ "--res 1.9x2.5 --bgc bgc --use_case 20thC_transient --namelist '&a start_ymd=18500101/'",
+ ) {
+ my $file = $startfile;
+ &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" );
+ eval{ system( "$bldnml -envxml_dir . $options > $tempfile 2>&1 " ); };
+ is( $@, '', "options: $options" );
+ $cfiles->checkfilesexist( "$options", $mode );
+ $cfiles->shownmldiff( "default", $mode );
+ if ( defined($opts{'compare'}) ) {
+ $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode );
+ $cfiles->dodiffonfile( "lnd_in", "$options", $mode );
+ $cfiles->comparefiles( "$options", $mode, $opts{'compare'} );
+ }
+ if ( defined($opts{'generate'}) ) {
+ $cfiles->copyfiles( "$options", $mode );
+ }
+ &cleanup();
+}
+foreach my $options (
"-bgc fates -use_case 2000_control -no-megan",
"-bgc fates -use_case 20thC_transient -no-megan",
"-bgc fates -use_case 20thC_transient -no-megan -no-crop --res 4x5",
"-bgc fates -use_case 1850_control -no-megan -namelist \"&a use_fates_sp=T, soil_decomp_method='None'/\"",
"-bgc sp -use_case 2000_control -res 0.9x1.25 -namelist '&a use_soil_moisture_streams = T/'",
- "--res 1.9x2.5 --bgc bgc --use_case 1850-2100_SSP2-4.5_transient --namelist '&a start_ymd=19101023/'",
"-namelist \"&a dust_emis_method='Zender_2003', zender_soil_erod_source='lnd' /'\"",
"-bgc bgc -use_case 2000_control -namelist \"&a fire_method='nofire'/\" -crop",
"-res 0.9x1.25 -bgc sp -use_case 1850_noanthro_control -drydep",
@@ -611,6 +632,11 @@ sub cat_and_create_namelistinfile {
system( "touch $finidat" );
my %failtest = (
+ "cmip7_w_issp" =>{ options=>"-envxml_dir . -use_case 1850-2100_SSP2-4.5_transient",
+ namelst=>"",
+ CLM_CMIP_ERA=>"cmip7",
+ phys=>"clm6_0",
+ },
"coldstart but with IC file"=>{ options=>"-clm_start_type cold -envxml_dir .",
namelst=>"finidat='$finidat'",
phys=>"clm5_0",
@@ -1170,7 +1196,7 @@ sub cat_and_create_namelistinfile {
namelst=>"use_fates_lupft=.true.",
phys=>"clm4_5",
},
- "inventoryfileDNE" =>{ options=>"-bgc fates -envxml_dir . -no-megan",
+ "useFATESLUH2fileDNE" =>{ options=>"-bgc fates -envxml_dir . -no-megan",
namelst=>"use_fates_luh=.true., fluh_timeseries='zztop'",
phys=>"clm4_5",
},
@@ -1385,7 +1411,7 @@ sub cat_and_create_namelistinfile {
my $options = $failtest{$key}{"options"};
my $namelist = $failtest{$key}{"namelst"};
my %settings;
- foreach my $xmlvar ( "GLC_TWO_WAY_COUPLING", "LND_SETS_DUST_EMIS_DRV_FLDS") {
+ foreach my $xmlvar ( "GLC_TWO_WAY_COUPLING", "LND_SETS_DUST_EMIS_DRV_FLDS", "CLM_CMIP_ERA") {
if ( defined($failtest{$key}{$xmlvar}) ) {
$settings{$xmlvar} = $failtest{$key}{$xmlvar};
}
@@ -1421,6 +1447,11 @@ sub cat_and_create_namelistinfile {
namelst=>"use_soil_moisture_streams=T,soilm_tintalgo='linear'",
phys=>"clm5_0",
},
+ "c14_meshfile_none" =>{ options=>"-envxml_dir . -bgc bgc",
+ namelst=>"stream_fldfilename_atm_c14='/dev/null', " .
+ "stream_meshfile_atm_c14='none'",
+ phys=>"clm6_0",
+ },
"missing_ndep_file" =>{ options=>"-envxml_dir . -bgc bgc -ssp_rcp SSP5-3.4",
namelst=>"",
phys=>"clm5_0",
@@ -1611,9 +1642,9 @@ sub cat_and_create_namelistinfile {
&cleanup(); print "\n";
}
-print "\n==================================================\n";
-print " Test all use-cases over all physics options\n";
-print "==================================================\n";
+print "\n=============================================================\n";
+print " Test all use-cases over all physics options for f09 and SP \n";
+print "=============================================================\n";
# Run over all use-cases for f09 and all physics...
my $list = `$bldnml -use_case list 2>&1 | grep "use case"`;
@@ -1634,8 +1665,9 @@ sub cat_and_create_namelistinfile {
&make_config_cache($phys);
foreach my $usecase ( @usecases ) {
print "usecase = $usecase\n";
- $options = "-res 0.9x1.25 -use_case $usecase -envxml_dir .";
- &make_env_run();
+ # Just do SP here as some use-cases can't do crop (nonanthro), and some not BGC (stdurbpt)
+ $options = "-res 0.9x1.25 -use_case $usecase --bgc bgc -envxml_dir .";
+ &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" );
my $expect_fail = undef;
foreach my $failusecase ( @expect_fails ) {
if ( $failusecase eq $usecase ) {
@@ -1856,15 +1888,21 @@ sub cat_and_create_namelistinfile {
my $startymd = undef;
if ( ($usecase eq "1850_control") || ($usecase eq "20thC_transient") ) {
$startymd = 18500101;
+ &make_env_run();
} elsif ( $usecase eq "2000_control") {
$startymd = 20000101;
+ &make_env_run();
} elsif ( $usecase eq "2010_control") {
$startymd = 20100101;
+ &make_env_run();
+ } elsif ( $usecase =~ "2100_SSP") {
+ $startymd = 20150101;
+ &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" );
} else {
$startymd = 20150101;
+ &make_env_run();
}
$options = "-bgc bgc -res $res -use_case $usecase -envxml_dir . -namelist '&a start_ymd=$startymd/'";
- &make_env_run();
eval{ system( "$bldnml $options > $tempfile 2>&1 " ); };
is( $@, '', "$options" );
$cfiles->checkfilesexist( "$options", $mode );
@@ -1901,11 +1939,11 @@ sub cat_and_create_namelistinfile {
}
# Transient ssp_rcp scenarios that work
my @tran_res = ( "4x5", "0.9x1.25", "1.9x2.5", "10x15", "360x720cru", "ne3np4", "ne3np4.pg3", "ne16np4.pg3", "ne30np4.pg3", "C96", "mpasa120" );
+my $startymd = 20150101;
+&make_env_run( 'CLM_CMIP_ERA'=>"cmip6" );
foreach my $usecase ( "1850-2100_SSP2-4.5_transient" ) {
- my $startymd = 20150101;
foreach my $res ( @tran_res ) {
$options = "-res $res -bgc bgc -crop -use_case $usecase -envxml_dir . -namelist '&a start_ymd=$startymd/'";
- &make_env_run();
eval{ system( "$bldnml $options > $tempfile 2>&1 " ); };
is( $@, '', "$options" );
$cfiles->checkfilesexist( "$options", $mode );
@@ -1940,6 +1978,12 @@ sub cat_and_create_namelistinfile {
my @clmres = ( "10x15", "4x5", "360x720cru", "0.9x1.25", "1.9x2.5", "ne3np4", "ne3np4.pg3", "ne16np4.pg3", "ne30np4.pg3", "C96", "mpasa120" );
foreach my $res ( @clmres ) {
$options = "-res $res -envxml_dir . ";
+ # For clm6_0 and BGC use Carbon isotope streams
+ if ( ($phys eq "clm6_0") && ($clmopts =~ /bgc bgc/) ) {
+ $options = "$options --namelist \"&a stream_fldfilename_atm_c14 = '/dev/null'," .
+ "stream_meshfile_atm_c14 = '/dev/null', " .
+ "stream_fldfilename_atm_c13 = '/dev/null' /\"";
+ }
&make_env_run( );
eval{ system( "$bldnml $options $clmopts > $tempfile 2>&1 " ); };
is( $@, '', "$options $clmopts" );
@@ -2038,7 +2082,8 @@ sub cat_and_create_namelistinfile {
foreach my $bgc ( "sp", "bgc" ) {
my $lndtuningmode = "${phys}_${forc}";
if ( $lndtuningmode eq "clm6_0_CRUv7" or
- $lndtuningmode eq "clm4_5_CRUJRA2024") {
+ $lndtuningmode eq "clm4_5_CRUJRA2024" or
+ $lndtuningmode eq "clm5_0_CRUJRA2024") {
next;
}
my $clmoptions = "-res $res -mask $mask -sim_year $simyr -envxml_dir . -lnd_tuning_mod $lndtuningmode -bgc $bgc";
diff --git a/ccs_config b/ccs_config
index b20a207bc9..d686615fac 160000
--- a/ccs_config
+++ b/ccs_config
@@ -1 +1 @@
-Subproject commit b20a207bc918b956b8dad44c14c4471aff9331ee
+Subproject commit d686615faceac30705b199f592808e3558ac176b
diff --git a/cime_config/config_component.xml b/cime_config/config_component.xml
index f869d0e362..e991288cc5 100644
--- a/cime_config/config_component.xml
+++ b/cime_config/config_component.xml
@@ -156,6 +156,25 @@
This is typically set by the compset.
+
+ char
+ cmip6,cmip7
+ cmip7
+
+ cmip6
+
+ run_component_ctsm
+ env_run.xml
+ Whether to use CMIP6 or CMIP7 fsurdat/landuse files.
+ As of ctsm5.4 we do not have CMIP7 PFT raw datasets for SSPs, so default to CMIP6 for these. For other compsets default to CMIP7. User may modify to a non-default value in env_run.xml.
+Caveats:
+1) We supply only CMIP7 C13/C14 isotope datasets, so these get used regardless.
+2) We supply only CMIP7 population density with ctsm6 in non-SSP cases, because the fire model is calibrated to that; conversely, for pre-ctsm6 and for SSP we supply only CMIP6 population density.
+3) We supply only CMIP6 nitrogen deposition (ndep), so this gets used regardless.
+4) For DATM we supply only CMIP6 aerosols.
+5) For DATM we supply only CMIP6 CO2
+
+
logical
@@ -219,7 +238,6 @@
1850-2100_SSP3-7.0_transient
1850-2100_SSP5-3.4_transient
1850-2100_SSP2-4.5_transient
- 1850-2100_SSP2-4.5_transient
1850-2100_SSP1-1.9_transient
1850-2100_SSP4-3.4_transient
1850-2100_SSP4-6.0_transient
diff --git a/cime_config/testdefs/ExpectedTestFails.xml b/cime_config/testdefs/ExpectedTestFails.xml
index 1acc725738..d21fc39c42 100644
--- a/cime_config/testdefs/ExpectedTestFails.xml
+++ b/cime_config/testdefs/ExpectedTestFails.xml
@@ -29,42 +29,13 @@
-
+
FAIL
- #3311
- Requires finidat with c13/c14 to PASS
+ #3529
+ We will generate new fsurdat files with the new raw lai file to resolve this issue.
-
-
- FAIL
- #3311
- Requires finidat with c13/c14 to PASS
-
-
-
-
- FAIL
- #3311
- Requires finidat with c13/c14 to PASS
-
-
-
-
- FAIL
- #3311
- Requires finidat with c13/c14 to PASS
-
-
-
-
- FAIL
- #3311
- Requires finidat with c13/c14 to PASS
-
-
-
FAIL
@@ -98,6 +69,12 @@
+
+
+ FAIL
+ #3495
+
+
FAIL
@@ -116,20 +93,6 @@
#3454
-
-
- FAIL
- #3252
- Works with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000.nc' and fails with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000_64bitoffset.nc'.
-
-
-
-
- FAIL
- #3252
- Works with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000.nc' and fails with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000_64bitoffset.nc'.
-
-
FAIL
@@ -207,10 +170,6 @@
-
- FAIL
- #3182
-
FAIL
#3182
@@ -379,6 +338,22 @@
+
+
+ FAIL
+ #3252
+ This should be resolved for the 5.4 release.
+
+
+
+
+
+ FAIL
+ #3252
+ This should be resolved for the 5.4 release.
+
+
+
diff --git a/cime_config/testdefs/testlist_clm.xml b/cime_config/testdefs/testlist_clm.xml
index 64c9274b3e..15e395fe6d 100644
--- a/cime_config/testdefs/testlist_clm.xml
+++ b/cime_config/testdefs/testlist_clm.xml
@@ -430,6 +430,15 @@
+
+
+
+
+
+
+
+
+
@@ -950,6 +959,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1121,6 +1148,15 @@
+
+
+
+
+
+
+
+
+
@@ -2532,6 +2568,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/README b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/README
new file mode 100644
index 0000000000..9ad9b7e1a1
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/README
@@ -0,0 +1 @@
+This tests with the new CMIP7 Carbon isotope datasets as streams.
diff --git a/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm
index df0189c2e6..abfad740be 100644
--- a/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm
+++ b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm
@@ -1,5 +1,4 @@
- stream_fldfilename_atm_c13 = '$DIN_LOC_ROOT/lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C13_CMIP7_global_1700-2023_yearly_v3.0_c251013.nc'
- stream_fldfilename_atm_c14 = '$DIN_LOC_ROOT/lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C14_CMIP7_4x1_global_1700-2023_yearly_v3.0_c251013.nc'
+ hist_dov2xy = .true.,.true. ! Set both history output files to 2D grid, so can be evaluated
stream_year_first_atm_c14 = 2013
stream_model_year_align_atm_c14 = 2013
stream_year_first_atm_c13 = 2013
diff --git a/python/ctsm/test/test_unit_subset_data.py b/python/ctsm/test/test_unit_subset_data.py
index a127a282e0..81b4fb3281 100755
--- a/python/ctsm/test/test_unit_subset_data.py
+++ b/python/ctsm/test/test_unit_subset_data.py
@@ -107,7 +107,7 @@ def test_inputdata_setup_files_basic(self):
files = setup_files(self.args, self.defaults, self.cesmroot, testing=True)
self.assertEqual(
files["fsurf_in"],
- "surfdata_0.9x1.25_hist_2000_16pfts_c240908.nc",
+ "surfdata_0.9x1.25_hist_2000_16pfts_c251022.nc",
"fsurf_in filename not whats expected",
)
self.assertEqual(
@@ -117,7 +117,7 @@ def test_inputdata_setup_files_basic(self):
)
self.assertEqual(
files["main_dir"],
- "/glade/campaign/cesm/cesmdata/cseg/inputdata",
+ "/glade/campaign/cesm/cesmdata/inputdata",
"main_dir directory not whats expected",
)
diff --git a/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py b/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py
index 5a5425dc60..f0fd65862f 100755
--- a/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py
+++ b/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py
@@ -24,35 +24,41 @@
"global-present",
"global-present-low-res",
"global-present-ultra-hi-res",
- "global-hist-1850-f19",
- "global-hist-1850-f45",
+ "global-hist-1850-1and2deg",
+ "global-hist-1850-low-res",
"crop-tropics-present",
"crop",
"crop-global-present",
"crop-global-present-low-res",
+ "crop-global-present-ne3",
"crop-global-present-ne16",
"crop-global-present-ne30",
- "crop-global-present-ne120",
+ "crop-global-present-vrandne120",
"crop-global-present-mpasa480",
"crop-global-present-nldas",
"crop-global-1850",
"crop-global-1850-low-res",
+ "crop-global-1850-ne3",
"crop-global-1850-ne16",
"crop-global-1850-ne30",
"crop-global-1850-ne120",
"crop-global-1850-mpasa480",
"crop-global-hist",
"crop-global-hist-low-res",
+ "crop-global-hist-ne3-1",
+ "crop-global-hist-ne3-2",
+ "crop-global-hist-ne3-3",
"crop-global-hist-ne16",
"crop-global-hist-ne30",
- "crop-global-hist-f09",
+ "crop-global-hist-1700",
+ "crop-global-hist-mpasa480",
"crop-global-SSP1-1.9-f09",
"crop-global-SSP1-2.6-f09",
"crop-global-SSP2-4.5-f09",
"crop-global-SSP2-4.5-f19",
"crop-global-SSP2-4.5-f10",
"crop-global-SSP2-4.5-f45",
- "crop-global-SSP2-4.5-ne0np4",
+ "crop-global-hist-vrandne120",
"crop-global-SSP2-4.5-ne3",
"crop-global-SSP2-4.5-ne16",
"crop-global-SSP2-4.5-ne30",
@@ -145,7 +151,9 @@ def write_runscript(
runfile.write(f"{output} \n")
check = f"if [ $? != 0 ]; then echo 'Error running resolution {res}'; exit -4; fi"
runfile.write(f"{check} \n")
- runfile.write(f"echo Successfully ran resolution {res}\n")
+ runfile.write(
+ f"echo Confirm completion of fsurdat/landuse generation in the .log file {res}\n"
+ )
runfile.write(f"echo Successfully ran {jobscript_file}\n")
@@ -191,7 +199,10 @@ def main():
# ],
# --------------------------
resolution_dict = {
- "standard_res_no_crop": ["0.9x1.25", "1.9x2.5", "mpasa60"],
+ "potveg_res": ["0.9x1.25", "1.9x2.5", "ne16np4.pg3", "ne30np4.pg3"],
+ "standard_res_no_crop": ["0.9x1.25", "1.9x2.5", "mpasa60", "mpasa30", "ne30np4.pg3"],
+ "1700_res": ["0.9x1.25", "360x720cru"],
+ "1and2deg_no_crop": ["1.9x2.5", "0.9x1.25", "ne30np4.pg3"],
"f09": ["0.9x1.25"],
"f19": ["1.9x2.5"],
"hcru": ["360x720cru"],
@@ -199,28 +210,25 @@ def main():
"mpasa120": ["mpasa120"],
"f10": ["10x15"],
"f45": ["4x5"],
- "low_res_no_crop": ["4x5", "10x15"],
+ "low_res": ["4x5", "10x15"],
"ultra_hi_res_no_crop": ["mpasa15", "mpasa3p75"],
"standard_res": ["360x720cru", "0.9x1.25", "1.9x2.5", "C96", "mpasa120"],
- "standard_res_no_f09": ["360x720cru", "1.9x2.5", "C96", "mpasa120"],
- "low_res": ["4x5", "10x15", "ne3np4.pg3", "ne3np4"],
"mpasa480": ["mpasa480"],
"nldas_res": ["0.125nldas2"],
"5x5_amazon": ["5x5_amazon"],
- "ne3": ["ne3np4", "ne3np4.pg3"],
+ "ne3": ["ne3np4.pg2", "ne3np4.pg3", "ne3np4"],
+ "ne3_1": ["ne3np4"],
+ "ne3_2": ["ne3np4.pg2"],
+ "ne3_3": ["ne3np4.pg3"],
"ne16": ["ne16np4.pg3"],
"ne30": ["ne30np4.pg3", "ne30np4.pg2", "ne30np4"],
- "ne0np4": [
- "ne0np4.ARCTICGRIS.ne30x8",
- "ne0np4.ARCTIC.ne30x4",
- "ne0np4CONUS.ne30x8",
- "ne0np4.POLARCAP.ne30x4",
- ],
- "ne120": [
+ "ne120": ["ne120np4.pg3"],
+ "vr_and_ne120": [
"ne0np4.ARCTICGRIS.ne30x8",
"ne0np4.ARCTIC.ne30x4",
"ne0np4CONUS.ne30x8",
"ne0np4.POLARCAP.ne30x4",
+ "ne0np4.NATL.ne30x8",
"ne120np4.pg3",
],
}
@@ -231,7 +239,7 @@ def main():
dataset_dict = {
"global-potveg": (
"--start-year 1850 --end-year 1850 --nocrop --potveg --res",
- "f09",
+ "potveg_res",
),
"global-present": (
"--start-year 2000 --end-year 2000 --nocrop --res",
@@ -239,19 +247,19 @@ def main():
),
"global-present-low-res": (
"--start-year 2000 --end-year 2000 --nocrop --res",
- "low_res_no_crop",
+ "low_res",
),
"global-present-ultra-hi-res": (
"--start-year 2000 --end-year 2000 --nocrop --res",
"ultra_hi_res_no_crop",
),
- "global-hist-1850-f19": (
+ "global-hist-1850-1and2deg": (
"--start-year 1850 --end-year 2023 --nocrop --res",
- "f19",
+ "1and2deg_no_crop",
),
- "global-hist-1850-f45": (
+ "global-hist-1850-low-res": (
"--start-year 1850 --end-year 2023 --nocrop --res",
- "f45",
+ "low_res",
),
"crop-tropics-present": (
"--start-year 2000 --end-year 2000 --res",
@@ -265,6 +273,10 @@ def main():
"--start-year 2000 --end-year 2000 --res",
"low_res",
),
+ "crop-global-present-ne3": (
+ "--start-year 2000 --end-year 2000 --res",
+ "ne3",
+ ),
"crop-global-present-ne16": (
"--start-year 2000 --end-year 2000 --res",
"ne16",
@@ -273,9 +285,9 @@ def main():
"--start-year 2000 --end-year 2000 --res",
"ne30",
),
- "crop-global-present-ne120": (
+ "crop-global-present-vrandne120": (
"--start-year 2000 --end-year 2000 --res",
- "ne120",
+ "vr_and_ne120",
),
"crop-global-present-mpasa480": (
"--start-year 2000 --end-year 2000 --res",
@@ -293,6 +305,10 @@ def main():
"--start-year 1850 --end-year 1850 --res",
"low_res",
),
+ "crop-global-1850-ne3": (
+ "--start-year 1850 --end-year 1850 --res",
+ "ne3",
+ ),
"crop-global-1850-ne16": (
"--start-year 1850 --end-year 1850 --res",
"ne16",
@@ -309,14 +325,30 @@ def main():
"--start-year 1850 --end-year 1850 --res",
"mpasa480",
),
+ "crop-global-hist-mpasa480": (
+ "--start-year 1850 --end-year 2023 --nosurfdata --res",
+ "mpasa480",
+ ),
"crop-global-hist": (
"--start-year 1850 --end-year 2023 --nosurfdata --res",
- "standard_res_no_f09",
+ "standard_res",
),
"crop-global-hist-low-res": (
"--start-year 1850 --end-year 2023 --nosurfdata --res",
"low_res",
),
+ "crop-global-hist-ne3-1": (
+ "--start-year 1850 --end-year 2023 --nosurfdata --res",
+ "ne3_1",
+ ),
+ "crop-global-hist-ne3-2": (
+ "--start-year 1850 --end-year 2023 --nosurfdata --res",
+ "ne3_2",
+ ),
+ "crop-global-hist-ne3-3": (
+ "--start-year 1850 --end-year 2023 --nosurfdata --res",
+ "ne3_3",
+ ),
"crop-global-hist-ne16": (
"--start-year 1850 --end-year 2023 --nosurfdata --res",
"ne16",
@@ -325,9 +357,9 @@ def main():
"--start-year 1850 --end-year 2023 --nosurfdata --res",
"ne30",
),
- "crop-global-hist-f09": (
+ "crop-global-hist-1700": (
"--start-year 1700 --end-year 2023 --res",
- "f09",
+ "1700_res",
),
"crop-global-SSP1-1.9-f09": (
"--start-year 1850 --end-year 2100 --nosurfdata --ssp-rcp SSP1-1.9 --res",
@@ -357,9 +389,13 @@ def main():
"--start-year 1850 --end-year 2100 --nosurfdata --ssp-rcp SSP2-4.5 --res",
"f45",
),
- "crop-global-SSP2-4.5-ne0np4": (
- "--start-year 1979 --end-year 2026 --ssp-rcp SSP2-4.5 --res",
- "ne0np4",
+ # NOTE 2025/10/21: When CMIP7 future scenarios become available,
+ # change 2023 to 2030 for a so-called "midpoint" future scenario.
+ # This future-proofs these cases, so that as time moves on, these
+ # simulations will still include the most recent historical year.
+ "crop-global-hist-vrandne120": (
+ "--start-year 1979 --end-year 2023 --res",
+ "vr_and_ne120",
),
"crop-global-SSP2-4.5-ne3": (
"--start-year 1850 --end-year 2100 --nosurfdata --ssp-rcp SSP2-4.5 --res",
diff --git a/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py b/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py
index c3f762380e..1413e49158 100755
--- a/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py
+++ b/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py
@@ -266,7 +266,7 @@ def write_runscript_part2(namelist_file, runfile, executable, mksurfdata_path, e
check = f'if [ $? != 0 ]; then echo "Error running for namelist {namelist_file}"; exit -4; fi'
runfile.write(f"{check} \n")
- runfile.write("echo Successfully ran resolution\n")
+ runfile.write("echo Confirm completion of fsurdat/landuse generation in the .log file\n")
def main():
diff --git a/src/biogeochem/AtmCarbonIsotopeStreamType.F90 b/src/biogeochem/AtmCarbonIsotopeStreamType.F90
index 0a49ac8061..e3317ea609 100644
--- a/src/biogeochem/AtmCarbonIsotopeStreamType.F90
+++ b/src/biogeochem/AtmCarbonIsotopeStreamType.F90
@@ -1,4 +1,7 @@
module AtmCarbonIsotopeStreamType
+
+
+#include "shr_assert.h"
!
! Description:
!
@@ -9,6 +12,7 @@ module AtmCarbonIsotopeStreamType
use clm_varctl , only : iulog
use abortutils , only : endrun
use decompMod , only : bounds_type
+ use shr_log_mod, only : errMsg => shr_log_errMsg
use CTSMForce2DStreamBaseType, only : ctsm_force_2DStream_base_type
implicit none
@@ -84,10 +88,15 @@ subroutine C13Init( this, bounds, fldfilename, meshfile, mapalgo, tintalgo, taxm
integer, intent(in) :: year_last ! last year to use
integer, intent(in) :: model_year_align ! align yearFirst with this model year
+ ! Since C13 data is a single global value mapalgo and meshfile must both be none
+ call shr_assert( trim(mapalgo) == "none", "mapalgo MUST be none for C13 streams"//errMsg( file=sourcefile, line=__LINE__) )
+ call shr_assert( trim(meshfile) == "none", "meshfile MUST be none for C13 streams"//errMsg( file=sourcefile, line=__LINE__) )
call this%InitBase( bounds, varnames = (/ varname_c13 /), fldfilename=fldfilename, meshfile=meshfile, &
mapalgo=mapalgo, tintalgo=tintalgo, taxmode=taxmode, name=varname_c13, &
year_first=year_first, year_last=year_last, model_year_align=model_year_align )
call this%C13InitAllocate( bounds )
+ call this%Advance( )
+ call this%Check1DPtrSize( bounds )
end subroutine C13Init
@@ -168,10 +177,26 @@ subroutine C14Init( this, bounds, fldfilename, meshfile, mapalgo, tintalgo, taxm
integer, intent(in) :: year_last ! last year to use
integer, intent(in) :: model_year_align ! align yearFirst with this model year
+ character(len=len(mapalgo)) :: str_mapalgo ! Temporary copy of mapalgo so can change input if meshfile is none
+
+ ! Since C14 data has latitude bands mapalgo and meshfile can neither be set to none
+ call shr_assert( trim(mapalgo) /= "none", "mapalgo MUST NOT be none for C14 streams"//errMsg( file=sourcefile, line=__LINE__) )
+ ! TODO: Uncomment this error check when we are ready for the test for this to change answers
+ !call shr_assert( trim(meshfile) /= "none", "meshfile MUST NOT be none for C14 streams"//errMsg( file=sourcefile, line=__LINE__) )
+ ! TOD: Remove this tempoary bit at the same time
+ if ( trim(meshfile) == "none" )then
+ str_mapalgo = "none"
+ else
+ str_mapalgo = mapalgo
+ end if
+ ! TODO: End of temporary bit
+
call this%InitBase( bounds, varnames = (/ varname_c14 /), fldfilename=fldfilename, meshfile=meshfile, &
- mapalgo=mapalgo, tintalgo=tintalgo, taxmode=taxmode, name=varname_c14, &
+ mapalgo=str_mapalgo, tintalgo=tintalgo, taxmode=taxmode, name=varname_c14, &
year_first=year_first, year_last=year_last, model_year_align=model_year_align )
call this%C14InitAllocate( bounds )
+ call this%Advance( )
+ call this%Check1DPtrSize( bounds )
end subroutine C14Init
diff --git a/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90 b/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90
index 736924fd4f..dce6f489c2 100644
--- a/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90
+++ b/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90
@@ -64,6 +64,7 @@ module CIsoAtmTimeseriesMod
! Private data for the control namelist:
character(len=CL), private :: stream_fldfilename_atm_c14 = ' '
character(len=CL), private :: stream_fldfilename_atm_c13 = ' '
+ character(len=CL), private :: stream_meshfile_atm_c14 = 'none'
integer, private :: stream_year_first_atm_c14 = 1850
integer, private :: stream_year_last_atm_c14 = 2023
integer, private :: stream_model_year_align_atm_c14 = 1850
@@ -73,7 +74,7 @@ module CIsoAtmTimeseriesMod
character(len=CL), private :: stream_mapalgo_atm_c14 = 'nn'
character(len=CL), private :: stream_tintalgo_atm_c14 = 'linear'
character(len=CL), private :: stream_taxmode_atm_c14 = 'extend'
- character(len=CL), private :: stream_mapalgo_atm_c13 = 'nn'
+ character(len=CL), private :: stream_mapalgo_atm_c13 = 'none'
character(len=CL), private :: stream_tintalgo_atm_c13 = 'linear'
character(len=CL), private :: stream_taxmode_atm_c13 = 'extend'
@@ -105,8 +106,11 @@ subroutine CIsoAtmReadNML( NLFilename )
namelist /carbon_isotope_streams/ stream_fldfilename_atm_c14, &
stream_fldfilename_atm_c13, stream_year_first_atm_c14, &
stream_year_last_atm_c14, stream_model_year_align_atm_c14, &
+ stream_meshfile_atm_c14, &
stream_year_first_atm_c13, stream_year_last_atm_c13, &
- stream_model_year_align_atm_c13
+ stream_model_year_align_atm_c13, stream_tintalgo_atm_c14, &
+ stream_taxmode_atm_c14, stream_tintalgo_atm_c13, &
+ stream_taxmode_atm_c13
! Read in the namelist on the main task
if (masterproc) then
@@ -127,13 +131,18 @@ subroutine CIsoAtmReadNML( NLFilename )
end if
! Broadcast namelist values to all tasks
call shr_mpi_bcast( stream_fldfilename_atm_c14, mpicom )
+ call shr_mpi_bcast( stream_meshfile_atm_c14, mpicom )
call shr_mpi_bcast( stream_year_first_atm_c14, mpicom )
call shr_mpi_bcast( stream_year_last_atm_c14, mpicom )
call shr_mpi_bcast( stream_model_year_align_atm_c14, mpicom )
+ call shr_mpi_bcast( stream_tintalgo_atm_c14, mpicom )
+ call shr_mpi_bcast( stream_taxmode_atm_c14, mpicom )
call shr_mpi_bcast( stream_fldfilename_atm_c13, mpicom )
call shr_mpi_bcast( stream_year_first_atm_c13, mpicom )
call shr_mpi_bcast( stream_year_last_atm_c13, mpicom )
call shr_mpi_bcast( stream_model_year_align_atm_c13, mpicom )
+ call shr_mpi_bcast( stream_tintalgo_atm_c13, mpicom )
+ call shr_mpi_bcast( stream_taxmode_atm_c13, mpicom )
! Do some error checking of input namelist items, set control flags, and write to the log
call CIsoCheckNMLInputs()
@@ -558,10 +567,13 @@ subroutine C14StreamsInit( bounds )
write(iulog, *) 'C14StreamsInit: Initializing C14 streams with file:'
write(iulog, *) trim(stream_fldfilename_atm_c14)
end if
+ ! Any error checking
+ call shr_assert( trim(stream_mapalgo_atm_c14) == "nn", "stream_mapalgo_atm_c14 MUST be nn because the file " // &
+ "is lattitude bands copied to a half degree grid: "//errMsg( file=sourcefile, line=__LINE__) )
! Streams method
call atm_c14_stream%Init( bounds, &
fldfilename=stream_fldfilename_atm_c14, &
- meshfile= 'none', &
+ meshfile= stream_meshfile_atm_c14, &
mapalgo=stream_mapalgo_atm_c14, &
tintalgo=stream_tintalgo_atm_c14, &
taxmode=stream_taxmode_atm_c14, &
@@ -795,6 +807,7 @@ subroutine C13StreamsInit( bounds )
! Streams method
call atm_c13_stream%Init( bounds, &
fldfilename=stream_fldfilename_atm_c13, &
+ ! meshfile MUST be none for C13 streams since its a single global value
meshfile= 'none', &
mapalgo=stream_mapalgo_atm_c13, &
tintalgo=stream_tintalgo_atm_c13, &
diff --git a/src/biogeochem/CNFireLi2024Mod.F90 b/src/biogeochem/CNFireLi2024Mod.F90
index dbad9a773d..d4c05f63bc 100644
--- a/src/biogeochem/CNFireLi2024Mod.F90
+++ b/src/biogeochem/CNFireLi2024Mod.F90
@@ -7,11 +7,8 @@ module CNFireLi2024Mod
! module for fire dynamics
! created in Nov, 2012 and revised in Apr, 2013 by F. Li and S. Levis
! based on Li et al. (2012a,b; 2013)
- ! revised in Apr, 2014 according to Li et al.(2014)
- ! revised in May, 2015, according to Li et al. (2015, in prep.)
- ! Fire-related parameters were calibrated or tuned in May, 2015 based on the
- ! 20th Century transient simulations at f19_g16 with a CLM4.5 version
- ! (clm50fire), CRUNCEPv5, and climatological lightning data.
+ ! revised in Apr, 2014 according to Li and Lawrance (2017)
+ ! revised in Jun, 2024 and modified in May, 2025, according to Li et al. (2025, in prep.)
!
! !USES:
use shr_kind_mod , only : r8 => shr_kind_r8
@@ -147,6 +144,10 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
real(r8) :: fs ! hd-dependent fires suppression (0-1)
real(r8) :: ig ! total ignitions (count/km2/hr)
real(r8) :: hdmlf ! human density
+ real(r8) :: topoi ! influence of topography on fires (0-1), where 1 indicates no impact.
+ ! can be removed if CLM consider Arctic C3 grass in plateau->
+ ! intense light-> much more C allocated to fine roots than leaf,
+ ! and roots decreasing infiltration
real(r8) :: arh, arh30 !combustability of fuel related to RH and RH30
real(r8) :: afuel !weight for arh and arh30
real(r8) :: btran_col(bounds%begc:bounds%endc)
@@ -180,7 +181,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
defo_fire_precip_thresh_bdt => cnfire_const%defo_fire_precip_thresh_bdt, & ! Input: [real(r8) ] (mm/day) Max running mean daily precip allowing deforestation fire for broadleaf deciduous trees
borpeat_fire_soilmoist_denom => cnfire_const%borpeat_fire_soilmoist_denom, & ! Input: [real(r8) ] (unitless) Denominator of exponential in soil moisture term of equation relating that and temperature to boreal peat fire (unitless)
nonborpeat_fire_precip_denom => cnfire_const%nonborpeat_fire_precip_denom, & ! Input: [real(r8) ] (unitless) Denominator of precipitation in equation relating that to non-boreal peat fire (unitless)
-
+ forc_topo_g => atm2lnd_inst%forc_topo_grc , & ! Input: [real(r8) (:) ] atmospheric surface height, a.k.a. elevation (m)
fsr_pft => pftcon%fsr_pft , & ! Input:
fd_pft => pftcon%fd_pft , & ! Input:
rswf_min => pftcon%rswf_min , & ! Input:
@@ -197,8 +198,8 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
forc_t => atm2lnd_inst%forc_t_downscaled_col , & ! Input: [real(r8) (:) ] downscaled atmospheric temperature (Kelvin)
forc_rain => wateratm2lndbulk_inst%forc_rain_downscaled_col , & ! Input: [real(r8) (:) ] downscaled rain
forc_snow => wateratm2lndbulk_inst%forc_snow_downscaled_col , & ! Input: [real(r8) (:) ] downscaled snow
- prec30 => wateratm2lndbulk_inst%prec30_patch , & ! Input: [real(r8) (:) ] 10-day running mean of tot. precipitation
- rh30 => wateratm2lndbulk_inst%rh30_patch , & ! Input: [real(r8) (:) ] 10-day running mean of tot. relative humidity
+ prec30 => wateratm2lndbulk_inst%prec30_patch , & ! Input: [real(r8) (:) ] 30-day running mean of tot. precipitation
+ rh30 => wateratm2lndbulk_inst%rh30_patch , & ! Input: [real(r8) (:) ] 30-day running mean of tot. relative humidity
dwt_smoothed => cnveg_state_inst%dwt_smoothed_patch , & ! Input: [real(r8) (:) ] change in patch weight (-1 to 1) on the gridcell, smoothed over the year
cropf_col => cnveg_state_inst%cropf_col , & ! Input: [real(r8) (:) ] cropland fraction in veg column
gdp_lf => this%gdp_lf_col , & ! Input: [real(r8) (:) ] gdp data
@@ -302,8 +303,8 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
if( patch%itype(p) > nc4_grass )then
cropf_col(c) = cropf_col(c) + patch%wtcol(p)
end if
- ! For natural vegetation
- if (patch%itype(p) <= nc4_grass ) then
+ ! Exclude crops and bare soil
+ if (patch%itype(p) <= nc4_grass .and. patch%itype(p) >= ndllf_evr_tmp_tree) then
lfwt(c) = lfwt(c) + patch%wtgcell(p)
end if
end do
@@ -516,6 +517,10 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
g = col%gridcell(c)
! For crop
+ ! cropf_col(c) * col%wtgcell(c) > 0.1_r8 is added because fires are rare in
+ ! gridcells with limited cropland coverage based on GFED5. Also, this helps to
+ ! avoid abm (crop fire peak month) regridding error from 0.05 degree to lower resolution
+ ! The condition could be removed if CLM supports the use of mode in abm inputs regridding
if( forc_t(c) >= SHR_CONST_TKFRZ .and. patch%itype(p) > nc4_grass .and. &
kmo == abm_lf(c) .and. &
burndate(p) >= 999 .and. patch%wtcol(p) > 0._r8 )then ! catch crop burn time
@@ -616,7 +621,15 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
cnfire_params%ignition_efficiency*(1._r8-fs)* &
(lfwt(c)**0.5)
end if
- nfire(c) = ig/secsphr*fb*fire_m*lgdp_col(c) !fire counts/km2/sec
+
+ ! Reduce burnability at high elevations
+ if(forc_topo_g(g) <= 2500._r8)then !influence of topography on fires
+ topoi = 1._r8
+ else
+ topoi = 0.004_r8
+ end if
+
+ nfire(c) = ig/secsphr*fb*fire_m*lgdp_col(c) * topoi !fire counts/km2/sec
Lb_lf = 1._r8+10._r8*(1._r8-EXP(-0.06_r8*forc_wind(g)))
spread_m = fire_m**0.5_r8
fd_col(c) = (lfwt(c)*lgdp1_col(c)*lpop_col(c))**0.5_r8 * fd_col(c)
@@ -639,7 +652,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
/ (trotr1_col(c) + trotr2_col(c))
cli = max(0._r8,min(1._r8,1._r8-prec30_col(c)*secspday/cri))* &
- (15._r8*min(0.0016_r8,dtrotr_col(c)/dt*dayspyr*secspday)+0.009_r8)* &
+ (0.67_r8*min(0.01_r8,dtrotr_col(c)/dt*dayspyr*secspday)+0.001_r8) * &
max(0._r8,min(1._r8,(0.25_r8-(forc_rain(c)+forc_snow(c))*secsphr)/0.25_r8))
farea_burned(c) = farea_burned(c)+fb*cli*(cli_scale/secspday)
diff --git a/src/biogeophys/CanopyStateType.F90 b/src/biogeophys/CanopyStateType.F90
index 81dc3947b1..66804e1549 100644
--- a/src/biogeophys/CanopyStateType.F90
+++ b/src/biogeophys/CanopyStateType.F90
@@ -296,11 +296,11 @@ subroutine InitHistory(this, bounds)
this%vegwp_ln_patch(begp:endp,:) = spval
call hist_addfld2d (fname='VEGWPLN', units='mm', type2d='nvegwcs', &
avgflag='A', long_name='vegetation water matric potential for sun/sha canopy,xyl,root at local noon', &
- ptr_patch=this%vegwp_ln_patch, default='active')
+ ptr_patch=this%vegwp_ln_patch, default='inactive')
this%vegwp_pd_patch(begp:endp,:) = spval
call hist_addfld2d (fname='VEGWPPD', units='mm', type2d='nvegwcs', avgflag='A', &
long_name='predawn vegetation water matric potential for sun/sha canopy,xyl,root', &
- ptr_patch=this%vegwp_pd_patch, default='active')
+ ptr_patch=this%vegwp_pd_patch, default='inactive')
end if
end subroutine InitHistory
diff --git a/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90 b/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90
index 174fa3554e..ba10de207e 100644
--- a/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90
+++ b/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90
@@ -15,7 +15,7 @@ module CTSMForce2DStreamBaseType
#include "shr_assert.h"
use ESMF, only : ESMF_LogFoundError, ESMF_LOGERR_PASSTHRU
- use dshr_strdata_mod , only : shr_strdata_type
+ use dshr_strdata_mod , only : shr_strdata_type
use shr_kind_mod , only : r8 => shr_kind_r8, CL => shr_kind_CL
use clm_varctl , only : iulog
use spmdMod , only : masterproc, mpicom, iam
@@ -43,6 +43,7 @@ module CTSMForce2DStreamBaseType
procedure, public, non_overridable :: CleanBase ! Clean method for the base type
procedure, public, non_overridable :: Advance ! Advance the streams data to the current model date
procedure, public :: GetPtr1D ! Get pointer to the 1D data array
+ procedure, public :: Check1DPtrSize ! Check that the data pointers are the expected size
procedure(Interp_interface), public, deferred :: Interp ! method in extensions to turn stream data into CTSM data
end type ctsm_force_2DStream_base_type
@@ -67,7 +68,7 @@ subroutine Init_interface( this, bounds, fldfilename, meshfile, mapalgo, tintalg
import :: ctsm_force_2DStream_base_type
! Arguments:
- class(ctsm_force_2DStream_base_type), intent(inout) :: this
+ class(ctsm_force_2DStream_base_type), intent(inout) :: this
type(bounds_type), intent(in) :: bounds
character(*), intent(in) :: fldfilename ! stream data filename (full pathname) (single file)
! NOTE: fldfilename could be expanded to an array if needed, but currently we only have one file
@@ -91,7 +92,7 @@ subroutine Clean_interface(this)
!
! Arguments:
class(ctsm_force_2DStream_base_type), intent(inout) :: this
- end subroutine Clean_interface
+ end subroutine Clean_interface
!-----------------------------------------------------------------------
@@ -134,7 +135,7 @@ subroutine InitBase( this, bounds, varnames, fldfilename, meshfile, mapalgo, tin
use decompMod , only : bounds_level_proc
use shr_log_mod , only : errMsg => shr_log_errMsg
! Arguments:
- class(ctsm_force_2DStream_base_type), intent(inout) :: this
+ class(ctsm_force_2DStream_base_type), intent(inout) :: this
type(bounds_type), intent(in) :: bounds
character(*), intent(in) :: varnames(:) ! variable names to read from stream file
character(*), intent(in) :: fldfilename ! stream data filename (full pathname) (single file)
@@ -158,6 +159,14 @@ subroutine InitBase( this, bounds, varnames, fldfilename, meshfile, mapalgo, tin
if ( len(fldfilename) >= FL )then
call endrun( 'stream field filename is too long:'//trim(fldfilename), file=sourcefile, line=__LINE__ )
end if
+ if( trim(meshfile) == "none" .and. trim(mapalgo) /= "none" ) then
+ write(iulog,*) 'mapalgo = ', trim(mapalgo), ' meshfile = ', trim(meshfile)
+ call endrun( "if meshfile is none so must be mapalgo", file=sourcefile, line=__LINE__ )
+ end if
+ if( trim(meshfile) /= "none" .and. trim(mapalgo) == "none" ) then
+ write(iulog,*) 'mapalgo = ', trim(mapalgo), ' meshfile = ', trim(meshfile)
+ call endrun( "if mapalgo is none so must be meshfile", file=sourcefile, line=__LINE__ )
+ end if
this%stream_filename = fldfilename
this%stream_name = name
call shr_strdata_init_from_inline(this%sdat, &
@@ -185,17 +194,61 @@ subroutine InitBase( this, bounds, varnames, fldfilename, meshfile, mapalgo, tin
write(iulog,*) ' Streams initialization failing for ', trim(name), ' stream file = ', trim(fldfilename)
call endrun( 'CTSM forcing Streams initialization failing', file=sourcefile, line=__LINE__ )
end if
+
end subroutine InitBase
!-----------------------------------------------------------------------
+ subroutine Check1DPtrSize( this, bounds )
+ !
+ ! Description:
+ !
+ ! Check that the stream data pointer size is as expected
+ !
+ use shr_kind_mod , only : CS => shr_kind_CS
+ use dshr_stream_mod, only : shr_stream_streamType, shr_stream_getStreamFieldList
+ use dshr_stream_mod, only : shr_stream_getMeshFileName
+ use shr_log_mod , only : errMsg => shr_log_errMsg
+ ! Arguments:
+ class(ctsm_force_2DStream_base_type), intent(inout) :: this
+ type(bounds_type), intent(in) :: bounds
+ ! Local variables
+ integer :: n ! Indices
+ integer :: nvars ! Number of variables
+ real(r8), pointer :: dataptr1d(:) ! Pointer to the 1D data
+ character(len=CS), allocatable :: varnames(:)
+ type(shr_stream_streamType), pointer :: stream => NULL()
+ character(len=CL) :: meshname
+
+ ! Loop through the list of varnames
+
+ stream => this%sdat%stream(1)
+ nvars = stream%nvars
+ allocate( varnames(nvars) )
+ call shr_stream_getStreamFieldList( stream, varnames )
+ call shr_stream_getMeshFileName( stream, meshname )
+ do n = 1, nvars
+ call this%GetPtr1D( varnames(n), dataptr1d )
+ call shr_assert( size(dataptr1d) >= bounds%endg-bounds%begg + 1, "Expect stream data to be >= size of grid bounds (includes ocean)"//errMsg( file=sourcefile, line=__LINE__) )
+ if ( trim(meshname) == 'none' ) then
+ call shr_assert( all(dataptr1d(:) == dataptr1d(1)), "Expect stream data to duplicate a single value when no mesh given"//errMsg( file=sourcefile, line=__LINE__) )
+ end if
+ end do
+ nullify( dataptr1d )
+ nullify( stream )
+ deallocate( varnames )
+
+ end subroutine Check1DPtrSize
+
+ !-----------------------------------------------------------------------
+
subroutine CleanBase( this )
! Description:
! Clean up any memory in the base type as needed.
! Normally types that extend this base type will call this as part of their clean operation
!
! Arguments:
- class(ctsm_force_2DStream_base_type) , intent(inout) :: this
+ class(ctsm_force_2DStream_base_type) , intent(inout) :: this
integer :: ierr ! error code
@@ -243,7 +296,7 @@ subroutine GetPtr1D(this, fldname, dataptr1d)
! Description:
!
! Get the pointer to the 1D data array for the given field name
- ! Normally stream extensions will use this in the Interp method to
+ ! Normally stream extensions will use this in the Interp method to
! save the stream data locally.
!
! Uses:
@@ -251,12 +304,13 @@ subroutine GetPtr1D(this, fldname, dataptr1d)
! Arguments:
class(ctsm_force_2DStream_base_type), intent(inout) :: this
character(*), intent(in) :: fldname ! field name to get pointer for
- real(r8), pointer :: dataptr1d(:) ! Pointer to the 1D data
+ real(r8), intent(inout), pointer :: dataptr1d(:) ! Pointer to the 1D data
! Local variables
integer :: rc ! error return code
! Get pointer for stream data that is time and spatially interpolated to model time and grid
+ nullify( dataptr1d )
call dshr_fldbun_getFldPtr(this%sdat%pstrm(1)%fldbun_model, fldname=fldname, fldptr1=dataptr1d, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=sourcefile)) then
call endrun( 'Error getting field pointer for '//trim(fldname)//' from stream data', file=sourcefile, line=__LINE__ )
diff --git a/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90 b/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90
index 59e6a4d551..0d284a7d54 100644
--- a/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90
+++ b/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90
@@ -21,6 +21,7 @@ module CTSMForce2DStreamBaseType
procedure, public, non_overridable :: CleanBase ! Clean method for the base type
procedure, public, non_overridable :: Advance ! Advance the streams data to the current model date
procedure, public :: GetPtr1D ! Get pointer to the 1D data array
+ procedure, public :: Check1DPtrSize ! Check the size of the 1D stream data array
procedure(Interp_interface), public, deferred :: Interp ! method in extensions to turn stream data into output data
end type ctsm_force_2DStream_base_type
@@ -117,4 +118,14 @@ subroutine GetPtr1D(this, fldname, dataptr1d)
end subroutine GetPtr1D
+ !-----------------------------------------------------------------------
+
+ subroutine Check1DPtrSize( this, bounds )
+ ! Check that the stream data pointer size is as expected
+ ! Arguments:
+ class(ctsm_force_2DStream_base_type), intent(inout) :: this
+ type(bounds_type), intent(in) :: bounds
+
+ end subroutine Check1DPtrSize
+
end module CTSMForce2DStreamBaseType
diff --git a/tools/mksurfdata_esmf/Makefile b/tools/mksurfdata_esmf/Makefile
index 835f732a02..1a6badd0c7 100644
--- a/tools/mksurfdata_esmf/Makefile
+++ b/tools/mksurfdata_esmf/Makefile
@@ -14,7 +14,7 @@
# To generate a single dataset, run make with the name of the rule you
# want to build. For example, to generate the crop data set for 1x1_numaIA:
#
-# make crop-numa
+# make 1x1-numa-present
#
# NOTE: The default behavior is to parallelize data set creation using
# the batch system by submitting jobs to the batch queue (on Derecho).
@@ -81,36 +81,51 @@ URBALPHA_TMP2_FNAME := surfdata_1x1_urbanc_alpha_hist_2000_78pfts_tmp.nc
URBALPHA_FNAME := surfdata_1x1_urbanc_alpha_hist_2000_78pfts_c$(CDATE).nc
SUBSETDATA_1X1_MEXICOCITY := --lat 19.5 --lon 260.5 --site 1x1_mexicocityMEX --out-surface $(MEXICOCITY_TMP_FNAME)
SUBSETDATA_1X1_VANCOUVER := --lat 49.5 --lon 236.5 --site 1x1_vancouverCAN --out-surface $(VANCOUVER_TMP_FNAME)
-SUBSETDATA_1X1_URBALPHA := --lat -37.7308 --lon 0 --site 1x1_urbanc_alpha --out-surface $(URBALPHA_TMP_FNAME)
+SUBSETDATA_1X1_URBALPHA := --lat -37.7308 --lon 360 --site 1x1_urbanc_alpha --out-surface $(URBALPHA_TMP_FNAME)
# ne120np4 and hi-res are for high resolution, ne16np4 is for mid-resolution testing
# low-res is for low resolutions for testing
# nldas is for NWP working with WRF
# STANDARD means no crop, so 16 pfts
-# global-hist-1850-f45 is used by FATES and we expect it to be phased out
+# global-hist-1850-low-res is used by FATES; we expected to phase it out, but to f45 we added f10 in ctsm5.4
STANDARD = \
global-potveg \
global-present \
global-present-low-res \
- global-hist-1850-f19 \
- global-hist-1850-f45 \
-
+ global-hist-1850-1and2deg \
+ global-hist-1850-low-res \
+
+# NOTE slevis 2025/9/10: For CTSM5.4, I removed from CROP:
+# crop-global-future
+# Here I added this because it spans 1979-2023. When CMIP7 future scenarios become available, this will span 1979-2030:
+# crop-global-hist-vrandne120
+# Also I split ne3 into ne3-1, ne3-2, ne3-3 for historical because the combined ne3 job took >12 hours in the queue
CROP = \
- crop-global-future \
- crop-global-hist-f09 \
+ crop-global-hist \
+ crop-global-hist-low-res \
+ crop-global-hist-ne3-1 \
+ crop-global-hist-ne3-2 \
+ crop-global-hist-ne3-3 \
+ crop-global-hist-ne16 \
+ crop-global-hist-ne30 \
+ crop-global-hist-mpasa480 \
+ crop-global-hist-1700 \
crop-global-1850-ne120 \
- crop-global-present-ne120 \
+ crop-global-present-vrandne120 \
crop-global-present-nldas \
crop-global-present-ne30 \
crop-global-present \
crop-global-present-low-res \
+ crop-global-present-ne3 \
crop-global-present-ne16 \
crop-global-present-mpasa480 \
crop-global-1850 \
crop-global-1850-low-res \
+ crop-global-1850-ne3 \
crop-global-1850-ne16 \
crop-global-1850-ne30 \
crop-global-1850-mpasa480 \
+ crop-global-hist-vrandne120 \
# Build the executable if it doesn't exist and any target depends on it
$(MKSURFDATA_EXE):
@@ -127,11 +142,12 @@ all : all-subset global-present-ultra-hi-res crop standard crop-tropics-present
# These are all the surface datasets generated by subset_data
# This runs interactively and does not send jobs to the batch queue
+# NOTE slevis 2025/9/10: For CTSM5.4, I removed from all-subset:
+# 1x1-smallville-present
all-subset : \
1x1_brazil-present \
1x1_brazil-transient \
1x1-numa-present \
- 1x1-smallville-present \
1x1-smallville-1850 \
1x1-smallville-transient \
1x1-cidadinho-present \
@@ -168,10 +184,10 @@ global-present-low-res : FORCE
$(MKSURFDATA) --number-of-nodes 1 --tasks-per-node 64 --scenario $@ --jobscript-file $@.sh --walltime 01:00:00
$(BATCHJOBS) $@.sh
-global-hist-1850-f19 : FORCE
+global-hist-1850-1and2deg : FORCE
$(MKSURFDATA) --number-of-nodes 8 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
-global-hist-1850-f45 : FORCE
+global-hist-1850-low-res : FORCE
$(MKSURFDATA) --number-of-nodes 2 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
#
@@ -205,7 +221,11 @@ crop-global-present : FORCE
$(BATCHJOBS) $@.sh
crop-global-present-low-res : FORCE
- $(MKSURFDATA) --number-of-nodes 1 --tasks-per-node 64 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(BATCHJOBS) $@.sh
+
+crop-global-present-ne3 : FORCE
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
crop-global-present-ne16 : FORCE
@@ -216,7 +236,7 @@ crop-global-present-ne30 : FORCE
$(MKSURFDATA) --number-of-nodes 4 --scenario $@ --jobscript-file $@.sh --walltime 01:00:00
$(BATCHJOBS) $@.sh
-crop-global-present-ne120 : FORCE
+crop-global-present-vrandne120 : FORCE
$(MKSURFDATA) --number-of-nodes 4 --scenario $@ --jobscript-file $@.sh --walltime 01:00:00
$(BATCHJOBS) $@.sh
@@ -233,7 +253,11 @@ crop-global-1850 : FORCE
$(BATCHJOBS) $@.sh
crop-global-1850-low-res : FORCE
- $(MKSURFDATA) --number-of-nodes 1 --tasks-per-node 64 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(BATCHJOBS) $@.sh
+
+crop-global-1850-ne3 : FORCE
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
crop-global-1850-ne16 : FORCE
@@ -256,12 +280,24 @@ crop-global-hist : FORCE
$(MKSURFDATA) --number-of-nodes 72 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
-crop-global-hist-f09 : FORCE
+crop-global-hist-1700 : FORCE
$(MKSURFDATA) --number-of-nodes 9 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
crop-global-hist-low-res : FORCE
- $(MKSURFDATA) --number-of-nodes 14 --tasks-per-node 32 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(BATCHJOBS) $@.sh
+
+crop-global-hist-ne3-1: FORCE
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(BATCHJOBS) $@.sh
+
+crop-global-hist-ne3-2: FORCE
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(BATCHJOBS) $@.sh
+
+crop-global-hist-ne3-3: FORCE
+ $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
crop-global-hist-ne16 : FORCE
@@ -272,6 +308,10 @@ crop-global-hist-ne30 : FORCE
$(MKSURFDATA) --number-of-nodes 9 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
+crop-global-hist-mpasa480 : FORCE
+ $(MKSURFDATA) --number-of-nodes 4 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
+ $(BATCHJOBS) $@.sh
+
1x1-numa-present : FORCE
$(SUBSETDATA_POINT_ALLLU) --create-surface $(SUBSETDATA_1X1_NUMAIA)
@@ -296,7 +336,11 @@ crop-global-hist-ne30 : FORCE
#
# Crop with future scenarios
-#
+# NOTE 2025/10/21: Time periods extending beyond 2023 combine CMIP7 data
+# for the historical period and CMIP6 data beyond 2023.
+# This introduces a discontinuity in 2024.
+# TODO: Add crop-global-future back when the CMIP7 data become available.
+# See other corresponding crop-global-future comment elsewhere in this Makefile.
crop-global-future : crop-global-SSP1-1.9-f09 \
crop-global-SSP1-2.6-f09 \
@@ -310,12 +354,14 @@ crop-global-future : crop-global-SSP1-1.9-f09 \
crop-global-SSP2-4.5-low-res : crop-global-SSP2-4.5-f10 \
crop-global-SSP2-4.5-f45 \
crop-global-SSP2-4.5-ne3
+# NOTE slevis 2025/9/10: For CTSM5.4, I moved to CROP because it spans 1979-2023:
+# crop-global-hist-vrandne120
+# When CMIP7 future scenario data become available, this will span 1979-2030.
crop-global-SSP2-4.5 : crop-global-SSP2-4.5-f09 \
crop-global-SSP2-4.5-f19 \
crop-global-SSP2-4.5-hcru \
crop-global-SSP2-4.5-ne16 \
crop-global-SSP2-4.5-ne30 \
- crop-global-SSP2-4.5-ne0np4 \
crop-global-SSP2-4.5-C96 \
crop-global-SSP2-4.5-mpasa120
@@ -359,7 +405,7 @@ crop-global-SSP2-4.5-ne30 : FORCE
$(MKSURFDATA) --number-of-nodes 9 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
-crop-global-SSP2-4.5-ne0np4 : FORCE
+crop-global-hist-vrandne120 : FORCE
$(MKSURFDATA) --number-of-nodes 2 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00
$(BATCHJOBS) $@.sh
diff --git a/tools/mksurfdata_esmf/README.md b/tools/mksurfdata_esmf/README.md
index f49d23fb61..95064a9839 100644
--- a/tools/mksurfdata_esmf/README.md
+++ b/tools/mksurfdata_esmf/README.md
@@ -100,6 +100,7 @@ This will bring in CIME and ccs_config which are required for building.
``` shell
# Assuming pwd is the tools/mksurfdata_esmf directory
+setenv DEBUG TRUE # only if debugging and your shell is tcsh (in bash use: export DEBUG=TRUE)
./gen_mksurfdata_build # For machines with a cime build
```
diff --git a/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml b/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml
index a2266bf0a0..1d242a11c5 100644
--- a/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml
+++ b/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml
@@ -10,7 +10,7 @@
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histMKSRFDeg025_240709/mksrf_landuse_ctsm53_pftlai_CLIM.c240709.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_pftlai_clm6_histLUH3_2005_c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
@@ -21,7 +21,7 @@
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histMKSRFDeg025_240709/mksrf_landuse_ctsm53_soilcolor_CLIM.c240709.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_soilcolor_clm6_histLUH3_2005_c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
@@ -93,7 +93,7 @@
- lnd/clm2/mappingdata/grids/UNSTRUCTgrid_3x3min_nomask_cdf5_c200129.nc
+ lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
@@ -168,7 +168,7 @@ version of the raw dataset will probably go away.
- lnd/clm2/rawdata/mksrf_abm_0.5x0.5_simyr2000.c240821.nc
+ lnd/clm2/rawdata/mksrf_abm_0.5x0.5_simyr2000.c250715.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.5x0.5_nomask_cdf5_c200129.nc
@@ -204,40 +204,40 @@ version of the raw dataset will probably go away.
-
+
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRNOANTHRODeg025_240831/mksrf_landuse_ctsm53_histTRNOANTHRO_1.c240831.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_NOANTHRO_CMIP7/mksrf_landuse_clm6_noanthroLUH3_1.c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_1850.cdf5.c20220325.nc
lnd/clm2/rawdata/mksrf_urban_0.05x0.05_zerourbanpct.cdf5.c181014.nc
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_1700.c240728.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_1700.c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_1850.cdf5.c20220325.nc
- lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_1850_cdf5_c20220910.nc
+ lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_1700_c250423.nc
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_1850.c240728.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_1850.c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_1850.cdf5.c20220325.nc
- lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_1850_cdf5_c20220910.nc
+ lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_1850_c250423.nc
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_2000.c240728.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_2000.c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_2000.cdf5.c20220325.nc
- lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_2000_cdf5_c20220910.nc
+ lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_2000_c250423.nc
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_2005.c240728.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_2005.c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_2005.cdf5.c20220325.nc
- lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_2005_cdf5_c20220910.nc
+ lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_2005_c250423.nc
@@ -251,12 +251,11 @@ version of the raw dataset will probably go away.
-
- lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_%y.c240728.nc
+ lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_%y.c251012.nc
lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc
lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_%y.cdf5.c20220325.nc
- lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_%y_cdf5_c20220910.nc
+ lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_%y_c250423.nc
diff --git a/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg b/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg
index bdb27ac43d..1e509ccb8f 100644
--- a/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg
+++ b/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg
@@ -32,6 +32,8 @@ lnd_lat_2 = 90
lnd_lon_1 = 0
# easternmost longitude for rectangle
lnd_lon_2 = 360
+# Upper limit of longitudes, from format being either [-180, 180] or [0, 360]
+lon_type = 360
# user-defined mask in a file, as alternative to setting lat/lon values
landmask_file = UNSET
diff --git a/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90 b/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90
index 6115e813f9..417658245c 100644
--- a/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90
+++ b/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90
@@ -20,9 +20,9 @@ module mkagfirepkmonthMod
public :: mkagfirepkmon ! Set agricultural fire peak month
- integer , parameter :: min_valid = 1
- integer , parameter :: max_valid = 12
- integer , parameter :: unsetmon = 13
+ integer , parameter :: min_valid = 1 ! month value for January
+ integer , parameter :: max_valid = 13 ! value for no agricultural fire
+ integer , parameter :: unsetmon = 14 ! value for no data
type(ESMF_DynamicMask) :: dynamicMask
@@ -36,6 +36,10 @@ module mkagfirepkmonthMod
subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc)
!
! Make agricultural fire peak month data from higher resolution data
+ ! by selecting the dominant value from values 1 through 13
+ ! where 13 means no agricultural fire.
+ !
+ ! The relevant subroutine is get_dominant_indices.
!
! input/output variables
character(len=*) , intent(in) :: file_mesh_i ! input mesh file name
@@ -54,9 +58,9 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc)
integer :: k
integer :: ni,no
integer :: ns_i, ns_o
- integer , allocatable :: mask_i(:)
- real(r4), allocatable :: rmask_i(:)
- real(r8), allocatable :: frac_o(:)
+ integer , allocatable :: mask_i(:) ! input grid: mesh file landmask
+ real(r4), allocatable :: rmask_i(:) ! input grid: raw dataset landmask
+ real(r8), allocatable :: frac_o(:) ! output grid: agricultural fire peak month
integer , allocatable :: idata_i(:) ! input grid: agricultural fire peak month
integer , allocatable :: agfirepkmon_o(:) ! agricultural fire peak month
real(r4), pointer :: dataptr(:)
@@ -116,6 +120,10 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc)
call mkpio_get_rawdata(pioid_i, 'abm', mesh_i, idata_i, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
call ESMF_VMLogMemInfo("After mkpio_getrawdata in "//trim(subname))
+ ! Update idata_i to unsetmon where mask_i == 0, i.e. over ocean
+ do ni = 1, ns_i
+ if (mask_i(ni) == 0) idata_i(ni) = unsetmon
+ end do
! Create ESMF fields that will be used below
field_i = ESMF_FieldCreate(mesh_i, ESMF_TYPEKIND_R4, meshloc=ESMF_MESHLOC_ELEMENT, rc=rc)
@@ -142,6 +150,7 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc)
! Create a dynamic mask object
! The dynamic mask object further holds a pointer to the routine that will be called in order to
! handle dynamically masked elements - in this case its DynMaskProc (see below)
+ ! This calls subroutine get_dominant_indices
call ESMF_DynamicMaskSetR4R8R4(dynamicMask, dynamicMaskRoutine=get_dominant_indices, &
handleAllElements=.true., rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return
@@ -164,6 +173,7 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc)
! Check validity of output data
if (min_bad(agfirepkmon_o, min_valid, 'agfirepkmon') .or. &
max_bad(agfirepkmon_o, unsetmon , 'agfirepkmon')) then
+ if (root_task) write(ndiag, '(a)') trim(subname)//" error in agfirepkmon_o value range: expect min_valid to unsetmon which equal ", min_valid, unsetmon
call shr_sys_abort()
end if
@@ -178,7 +188,7 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc)
! Output diagnostics comparing global area of each peak month on input and output grids
call output_diagnostics_index(mesh_i, mesh_o, mask_i, frac_o, &
- 1, 13, idata_i, agfirepkmon_o, 'peak fire month', ndiag, rc)
+ min_valid, unsetmon, idata_i, agfirepkmon_o, 'peak fire month', ndiag, rc)
if (chkerr(rc,__LINE__,u_FILE_u)) call shr_sys_abort()
! Release memory
@@ -206,15 +216,16 @@ subroutine get_dominant_indices(dynamicMaskList, dynamicSrcMaskValue, dynamicDst
! input/output arguments
type(ESMF_DynamicMaskElementR4R8R4) , pointer :: dynamicMaskList(:)
- real(ESMF_KIND_R4) , intent(in), optional :: dynamicSrcMaskValue
- real(ESMF_KIND_R4) , intent(in), optional :: dynamicDstMaskValue
- integer , intent(out) :: rc
+ real(ESMF_KIND_R4) , intent(in), optional :: dynamicSrcMaskValue ! Source (i.e. input) grid mask
+ real(ESMF_KIND_R4) , intent(in), optional :: dynamicDstMaskValue ! Destination (i.e. output) grid mask
+ integer , intent(out) :: rc ! error status
! local variables
integer :: ni, no, n
real(ESMF_KIND_R4) :: wts_o(min_valid:max_valid)
integer :: maxindex(1)
logical :: hasdata
+ character(len=*), parameter :: subname = 'get_dominant_indices'
!---------------------------------------------------------------
rc = ESMF_SUCCESS
diff --git a/tools/mksurfdata_esmf/src/mksurfdata.F90 b/tools/mksurfdata_esmf/src/mksurfdata.F90
index 35ff1807cd..c2ecc9c308 100644
--- a/tools/mksurfdata_esmf/src/mksurfdata.F90
+++ b/tools/mksurfdata_esmf/src/mksurfdata.F90
@@ -968,8 +968,8 @@ program mksurfdata
rcode = pio_put_var(pioid, pio_varid, (/ntim/), year)
rcode = pio_inq_varid(pioid, 'time', pio_varid)
rcode = pio_put_var(pioid, pio_varid, (/ntim/), year)
- !rcode = pio_inq_varid(pioid, 'input_pftdata_filename', pio_varid)
- !rcode = pio_put_var(pioid, pio_varid, (/1,ntim/), (/len_trim(string),1/), trim(string))
+ rcode = pio_inq_varid(pioid, 'input_pftdata_filename', pio_varid)
+ rcode = pio_put_var(pioid, pio_varid, (/1,ntim/), trim(string))
call pio_syncfile(pioid)
! Create pctpft data at model resolution from file fname
diff --git a/tools/mksurfdata_esmf/validate_fsurdat_files.sh b/tools/mksurfdata_esmf/validate_fsurdat_files.sh
new file mode 100755
index 0000000000..2158a30435
--- /dev/null
+++ b/tools/mksurfdata_esmf/validate_fsurdat_files.sh
@@ -0,0 +1,126 @@
+#!/bin/bash
+
+# Validation/verification of new fsurdat files
+# --------------------------------------------
+# WRITTEN by slevis after discussions with ekluzek.
+#
+# LOCATION: slevis first used this script in the directory
+# .../inputdata/lnd/clm2/surfdata_esmf/ctsm5.4.0/validation
+#
+# CAVEAT: For new CTSM versions, use this script as a template with the
+# understanding that aspects of the code will need to change. Search
+# the string "current" for items that may need to change in the future.
+#
+# PURPOSE and DETAILS
+# -------------------
+# This script
+# 1) uses cprnc to compare NEW_VERSION versus OLD_VERSION files by generating
+# cprnc.out files.
+# 2) greps for fields with differences (RMS or NORMALIZED) that are >=1.
+# The strictest grep threshold that I found isolates potentially
+# unexpected changes is E-03. I determined this empirically using two
+# types of problematic fsurdat files from the recent past:
+# - No LAI, SAI, and heights for pfts 15 and 16.
+# - No soil textures in parts of the world in unstructured grids.
+# These "unexpected" fields appear alongside expected diffs (discussed
+# below) when grepping for E+. Grepping for less than E-03 starts to
+# capture fields with smaller differences and is likely to miss
+# unexpected problematic fields.
+#
+# Step after running the script
+# -----------------------------
+# Interactively and iteratively build this grep command to confirm that
+# all fields in the script's grep output are expected. This list of
+# fields here is ctsm5.4-specific:
+# >>> grep NORM grep_E+_surfdata_cprnc.out | grep -v ROOF | grep -v WALL | grep -v URBAN | grep -v BUILDING | grep -v abm | grep -v CANYON | grep -v CONST_HARVEST | grep -v ROAD | grep -v UNREPRESENTED_PFT | grep -v PCT_NATVEG
+#
+# If the grep command reveals unexpected fields, investigate.
+# The list of fields to check depends on which fields you expect to have
+# answer changes. The magnitude of the differences will depend on the
+# specifics of what changed. Ensure you only see the answer changes that
+# you expect.
+#
+# -----------------------------
+#
+# Separate subjective comparison
+# ------------------------------
+# >>> ncdiff surfdata_new.nc surfdata_old.nc surfdata_new_vs_old.nc
+# >>> ncview surfdata_new_vs_old.nc
+# - Focus on fields with larger RMS diffs in the cprnc output.
+# - ncvis works like ncview for unstructured grids (e.g. ne30), though
+# slevis found ncvis to crash when reading a "diff" file generated by ncdiff.
+#
+# Another validation step
+# -----------------------
+# Run mksurfdata_esmf with a different number of processors and confirm
+# bit-for-bit same results.
+
+# Settings to be used in the comparisons below.
+# Paths are hardwired to derecho currently.
+newdatestamp=c251022 # USER DEFINED
+newdir=ctsm5.4.0 # USER DEFINED
+olddir=ctsm5.3.0 # USER DEFINED
+olddatestamp=c240908 # USER DEFINED
+olddatestamp_ne3np4=c240925 # USER DEFINED
+cimetoolspath=/glade/campaign/cesm/cesmdata/cseg/tools/cime/tools
+CPRNC=$cimetoolspath/cprnc/cprnc
+
+echo "starting grids loop"
+
+# The first loop of grids (unlike the other loops) uses olddatestamp_ne3np4 currently.
+# Skip ne3np4.pg2 as present only in NEW_VERSION currently so may wish to add in future versions.
+grids=("ne3np4")
+
+for grid in "${grids[@]}"
+
+ # 1850_78pft files
+ do $CPRNC ../surfdata_$grid\_hist_1850_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_1850_78pfts_$olddatestamp_ne3np4.nc >& surfdata_$grid\_hist_1850_78pfts_$newdir\_vs_$olddir.cprnc.out
+ # 2000_78pft files
+ $CPRNC ../surfdata_$grid\_hist_2000_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_2000_78pfts_$olddatestamp_ne3np4.nc >& surfdata_$grid\_hist_2000_78pfts_$newdir\_vs_$olddir.cprnc.out
+ echo "done $grid"
+
+done
+
+# Second loop of grids.
+grids=("C96" "360x720cru" "4x5" "10x15" "0.9x1.25" "1.9x2.5" "mpasa120" "mpasa480" "ne16np4.pg3" "ne120np4.pg3" "ne3np4.pg3" "ne30np4" "ne30np4.pg2" "ne30np4.pg3")
+for grid in "${grids[@]}"
+
+ # 1850_78pft files
+ do $CPRNC ../surfdata_$grid\_hist_1850_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_1850_78pfts_$olddatestamp.nc >& surfdata_$grid\_hist_1850_78pfts_$newdir\_vs_$olddir.cprnc.out
+ # 2000_78pft files
+ $CPRNC ../surfdata_$grid\_hist_2000_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_2000_78pfts_$olddatestamp.nc >& surfdata_$grid\_hist_2000_78pfts_$newdir\_vs_$olddir.cprnc.out
+ echo "done $grid"
+
+done
+
+# Third loop of grids.
+# Skip 1850 as only 2000 is present currently.
+# Skip mpasa30 as present only in NEW_VERSION currently so may wish to add in future versions.
+# Skip mpasa3p75 because cprnc runs out of memory at that resolution currently.
+grids=("mpasa60" "mpasa15")
+for grid in "${grids[@]}"
+
+ # 2000_16pft files
+ do $CPRNC ../surfdata_$grid\_hist_2000_16pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_2000_16pfts_$olddatestamp.nc >& surfdata_$grid\_hist_2000_16pfts_$newdir\_vs_$olddir.cprnc.out
+ echo "done $grid"
+
+done
+
+# Fourth loop of grids: for 1979 files.
+# Skip ne0np4.NATL.ne30x8 and ne120np4.pg3 as present only in NEW_VERSION currently so may wish to add in future versions.
+grids=("ne0np4.ARCTICGRIS.ne30x8" "ne0np4.ARCTIC.ne30x4" "ne0np4CONUS.ne30x8" "ne0np4.POLARCAP.ne30x4")
+
+for grid in "${grids[@]}"
+
+ # 1979_78pft files
+ do $CPRNC ../surfdata_$grid\_hist_1979_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_1979_78pfts_$olddatestamp.nc >& surfdata_$grid\_hist_1979_78pfts_$newdir\_vs_$olddir.cprnc.out
+ echo "done $grid"
+
+done
+
+# grep for E+ to catch larger diffs.
+for file in surfdata_*cprnc.out
+ do grep -H NORM $file | grep 'E+' >> grep_E+_surfdata_cprnc.out
+done
+
+exit
diff --git a/tools/modify_input_files/modify_smallville.sh b/tools/modify_input_files/modify_smallville.sh
index 4dc7c58e9b..f4694e95c2 100755
--- a/tools/modify_input_files/modify_smallville.sh
+++ b/tools/modify_input_files/modify_smallville.sh
@@ -7,14 +7,14 @@ module load nco
# This script runs from the mksurfdata_esmf/Makefile.
# When running standalone, it may need "subset_data_single_point/" in front
# of each landuse.timeseries file name.
- file_to_2100="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-2100_78pfts_c$(date +%y%m%d).nc"
- file_to_1855="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_c$(date +%y%m%d).nc"
- file_lake="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_dynLakes_c$(date +%y%m%d).nc"
- file_urban="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_dynUrban_c$(date +%y%m%d).nc"
- file_pft="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_dynPft_c$(date +%y%m%d).nc"
+ file_whole="landuse.timeseries_1x1_smallvilleIA_hist_1850-2023_78pfts_c$(date +%y%m%d).nc"
+ file_to_1855="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_c$(date +%y%m%d).nc"
+ file_lake="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_dynLakes_c$(date +%y%m%d).nc"
+ file_urban="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_dynUrban_c$(date +%y%m%d).nc"
+ file_pft="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_dynPft_c$(date +%y%m%d).nc"
# Trim the file to just the years 1850-1855
-ncks -d time,0,5 $file_to_2100 $file_to_1855
+ncks -d time,0,5 $file_whole $file_to_1855
# Replace all values in the LAKE and CROP variables
ncap2 -s "PCT_LAKE=array(0.,0.,PCT_CROP); PCT_LAKE={0.,50.,25.,25.,25.,25.} ; PCT_LAKE_MAX=array(50.,50.,PCT_CROP_MAX); PCT_CROP=array(0.,0.,PCT_LAKE); PCT_CROP={0.,25.,12.,12.,12.,12.}; PCT_CROP_MAX=array(25.,25.,PCT_LAKE_MAX)" $file_to_1855 $file_lake
diff --git a/tools/site_and_regional/default_data_1850.cfg b/tools/site_and_regional/default_data_1850.cfg
index ce68b1debf..a86176acd8 100644
--- a/tools/site_and_regional/default_data_1850.cfg
+++ b/tools/site_and_regional/default_data_1850.cfg
@@ -15,12 +15,12 @@ precname = CLMCRUJRA2024.Precip
tpqwname = CLMCRUJRA2024.TPQW
[surfdat]
-dir = lnd/clm2/surfdata_esmf/ctsm5.3.0
-surfdat_78pft = surfdata_0.9x1.25_hist_1850_78pfts_c240908.nc
+dir = lnd/clm2/surfdata_esmf/ctsm5.4.0
+surfdat_78pft = surfdata_0.9x1.25_hist_1850_78pfts_c251022.nc
[landuse]
-dir = lnd/clm2/surfdata_esmf/ctsm5.3.0
-landuse_78pft = landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc
+dir = lnd/clm2/surfdata_esmf/ctsm5.4.0
+landuse_78pft = landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc
[domain]
file = share/domains/domain.lnd.fv0.9x1.25_gx1v7.151020.nc
diff --git a/tools/site_and_regional/default_data_2000.cfg b/tools/site_and_regional/default_data_2000.cfg
index 60c012561c..e43af3f7e3 100644
--- a/tools/site_and_regional/default_data_2000.cfg
+++ b/tools/site_and_regional/default_data_2000.cfg
@@ -1,5 +1,5 @@
[main]
-clmforcingindir = /glade/campaign/cesm/cesmdata/cseg/inputdata
+clmforcingindir = /glade/campaign/cesm/cesmdata/inputdata
[datm]
dir = atm/datm7/atm_forcing.datm7.CRUJRA.0.5d.c20241231/three_stream
@@ -15,16 +15,16 @@ precname = CLMCRUJRA2024.Precip
tpqwname = CLMCRUJRA2024.TPQW
[surfdat]
-dir = lnd/clm2/surfdata_esmf/ctsm5.3.0
-surfdat_16pft = surfdata_0.9x1.25_hist_2000_16pfts_c240908.nc
-surfdat_78pft = surfdata_0.9x1.25_hist_2000_78pfts_c240908.nc
+dir = lnd/clm2/surfdata_esmf/ctsm5.4.0
+surfdat_16pft = surfdata_0.9x1.25_hist_2000_16pfts_c251022.nc
+surfdat_78pft = surfdata_0.9x1.25_hist_2000_78pfts_c251022.nc
mesh_dir = share/meshes/
mesh_surf = fv0.9x1.25_141008_ESMFmesh.nc
[landuse]
-dir = lnd/clm2/surfdata_esmf/ctsm5.3.0
-landuse_16pft = landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc
-landuse_78pft = landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc
+dir = lnd/clm2/surfdata_esmf/ctsm5.4.0
+landuse_16pft = landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc
+landuse_78pft = landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc
[domain]
file = share/domains/domain.lnd.fv0.9x1.25_gx1v7.151020.nc