diff --git a/CIME/SystemTests/eri.py b/CIME/SystemTests/eri.py
index 0aff0431373..c7ac3142158 100644
--- a/CIME/SystemTests/eri.py
+++ b/CIME/SystemTests/eri.py
@@ -83,7 +83,7 @@ def run_phase(self):
start_1 = run_startdate
stop_n2 = stop_n - stop_n1
- rest_n2 = int(stop_n2 / 2 + 1)
+
hist_n = stop_n2
start_1_year, start_1_month, start_1_day = [
@@ -93,10 +93,28 @@ def run_phase(self):
start_2 = "{:04d}-{:02d}-{:02d}".format(
start_2_year, start_1_month, start_1_day
)
+ rest_n2 = self._set_restart_interval(
+ stop_n=stop_n2,
+ stop_option=stop_option,
+ startdate=start_2,
+ starttime=start_tod,
+ )
stop_n3 = stop_n2 - rest_n2
- rest_n3 = int(stop_n3 / 2 + 1)
+ ninst = self._case.get_value("NINST")
+ drvrest = "rpointer.cpl"
+ if ninst > 1:
+ drvrest += "_0001"
+ drvrest += self._rest_time
+ self._set_drv_restart_pointer(drvrest)
+
+ rest_n3 = self._set_restart_interval(
+ stop_n=stop_n3,
+ stop_option=stop_option,
+ startdate=start_2,
+ starttime=start_tod,
+ )
stop_n4 = stop_n3 - rest_n3
expect(stop_n4 >= 1 and stop_n1 >= 1, "Run length too short")
@@ -223,8 +241,10 @@ def run_phase(self):
self._case.set_value("GET_REFCASE", False)
self._case.set_value("CONTINUE_RUN", False)
self._case.set_value("STOP_N", stop_n3)
- self._case.set_value("REST_OPTION", stop_option)
- self._case.set_value("REST_N", rest_n3)
+ self._set_restart_interval(
+ stop_n=stop_n3, startdate=refdate_3, starttime=refsec_3
+ )
+
self._case.set_value("HIST_OPTION", stop_option)
self._case.set_value("HIST_N", stop_n2)
self._case.set_value("DOUT_S", False)
@@ -266,6 +286,12 @@ def run_phase(self):
self._case.set_value("DOUT_S", False)
self._case.set_value("HIST_OPTION", stop_option)
self._case.set_value("HIST_N", hist_n)
+ drvrest = "rpointer.cpl"
+ if ninst > 1:
+ drvrest += "_0001"
+ drvrest += self._rest_time
+
+ self._set_drv_restart_pointer(drvrest)
self._case.flush()
# do the restart run (short term archiving is off)
diff --git a/CIME/SystemTests/err.py b/CIME/SystemTests/err.py
index 355ddd5d390..276ceb634aa 100644
--- a/CIME/SystemTests/err.py
+++ b/CIME/SystemTests/err.py
@@ -5,7 +5,7 @@
import glob, os
from CIME.XML.standard_module_setup import *
from CIME.SystemTests.restart_tests import RestartTest
-from CIME.utils import ls_sorted_by_mtime, safe_copy
+from CIME.utils import safe_copy
logger = logging.getLogger(__name__)
@@ -35,12 +35,11 @@ def _case_two_setup(self):
def _case_two_custom_prerun_action(self):
dout_s_root = self._case1.get_value("DOUT_S_ROOT")
- rest_root = os.path.abspath(os.path.join(dout_s_root, "rest"))
- restart_list = ls_sorted_by_mtime(rest_root)
- expect(len(restart_list) >= 1, "No restart files found in {}".format(rest_root))
- self._case.restore_from_archive(
- rest_dir=os.path.join(rest_root, restart_list[0])
- )
+ self._drv_restart_pointer = self._case2.get_value("DRV_RESTART_POINTER")
+ resttime = self._drv_restart_pointer[-16:]
+ rest_root = os.path.abspath(os.path.join(dout_s_root, "rest", resttime))
+ expect(os.path.isdir(rest_root), "None such directory {}".format(rest_root))
+ self._case.restore_from_archive(rest_dir=rest_root)
def _case_two_custom_postrun_action(self):
# Link back to original case1 name
diff --git a/CIME/SystemTests/ers.py b/CIME/SystemTests/ers.py
index 0e4bccd953a..42cc83d3481 100644
--- a/CIME/SystemTests/ers.py
+++ b/CIME/SystemTests/ers.py
@@ -36,7 +36,13 @@ def _ers_second_phase(self):
pfile,
os.path.join(os.path.dirname(pfile), "run1." + os.path.basename(pfile)),
)
+ ninst = self._case.get_value("NINST")
+ drvrest = "rpointer.cpl"
+ if ninst > 1:
+ drvrest += "_0001"
+ drvrest += self._rest_time
+ self._set_drv_restart_pointer(drvrest)
self._case.set_value("HIST_N", stop_n)
self._case.set_value("STOP_N", stop_new)
self._case.set_value("CONTINUE_RUN", True)
diff --git a/CIME/SystemTests/restart_tests.py b/CIME/SystemTests/restart_tests.py
index 4252739d326..d89acf70070 100644
--- a/CIME/SystemTests/restart_tests.py
+++ b/CIME/SystemTests/restart_tests.py
@@ -50,3 +50,9 @@ def _case_two_setup(self):
self._case.set_value("STOP_N", stop_new)
self._case.set_value("CONTINUE_RUN", True)
self._case.set_value("REST_OPTION", "never")
+ ninst = self._case.get_value("NINST")
+ drvrest = "rpointer.cpl"
+ if ninst > 1:
+ drvrest += "_0001"
+ drvrest += self._rest_time
+ self._set_drv_restart_pointer(drvrest)
diff --git a/CIME/SystemTests/system_tests_common.py b/CIME/SystemTests/system_tests_common.py
index 42e1b897e58..845d09a9bb2 100644
--- a/CIME/SystemTests/system_tests_common.py
+++ b/CIME/SystemTests/system_tests_common.py
@@ -37,8 +37,9 @@
load_coupler_customization,
)
import CIME.build as build
+from datetime import datetime, timedelta
+import glob, gzip, time, traceback, os, math, calendar
-import glob, gzip, time, traceback, os, math
from contextlib import ExitStack
logger = logging.getLogger(__name__)
@@ -111,6 +112,7 @@ def __init__(
self._init_environment(caseroot)
self._init_locked_files(caseroot, expected)
self._skip_pnl = False
+ self._rest_time = None
self._cpllog = (
"med" if self._case.get_value("COMP_INTERFACE") == "nuopc" else "cpl"
)
@@ -119,10 +121,22 @@ def __init__(
self._user_separate_builds = False
self._expected_num_cmp = None
self._rest_n = None
+ # Does the model support this variable?
+ self._drv_restart_pointer = self._case.get_value("DRV_RESTART_POINTER")
+
+ def _set_drv_restart_pointer(self, value):
+ if self._drv_restart_pointer:
+ logger.info("setting DRV_RESTART_POINTER={}".format(value))
+ self._case.set_value("DRV_RESTART_POINTER", value)
+
+ def _set_restart_interval(
+ self, stop_n=None, stop_option=None, startdate=None, starttime=None
+ ):
+ if not stop_n:
+ stop_n = self._case.get_value("STOP_N")
+ if not stop_option:
+ stop_option = self._case.get_value("STOP_OPTION")
- def _set_restart_interval(self):
- stop_n = self._case.get_value("STOP_N")
- stop_option = self._case.get_value("STOP_OPTION")
self._case.set_value("REST_OPTION", stop_option)
# We need to make sure the run is long enough and to set REST_N to a
# value that makes sense for all components
@@ -172,19 +186,68 @@ def _set_restart_interval(self):
factor = 315360000
else:
expect(False, f"stop_option {stop_option} not available for this test")
-
stop_n = int(stop_n * factor // coupling_secs)
rest_n = math.ceil((stop_n // 2 + 1) * coupling_secs / factor)
-
expect(stop_n > 0, "Bad STOP_N: {:d}".format(stop_n))
-
expect(stop_n > 2, "ERROR: stop_n value {:d} too short".format(stop_n))
+ if not starttime:
+ starttime = self._case.get_value("START_TOD")
+ if not startdate:
+ startdate = self._case.get_value("RUN_STARTDATE")
+ if "-" in startdate:
+ startdatetime = datetime.fromisoformat(startdate) + timedelta(
+ seconds=int(starttime)
+ )
+ else:
+ startdatetime = datetime.strptime(startdate, "%Y%m%d") + timedelta(
+ seconds=int(starttime)
+ )
+
+ cal = self._case.get_value("CALENDAR")
+
+ if stop_option == "nsteps":
+ rtd = timedelta(seconds=rest_n * factor)
+ elif stop_option == "nminutes":
+ rtd = timedelta(minutes=rest_n)
+ elif stop_option == "nhours":
+ rtd = timedelta(hours=rest_n)
+ elif stop_option == "ndays":
+ rtd = timedelta(days=rest_n)
+ elif stop_option == "nyears":
+ rtd = timedelta(days=rest_n * 365)
+ else:
+ expect(False, f"stop_option {stop_option} not available for this test")
+
+ restdatetime = startdatetime + rtd
+ if cal == "NO_LEAP":
+ dayscorrected = 0
+ syr = startdatetime.year
+ smon = startdatetime.month
+ ryr = restdatetime.year
+ rmon = restdatetime.month
+ while ryr > syr:
+ if rmon > 2 and calendar.isleap(ryr):
+ dayscorrected += 1
+ ryr = ryr - 1
+ if rmon > 2 and smon <= 2:
+ if calendar.isleap(syr):
+ dayscorrected += 1
+ restdatetime = restdatetime + timedelta(days=dayscorrected)
+ self._rest_time = (
+ f".{restdatetime.year:04d}-{restdatetime.month:02d}-{restdatetime.day:02d}-"
+ )
+ h = restdatetime.hour
+ m = restdatetime.minute
+ s = restdatetime.second
+ self._rest_time += f"{(h*3600+m*60+s):05d}"
+
logger.info(
"doing an {0} {1} initial test with restart file at {2} {1}".format(
str(stop_n), stop_option, str(rest_n)
)
)
self._case.set_value("REST_N", rest_n)
+
return rest_n
def _init_environment(self, caseroot):
@@ -261,7 +324,9 @@ def build(
sharedlib_only=(phase_name == SHAREDLIB_BUILD_PHASE),
model_only=(phase_name == MODEL_BUILD_PHASE),
)
- except BaseException as e: # We want KeyboardInterrupts to generate FAIL status
+ except (
+ BaseException
+ ) as e: # We want KeyboardInterrupts to generate FAIL status
success = False
if isinstance(e, CIMEError):
# Don't want to print stacktrace for a build failure since that
@@ -334,7 +399,13 @@ def run(self, skip_pnl=False):
"""
success = True
start_time = time.time()
- self._skip_pnl = skip_pnl
+ wav_comp = self._case.get_value("COMP_WAV")
+ # WW3 requires pnl to be run again after the build phase.
+ if wav_comp and wav_comp == "ww3":
+ self._skip_pnl = False
+ else:
+ self._skip_pnl = skip_pnl
+
try:
self._resetup_case(RUN_PHASE)
do_baseline_ops = True
diff --git a/CIME/case/case.py b/CIME/case/case.py
index 455a6877d6b..4e2677c81fe 100644
--- a/CIME/case/case.py
+++ b/CIME/case/case.py
@@ -1846,13 +1846,15 @@ def create_caseroot(self, clone=False):
component_class in self._component_description
and len(self._component_description[component_class]) > 0
):
- append_status(
- "Component {} is {}".format(
- component_class, self._component_description[component_class]
- ),
- "README.case",
- caseroot=self._caseroot,
- )
+ if "Stub" not in self._component_description[component_class]:
+ append_status(
+ "Component {} is {}".format(
+ component_class,
+ self._component_description[component_class],
+ ),
+ "README.case",
+ caseroot=self._caseroot,
+ )
if component_class == "CPL":
append_status(
"Using %s coupler instances" % (self.get_value("NINST_CPL")),
@@ -1861,12 +1863,13 @@ def create_caseroot(self, clone=False):
)
continue
comp_grid = "{}_GRID".format(component_class)
-
- append_status(
- "{} is {}".format(comp_grid, self.get_value(comp_grid)),
- "README.case",
- caseroot=self._caseroot,
- )
+ grid_val = self.get_value(comp_grid)
+ if grid_val != "null":
+ append_status(
+ "{} is {}".format(comp_grid, self.get_value(comp_grid)),
+ "README.case",
+ caseroot=self._caseroot,
+ )
comp = str(self.get_value("COMP_{}".format(component_class)))
user_mods = self._get_comp_user_mods(comp)
if user_mods is not None:
diff --git a/CIME/case/case_run.py b/CIME/case/case_run.py
index 2c21bd4b076..48b1112d855 100644
--- a/CIME/case/case_run.py
+++ b/CIME/case/case_run.py
@@ -477,7 +477,7 @@ def case_run(self, skip_pnl=False, set_continue_run=False, submit_resubmits=Fals
and len(data_assimilation_script) > 0
and os.path.isfile(data_assimilation_script)
)
-
+ drv_restart_pointer = self.get_value("DRV_RESTART_POINTER")
for cycle in range(data_assimilation_cycles):
# After the first DA cycle, runs are restart runs
if cycle > 0:
@@ -496,6 +496,14 @@ def case_run(self, skip_pnl=False, set_continue_run=False, submit_resubmits=Fals
"{} RUN_MODEL BEGINS HERE".format(time.strftime("%Y-%m-%d %H:%M:%S")),
)
lid = _run_model(self, lid, skip_pnl, da_cycle=cycle)
+
+ # get the most recent cpl restart pointer file
+ rundir = self.get_value("RUNDIR")
+ if drv_restart_pointer:
+ pattern = os.path.join(rundir, "rpointer.cpl*")
+ files = sorted(glob.glob(pattern), key=os.path.getmtime)
+ drv_ptr = os.path.basename(files[-1])
+ self.set_value("DRV_RESTART_POINTER", drv_ptr)
model_log(
"e3sm",
logger,
diff --git a/CIME/case/case_st_archive.py b/CIME/case/case_st_archive.py
index 1135741228b..5e32ef5b4f9 100644
--- a/CIME/case/case_st_archive.py
+++ b/CIME/case/case_st_archive.py
@@ -168,60 +168,84 @@ def _archive_rpointer_files(
datename_is_last,
):
###############################################################################
-
if datename_is_last:
- # Copy of all rpointer files for latest restart date
- rpointers = glob.glob(os.path.join(rundir, "rpointer.*"))
- for rpointer in rpointers:
- safe_copy(
- rpointer, os.path.join(archive_restdir, os.path.basename(rpointer))
- )
+ rpointers = glob.glob(
+ os.path.join(rundir, "rpointer.*" + _datetime_str(datename))
+ )
+ # If timestamped rpointers exist use them
+ if rpointers:
+ for rpointer in rpointers:
+ safe_copy(
+ rpointer, os.path.join(archive_restdir, os.path.basename(rpointer))
+ )
+ else:
+ # Copy of all rpointer files for latest restart date
+ rpointers = glob.glob(os.path.join(rundir, "rpointer.*"))
+ for rpointer in rpointers:
+ safe_copy(
+ rpointer, os.path.join(archive_restdir, os.path.basename(rpointer))
+ )
else:
# Generate rpointer file(s) for interim restarts for the one datename and each
# possible value of ninst_strings
if save_interim_restart_files:
- # parse env_archive.xml to determine the rpointer files
- # and contents for the given archive_entry tag
- rpointer_items = archive.get_rpointer_contents(archive_entry)
-
- # loop through the possible rpointer files and contents
- for rpointer_file, rpointer_content in rpointer_items:
- temp_rpointer_file = rpointer_file
- temp_rpointer_content = rpointer_content
-
- # put in a temporary setting for ninst_strings if they are empty
- # in order to have just one loop over ninst_strings below
- if rpointer_content != "unset":
- if not ninst_strings:
- ninst_strings = ["empty"]
-
- for ninst_string in ninst_strings:
- rpointer_file = temp_rpointer_file
- rpointer_content = temp_rpointer_content
- if ninst_string == "empty":
- ninst_string = ""
- for key, value in [
- ("$CASE", casename),
- ("$DATENAME", _datetime_str(datename)),
- ("$MPAS_DATENAME", _datetime_str_mpas(datename)),
- ("$NINST_STRING", ninst_string),
- ]:
- rpointer_file = rpointer_file.replace(key, value)
- rpointer_content = rpointer_content.replace(key, value)
-
- # write out the respective files with the correct contents
- rpointer_file = os.path.join(archive_restdir, rpointer_file)
- logger.info("writing rpointer_file {}".format(rpointer_file))
- f = open(rpointer_file, "w")
- for output in rpointer_content.split(","):
- f.write("{} \n".format(output))
- f.close()
- else:
- logger.info(
- "rpointer_content unset, not creating rpointer file {}".format(
- rpointer_file
- )
+ rpointers = glob.glob(
+ os.path.join(rundir, "rpointer.*" + _datetime_str(datename))
+ )
+ # If timestamped rpointers exist use them
+ if rpointers:
+ for rpointer in rpointers:
+ safe_copy(
+ rpointer,
+ os.path.join(archive_restdir, os.path.basename(rpointer)),
)
+ else:
+ # parse env_archive.xml to determine the rpointer files
+ # and contents for the given archive_entry tag
+ rpointer_items = archive.get_rpointer_contents(archive_entry)
+
+ # loop through the possible rpointer files and contents
+ for rpointer_file, rpointer_content in rpointer_items:
+ temp_rpointer_file = rpointer_file
+ temp_rpointer_content = rpointer_content
+
+ # put in a temporary setting for ninst_strings if they are empty
+ # in order to have just one loop over ninst_strings below
+ if rpointer_content != "unset":
+ if not ninst_strings:
+ ninst_strings = ["empty"]
+
+ for ninst_string in ninst_strings:
+ rpointer_file = temp_rpointer_file
+ rpointer_content = temp_rpointer_content
+ if ninst_string == "empty":
+ ninst_string = ""
+ for key, value in [
+ ("$CASE", casename),
+ ("$DATENAME", _datetime_str(datename)),
+ ("$MPAS_DATENAME", _datetime_str_mpas(datename)),
+ ("$NINST_STRING", ninst_string),
+ ]:
+ rpointer_file = rpointer_file.replace(key, value)
+ rpointer_content = rpointer_content.replace(key, value)
+
+ # write out the respective files with the correct contents
+ rpointer_file = os.path.join(
+ archive_restdir, rpointer_file
+ )
+ logger.info(
+ "writing rpointer_file {}".format(rpointer_file)
+ )
+ f = open(rpointer_file, "w")
+ for output in rpointer_content.split(","):
+ f.write("{} \n".format(output))
+ f.close()
+ else:
+ logger.info(
+ "rpointer_content unset, not creating rpointer file {}".format(
+ rpointer_file
+ )
+ )
###############################################################################
@@ -501,9 +525,10 @@ def _archive_restarts_date_comp(
"""
datename_str = _datetime_str(datename)
- if datename_is_last or case.get_value("DOUT_S_SAVE_INTERIM_RESTART_FILES"):
- if not os.path.exists(archive_restdir):
- os.makedirs(archive_restdir)
+ if (
+ datename_is_last or case.get_value("DOUT_S_SAVE_INTERIM_RESTART_FILES")
+ ) and not os.path.isdir(archive_restdir):
+ os.makedirs(archive_restdir)
# archive the rpointer file(s) for this datename and all possible ninst_strings
_archive_rpointer_files(
diff --git a/CIME/data/config/config_tests.xml b/CIME/data/config/config_tests.xml
index 0d5a4b86c68..5e029ad8641 100644
--- a/CIME/data/config/config_tests.xml
+++ b/CIME/data/config/config_tests.xml
@@ -261,7 +261,6 @@ NODEFAIL Tests restart upon detected node failure. Generates fake failu
11
FALSE
TRUE
- $STOP_N / 2 + 1
$STOP_OPTION
$STOP_OPTION
$STOP_N
@@ -272,7 +271,6 @@ NODEFAIL Tests restart upon detected node failure. Generates fake failu
1
ndays
11
- $STOP_N / 2 + 1
$STOP_OPTION
$STOP_N
$STOP_OPTION
@@ -298,7 +296,6 @@ NODEFAIL Tests restart upon detected node failure. Generates fake failu
1
ndays
11
- $STOP_N / 2 - 1
$STOP_OPTION
$STOP_N
$STOP_OPTION
@@ -325,6 +322,7 @@ NODEFAIL Tests restart upon detected node failure. Generates fake failu
$STOP_OPTION
1
FALSE
+ TRUE
diff --git a/CIME/data/config/xml_schemas/config_workflow.xsd b/CIME/data/config/xml_schemas/config_workflow.xsd
index 5b09913a4b6..b39b8526a90 100644
--- a/CIME/data/config/xml_schemas/config_workflow.xsd
+++ b/CIME/data/config/xml_schemas/config_workflow.xsd
@@ -58,7 +58,7 @@
-
+
diff --git a/CIME/hist_utils.py b/CIME/hist_utils.py
index 253cae0b926..c5206cff05a 100644
--- a/CIME/hist_utils.py
+++ b/CIME/hist_utils.py
@@ -83,7 +83,6 @@ def copy_histfiles(case, suffix, match_suffix=None):
)
continue
- comments += " Copying hist files for model '{}'\n".format(model)
test_hists = archive.get_latest_hist_files(
casename, model, rundir, suffix=match_suffix, ref_case=ref_case
)
@@ -93,6 +92,14 @@ def copy_histfiles(case, suffix, match_suffix=None):
if not test_hist.endswith(".nc") or "once" in os.path.basename(test_hist):
logger.info("Will not compare non-netcdf file {}".format(test_hist))
continue
+ if model == "mom":
+ if "ocean_geometry" in test_hist:
+ comments += " skipping '{}'\n".format(test_hist)
+ continue
+ if "mom6.ic" in test_hist:
+ comments += " skipping '{}'\n".format(test_hist)
+ continue
+ comments += " Copying hist files for model '{}'\n".format(model)
new_file = "{}.{}".format(test_hist, suffix)
if os.path.exists(new_file):
os.remove(new_file)
diff --git a/CIME/tests/test_unit_system_tests.py b/CIME/tests/test_unit_system_tests.py
index 1c05bed45be..0ada347183b 100644
--- a/CIME/tests/test_unit_system_tests.py
+++ b/CIME/tests/test_unit_system_tests.py
@@ -103,6 +103,7 @@ def test_check_for_memleak_runtime_error(
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ "rpointer.cpl",
0.01,
)
@@ -156,6 +157,7 @@ def test_check_for_memleak_not_enough_samples(
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ None,
0.01,
)
@@ -211,6 +213,7 @@ def test_check_for_memleak_found(
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ None,
0.01,
)
@@ -268,6 +271,7 @@ def test_check_for_memleak(
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ None,
0.01,
)
@@ -300,6 +304,7 @@ def test_compare_throughput(self, append_testlog, perf_compare_throughput_baseli
str(Path(tempdir) / "caseroot"),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ None,
)
common = SystemTestsCommon(case)
@@ -329,6 +334,7 @@ def test_compare_throughput_error_diff(
str(Path(tempdir) / "caseroot"),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ "rpointer.cpl.0001-01-01",
)
common = SystemTestsCommon(case)
@@ -358,6 +364,7 @@ def test_compare_throughput_fail(
str(Path(tempdir) / "caseroot"),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ None,
)
common = SystemTestsCommon(case)
@@ -388,6 +395,7 @@ def test_compare_memory(self, append_testlog, perf_compare_memory_baseline):
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ "rpointer.cpl",
)
common = SystemTestsCommon(case)
@@ -403,7 +411,7 @@ def test_compare_memory(self, append_testlog, perf_compare_memory_baseline):
@mock.patch("CIME.SystemTests.system_tests_common.perf_compare_memory_baseline")
@mock.patch("CIME.SystemTests.system_tests_common.append_testlog")
- def test_compare_memory_erorr_diff(
+ def test_compare_memory_error_diff(
self, append_testlog, perf_compare_memory_baseline
):
perf_compare_memory_baseline.return_value = (None, "Error diff value")
@@ -417,6 +425,7 @@ def test_compare_memory_erorr_diff(
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ None,
)
common = SystemTestsCommon(case)
@@ -429,7 +438,7 @@ def test_compare_memory_erorr_diff(
@mock.patch("CIME.SystemTests.system_tests_common.perf_compare_memory_baseline")
@mock.patch("CIME.SystemTests.system_tests_common.append_testlog")
- def test_compare_memory_erorr_fail(
+ def test_compare_memory_error_fail(
self, append_testlog, perf_compare_memory_baseline
):
perf_compare_memory_baseline.return_value = (
@@ -446,6 +455,7 @@ def test_compare_memory_erorr_fail(
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ "rpointer.cpl",
)
common = SystemTestsCommon(case)
@@ -469,6 +479,7 @@ def test_generate_baseline(self):
str(caseroot),
"ERIO.ne30_g16_rx1.A.docker_gnu",
"mct",
+ None,
str(run_dir),
"case.std",
str(baseline_root),
@@ -500,7 +511,6 @@ def test_generate_baseline(self):
common._generate_baseline()
baseline_dir = baseline_root / "master" / "ERIO.ne30_g16_rx1.A.docker_gnu"
-
assert (baseline_dir / "cpl.log.gz").exists()
assert (baseline_dir / "cpl-tput.log").exists()
assert (baseline_dir / "cpl-mem.log").exists()
@@ -577,6 +587,7 @@ def test_dry_run(self):
"/caseroot",
"SMS.f19_g16.S",
"cpl",
+ None,
"/caseroot",
"SMS.f19_g16.S",
)
@@ -595,6 +606,7 @@ def test_dry_run(self):
"/caseroot",
"SMS.f19_g16.S",
"cpl",
+ "rpointer.cpl",
"/caseroot",
"SMS.f19_g16.S",
)
diff --git a/CIME/tests/test_unit_system_tests_mvk.py b/CIME/tests/test_unit_system_tests_mvk.py
index 56eaa39f67e..8e424de30bc 100644
--- a/CIME/tests/test_unit_system_tests_mvk.py
+++ b/CIME/tests/test_unit_system_tests_mvk.py
@@ -29,6 +29,7 @@ def create_complex_case(
"MVK.f19_g16.S.docker_gnu", # CASEBASEID
"mct", # COMP_INTERFACE
"mct", # COMP_INTERFACE
+ False, # DRV_RESTART_POINTER
]
# single extra call for _compare_baseline
@@ -93,6 +94,7 @@ def create_simple_case(model="e3sm", resubmit=0, generate_baseline=False):
"/tmp/case", # CASEROOT
"MVK.f19_g16.S.docker_gnu", # CASEBASEID
"mct", # COMP_INTERFACE
+ False, # DRV_RESTART_POINTER
"MVK.f19_g16.S.docker_gnu", # CASEBASEID
model,
resubmit,
@@ -439,6 +441,7 @@ def test_build_phase(self, build_indv, case_setup):
n = 7
side_effect.insert(n, 8)
side_effect.insert(n, 16)
+ side_effect.insert(n, None)
case.get_value.side_effect = side_effect
@@ -481,6 +484,7 @@ def test__generate_baseline(self, evv, append_testlog, _generate_baseline):
side_effect.extend(
[
+ None,
str(baseline_dir),
"MVK.f19_g16.S",
str(run_dir),
diff --git a/CIME/tests/test_unit_xml_tests.py b/CIME/tests/test_unit_xml_tests.py
index 88a9750130d..a79bb3b9c0a 100644
--- a/CIME/tests/test_unit_xml_tests.py
+++ b/CIME/tests/test_unit_xml_tests.py
@@ -71,6 +71,7 @@ def test_support_single_exe_error(self, _setup_cases_if_not_yet_done):
f"{caseroot}",
"ERP.f19_g16.S",
"cpl",
+ None,
"ERP.f19_g16.S",
f"{caseroot}",
"ERP.f19_g16.S",