Source code for CIME.SystemTests.pre

"""
Implementation of the CIME pause/resume test: Tests having driver
'pause' (write cpl restart file) and 'resume' (read cpl restart file)
possibly changing the restart file. Compared to non-pause/resume run.
Test can also be run with other component combinations.
Test requires DESP component to function correctly.
"""

import os.path
import logging
import glob

from CIME.SystemTests.system_tests_compare_two import SystemTestsCompareTwo
from CIME.utils import expect
from CIME.hist_utils import cprnc

###############################################################################
[docs] class PRE(SystemTestsCompareTwo): ############################################################################### """ Implementation of the CIME pause/resume test: Tests having driver 'pause' (write cpl and/or other restart file(s)) and 'resume' (read cpl and/or other restart file(s)) possibly changing restart file. Compare to non-pause/resume run. """ ########################################################################### def __init__(self, case, **kwargs): ########################################################################### SystemTestsCompareTwo.__init__( self, case, separate_builds=False, run_two_suffix="pr", run_one_description="no pause/resume", run_two_description="pause/resume", **kwargs ) self._stopopt = "" self._stopn = 0 self._cprnc_exe = None ########################################################################### def _case_one_setup(self): ########################################################################### pass ########################################################################### def _case_two_setup(self): ########################################################################### # Set up a pause/resume run stopopt = self._case1.get_value("STOP_OPTION") stopn = self._case1.get_value("STOP_N") self._case.set_value("STOP_OPTION", stopopt) self._case.set_value("STOP_N", stopn) self._case.set_value("ESP_RUN_ON_PAUSE", "TRUE") if stopn > 3: pausen = 2 else: pausen = 1 # End if self._case.set_value("PAUSE_OPTION", stopopt) self._case.set_value("PAUSE_N", pausen) comps = self._case.get_values("COMP_CLASSES") pause_active = [] for comp in comps: pause_active.append(self._case.get_value("PAUSE_ACTIVE_{}".format(comp))) expect(any(pause_active), "No pause_active flag is set") self._case.flush() ###########################################################################
[docs] def run_phase(self): # pylint: disable=arguments-differ ########################################################################### self._activate_case2() should_match = self._case.get_value("DESP_MODE") == "NOCHANGE" SystemTestsCompareTwo.run_phase(self, success_change=not should_match) # Look for expected coupler restart files logger = logging.getLogger(__name__) self._activate_case1() rundir1 = self._case.get_value("RUNDIR") self._cprnc_exe = self._case.get_value("CCSM_CPRNC") self._activate_case2() rundir2 = self._case.get_value("RUNDIR") compare_ok = True multi_driver = self._case.get_value("MULTI_DRIVER") comps = self._case.get_values("COMP_CLASSES") for comp in comps: if not self._case.get_value("PAUSE_ACTIVE_{}".format(comp)): continue if comp == "CPL": if multi_driver: ninst = self._case.get_value("NINST_MAX") else: ninst = 1 else: ninst = self._case.get_value("NINST_{}".format(comp)) comp_name = self._case.get_value("COMP_{}".format(comp)) for index in range(1, ninst + 1): if ninst == 1: rname = "*.{}.r.*".format(comp_name) else: rname = "*.{}_{:04d}.r.*".format(comp_name, index) restart_files_1 = glob.glob(os.path.join(rundir1, rname)) expect( (len(restart_files_1) > 0), "No case1 restart files for {}".format(comp), ) restart_files_2 = glob.glob(os.path.join(rundir2, rname)) expect( (len(restart_files_2) > len(restart_files_1)), "No pause (restart) files found in case2 for {}".format(comp), ) # Do cprnc of restart files. rfile1 = restart_files_1[len(restart_files_1) - 1] # rfile2 has to match rfile1 (same time string) parts = os.path.basename(rfile1).split(".") glob_str = "*.{}".format(".".join(parts[len(parts) - 4 :])) restart_files_2 = glob.glob(os.path.join(rundir2, glob_str)) expect( (len(restart_files_2) == 1), "Missing case2 restart file, {}", glob_str, ) rfile2 = restart_files_2[0] ok = cprnc( comp, rfile1, rfile2, self._case, rundir2, cprnc_exe=self._cprnc_exe )[0] logger.warning( "CPRNC result for {}: {}".format( os.path.basename(rfile1), "PASS" if (ok == should_match) else "FAIL", ) ) compare_ok = compare_ok and (should_match == ok) expect( compare_ok, "Not all restart files {}".format( "matched" if should_match else "failed to match" ), )