77 lines
3.4 KiB
Python
77 lines
3.4 KiB
Python
"""
|
|
Implementation of the LII2FINIDATAREAS test.
|
|
|
|
This is similar to the LII test, but tests init_interp with mode
|
|
'use_finidat_areas'.
|
|
|
|
As with the standard LII test, this must be used in a configuration for
|
|
which we have a compatible out-of-the-box finidat file (so that the run
|
|
with use_init_interp = .false. runs successfully). In constrast to our
|
|
standard LII test (which uses glcMEC_spunup_1way), this one can use a
|
|
standard CISM2%NOEVOLVE configuration: we do *not* need to set
|
|
GLC_TWO_WAY_COUPLING=FALSE; in fact, it's a better test if we have
|
|
GLC_TWO_WAY_COUPLING=TRUE: with this mode of operation, areas should
|
|
match between the two runs.
|
|
|
|
It may not be totally necessary to have a system test covering this
|
|
init_interp_method: between unit tests and inline checks, we have quite
|
|
a bit of testing of this code. It's important to have at least one LII
|
|
test to make sure we're interpolating all the fields we're supposed to
|
|
interpolate, but we don't necessarily need a LII test with this mode of
|
|
operation as long as we have one with the general mode of operation.
|
|
|
|
However, this test is a good check that every point has a unique type
|
|
(because this mode of operation will fail if that's not the case); this
|
|
is something needed even for the 'general' init_interp method to work
|
|
correctly, but the 'general' mode won't catch problems in this regard.
|
|
|
|
One other reason why this test is useful is to cover the threading
|
|
directives in the set_single_match routine, since those aren't covered
|
|
by unit tests. So this test mod should be used in a test with threading.
|
|
|
|
To update the initial conditions (finidat) file for this test:
|
|
|
|
(1) Run the test; the 'base' case should run to completion even if the
|
|
no_interp test fails. (If the 'base' case fails, you may need to retry
|
|
with init_interp_method='general'.)
|
|
|
|
(2) Copy the finidat_interp_dest.nc file from the 'base' case to the inputdata
|
|
space. Rename this to be similar to the out-of-the-box finidat file
|
|
currently used by this test, but with a new creation date.
|
|
|
|
(3) Update namelist defaults to point to the new finidat file. If
|
|
updating the out-of-the-box file is not desired, then you could instead
|
|
point to this new finidat file with a user_nl_clm file in this testmod.
|
|
"""
|
|
|
|
from CIME.XML.standard_module_setup import *
|
|
from CIME.SystemTests.test_utils.user_nl_utils import append_to_user_nl_files
|
|
|
|
# We can import lii directly because the SystemTests directory has been
|
|
# added to sys.path.
|
|
#
|
|
# A cleaner and more general way to accomplish this would be: In cime:
|
|
# Rather than adding the SystemTests directory to sys.path and then
|
|
# importing an individual module from there: instead, allow each
|
|
# component to have a COMPNAME_pylib directory within its cime_config,
|
|
# and then have cime add each component's cime_config directory to
|
|
# sys.path and then do something like:
|
|
# import_module("COMPNAME_pylib.SystemTests.TESTNAME"). Then, for
|
|
# example, ctsm could access its own modules via "import
|
|
# ctsm_pylib.foo", or (in this case) "from ctsm_pylib.SystemTests.lii
|
|
# import LII".
|
|
from lii import LII
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class LII2FINIDATAREAS(LII):
|
|
|
|
def __init__(self, case):
|
|
super(LII2FINIDATAREAS, self).__init__(case)
|
|
|
|
def _case_one_setup(self):
|
|
super(LII2FINIDATAREAS, self)._case_one_setup()
|
|
append_to_user_nl_files(caseroot = self._get_caseroot(),
|
|
component = "clm",
|
|
contents = "init_interp_method = 'use_finidat_areas'")
|