diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 8960800172..1e73e65b4f 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -58,3 +58,4 @@ bd535c710db78420b8e8b9d71d88d8339e899c59 4b20bbd7003e6f77dab4e3268cc4a43f9b5a3b5d cf433215b58ba8776ec5edfb0b0d80c0836ed3a0 16d57ff37859b34dab005693e3085d64e2bcd95a +e8fc526e0d7818d45f171488c78392c4ff63902a diff --git a/doc/ChangeLog b/doc/ChangeLog index 2e7e95f9b8..3a47cc5c20 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,4 +1,88 @@ =============================================================== +Tag name: ctsm5.3.026 +Originator(s): erik (Erik Kluzek,UCAR/TSS,303-497-1326) +Date: Wed 26 Feb 2025 09:55:48 AM MST +One-line Summary: Merge b4b-dev to master: run_tower updates, reduce log noise + +Purpose and description of changes +---------------------------------- + +Merge b4b-dev to master. + +Some run_tower updatesm, fix some issues, and improve code health. Also reduces some log noise. + + +Significant changes to scientifically-supported configurations +-------------------------------------------------------------- + +Does this tag change answers significantly for any of the following physics configurations? +(Details of any changes will be given in the "Answer changes" section below.) + + [Put an [X] in the box for any configuration with significant answer changes.] + +[ ] clm6_0 + +[ ] clm5_0 + +[ ] ctsm5_0-nwp + +[ ] clm4_5 + + +Bugs fixed +---------- +List of CTSM issues fixed (include CTSM Issue # and description) [one per line]: + Resolves #2884 -- run_neon overwrite ignored + Resolves #2885 -- run_neon setup_only ignored + Resolves #2946 -- python tests much longer + Resolves #2717 -- cleanup cesm log + Resolves #2737 -- reduce log noise + +Notes of particular relevance for users +--------------------------------------- +Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables): + Two new options to run_tower: + --no-inputdata-check option implies --setup-only but skips the check/download of input data. This is used instead of --setup-only + in run_tower system testing for a speedup of ~20%. + --xmlchange option allows user to specify xmlchange settings to apply. E.g., --xmlchange CLM_CO2_TYPE=constant,CCSM_CO2_PPMV=850. + +Notes of particular relevance for developers: +--------------------------------------------- + +Caveats for developers (e.g., code that is duplicated that requires double maintenance): + +Testing summary: Regular +---------------- + [PASS means all tests PASS; OK means tests PASS other than expected fails.] + + python testing (if python code has changed; see instructions in python/README.md; document testing done): + + derecho - PASS + + regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing): + + derecho ----- OK + izumi ------- OK + +If the tag used for baseline comparisons was NOT the previous tag, note that here: + + +Answer changes +-------------- + +Changes answers relative to baseline: No bit-for-bit + +Other details +------------- + +Pull Requests that document the changes (include PR ids): +(https://github.com/ESCOMP/ctsm/pull) + #2969 -- Simplify tower types + #2962 -- Run tower fix and improvements + #2927 -- Remove log noise + +=============================================================== +=============================================================== Tag name: ctsm5.3.025 Originator(s): glemieux (Gregory Lemieux, LBNL, glemieux@lbl.gov) Date: Thu Feb 20 14:24:45 MST 2025 diff --git a/doc/ChangeSum b/doc/ChangeSum index 44d19c635e..bda8a4f301 100644 --- a/doc/ChangeSum +++ b/doc/ChangeSum @@ -1,5 +1,6 @@ Tag Who Date Summary ============================================================================================================================ + ctsm5.3.026 samrabin 02/26/2025 Merge b4b-dev to master: run_tower updates, reduce log noise ctsm5.3.025 glemieux 02/20/2025 FATES default parameter file update ctsm5.3.024 xinchang 02/11/2025 Change choice of pressure in CLMU building energy model ctsm5.3.023 afoster 02/08/2025 merge b4b-dev diff --git a/python/ctsm/site_and_regional/neon_site.py b/python/ctsm/site_and_regional/neon_site.py index df8a514ea3..da979e0be3 100755 --- a/python/ctsm/site_and_regional/neon_site.py +++ b/python/ctsm/site_and_regional/neon_site.py @@ -34,83 +34,8 @@ class NeonSite(TowerSite): A class for encapsulating neon sites. """ - def build_base_case( - self, - cesmroot, - output_root, - res, - compset, - user_mods_dirs=None, - overwrite=False, - setup_only=False, - ): - if user_mods_dirs is None: - user_mods_dirs = [ - os.path.join( - self.cesmroot, "cime_config", "usermods_dirs", "clm", "NEON", self.name - ) - ] - case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs) - - return case_path - - # pylint: disable=too-many-statements - def run_case( - self, - base_case_root, - run_type, - prism, - user_version, - tower_type=None, - user_mods_dirs=None, - overwrite=False, - setup_only=False, - no_batch=False, - rerun=False, - experiment=False, - ): - """ - Run case. - - Args: - self - base_case_root: str, opt - file path of base case - run_type: str, opt - transient, post_ad, or ad case, default transient - prism: bool, opt - if True, use PRISM precipitation, default False - user_version: str, opt - default 'latest' - overwrite: bool, opt - default False - setup_only: bool, opt - default False; if True, set up but do not run case - no_batch: bool, opt - default False - rerun: bool, opt - default False - experiment: str, opt - name of experiment, default False - """ - user_mods_dirs = [ - os.path.join(self.cesmroot, "cime_config", "usermods_dirs", "clm", "NEON", self.name) - ] - tower_type = "NEON" - - super().run_case( - base_case_root, - run_type, - prism, - user_version, - tower_type, - user_mods_dirs, - overwrite, - setup_only, - no_batch, - rerun, - experiment, - ) + def __init__(self, *args, **kwargs): + super().__init__("NEON", *args, **kwargs) def modify_user_nl(self, case_root, run_type, rundir, site_lines=None): # TODO: include neon-specific user namelist lines, using this as just an example currently diff --git a/python/ctsm/site_and_regional/plumber_site.py b/python/ctsm/site_and_regional/plumber_site.py index 3f06f2949b..2d6e006b07 100755 --- a/python/ctsm/site_and_regional/plumber_site.py +++ b/python/ctsm/site_and_regional/plumber_site.py @@ -33,87 +33,8 @@ class Plumber2Site(TowerSite): A class for encapsulating plumber sites. """ - def build_base_case( - self, - cesmroot, - output_root, - res, - compset, - user_mods_dirs=None, - overwrite=False, - setup_only=False, - ): - if user_mods_dirs is None: - user_mods_dirs = [ - os.path.join( - self.cesmroot, "cime_config", "usermods_dirs", "clm", "PLUMBER2", self.name - ) - ] - case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs) - - return case_path - - # pylint: disable=too-many-statements - def run_case( - self, - base_case_root, - run_type, - prism, - user_version, - tower_type=None, - user_mods_dirs=None, - overwrite=False, - setup_only=False, - no_batch=False, - rerun=False, - experiment=False, - ): - """ - Run case. - - Args: - self - base_case_root: str, opt - file path of base case - run_type: str, opt - transient, post_ad, or ad case, default ad - (ad case is default because PLUMBER requires spinup) - prism: bool, opt - if True, use PRISM precipitation, default False - Note: only supported for NEON sites - user_version: str, opt - default 'latest'; this could be useful later - This is currently only implemented with neon (not plumber) sites - overwrite: bool, opt - default False - setup_only: bool, opt - default False; if True, set up but do not run case - no_batch: bool, opt - default False - rerun: bool, opt - default False - experiment: str, opt - name of experiment, default False - """ - user_mods_dirs = [ - os.path.join( - self.cesmroot, "cime_config", "usermods_dirs", "clm", "PLUMBER2", self.name - ) - ] - tower_type = "PLUMBER" - super().run_case( - base_case_root, - run_type, - prism, - user_version, - tower_type, - user_mods_dirs, - overwrite, - setup_only, - no_batch, - rerun, - experiment, - ) + def __init__(self, *args, **kwargs): + super().__init__("PLUMBER2", *args, **kwargs) def set_ref_case(self, case): super().set_ref_case(case) diff --git a/python/ctsm/site_and_regional/run_tower.py b/python/ctsm/site_and_regional/run_tower.py index e65e26a064..fe3859fa3c 100755 --- a/python/ctsm/site_and_regional/run_tower.py +++ b/python/ctsm/site_and_regional/run_tower.py @@ -233,7 +233,9 @@ def main(description): setup_only, no_batch, rerun, + no_input_data_check, user_version, + xmlchange, ) = get_parser(sys.argv, description, valid_neon_sites, valid_plumber_sites) if output_root: @@ -261,9 +263,9 @@ def main(description): if run_from_postad: neon_site.finidat = None if not base_case_root: - user_mods_dirs = None + neon_site.set_default_user_mods_dirs() base_case_root = neon_site.build_base_case( - cesmroot, output_root, res, compset, user_mods_dirs, overwrite, setup_only + cesmroot, output_root, res, compset, overwrite, setup_only ) logger.info("-----------------------------------") logger.info("Running CTSM for neon site : %s", neon_site.name) @@ -278,6 +280,8 @@ def main(description): no_batch=no_batch, rerun=rerun, experiment=experiment, + no_input_data_check=no_input_data_check, + xmlchange=xmlchange, ) # -- check for available plumber data: @@ -290,9 +294,9 @@ def main(description): if run_from_postad: plumber_site.finidat = None if not base_case_root: - user_mods_dirs = None + plumber_site.set_default_user_mods_dirs() base_case_root = plumber_site.build_base_case( - cesmroot, output_root, res, compset, user_mods_dirs, overwrite, setup_only + cesmroot, output_root, res, compset, overwrite, setup_only ) logger.info("-----------------------------------") logger.info("Running CTSM for plumber site : %s", plumber_site.name) @@ -306,4 +310,6 @@ def main(description): no_batch=no_batch, rerun=rerun, experiment=experiment, + no_input_data_check=no_input_data_check, + xmlchange=xmlchange, ) diff --git a/python/ctsm/site_and_regional/tower_arg_parse.py b/python/ctsm/site_and_regional/tower_arg_parse.py index c4491ffa99..33b3db2afa 100644 --- a/python/ctsm/site_and_regional/tower_arg_parse.py +++ b/python/ctsm/site_and_regional/tower_arg_parse.py @@ -104,6 +104,19 @@ def get_parser(args, description, valid_neon_sites, valid_plumber_sites): default=False, ) + parser.add_argument( + "--no-input-data-check", + "--no-check-input-data", + help=""" + Don't check for input data. Implies --setup-only. + [default: %(default)s] + """, + action="store_true", + dest="no_input_data_check", + required=False, + default=False, + ) + parser.add_argument( "--rerun", help=""" @@ -185,6 +198,17 @@ def get_parser(args, description, valid_neon_sites, valid_plumber_sites): choices=["v1", "v2", "v3"], ) + parser.add_argument( + "--xmlchange", + help=""" + Any xmlchanges (e.g., CLM_CO2_TYPE=constant,CCSM_CO2_PPMV=500) + [default: %(default)s] + """, + required=False, + type=str, + default=None, + ) + args = parse_args_and_handle_standard_logging_options(args, parser) if args.neon_sites: @@ -230,6 +254,10 @@ def get_parser(args, description, valid_neon_sites, valid_plumber_sites): root_logger = logging.getLogger() root_logger.setLevel(logging.WARN) + # --no-input-data-check implies --setup-only + if args.no_input_data_check and not args.setup_only: + args.setup_only = True + return ( neon_sites, plumber_sites, @@ -243,5 +271,7 @@ def get_parser(args, description, valid_neon_sites, valid_plumber_sites): args.setup_only, args.no_batch, args.rerun, + args.no_input_data_check, args.user_version, + args.xmlchange, ) diff --git a/python/ctsm/site_and_regional/tower_site.py b/python/ctsm/site_and_regional/tower_site.py index 8a2c55c64d..7bdf47df88 100644 --- a/python/ctsm/site_and_regional/tower_site.py +++ b/python/ctsm/site_and_regional/tower_site.py @@ -29,7 +29,6 @@ logger = logging.getLogger(__name__) - # pylint: disable=too-many-instance-attributes class TowerSite: """ @@ -41,12 +40,23 @@ class TowerSite: ------- """ - def __init__(self, name, start_year, end_year, start_month, end_month, finidat): + def __init__( + self, + tower_type, + name, + start_year, + end_year, + start_month, + end_month, + finidat, + user_mods_dirs=None, + ): """ Initializes TowerSite with the given arguments. Parameters ---------- """ + self.tower_type = tower_type self.name = name self.start_year = int(start_year) self.end_year = int(end_year) @@ -55,6 +65,14 @@ def __init__(self, name, start_year, end_year, start_month, end_month, finidat): self.cesmroot = path_to_ctsm_root() self.finidat = finidat + if user_mods_dirs is None: + self.set_default_user_mods_dirs() + elif not isinstance(user_mods_dirs, list): + abort("Input user_mods_dirs is NOT a list as expected: " + str(user_mods_dirs)) + else: + self.user_mods_dirs = user_mods_dirs + self.check_user_mods_dirs() + def __str__(self): """ Converts ingredients of the TowerSite to string for printing. @@ -69,10 +87,29 @@ def __str__(self): ), ) + def set_default_user_mods_dirs(self): + """ + Sets user_mods_dirs to the default + """ + self.user_mods_dirs = [ + os.path.join( + self.cesmroot, "cime_config", "usermods_dirs", "clm", self.tower_type, self.name + ) + ] + self.check_user_mods_dirs() + + def check_user_mods_dirs(self): + """ + Checks that every user_mod_dir exists + """ + for dirtree in self.user_mods_dirs: + if not os.path.isdir(dirtree): + abort("Input user_mods_dirs dirtreetory does NOT exist: " + str(dirtree)) + # TODO: Refactor to shorten this so the disable can be removed # pylint: disable=too-many-statements def build_base_case( - self, cesmroot, output_root, res, compset, user_mods_dirs, overwrite=False, setup_only=False + self, cesmroot, output_root, res, compset, overwrite=False, setup_only=False ): """ Function for building a base_case to clone. @@ -91,8 +128,6 @@ def build_base_case( base_case resolution or gridname compset (str): base case compset - user_mods_dirs (str): - path to the user-mod-directory to use overwrite (bool) : Flag to overwrite the case if exists setup_only (bool) : @@ -111,11 +146,6 @@ def build_base_case( abort("Input compset is NOT a boolean as expected: " + str(compset)) if not isinstance(setup_only, bool): abort("Input setup_only is NOT a boolean as expected: " + str(setup_only)) - if not isinstance(user_mods_dirs, list): - abort("Input user_mods_dirs is NOT a list as expected: " + str(user_mods_dirs)) - for dirtree in user_mods_dirs: - if not os.path.isdir(dirtree): - abort("Input user_mods_dirs dirtreetory does NOT exist: " + str(dirtree)) print("---- building a base case -------") # pylint: disable=attribute-defined-outside-init @@ -130,7 +160,7 @@ def build_base_case( case_path = os.path.join(output_root, self.name) logger.info("base_case_name : %s", self.name) - logger.info("user_mods_dir : %s", user_mods_dirs[0]) + logger.info("user_mods_dir : %s", self.user_mods_dirs[0]) if overwrite and os.path.isdir(case_path): print("Removing the existing case at: {}".format(case_path)) @@ -150,7 +180,7 @@ def build_base_case( run_unsupported=True, answer="r", output_root=output_root, - user_mods_dirs=user_mods_dirs, + user_mods_dirs=self.user_mods_dirs, driver="nuopc", ) @@ -289,13 +319,13 @@ def run_case( run_type, prism, user_version, - tower_type, - user_mods_dirs, overwrite, setup_only, no_batch, rerun, experiment, + no_input_data_check, + xmlchange, ): """ Run case. @@ -396,7 +426,7 @@ def run_case( # that the shell_commands file is copied, as well as taking care of the DATM inputs. # See https://github.com/ESCOMP/CTSM/pull/1872#pullrequestreview-1169407493 # - basecase.create_clone(case_root, keepexe=True, user_mods_dirs=user_mods_dirs) + basecase.create_clone(case_root, keepexe=True, user_mods_dirs=self.user_mods_dirs) with Case(case_root, read_only=False) as case: if run_type != "transient": @@ -405,7 +435,7 @@ def run_case( case.set_value("STOP_OPTION", "ndays") case.set_value("REST_OPTION", "end") case.set_value("CONTINUE_RUN", False) - if tower_type == "NEON": + if self.tower_type == "NEON": case.set_value("NEONVERSION", version) if prism: case.set_value("CLM_USRDAT_NAME", "NEON.PRISM") @@ -445,11 +475,19 @@ def run_case( if not rundir: rundir = case.get_value("RUNDIR") + if xmlchange: + xmlchange_list = xmlchange.split(",") + for setting in xmlchange_list: + setting_split = setting.split("=") + case.set_value(*setting_split) + self.modify_user_nl(case_root, run_type, rundir) case.create_namelists() + # explicitly run check_input_data - case.check_all_input_data() + if not no_input_data_check: + case.check_all_input_data() if not setup_only: case.submit(no_batch=no_batch) print("-----------------------------------") diff --git a/python/ctsm/test/test_sys_run_tower.py b/python/ctsm/test/test_sys_run_tower.py index b1eef6c3a9..d444992249 100755 --- a/python/ctsm/test/test_sys_run_tower.py +++ b/python/ctsm/test/test_sys_run_tower.py @@ -10,11 +10,16 @@ import tempfile import shutil import sys +import pathlib from ctsm import unit_testing from ctsm.site_and_regional.run_tower import main from ctsm.path_utils import path_to_ctsm_root +# pylint: disable=import-error +# pylint: disable=wrong-import-order +from CIME.case import Case + # Allow test names that pylint doesn't like; otherwise hard to make them # readable # pylint: disable=invalid-name @@ -58,13 +63,12 @@ def test_one_site(self): os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), "--neon-sites", "BART", - "--setup-only", + "--no-input-data-check", "--experiment", "TEST", "--output-root", self._tempdir, ] - print(sys.argv) main("") # assert that BART directories were created during setup @@ -82,7 +86,7 @@ def test_ad_site(self): os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), "--neon-sites", "ABBY", - "--setup-only", + "--no-input-data-check", "--run-type", "ad", "--output-root", @@ -104,7 +108,7 @@ def test_plumber_site(self): os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), "--plumber-sites", "AR-SLu", - "--setup-only", + "--no-input-data-check", "--experiment", "TEST", "--output-root", @@ -115,6 +119,94 @@ def test_plumber_site(self): # assert that AR-SLu directories were created during setup self.assertTrue("AR-SLu" in glob.glob(self._tempdir + "/AR-SLu*")[0]) + def test_xmlchange(self): + """ + This test checks that the --xmlchange argument is obeyed. + """ + + # run the run_tower tool + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--neon-sites", + "BART", + "--no-input-data-check", + "--experiment", + "TEST", + "--xmlchange", + "CLM_CO2_TYPE=constant,CCSM_CO2_PPMV=1987", + "--output-root", + self._tempdir, + ] + main("") + + # Check that the --xmlchange argument is obeyed + case_dir = os.path.join(self._tempdir, "BART.TEST.transient") + self.assertTrue(os.path.exists(case_dir)) + with Case(case_dir, read_only=True) as case: + value = case.get_value("CLM_CO2_TYPE") + print(f"CLM_CO2_TYPE = {value}") + self.assertTrue(value == "constant") + value = int(case.get_value("CCSM_CO2_PPMV")) + print(f"CCSM_CO2_PPMV = {value}") + self.assertTrue(int(value) == 1987) + + def test_setup_only(self): + """ + This test checks that the --setup-only argument is obeyed + """ + + # run the run_tower tool + site_name = "BART" + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--neon-sites", + site_name, + "--setup-only", + "--experiment", + "TEST", + "--output-root", + self._tempdir, + ] + main("") + + # make sure that build didn't happen: this dir should be empty + case_dir = os.path.join(self._tempdir, site_name) + build_dir_to_check = os.path.join(case_dir, "bld", "cpl", "obj") + self.assertTrue(os.path.exists(build_dir_to_check)) + self.assertTrue(len(os.listdir(build_dir_to_check)) == 0) + + def test_overwrite(self): + """ + This test checks that the --overwrite argument is obeyed + """ + + # run the run_tower tool once + site_name = "BART" + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--neon-sites", + site_name, + "--no-input-data-check", + "--experiment", + "TEST", + "--output-root", + self._tempdir, + ] + main("") + + # create a file that should be erased during the upcoming overwrite + case_dir = os.path.join(self._tempdir, site_name) + test_file = os.path.join(case_dir, "test_file") + pathlib.Path(test_file).touch() + self.assertTrue(os.path.exists(test_file)) + + # run the tool again, overwriting existing + sys.argv += ["--overwrite"] + main("") + + # ensure that file we created is gone + self.assertFalse(os.path.exists(test_file)) + if __name__ == "__main__": unit_testing.setup_for_tests() diff --git a/src/init_interp/initInterp.F90 b/src/init_interp/initInterp.F90 index f6027fe632..e0d56aed62 100644 --- a/src/init_interp/initInterp.F90 +++ b/src/init_interp/initInterp.F90 @@ -1397,7 +1397,7 @@ subroutine check_interp_non_ciso_to_ciso(ncidi) write(iulog,*) 'Proceeding despite missing c13 and/or c14 fields on input finidat file,' write(iulog,*) 'because for_testing_allow_interp_non_ciso_to_ciso is set.' write(iulog,*) ' ' - else + else if (masterproc) then write(iulog,*) ' ' write(iulog,*) 'for_testing_allow_interp_non_ciso_to_ciso is .true., but it appears to be unnecessary in this run' write(iulog,*) '(this is informational only - it does not indicate a problem)' diff --git a/src/soilbiogeochem/CNSoilMatrixMod.F90 b/src/soilbiogeochem/CNSoilMatrixMod.F90 index 56c1f11b5c..e2b4ff2292 100644 --- a/src/soilbiogeochem/CNSoilMatrixMod.F90 +++ b/src/soilbiogeochem/CNSoilMatrixMod.F90 @@ -18,6 +18,7 @@ module CNSoilMatrixMod use shr_log_mod , only : errMsg => shr_log_errMsg use decompMod , only : bounds_type use abortutils , only : endrun + use spmdMod , only : masterproc use clm_time_manager , only : get_step_size, is_end_curr_month,get_curr_date,update_DA_nstep use clm_time_manager , only : is_first_restart_step,is_beg_curr_year,is_end_curr_year,is_first_step_of_this_run_segment use clm_varpar , only : ndecomp_pools, nlevdecomp, ndecomp_pools_vr !number of biogeochemically active soil layers @@ -64,7 +65,7 @@ subroutine CNSoilMatrixInit( ) ! !LOCAL VARIABLES: !----------------------------------------------------------------------- - if ( use_soil_matrixcn ) then + if ( use_soil_matrixcn .and. masterproc) then write(iulog,*) 'CN Soil matrix solution is on' write(iulog,*) '*****************************' if ( spinup_matrixcn ) then @@ -79,8 +80,6 @@ subroutine CNSoilMatrixInit( ) else write(iulog,*) ' no extra matrix solution tracability output' end if - else - write(iulog,*) 'CN Soil matrix solution is off' end if end subroutine CNSoilMatrixInit diff --git a/src/utils/clmfates_interfaceMod.F90 b/src/utils/clmfates_interfaceMod.F90 index bee69cce45..61d2af3cbd 100644 --- a/src/utils/clmfates_interfaceMod.F90 +++ b/src/utils/clmfates_interfaceMod.F90 @@ -1283,11 +1283,6 @@ subroutine dynamics_driv(this, nc, bounds_clump, & this%fates(nc)%sites, & this%fates(nc)%bc_in ) - if (masterproc) then - write(iulog, *) 'clm: leaving fates model', bounds_clump%begg, & - bounds_clump%endg - end if - call t_stopf('fates_dynamics_daily_driver') return @@ -3142,7 +3137,6 @@ subroutine Init2(this, bounds, NLFilename) call t_startf('fates_init2') - write(iulog,*) 'Init2: calling FireInit' call this%fates_fire_data_method%FireInit(bounds, NLFilename) call t_stopf('fates_init2')