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",