diff --git a/Externals.cfg b/Externals.cfg index e683f199ac..9e7b4acc31 100644 --- a/Externals.cfg +++ b/Externals.cfg @@ -8,7 +8,7 @@ required = True local_path = components/cism protocol = git repo_url = https://github.com/ESCOMP/CISM-wrapper -tag = cismwrap_2_1_95 +tag = cismwrap_2_1_96 externals = Externals_CISM.cfg required = True @@ -34,7 +34,7 @@ hash = 34723c2 required = True [ccs_config] -tag = ccs_config_cesm0.0.65 +tag = ccs_config_cesm0.0.82 protocol = git repo_url = https://github.com/ESMCI/ccs_config_cesm.git local_path = ccs_config @@ -44,18 +44,18 @@ required = True local_path = cime protocol = git repo_url = https://github.com/ESMCI/cime -tag = cime6.0.125 +tag = cime6.0.175 required = True [cmeps] -tag = cmeps0.14.21 +tag = cmeps0.14.43 protocol = git repo_url = https://github.com/ESCOMP/CMEPS.git local_path = components/cmeps required = True [cdeps] -tag = cdeps1.0.13 +tag = cdeps1.0.23 protocol = git repo_url = https://github.com/ESCOMP/CDEPS.git local_path = components/cdeps @@ -63,7 +63,7 @@ externals = Externals_CDEPS.cfg required = True [cpl7] -tag = cpl77.0.5 +tag = cpl77.0.7 protocol = git repo_url = https://github.com/ESCOMP/CESM_CPL7andDataComps local_path = components/cpl7 @@ -84,7 +84,7 @@ local_path = libraries/mct required = True [parallelio] -tag = pio2_5_10 +tag = pio2_6_2 protocol = git repo_url = https://github.com/NCAR/ParallelIO local_path = libraries/parallelio diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm index 40b7f13c25..e067a54512 100755 --- a/bld/CLMBuildNamelist.pm +++ b/bld/CLMBuildNamelist.pm @@ -4394,6 +4394,8 @@ sub setup_logic_exice { # my ($opts, $nl_flags, $definition, $defaults, $nl) = @_; my $use_exice = $nl->get_value( 'use_excess_ice' ); + + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_excess_ice_streams', 'phys'=>$nl_flags->{'phys'}); my $use_exice_streams = $nl->get_value( 'use_excess_ice_streams' ); # IF excess ice streams is on if (defined($use_exice_streams) && value_is_true($use_exice_streams)) { diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml index 0edffa3f1a..996239e279 100644 --- a/bld/namelist_files/namelist_defaults_ctsm.xml +++ b/bld/namelist_files/namelist_defaults_ctsm.xml @@ -487,7 +487,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case). -lnd/clm2/paramdata/ctsm51_params.c211112.nc +lnd/clm2/paramdata/ctsm51_params.RMz0.c231011.nc lnd/clm2/paramdata/clm50_params.c211112.nc lnd/clm2/paramdata/clm45_params.c211112.nc @@ -501,10 +501,10 @@ attributes from the config_cache.xml file (with keys converted to upper-case). -ZengWang2007 +Meier2022 .true. -.false. +.true. @@ -680,6 +680,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case). set up. If more finidat files are added you may need to add more of these. Or one specific file will be chosen over another. --> + hgrid=0.9x1.25 maxpft=17 mask=gx1v7 use_cn=.true. use_crop=.false. irrigate=.true. glc_nec=10 do_transient_pfts=.false. @@ -724,6 +725,11 @@ attributes from the config_cache.xml file (with keys converted to upper-case). >hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.false. glc_nec=10 do_transient_pfts=.false. + +hgrid=ne30np4.pg3 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.false. glc_nec=10 do_transient_pfts=.false. + + hgrid=1.9x2.5 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. @@ -875,7 +881,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case). hgrid="ne0np4.ARCTICGRIS.ne30x8" use_cn=".false." maxpft="17" >hgrid=ne0np4.ARCTICGRIS.ne30x8 maxpft=17 mask=tx0.1v2 use_cn=.false. use_crop=.false. irrigate=.true. glc_nec=10 do_transient_pfts=.false. -p + lnd/clm2/initdata_map/clmi.I1850Clm50BgcCrop-ciso.1366-01-01.0.9x1.25_gx1v7_simyr1850_c200428.nc + +lnd/clm2/initdata_map/clmi.I1850Clm51CplhistBgcCrop-ciso.0561-01-01.ne30np4.pg3_gx1v7_simyr1850_c230717.nc + + -.false. +.true. +.true. lnd/clm2/paramdata/exice_init_0.125x0.125_c20220516.nc lnd/clm2/paramdata/exice_init_0.125x0.125_ESMFmesh_cdf5_c20220802.nc diff --git a/bld/namelist_files/namelist_definition_ctsm.xml b/bld/namelist_files/namelist_definition_ctsm.xml index 895940103d..f982f0b61d 100644 --- a/bld/namelist_files/namelist_definition_ctsm.xml +++ b/bld/namelist_files/namelist_definition_ctsm.xml @@ -2143,7 +2143,7 @@ Land mask description + valid_values="clm4_5_CRUv7,clm4_5_GSWP3v1,clm4_5_cam6.0,clm5_0_cam6.0,clm5_0_CRUv7,clm5_0_GSWP3v1,clm5_1_GSWP3v1,clm5_1_cam6.0"> General configuration of model version and atmospheric forcing to tune the model to run under. This sets the model to run with constants and initial conditions that were set to run well under the configuration of model version and atmospheric forcing. To run well constants would need to be changed diff --git a/cime_config/SystemTests/mksurfdataesmf.py b/cime_config/SystemTests/mksurfdataesmf.py index af783850ba..e240415a85 100644 --- a/cime_config/SystemTests/mksurfdataesmf.py +++ b/cime_config/SystemTests/mksurfdataesmf.py @@ -20,8 +20,8 @@ logger = logging.getLogger(__name__) -class MKSURFDATAESMF(SystemTestsCommon): +class MKSURFDATAESMF(SystemTestsCommon): def __init__(self, case): """ initialize an object interface to the SMS system test @@ -29,20 +29,22 @@ def __init__(self, case): SystemTestsCommon.__init__(self, case) # Paths and strings needed throughout - ctsm_root = self._case.get_value('COMP_ROOT_DIR_LND') - self._tool_path = os.path.join(ctsm_root, 'tools/mksurfdata_esmf') - self._tool_bld = os.path.join(self._get_caseroot(), 'tool_bld') + ctsm_root = self._case.get_value("COMP_ROOT_DIR_LND") + self._tool_path = os.path.join(ctsm_root, "tools/mksurfdata_esmf") + self._tool_bld = os.path.join(self._get_caseroot(), "tool_bld") time_stamp = datetime.today().strftime("%y%m%d") - self._res = '10x15' # see important comment in script's docstring - self._model_yr = '1850' - self._jobscript = os.path.join(self._get_caseroot(), - 'mksurfdata_jobscript_single') - self._fsurdat_namelist = os.path.join(self._get_caseroot(), - f'surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.namelist') - self._fsurdat_nc = os.path.join(self._get_caseroot(), - f'surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.nc') - self._TestStatus_log_path = os.path.join(self._get_caseroot(), - 'TestStatus.log') + self._res = "10x15" # see important comment in script's docstring + self._model_yr = "1850" + self._jobscript = os.path.join(self._get_caseroot(), "mksurfdata_jobscript_single") + self._fsurdat_namelist = os.path.join( + self._get_caseroot(), + f"surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.namelist", + ) + self._fsurdat_nc = os.path.join( + self._get_caseroot(), + f"surfdata_{self._res}_hist_78pfts_CMIP6_{self._model_yr}_c{time_stamp}.nc", + ) + self._TestStatus_log_path = os.path.join(self._get_caseroot(), "TestStatus.log") def build_phase(self, sharedlib_only=False, model_only=False): """ @@ -58,24 +60,25 @@ def build_phase(self, sharedlib_only=False, model_only=False): # if the test stops and gets restarted. if sharedlib_only: # Paths and strings - build_script_path = os.path.join(self._tool_path, - 'gen_mksurfdata_build.sh') - nml_script_path = os.path.join(self._tool_path, - 'gen_mksurfdata_namelist.py') - gen_jobscript_path = os.path.join(self._tool_path, - 'gen_mksurfdata_jobscript_single.py') - gen_mksurfdata_namelist = f'{nml_script_path} --res {self._res} --start-year {self._model_yr} --end-year {self._model_yr}' - gen_mksurfdata_jobscript = f'{gen_jobscript_path} --number-of-nodes 12 --tasks-per-node 12 --namelist-file {self._fsurdat_namelist}' + build_script_path = os.path.join(self._tool_path, "gen_mksurfdata_build.sh") + nml_script_path = os.path.join(self._tool_path, "gen_mksurfdata_namelist.py") + gen_jobscript_path = os.path.join(self._tool_path, "gen_mksurfdata_jobscript_single.py") + gen_mksurfdata_namelist = f"{nml_script_path} --res {self._res} --start-year {self._model_yr} --end-year {self._model_yr}" + gen_mksurfdata_jobscript = f"{gen_jobscript_path} --number-of-nodes 12 --tasks-per-node 12 --namelist-file {self._fsurdat_namelist}" # Rm tool_bld and build executable that will generate fsurdat try: - subprocess.check_call(f'rm -rf {self._tool_bld}', shell=True) + subprocess.check_call(f"rm -rf {self._tool_bld}", shell=True) except subprocess.CalledProcessError as e: - sys.exit(f'{e} ERROR REMOVING {self._tool_bld}. DETAILS IN {self._TestStatus_log_path}') + sys.exit( + f"{e} ERROR REMOVING {self._tool_bld}. DETAILS IN {self._TestStatus_log_path}" + ) try: - subprocess.check_call(f'{build_script_path} --blddir {self._tool_bld}', shell=True) + subprocess.check_call(f"{build_script_path} --blddir {self._tool_bld}", shell=True) except subprocess.CalledProcessError as e: - sys.exit(f'{e} ERROR RUNNING {build_script_path}. DETAILS IN {self._TestStatus_log_path}') + sys.exit( + f"{e} ERROR RUNNING {build_script_path}. DETAILS IN {self._TestStatus_log_path}" + ) # Generate namelist for generating fsurdat (rm namelist if exists) if os.path.exists(self._fsurdat_namelist): @@ -83,7 +86,9 @@ def build_phase(self, sharedlib_only=False, model_only=False): try: subprocess.check_call(gen_mksurfdata_namelist, shell=True) except subprocess.CalledProcessError as e: - sys.exit(f'{e} ERROR RUNNING {gen_mksurfdata_namelist}. DETAILS IN {self._TestStatus_log_path}') + sys.exit( + f"{e} ERROR RUNNING {gen_mksurfdata_namelist}. DETAILS IN {self._TestStatus_log_path}" + ) # Generate jobscript that will run the executable if os.path.exists(self._jobscript): @@ -91,16 +96,17 @@ def build_phase(self, sharedlib_only=False, model_only=False): try: subprocess.check_call(gen_mksurfdata_jobscript, shell=True) except subprocess.CalledProcessError as e: - sys.exit(f'{e} ERROR RUNNING {gen_mksurfdata_jobscript}. DETAILS IN {self._TestStatus_log_path}') + sys.exit( + f"{e} ERROR RUNNING {gen_mksurfdata_jobscript}. DETAILS IN {self._TestStatus_log_path}" + ) # Change self._jobscript to an executable file - subprocess.check_call(f'chmod a+x {self._jobscript}', shell=True) + subprocess.check_call(f"chmod a+x {self._jobscript}", shell=True) # Call this step only once even if the test stops and gets restarted. - if not os.path.exists(os.path.join(self._get_caseroot(), - 'done_MKSURFDATAESMF_setup.txt')): + if not os.path.exists(os.path.join(self._get_caseroot(), "done_MKSURFDATAESMF_setup.txt")): # Modify user_nl_clm to point to the generated fsurdat self._modify_user_nl() - with open('done_MKSURFDATAESMF_setup.txt', 'w') as fp: + with open("done_MKSURFDATAESMF_setup.txt", "w") as fp: pass self.build_indv(sharedlib_only=sharedlib_only, model_only=model_only) @@ -117,7 +123,7 @@ def run_phase(self): try: subprocess.check_call(self._jobscript, shell=True) except subprocess.CalledProcessError as e: - sys.exit(f'{e} ERROR RUNNING {self._jobscript}; details in {self._TestStatus_log_path}') + sys.exit(f"{e} ERROR RUNNING {self._jobscript}; details in {self._TestStatus_log_path}") # Submit CTSM run that uses fsurdat just generated self.run_indv() @@ -126,6 +132,8 @@ def _modify_user_nl(self): """ Modify user_nl_clm to point to the generated fsurdat """ - append_to_user_nl_files(caseroot = self._get_caseroot(), - component = "clm", - contents = "fsurdat = '{}'".format(self._fsurdat_nc)) + append_to_user_nl_files( + caseroot=self._get_caseroot(), + component="clm", + contents="fsurdat = '{}'".format(self._fsurdat_nc), + ) diff --git a/cime_config/config_component.xml b/cime_config/config_component.xml index 743e9229b9..281a94a0b2 100644 --- a/cime_config/config_component.xml +++ b/cime_config/config_component.xml @@ -63,7 +63,7 @@ Tuning parameters and initial conditions should be optimized for what CLM model version and what meteorlogical forcing combination? UNSET - clm5_0_cam6.0,clm5_0_GSWP3v1,clm5_0_CRUv7,clm4_5_CRUv7,clm4_5_GSWP3v1,clm4_5_cam6.0,clm5_1_GSWP3v1 + clm5_0_cam6.0,clm5_0_GSWP3v1,clm5_0_CRUv7,clm4_5_CRUv7,clm4_5_GSWP3v1,clm4_5_cam6.0,clm5_1_GSWP3v1,clm5_1_cam6.0 clm4_5_CRUv7 clm4_5_CRUv7 @@ -76,6 +76,7 @@ clm5_0_cam6.0 clm5_0_cam6.0 clm5_1_GSWP3v1 + clm5_1_cam6.0 diff --git a/cime_config/config_pes.xml b/cime_config/config_pes.xml index aad134be86..90b3fe9efe 100644 --- a/cime_config/config_pes.xml +++ b/cime_config/config_pes.xml @@ -372,6 +372,43 @@ + + + + none + + -1 + -5 + -5 + -5 + -5 + -5 + -5 + -5 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + + + @@ -557,6 +594,80 @@ + + + + none + + -1 + -5 + -5 + -5 + -5 + -5 + -5 + -5 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + + + + + + + none + + -1 + -20 + -20 + -20 + -20 + -20 + -20 + -20 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + + + diff --git a/cime_config/testdefs/ExpectedTestFails.xml b/cime_config/testdefs/ExpectedTestFails.xml index 174ebf9c58..6e1b1530a7 100644 --- a/cime_config/testdefs/ExpectedTestFails.xml +++ b/cime_config/testdefs/ExpectedTestFails.xml @@ -28,6 +28,21 @@ --> + + + + FAIL + #2210 + + + + + FAIL + #2210 + + + + diff --git a/cime_config/testdefs/testlist_clm.xml b/cime_config/testdefs/testlist_clm.xml index 2c96d01a12..01bd95699c 100644 --- a/cime_config/testdefs/testlist_clm.xml +++ b/cime_config/testdefs/testlist_clm.xml @@ -53,6 +53,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/include_user_mods new file mode 100644 index 0000000000..fe0e18cf88 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/include_user_mods @@ -0,0 +1 @@ +../default diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/shell_commands b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/shell_commands new file mode 100644 index 0000000000..cf39cca1c0 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningMode/shell_commands @@ -0,0 +1,5 @@ +#!/bin/bash + +./xmlchange LND_TUNING_MODE="clm5_1_cam6.0" +./xmlchange ROF_NCPL='$ATM_NCPL' + diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/include_user_mods b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/include_user_mods new file mode 100644 index 0000000000..a102434d88 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/include_user_mods @@ -0,0 +1 @@ +../clm51cam6LndTuningMode/ diff --git a/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/user_nl_clm new file mode 100644 index 0000000000..6797a9e5e0 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/clm/clm51cam6LndTuningModeNoMeier/user_nl_clm @@ -0,0 +1,3 @@ +! Turn off Meier roughness +z0param_method = 'ZengWang2007' +use_z0m_snowmelt = .false. diff --git a/python/ctsm/machine_defaults.py b/python/ctsm/machine_defaults.py index 7486237323..305c86e03c 100644 --- a/python/ctsm/machine_defaults.py +++ b/python/ctsm/machine_defaults.py @@ -66,6 +66,25 @@ ) }, ), + "derecho": MachineDefaults( + job_launcher_type=JOB_LAUNCHER_QSUB, + scratch_dir=os.path.join(os.path.sep, "glade", "derecho", "scratch", get_user()), + baseline_dir=os.path.join(os.path.sep, "glade", "p", "cgd", "tss", "ctsm_baselines"), + account_required=True, + create_test_retry=0, + create_test_queue="regular", + job_launcher_defaults={ + JOB_LAUNCHER_QSUB: QsubDefaults( + queue="regular", + walltime="11:50:00", + extra_args="", + # The following assumes a single node, with a single mpi proc; we may want + # to add more flexibility in the future, making the node / proc counts + # individually selectable + required_args="-l select=1:ncpus=128:mpiprocs=1 -V -r n -k oed", + ) + }, + ), "hobart": MachineDefaults( job_launcher_type=JOB_LAUNCHER_QSUB, scratch_dir=os.path.join(os.path.sep, "scratch", "cluster", get_user()), diff --git a/python/ctsm/machine_utils.py b/python/ctsm/machine_utils.py index da5c8b9c6a..970d2e9080 100644 --- a/python/ctsm/machine_utils.py +++ b/python/ctsm/machine_utils.py @@ -41,6 +41,8 @@ def _machine_from_hostname(hostname): """ if re.match(r"cheyenne\d+", hostname): machine = "cheyenne" + elif re.match(r"derecho\d+", hostname): + machine = "derecho" else: machine = hostname