Source code for CIME.SystemTests.ncr

"""
Implementation of the CIME NCR test.  This class inherits from SystemTestsCommon

Build two exectuables for this test:
The first runs two instances for each component with the same total number of tasks,
and runs each of them concurrently
The second is a default build

NOTE: This is currently untested, and may not be working properly
"""
from CIME.XML.standard_module_setup import *
from CIME.SystemTests.system_tests_compare_two import SystemTestsCompareTwo

logger = logging.getLogger(__name__)


[docs] class NCR(SystemTestsCompareTwo): def __init__(self, case, **kwargs): """ initialize an NCR test """ SystemTestsCompareTwo.__init__( self, case, separate_builds=True, run_two_suffix="singleinst", run_one_description="two instances, each with the same number of tasks", run_two_description="default build", **kwargs ) def _comp_classes(self): # Return the components which we need to set things for # ESP cannot have more than one instance, so don't set anything for it comp_classes = self._case.get_values("COMP_CLASSES") if "CPL" in comp_classes: comp_classes.remove("CPL") if "ESP" in comp_classes: comp_classes.remove("ESP") return comp_classes def _common_setup(self): # Set the default number of tasks for comp in self._comp_classes(): ntasks = self._case.get_value("NTASKS_{}".format(comp)) if ntasks > 1: self._case.set_value("NTASKS_{}".format(comp), ntasks // 2) def _case_one_setup(self): # Set the number of instances, the ROOTPEs, and the number of tasks # This case should have twice the number of instances and half the number of tasks # All tasks should be running concurrently # Note that this case must be the multiinstance one # to correctly set the required number of nodes and avoid crashing ntasks_sum = 0 for comp in self._comp_classes(): self._case.set_value("NINST_{}".format(comp), str(2)) self._case.set_value("ROOTPE_{}".format(comp), ntasks_sum) ntasks = self._case.get_value("NTASKS_{}".format(comp)) * 2 ntasks_sum += ntasks self._case.set_value("NTASKS_{}".format(comp), ntasks) # test_mode must be False here so the case.test file is updated # This ensures that the correct number of nodes are used in case it's larger than in case 2 def _case_two_setup(self): for comp in self._comp_classes(): self._case.set_value("NINST_{}".format(comp), str(1)) self._case.set_value("ROOTPE_{}".format(comp), 0)