diff --git a/Externals.cfg b/Externals.cfg
index e683f199ac..9e7b4acc31 100644
--- a/Externals.cfg
+++ b/Externals.cfg
@@ -8,7 +8,7 @@ required = True
local_path = components/cism
protocol = git
repo_url = https://github.com/ESCOMP/CISM-wrapper
-tag = cismwrap_2_1_95
+tag = cismwrap_2_1_96
externals = Externals_CISM.cfg
required = True
@@ -34,7 +34,7 @@ hash = 34723c2
required = True
[ccs_config]
-tag = ccs_config_cesm0.0.65
+tag = ccs_config_cesm0.0.82
protocol = git
repo_url = https://github.com/ESMCI/ccs_config_cesm.git
local_path = ccs_config
@@ -44,18 +44,18 @@ required = True
local_path = cime
protocol = git
repo_url = https://github.com/ESMCI/cime
-tag = cime6.0.125
+tag = cime6.0.175
required = True
[cmeps]
-tag = cmeps0.14.21
+tag = cmeps0.14.43
protocol = git
repo_url = https://github.com/ESCOMP/CMEPS.git
local_path = components/cmeps
required = True
[cdeps]
-tag = cdeps1.0.13
+tag = cdeps1.0.23
protocol = git
repo_url = https://github.com/ESCOMP/CDEPS.git
local_path = components/cdeps
@@ -63,7 +63,7 @@ externals = Externals_CDEPS.cfg
required = True
[cpl7]
-tag = cpl77.0.5
+tag = cpl77.0.7
protocol = git
repo_url = https://github.com/ESCOMP/CESM_CPL7andDataComps
local_path = components/cpl7
@@ -84,7 +84,7 @@ local_path = libraries/mct
required = True
[parallelio]
-tag = pio2_5_10
+tag = pio2_6_2
protocol = git
repo_url = https://github.com/NCAR/ParallelIO
local_path = libraries/parallelio
diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm
index 40b7f13c25..e067a54512 100755
--- a/bld/CLMBuildNamelist.pm
+++ b/bld/CLMBuildNamelist.pm
@@ -4394,6 +4394,8 @@ sub setup_logic_exice {
#
my ($opts, $nl_flags, $definition, $defaults, $nl) = @_;
my $use_exice = $nl->get_value( 'use_excess_ice' );
+
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_excess_ice_streams', 'phys'=>$nl_flags->{'phys'});
my $use_exice_streams = $nl->get_value( 'use_excess_ice_streams' );
# IF excess ice streams is on
if (defined($use_exice_streams) && value_is_true($use_exice_streams)) {
diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml
index 0edffa3f1a..996239e279 100644
--- a/bld/namelist_files/namelist_defaults_ctsm.xml
+++ b/bld/namelist_files/namelist_defaults_ctsm.xml
@@ -487,7 +487,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
-lnd/clm2/paramdata/ctsm51_params.c211112.nc
+lnd/clm2/paramdata/ctsm51_params.RMz0.c231011.nc
lnd/clm2/paramdata/clm50_params.c211112.nc
lnd/clm2/paramdata/clm45_params.c211112.nc
@@ -501,10 +501,10 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
-ZengWang2007
+Meier2022
.true.
-.false.
+.true.
@@ -680,6 +680,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
set up. If more finidat files are added you may need to add more of these.
Or one specific file will be chosen over another.
-->
+
hgrid=0.9x1.25 maxpft=17 mask=gx1v7 use_cn=.true. use_crop=.false. irrigate=.true. glc_nec=10 do_transient_pfts=.false.
@@ -724,6 +725,11 @@ 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=.false. glc_nec=10 do_transient_pfts=.false.
+
+hgrid=ne30np4.pg3 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.false. glc_nec=10 do_transient_pfts=.false.
+
+
hgrid=1.9x2.5 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false.
@@ -875,7 +881,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
hgrid="ne0np4.ARCTICGRIS.ne30x8" use_cn=".false." maxpft="17"
>hgrid=ne0np4.ARCTICGRIS.ne30x8 maxpft=17 mask=tx0.1v2 use_cn=.false. use_crop=.false. irrigate=.true. glc_nec=10 do_transient_pfts=.false.
-p
+
lnd/clm2/initdata_map/clmi.I1850Clm50BgcCrop-ciso.1366-01-01.0.9x1.25_gx1v7_simyr1850_c200428.nc
+
+lnd/clm2/initdata_map/clmi.I1850Clm51CplhistBgcCrop-ciso.0561-01-01.ne30np4.pg3_gx1v7_simyr1850_c230717.nc
+
+
-.false.
+.true.
+.true.
lnd/clm2/paramdata/exice_init_0.125x0.125_c20220516.nc
lnd/clm2/paramdata/exice_init_0.125x0.125_ESMFmesh_cdf5_c20220802.nc
diff --git a/bld/namelist_files/namelist_definition_ctsm.xml b/bld/namelist_files/namelist_definition_ctsm.xml
index 895940103d..f982f0b61d 100644
--- a/bld/namelist_files/namelist_definition_ctsm.xml
+++ b/bld/namelist_files/namelist_definition_ctsm.xml
@@ -2143,7 +2143,7 @@ Land mask description
+ valid_values="clm4_5_CRUv7,clm4_5_GSWP3v1,clm4_5_cam6.0,clm5_0_cam6.0,clm5_0_CRUv7,clm5_0_GSWP3v1,clm5_1_GSWP3v1,clm5_1_cam6.0">
General configuration of model version and atmospheric forcing to tune the model to run under.
This sets the model to run with constants and initial conditions that were set to run well under
the configuration of model version and atmospheric forcing. To run well constants would need to be changed
diff --git a/cime_config/SystemTests/mksurfdataesmf.py b/cime_config/SystemTests/mksurfdataesmf.py
index af783850ba..e240415a85 100644
--- a/cime_config/SystemTests/mksurfdataesmf.py
+++ b/cime_config/SystemTests/mksurfdataesmf.py
@@ -20,8 +20,8 @@
logger = logging.getLogger(__name__)
-class MKSURFDATAESMF(SystemTestsCommon):
+class MKSURFDATAESMF(SystemTestsCommon):
def __init__(self, case):
"""
initialize an object interface to the SMS system test
@@ -29,20 +29,22 @@ def __init__(self, case):
SystemTestsCommon.__init__(self, case)
# Paths and strings needed throughout
- ctsm_root = self._case.get_value('COMP_ROOT_DIR_LND')
- self._tool_path = os.path.join(ctsm_root, 'tools/mksurfdata_esmf')
- self._tool_bld = os.path.join(self._get_caseroot(), 'tool_bld')
+ ctsm_root = self._case.get_value("COMP_ROOT_DIR_LND")
+ self._tool_path = os.path.join(ctsm_root, "tools/mksurfdata_esmf")
+ self._tool_bld = os.path.join(self._get_caseroot(), "tool_bld")
time_stamp = datetime.today().strftime("%y%m%d")
- self._res = '10x15' # see important comment in script's docstring
- self._model_yr = '1850'
- self._jobscript = os.path.join(self._get_caseroot(),
- 'mksurfdata_jobscript_single')
- self._fsurdat_namelist = os.path.join(self._get_caseroot(),
- f'surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.namelist')
- self._fsurdat_nc = os.path.join(self._get_caseroot(),
- f'surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.nc')
- self._TestStatus_log_path = os.path.join(self._get_caseroot(),
- 'TestStatus.log')
+ self._res = "10x15" # see important comment in script's docstring
+ self._model_yr = "1850"
+ self._jobscript = os.path.join(self._get_caseroot(), "mksurfdata_jobscript_single")
+ self._fsurdat_namelist = os.path.join(
+ self._get_caseroot(),
+ f"surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.namelist",
+ )
+ self._fsurdat_nc = os.path.join(
+ self._get_caseroot(),
+ f"surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.nc",
+ )
+ self._TestStatus_log_path = os.path.join(self._get_caseroot(), "TestStatus.log")
def build_phase(self, sharedlib_only=False, model_only=False):
"""
@@ -58,24 +60,25 @@ def build_phase(self, sharedlib_only=False, model_only=False):
# if the test stops and gets restarted.
if sharedlib_only:
# Paths and strings
- build_script_path = os.path.join(self._tool_path,
- 'gen_mksurfdata_build.sh')
- nml_script_path = os.path.join(self._tool_path,
- 'gen_mksurfdata_namelist.py')
- gen_jobscript_path = os.path.join(self._tool_path,
- 'gen_mksurfdata_jobscript_single.py')
- gen_mksurfdata_namelist = f'{nml_script_path} --res {self._res} --start-year {self._model_yr} --end-year {self._model_yr}'
- gen_mksurfdata_jobscript = f'{gen_jobscript_path} --number-of-nodes 12 --tasks-per-node 12 --namelist-file {self._fsurdat_namelist}'
+ build_script_path = os.path.join(self._tool_path, "gen_mksurfdata_build.sh")
+ nml_script_path = os.path.join(self._tool_path, "gen_mksurfdata_namelist.py")
+ gen_jobscript_path = os.path.join(self._tool_path, "gen_mksurfdata_jobscript_single.py")
+ gen_mksurfdata_namelist = f"{nml_script_path} --res {self._res} --start-year {self._model_yr} --end-year {self._model_yr}"
+ gen_mksurfdata_jobscript = f"{gen_jobscript_path} --number-of-nodes 12 --tasks-per-node 12 --namelist-file {self._fsurdat_namelist}"
# Rm tool_bld and build executable that will generate fsurdat
try:
- subprocess.check_call(f'rm -rf {self._tool_bld}', shell=True)
+ subprocess.check_call(f"rm -rf {self._tool_bld}", shell=True)
except subprocess.CalledProcessError as e:
- sys.exit(f'{e} ERROR REMOVING {self._tool_bld}. DETAILS IN {self._TestStatus_log_path}')
+ sys.exit(
+ f"{e} ERROR REMOVING {self._tool_bld}. DETAILS IN {self._TestStatus_log_path}"
+ )
try:
- subprocess.check_call(f'{build_script_path} --blddir {self._tool_bld}', shell=True)
+ subprocess.check_call(f"{build_script_path} --blddir {self._tool_bld}", shell=True)
except subprocess.CalledProcessError as e:
- sys.exit(f'{e} ERROR RUNNING {build_script_path}. DETAILS IN {self._TestStatus_log_path}')
+ sys.exit(
+ f"{e} ERROR RUNNING {build_script_path}. DETAILS IN {self._TestStatus_log_path}"
+ )
# Generate namelist for generating fsurdat (rm namelist if exists)
if os.path.exists(self._fsurdat_namelist):
@@ -83,7 +86,9 @@ def build_phase(self, sharedlib_only=False, model_only=False):
try:
subprocess.check_call(gen_mksurfdata_namelist, shell=True)
except subprocess.CalledProcessError as e:
- sys.exit(f'{e} ERROR RUNNING {gen_mksurfdata_namelist}. DETAILS IN {self._TestStatus_log_path}')
+ sys.exit(
+ f"{e} ERROR RUNNING {gen_mksurfdata_namelist}. DETAILS IN {self._TestStatus_log_path}"
+ )
# Generate jobscript that will run the executable
if os.path.exists(self._jobscript):
@@ -91,16 +96,17 @@ def build_phase(self, sharedlib_only=False, model_only=False):
try:
subprocess.check_call(gen_mksurfdata_jobscript, shell=True)
except subprocess.CalledProcessError as e:
- sys.exit(f'{e} ERROR RUNNING {gen_mksurfdata_jobscript}. DETAILS IN {self._TestStatus_log_path}')
+ sys.exit(
+ f"{e} ERROR RUNNING {gen_mksurfdata_jobscript}. DETAILS IN {self._TestStatus_log_path}"
+ )
# Change self._jobscript to an executable file
- subprocess.check_call(f'chmod a+x {self._jobscript}', shell=True)
+ subprocess.check_call(f"chmod a+x {self._jobscript}", shell=True)
# Call this step only once even if the test stops and gets restarted.
- if not os.path.exists(os.path.join(self._get_caseroot(),
- 'done_MKSURFDATAESMF_setup.txt')):
+ if not os.path.exists(os.path.join(self._get_caseroot(), "done_MKSURFDATAESMF_setup.txt")):
# Modify user_nl_clm to point to the generated fsurdat
self._modify_user_nl()
- with open('done_MKSURFDATAESMF_setup.txt', 'w') as fp:
+ with open("done_MKSURFDATAESMF_setup.txt", "w") as fp:
pass
self.build_indv(sharedlib_only=sharedlib_only, model_only=model_only)
@@ -117,7 +123,7 @@ def run_phase(self):
try:
subprocess.check_call(self._jobscript, shell=True)
except subprocess.CalledProcessError as e:
- sys.exit(f'{e} ERROR RUNNING {self._jobscript}; details in {self._TestStatus_log_path}')
+ sys.exit(f"{e} ERROR RUNNING {self._jobscript}; details in {self._TestStatus_log_path}")
# Submit CTSM run that uses fsurdat just generated
self.run_indv()
@@ -126,6 +132,8 @@ def _modify_user_nl(self):
"""
Modify user_nl_clm to point to the generated fsurdat
"""
- append_to_user_nl_files(caseroot = self._get_caseroot(),
- component = "clm",
- contents = "fsurdat = '{}'".format(self._fsurdat_nc))
+ append_to_user_nl_files(
+ caseroot=self._get_caseroot(),
+ component="clm",
+ contents="fsurdat = '{}'".format(self._fsurdat_nc),
+ )
diff --git a/cime_config/config_component.xml b/cime_config/config_component.xml
index 743e9229b9..281a94a0b2 100644
--- a/cime_config/config_component.xml
+++ b/cime_config/config_component.xml
@@ -63,7 +63,7 @@
Tuning parameters and initial conditions should be optimized for what CLM model version and what meteorlogical forcing combination?
UNSET
- clm5_0_cam6.0,clm5_0_GSWP3v1,clm5_0_CRUv7,clm4_5_CRUv7,clm4_5_GSWP3v1,clm4_5_cam6.0,clm5_1_GSWP3v1
+ clm5_0_cam6.0,clm5_0_GSWP3v1,clm5_0_CRUv7,clm4_5_CRUv7,clm4_5_GSWP3v1,clm4_5_cam6.0,clm5_1_GSWP3v1,clm5_1_cam6.0
clm4_5_CRUv7
clm4_5_CRUv7
@@ -76,6 +76,7 @@
clm5_0_cam6.0
clm5_0_cam6.0
clm5_1_GSWP3v1
+ clm5_1_cam6.0
diff --git a/cime_config/config_pes.xml b/cime_config/config_pes.xml
index aad134be86..90b3fe9efe 100644
--- a/cime_config/config_pes.xml
+++ b/cime_config/config_pes.xml
@@ -372,6 +372,43 @@
+
+
+
+ none
+
+ -1
+ -5
+ -5
+ -5
+ -5
+ -5
+ -5
+ -5
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+ 0
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+
+
+
+
@@ -557,6 +594,80 @@
+
+
+
+ none
+
+ -1
+ -5
+ -5
+ -5
+ -5
+ -5
+ -5
+ -5
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+ 0
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+
+
+
+
+
+
+
+ none
+
+ -1
+ -20
+ -20
+ -20
+ -20
+ -20
+ -20
+ -20
+
+
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+ 0
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+
+
+
+
diff --git a/cime_config/testdefs/ExpectedTestFails.xml b/cime_config/testdefs/ExpectedTestFails.xml
index 174ebf9c58..6e1b1530a7 100644
--- a/cime_config/testdefs/ExpectedTestFails.xml
+++ b/cime_config/testdefs/ExpectedTestFails.xml
@@ -28,6 +28,21 @@
-->
+
+
+
+ FAIL
+ #2210
+
+
+
+
+ FAIL
+ #2210
+
+
+
+
diff --git a/cime_config/testdefs/testlist_clm.xml b/cime_config/testdefs/testlist_clm.xml
index 2c96d01a12..01bd95699c 100644
--- a/cime_config/testdefs/testlist_clm.xml
+++ b/cime_config/testdefs/testlist_clm.xml
@@ -53,6 +53,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/include_user_mods
new file mode 100644
index 0000000000..fe0e18cf88
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/include_user_mods
@@ -0,0 +1 @@
+../default
diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/shell_commands b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/shell_commands
new file mode 100644
index 0000000000..cf39cca1c0
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/shell_commands
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+./xmlchange LND_TUNING_MODE="clm5_1_cam6.0"
+./xmlchange ROF_NCPL='$ATM_NCPL'
+
diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/include_user_mods
new file mode 100644
index 0000000000..a102434d88
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/include_user_mods
@@ -0,0 +1 @@
+../clm51cam6LndTuningMode/
diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/user_nl_clm
new file mode 100644
index 0000000000..6797a9e5e0
--- /dev/null
+++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/user_nl_clm
@@ -0,0 +1,3 @@
+! Turn off Meier roughness
+z0param_method = 'ZengWang2007'
+use_z0m_snowmelt = .false.
diff --git a/python/ctsm/machine_defaults.py b/python/ctsm/machine_defaults.py
index 7486237323..305c86e03c 100644
--- a/python/ctsm/machine_defaults.py
+++ b/python/ctsm/machine_defaults.py
@@ -66,6 +66,25 @@
)
},
),
+ "derecho": MachineDefaults(
+ job_launcher_type=JOB_LAUNCHER_QSUB,
+ scratch_dir=os.path.join(os.path.sep, "glade", "derecho", "scratch", get_user()),
+ baseline_dir=os.path.join(os.path.sep, "glade", "p", "cgd", "tss", "ctsm_baselines"),
+ account_required=True,
+ create_test_retry=0,
+ create_test_queue="regular",
+ job_launcher_defaults={
+ JOB_LAUNCHER_QSUB: QsubDefaults(
+ queue="regular",
+ walltime="11:50:00",
+ extra_args="",
+ # The following assumes a single node, with a single mpi proc; we may want
+ # to add more flexibility in the future, making the node / proc counts
+ # individually selectable
+ required_args="-l select=1:ncpus=128:mpiprocs=1 -V -r n -k oed",
+ )
+ },
+ ),
"hobart": MachineDefaults(
job_launcher_type=JOB_LAUNCHER_QSUB,
scratch_dir=os.path.join(os.path.sep, "scratch", "cluster", get_user()),
diff --git a/python/ctsm/machine_utils.py b/python/ctsm/machine_utils.py
index da5c8b9c6a..970d2e9080 100644
--- a/python/ctsm/machine_utils.py
+++ b/python/ctsm/machine_utils.py
@@ -41,6 +41,8 @@ def _machine_from_hostname(hostname):
"""
if re.match(r"cheyenne\d+", hostname):
machine = "cheyenne"
+ elif re.match(r"derecho\d+", hostname):
+ machine = "derecho"
else:
machine = hostname