From f84aebb152dcb39141f143183e428de6e4549ac5 Mon Sep 17 00:00:00 2001 From: Sean Patrick Santos Date: Tue, 12 Jul 2016 18:12:00 -0600 Subject: [PATCH 01/15] Make `Case` a context manager. This change guarantees that a `Case` is always flushed, even if an exception is thrown, using this syntax: with Case(caseroot) as case: (do stuff with the case) These changes are not yet tested as of this commit. --- cime_config/acme/machines/template.case.run | 4 +- cime_config/acme/machines/template.case.test | 4 +- cime_config/acme/machines/template.lt_archive | 4 +- cime_config/acme/machines/template.st_archive | 4 +- cime_config/cesm/machines/template.case.run | 4 +- cime_config/cesm/machines/template.case.test | 4 +- cime_config/cesm/machines/template.lt_archive | 4 +- cime_config/cesm/machines/template.st_archive | 4 +- driver_cpl/cime_config/buildexe | 18 ++-- driver_cpl/cime_config/buildnml | 70 +++++++------ scripts/Tools/case.build | 47 ++++----- scripts/Tools/case.setup | 5 +- scripts/Tools/case.submit | 5 +- scripts/Tools/check_case | 6 +- scripts/Tools/check_input_data | 9 +- scripts/Tools/getTiming | 98 +++++++++---------- scripts/Tools/preview_namelists | 4 +- scripts/Tools/xmlchange | 34 +++---- scripts/Tools/xmlquery | 38 +++---- scripts/create_clone | 4 +- scripts/create_newcase | 36 ++++--- scripts/create_test | 10 +- utils/python/CIME/SystemTests/erp.py | 6 -- utils/python/CIME/build.py | 3 +- utils/python/CIME/buildlib.py | 58 +++++------ utils/python/CIME/buildnml.py | 23 +++-- utils/python/CIME/case.py | 20 ++-- utils/python/CIME/check_input_data.py | 3 +- utils/python/CIME/system_test.py | 10 +- .../python/tests/scripts_regression_tests.py | 38 +++---- 30 files changed, 292 insertions(+), 285 deletions(-) mode change 100644 => 100755 cime_config/acme/machines/template.case.run mode change 100644 => 100755 cime_config/acme/machines/template.lt_archive mode change 100644 => 100755 cime_config/acme/machines/template.st_archive mode change 100644 => 100755 cime_config/cesm/machines/template.case.run mode change 100644 => 100755 cime_config/cesm/machines/template.lt_archive mode change 100644 => 100755 cime_config/cesm/machines/template.st_archive diff --git a/cime_config/acme/machines/template.case.run b/cime_config/acme/machines/template.case.run old mode 100644 new mode 100755 index b7c14da1e5ff..4cec0f8b8d36 --- a/cime_config/acme/machines/template.case.run +++ b/cime_config/acme/machines/template.case.run @@ -74,8 +74,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_run(case) + with Case(caseroot) as case: + success = case_run(case) sys.exit(0 if success else 1) diff --git a/cime_config/acme/machines/template.case.test b/cime_config/acme/machines/template.case.test index 9976dea88742..7b6c4efbaea8 100755 --- a/cime_config/acme/machines/template.case.test +++ b/cime_config/acme/machines/template.case.test @@ -66,8 +66,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, testname = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_test(case, testname) + with Case(caseroot) as case: + success = case_test(case, testname) sys.exit(0 if success else 1) diff --git a/cime_config/acme/machines/template.lt_archive b/cime_config/acme/machines/template.lt_archive old mode 100644 new mode 100755 index fa121cc6302e..990f59bd3540 --- a/cime_config/acme/machines/template.lt_archive +++ b/cime_config/acme/machines/template.lt_archive @@ -67,8 +67,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_lt_archive(case) + with Case(caseroot) as case: + success = case_lt_archive(case) sys.exit(0 if success else 1) diff --git a/cime_config/acme/machines/template.st_archive b/cime_config/acme/machines/template.st_archive old mode 100644 new mode 100755 index d3865c8cca2c..fa4f79575d84 --- a/cime_config/acme/machines/template.st_archive +++ b/cime_config/acme/machines/template.st_archive @@ -66,8 +66,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_st_archive(case) + with Case(caseroot) as case: + success = case_st_archive(case) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.case.run b/cime_config/cesm/machines/template.case.run old mode 100644 new mode 100755 index b7c14da1e5ff..4cec0f8b8d36 --- a/cime_config/cesm/machines/template.case.run +++ b/cime_config/cesm/machines/template.case.run @@ -74,8 +74,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_run(case) + with Case(caseroot) as case: + success = case_run(case) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.case.test b/cime_config/cesm/machines/template.case.test index 9976dea88742..7b6c4efbaea8 100755 --- a/cime_config/cesm/machines/template.case.test +++ b/cime_config/cesm/machines/template.case.test @@ -66,8 +66,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, testname = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_test(case, testname) + with Case(caseroot) as case: + success = case_test(case, testname) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.lt_archive b/cime_config/cesm/machines/template.lt_archive old mode 100644 new mode 100755 index fa121cc6302e..990f59bd3540 --- a/cime_config/cesm/machines/template.lt_archive +++ b/cime_config/cesm/machines/template.lt_archive @@ -67,8 +67,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_lt_archive(case) + with Case(caseroot) as case: + success = case_lt_archive(case) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.st_archive b/cime_config/cesm/machines/template.st_archive old mode 100644 new mode 100755 index fd47d4ad697b..b52f7bd7ba10 --- a/cime_config/cesm/machines/template.st_archive +++ b/cime_config/cesm/machines/template.st_archive @@ -67,8 +67,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_st_archive(case) + with Case(caseroot) as case: + success = case_st_archive(case) sys.exit(0 if success else 1) diff --git a/driver_cpl/cime_config/buildexe b/driver_cpl/cime_config/buildexe index 668aad0b5def..dd32139ee955 100755 --- a/driver_cpl/cime_config/buildexe +++ b/driver_cpl/cime_config/buildexe @@ -26,16 +26,14 @@ def _main_func(): logger.info("Building a single executable version of target coupled model") - case = Case(caseroot) - - casetools = case.get_value("CASETOOLS") - cimeroot = case.get_value("CIMEROOT") - exeroot = case.get_value("EXEROOT") - gmake = case.get_value("GMAKE") - gmake_j = case.get_value("GMAKE_J") - model = case.get_value("MODEL") - - os.environ["PIO_VERSION"] = str(case.get_value("PIO_VERSION")) + with Case(caseroot) as case: + casetools = case.get_value("CASETOOLS") + cimeroot = case.get_value("CIMEROOT") + exeroot = case.get_value("EXEROOT") + gmake = case.get_value("GMAKE") + gmake_j = case.get_value("GMAKE_J") + model = case.get_value("MODEL") + os.environ["PIO_VERSION"] = str(case.get_value("PIO_VERSION")) with open('Filepath', 'w') as out: out.write(os.path.join(caseroot, "SourceMods", "src.drv") + "\n") diff --git a/driver_cpl/cime_config/buildnml b/driver_cpl/cime_config/buildnml index ef2fb6d4458e..f6bf496a4e43 100755 --- a/driver_cpl/cime_config/buildnml +++ b/driver_cpl/cime_config/buildnml @@ -23,42 +23,40 @@ def _main_func(): caseroot = parse_input(sys.argv) - case = Case(caseroot) - - cimeroot = case.get_value("CIMEROOT") - caseroot = case.get_value("CASEROOT") - casebuild = case.get_value("CASEBUILD") - rundir = case.get_value("RUNDIR") - grid = case.get_value("GRID") - atm_grid = case.get_value("ATM_GRID") - lnd_grid = case.get_value("LND_GRID") - ocn_grid = case.get_value("OCN_GRID") - rof_grid = case.get_value("ROF_GRID") - wav_grid = case.get_value("WAV_GRID") - comp_atm = case.get_value("COMP_ATM") - pio_version = case.get_value("PIO_VERSION") - - confdir = os.path.join(casebuild, "cplconf") - if not os.path.isdir(confdir): - os.makedirs(confdir) - - # create cplconf/namelist - - infile_text = "" - if comp_atm == 'cam': - # *** FIXME - this is confusing!!!*** - # cam is actually changing the driver namelist settings - cam_config_opts = case.get_value("CAM_CONFIG_OPTS") - if "adiabatic" in cam_config_opts: - infile_text = "atm_adiabatic = .true." - if "ideal" in cam_config_opts: - infile_text = "atm_ideal_phys = .true." - if "aquaplanet" in cam_config_opts: - infile_text = "aqua_planet = .true. \n aqua_planet_sst = 1" - - user_nl_file = os.path.join(caseroot, "user_nl_cpl") - namelist_infile = os.path.join(confdir, "namelist") - create_namelist_infile(case, user_nl_file, namelist_infile, infile_text) + with Case(caseroot) as case: + cimeroot = case.get_value("CIMEROOT") + caseroot = case.get_value("CASEROOT") + casebuild = case.get_value("CASEBUILD") + rundir = case.get_value("RUNDIR") + grid = case.get_value("GRID") + atm_grid = case.get_value("ATM_GRID") + lnd_grid = case.get_value("LND_GRID") + ocn_grid = case.get_value("OCN_GRID") + rof_grid = case.get_value("ROF_GRID") + wav_grid = case.get_value("WAV_GRID") + comp_atm = case.get_value("COMP_ATM") + pio_version = case.get_value("PIO_VERSION") + + confdir = os.path.join(casebuild, "cplconf") + if not os.path.isdir(confdir): + os.makedirs(confdir) + + # create cplconf/namelist + infile_text = "" + if comp_atm == 'cam': + # *** FIXME - this is confusing!!!*** + # cam is actually changing the driver namelist settings + cam_config_opts = case.get_value("CAM_CONFIG_OPTS") + if "adiabatic" in cam_config_opts: + infile_text = "atm_adiabatic = .true." + if "ideal" in cam_config_opts: + infile_text = "atm_ideal_phys = .true." + if "aquaplanet" in cam_config_opts: + infile_text = "aqua_planet = .true. \n aqua_planet_sst = 1" + + user_nl_file = os.path.join(caseroot, "user_nl_cpl") + namelist_infile = os.path.join(confdir, "namelist") + create_namelist_infile(case, user_nl_file, namelist_infile, infile_text) # call build-namelist diff --git a/scripts/Tools/case.build b/scripts/Tools/case.build index 1c70ea392cc7..6c1ee7815d1d 100755 --- a/scripts/Tools/case.build +++ b/scripts/Tools/case.build @@ -91,29 +91,30 @@ def _main_func(description): caseroot, sharedlib_only, model_only, cleanlist = parse_command_line(sys.argv, description) logging.info("calling build.case_build with caseroot=%s" %caseroot) - case = Case(caseroot) - testname = case.get_value('TESTCASE') - - if cleanlist: - build.clean(case, cleanlist) - elif(testname is not None): - logging.warn("Building test for %s in directory %s" % (testname, caseroot)) - try: - test = globals()[testname](case) - except KeyError: - expect(False, "Could not find a test called '%s'" % testname) - append_status("case.testbuild starting ", - caseroot=caseroot,sfile="CaseStatus") - test.build(sharedlib_only=sharedlib_only, model_only=model_only) - append_status("case.testbuild complete", - caseroot=caseroot,sfile="CaseStatus") - else: - append_status("case.build starting", - caseroot=caseroot,sfile="CaseStatus") - build.case_build(caseroot, case=case, sharedlib_only=sharedlib_only, - model_only=model_only) - append_status("case.build complete", - caseroot=caseroot,sfile="CaseStatus") + with Case(caseroot) as case: + testname = case.get_value('TESTCASE') + + if cleanlist: + build.clean(case, cleanlist) + elif(testname is not None): + logging.warn("Building test for %s in directory %s" % + (testname, caseroot)) + try: + test = globals()[testname](case) + except KeyError: + expect(False, "Could not find a test called '%s'" % testname) + append_status("case.testbuild starting ", + caseroot=caseroot,sfile="CaseStatus") + test.build(sharedlib_only=sharedlib_only, model_only=model_only) + append_status("case.testbuild complete", + caseroot=caseroot,sfile="CaseStatus") + else: + append_status("case.build starting", + caseroot=caseroot,sfile="CaseStatus") + build.case_build(caseroot, case=case, sharedlib_only=sharedlib_only, + model_only=model_only) + append_status("case.build complete", + caseroot=caseroot,sfile="CaseStatus") if __name__ == "__main__": _main_func(__doc__) diff --git a/scripts/Tools/case.setup b/scripts/Tools/case.setup index 97c0ba5e6da4..caa71d38c463 100755 --- a/scripts/Tools/case.setup +++ b/scripts/Tools/case.setup @@ -58,9 +58,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, clean, test_mode, reset = parse_command_line(sys.argv, description) - case = Case(caseroot) - - case_setup(case, clean, test_mode, reset) + with Case(caseroot) as case: + case_setup(case, clean, test_mode, reset) if __name__ == "__main__": _main_func(__doc__) diff --git a/scripts/Tools/case.submit b/scripts/Tools/case.submit index 1dcad532e382..4377c2112fd8 100755 --- a/scripts/Tools/case.submit +++ b/scripts/Tools/case.submit @@ -56,9 +56,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, job, no_batch, prereq = parse_command_line(sys.argv, description) - case = Case(caseroot) - - submit(case, job=job, no_batch=no_batch, prereq_jobid=prereq) + with Case(caseroot) as case: + submit(case, job=job, no_batch=no_batch, prereq_jobid=prereq) if __name__ == "__main__": _main_func(__doc__) diff --git a/scripts/Tools/check_case b/scripts/Tools/check_case index 6cadb693150b..4473ac3a3e6f 100755 --- a/scripts/Tools/check_case +++ b/scripts/Tools/check_case @@ -54,10 +54,10 @@ def _main_func(description): check_lockedfiles() - case = Case() - preview_namelists(case) + with Case() as case: + preview_namelists(case) + build_complete = case.get_value("BUILD_COMPLETE") - build_complete = case.get_value("BUILD_COMPLETE") if not build_complete: expect(False, "Please rebuild the model interactively by calling case.build") diff --git a/scripts/Tools/check_input_data b/scripts/Tools/check_input_data index 4e7e40fc2efa..76fe0f363df1 100755 --- a/scripts/Tools/check_input_data +++ b/scripts/Tools/check_input_data @@ -10,6 +10,7 @@ from standard_script_setup import * from CIME.utils import expect, get_model, run_cmd from CIME.XML.machines import Machines from CIME.check_input_data import check_input_data, SVN_LOCS +from CIME.case import Case import argparse, doctest, fnmatch @@ -64,8 +65,12 @@ def _main_func(description): svn_loc, input_data_root, data_list_dir, download = parse_command_line(sys.argv, description) - sys.exit(0 if check_input_data(svn_loc=svn_loc, input_data_root=input_data_root, - data_list_dir=data_list_dir, download=download) else 1) + with Case() as case: + sys.exit(0 if check_input_data(case, + svn_loc=svn_loc, + input_data_root=input_data_root, + data_list_dir=data_list_dir, + download=download) else 1) ############################################################################### diff --git a/scripts/Tools/getTiming b/scripts/Tools/getTiming index 0624b04581ba..1b1c6bccf453 100755 --- a/scripts/Tools/getTiming +++ b/scripts/Tools/getTiming @@ -120,55 +120,55 @@ class TimingParser: def getTiming(self): - case = Case(self.caseroot) - components=case.get_value("COMP_CLASSES").split(',') - components[components.index("DRV")]="CPL" - for s in components: - self.models[s] = getTimingInfo(s) - atm = self.models['ATM'] - lnd = self.models['LND'] - rof = self.models['ROF'] - wav = self.models['WAV'] - ice = self.models['ICE'] - ocn = self.models['OCN'] - glc = self.models['GLC'] - cpl = self.models['CPL'] - cime_model = case.get_value("MODEL") - caseid = case.get_value("CASE") - mach = case.get_value("MACH") - user = case.get_value("USER") - continue_run = case.get_value("CONTINUE_RUN") - rundir = case.get_value("RUNDIR") - run_type = case.get_value("RUN_TYPE") - ncpl_base_period = case.get_value("NCPL_BASE_PERIOD") - atm_ncpl = case.get_value("ATM_NCPL") - ocn_ncpl = case.get_value("OCN_NCPL") - ccsm_compset = case.get_value("CCSM_COMPSET") - if ccsm_compset is None: - ccsm_compset = "" - grid = case.get_value("GRID") - run_type = case.get_value("RUN_TYPE") - stop_option = case.get_value("STOP_OPTION") - stop_n = case.get_value("STOP_N") - cost_pes = case.get_value("COST_PES") - totalpes = case.get_value("TOTALPES") - pes_per_node = case.get_value("PES_PER_NODE") - - if cost_pes > 0: - pecost = cost_pes - else: - pecost = totalpes - - for m in self.models.values(): - for key in ["NTASKS", "ROOTPE", "PSTRID", "NTHRDS", "NINST"]: - if key == "NINST" and m.name == "CPL": - m.ninst = 1 - else: - setattr(m, key.lower(), - int(case.get_value("%s_%s" % (key, m.name)))) - - m.comp = case.get_value("COMP_%s" % (m.name)) - m.pemax = m.rootpe + m.ntasks * m.pstrid - 1 + with Case(self.caseroot) as case: + components=case.get_value("COMP_CLASSES").split(',') + components[components.index("DRV")]="CPL" + for s in components: + self.models[s] = getTimingInfo(s) + atm = self.models['ATM'] + lnd = self.models['LND'] + rof = self.models['ROF'] + wav = self.models['WAV'] + ice = self.models['ICE'] + ocn = self.models['OCN'] + glc = self.models['GLC'] + cpl = self.models['CPL'] + cime_model = case.get_value("MODEL") + caseid = case.get_value("CASE") + mach = case.get_value("MACH") + user = case.get_value("USER") + continue_run = case.get_value("CONTINUE_RUN") + rundir = case.get_value("RUNDIR") + run_type = case.get_value("RUN_TYPE") + ncpl_base_period = case.get_value("NCPL_BASE_PERIOD") + atm_ncpl = case.get_value("ATM_NCPL") + ocn_ncpl = case.get_value("OCN_NCPL") + ccsm_compset = case.get_value("CCSM_COMPSET") + if ccsm_compset is None: + ccsm_compset = "" + grid = case.get_value("GRID") + run_type = case.get_value("RUN_TYPE") + stop_option = case.get_value("STOP_OPTION") + stop_n = case.get_value("STOP_N") + cost_pes = case.get_value("COST_PES") + totalpes = case.get_value("TOTALPES") + pes_per_node = case.get_value("PES_PER_NODE") + + if cost_pes > 0: + pecost = cost_pes + else: + pecost = totalpes + + for m in self.models.values(): + for key in ["NTASKS", "ROOTPE", "PSTRID", "NTHRDS", "NINST"]: + if key == "NINST" and m.name == "CPL": + m.ninst = 1 + else: + setattr(m, key.lower(), + int(case.get_value("%s_%s" % (key, m.name)))) + + m.comp = case.get_value("COMP_%s" % (m.name)) + m.pemax = m.rootpe + m.ntasks * m.pstrid - 1 now = datetime.datetime.ctime(datetime.datetime.now()) inittype = "FALSE" diff --git a/scripts/Tools/preview_namelists b/scripts/Tools/preview_namelists index 732a91f807ee..32a4fac5b84d 100755 --- a/scripts/Tools/preview_namelists +++ b/scripts/Tools/preview_namelists @@ -55,8 +55,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, dryrun = parse_command_line(sys.argv, description) - case = Case(caseroot) - preview_namelists(case, dryrun=False) + with Case(caseroot) as case: + preview_namelists(case, dryrun=False) if (__name__ == "__main__"): _main_func(__doc__) diff --git a/scripts/Tools/xmlchange b/scripts/Tools/xmlchange index 6e4d7e10c060..26d31961f758 100755 --- a/scripts/Tools/xmlchange +++ b/scripts/Tools/xmlchange @@ -84,28 +84,28 @@ formatter_class=argparse.ArgumentDefaultsHelpFormatter def xmlchange(caseroot, listofsettings=None, xmlfile=None, xmlid=None, xmlval=None, subgroup=None, append=None, noecho=False, warn=None, force=False): - case = Case(caseroot) - if(listofsettings ): - for setting in listofsettings: - (xmlid, xmlval) = setting.split('=', 1) - type_str = case.get_type_info(xmlid) - if(append is True): + with Case(caseroot) as case: + if listofsettings: + for setting in listofsettings: + (xmlid, xmlval) = setting.split('=', 1) + type_str = case.get_type_info(xmlid) + if(append is True): + value = case.get_value(xmlid, resolved=False, + subgroup=subgroup) + xmlval = "%s %s" %(xmlval, value) + if not force: + xmlval = convert_to_type(xmlval, type_str, xmlid) + case.set_value(xmlid, xmlval, subgroup, ignore_type=force) + else: + if append is True: value = case.get_value(xmlid, resolved=False, subgroup=subgroup) xmlval = "%s %s" %(xmlval, value) + type_str = case.get_type_info(xmlid) if not force: xmlval = convert_to_type(xmlval, type_str, xmlid) case.set_value(xmlid, xmlval, subgroup, ignore_type=force) - else: - if(append is True): - value = case.get_value(xmlid, resolved=False, subgroup=subgroup) - xmlval = "%s %s" %(xmlval, value) - type_str = case.get_type_info(xmlid) - if not force: - xmlval = convert_to_type(xmlval, type_str, xmlid) - case.set_value(xmlid, xmlval, subgroup, ignore_type=force) - case.flush() - - if (noecho is False): + + if not noecho: argstr = "" for arg in sys.argv: argstr += "%s "%arg diff --git a/scripts/Tools/xmlquery b/scripts/Tools/xmlquery index 32106f398452..aedf710ab8c1 100755 --- a/scripts/Tools/xmlquery +++ b/scripts/Tools/xmlquery @@ -105,24 +105,26 @@ def xmlquery(caseroot, args, listofattributes=[] , subgroup=None, noecho=False, True """ # Initialize case ; read in all xml files from caseroot - case = Case(caseroot) - values = [] - results = [] # List of formatted strings containing the search results - - if(listofattributes and len(listofattributes) >= 1): - - for xmlattr in listofattributes: - # type_str = case.get_type_info(xmlattr) - logger.debug("Searching for %s", xmlattr) - attribute_hits = case.get_values(xmlattr, resolved=args.resolve, subgroup=subgroup) - - results += attribute_hits - - elif (args.listall): - logger.warning("Retrieving all values.") - results = case.get_values(None, resolved=args.resolve, subgroup=subgroup) - else: - logger.warning("No attributes (%s) or listall option" , listofattributes) + with Case(caseroot) as case: + values = [] + results = [] # List of formatted strings containing the search results + + if(listofattributes and len(listofattributes) >= 1): + + for xmlattr in listofattributes: + # type_str = case.get_type_info(xmlattr) + logger.debug("Searching for %s", xmlattr) + attribute_hits = case.get_values(xmlattr, resolved=args.resolve, + subgroup=subgroup) + results += attribute_hits + + elif (args.listall): + logger.warning("Retrieving all values.") + results = case.get_values(None, resolved=args.resolve, + subgroup=subgroup) + else: + logger.warning("No attributes (%s) or listall option", + listofattributes) # Formatting of return strings if ( len(results) > 0) : diff --git a/scripts/create_clone b/scripts/create_clone index 781e5291e753..c27c0e248d1e 100755 --- a/scripts/create_clone +++ b/scripts/create_clone @@ -66,8 +66,8 @@ def _main_func(): expect(os.path.isdir(cloneroot), "Missing cloneroot directory %s " % cloneroot) - clone = Case(cloneroot) - clone.create_clone(case, keepexe, mach_dir, project) + with Case(cloneroot) as clone: + clone.create_clone(case, keepexe, mach_dir, project) ############################################################################### diff --git a/scripts/create_newcase b/scripts/create_newcase index 034d1656b0ce..5fe123728428 100755 --- a/scripts/create_newcase +++ b/scripts/create_newcase @@ -135,41 +135,39 @@ def _main_func(): ############################################################################### cimeroot = os.path.abspath(CIME.utils.get_cime_root()) - case, compset, grid, machine, compiler, \ + caseroot, compset, grid, machine, compiler, \ mpilib, project, pecount, \ machine_dir, user_mods_dir, user_compset, pesfile, \ user_grid, gridfile, srcroot, test, ninst, walltime \ = parse_command_line(sys.argv, cimeroot) - caseroot = os.path.abspath(case) - case = os.path.basename(case) + caseroot = os.path.abspath(caseroot) # create_test creates the caseroot before calling create_newcase # otherwise throw an error if this directory exists expect(not (os.path.exists(caseroot) and not test), "Case directory %s already exists"%caseroot) - # Set the case object - caseobj = Case(caseroot) + with Case(caseroot) as case: + # Set values for env_case.xml + case.set_value("CASE", os.path.basename(caseroot)) + case.set_value("CASEROOT", caseroot) + case.set_value("SRCROOT", srcroot) - # Set values for env_case.xml - caseobj.set_value("CASE", os.path.basename(case)) - caseobj.set_value("CASEROOT", caseroot) - caseobj.set_value("SRCROOT", srcroot) + # Configure the Case + case.configure(compset, grid, machine_name=machine, project=project, + pecount=pecount, compiler=compiler, mpilib=mpilib, + user_compset=user_compset, pesfile=pesfile, + user_grid=user_grid, gridfile=gridfile, ninst=ninst, test=test, + walltime=walltime) - # Configure the Case - caseobj.configure(compset, grid, machine_name=machine, project=project, - pecount=pecount, compiler=compiler, mpilib=mpilib, - user_compset=user_compset, pesfile=pesfile, - user_grid=user_grid, gridfile=gridfile, ninst=ninst, test=test, - walltime=walltime) + case.create_caseroot() - caseobj.create_caseroot() + # Write out the case files + case.flush(flushall=True) - # Write out the case files - caseobj.flush(flushall=True) + case.apply_user_mods(user_mods_dir) - caseobj.apply_user_mods(user_mods_dir) # Copy env_case.xml into LockedFiles copyfile(os.path.join(caseroot,"env_case.xml"), os.path.join(caseroot,"LockedFiles","env_case.xml")) diff --git a/scripts/create_test b/scripts/create_test index 7f7967e811d7..82361d37a32f 100755 --- a/scripts/create_test +++ b/scripts/create_test @@ -256,12 +256,12 @@ def single_submit_impl(machine_name, test_id, proc_pool, project, args, job_cost testcase_dirs = glob.glob("%s/*%s*/TestStatus" % (test_root, test_id)) expect(testcase_dirs, "No test case dirs found!?") first_case = os.path.abspath(os.path.dirname(testcase_dirs[0])) - case = Case(first_case) - env_batch = env_batch = case._get_env("batch") + with Case(first_case) as case: + env_batch = case._get_env("batch") - directives = env_batch.get_batch_directives(case, "case.run", raw=True) - submit_cmd = env_batch.get_value("batch_submit", subgroup=None) - submit_args = env_batch.get_submit_args(case, "case.run") + directives = env_batch.get_batch_directives(case, "case.run", raw=True) + submit_cmd = env_batch.get_value("batch_submit", subgroup=None) + submit_args = env_batch.get_submit_args(case, "case.run") tasks_per_node = int(mach.get_value("PES_PER_NODE")) num_nodes = int(math.ceil(float(proc_pool) / tasks_per_node)) diff --git a/utils/python/CIME/SystemTests/erp.py b/utils/python/CIME/SystemTests/erp.py index 39d928fdd0e6..11e73c15e608 100644 --- a/utils/python/CIME/SystemTests/erp.py +++ b/utils/python/CIME/SystemTests/erp.py @@ -75,18 +75,12 @@ def build(self, sharedlib_only=False, model_only=False): self._case.set_value("NTASKS_%s"%comp, ntasks/2) self._case.set_value("ROOTPE_%s"%comp, rootpe/2) -# self._case.flush() - # Note, some components, like CESM-CICE, have # decomposition information in env_build.xml # case_setup(self._case, test_mode=True, reset=True)that # needs to be regenerated for the above new tasks and thread counts case_setup(self._case, test_mode=True, reset=True) - # update the case to the new values -# self._case = None -# self._case = Case(self._caseroot) - # Now rebuild the system, given updated information in env_build.xml SystemTestsCommon.build(self, sharedlib_only=sharedlib_only, model_only=model_only) diff --git a/utils/python/CIME/build.py b/utils/python/CIME/build.py index 9705245b4d6c..bea478c5a8bb 100644 --- a/utils/python/CIME/build.py +++ b/utils/python/CIME/build.py @@ -139,7 +139,7 @@ def post_build(case, logs): shutil.copy("env_build.xml", "LockedFiles") ############################################################################### -def case_build(caseroot, case=None, sharedlib_only=False, model_only=False): +def case_build(caseroot, case, sharedlib_only=False, model_only=False): ############################################################################### t1 = time.time() @@ -156,7 +156,6 @@ def case_build(caseroot, case=None, sharedlib_only=False, model_only=False): expect(os.path.exists("case.run"), "ERROR: must invoke case.setup script before calling build script ") - case = Case() if case is None else case cimeroot = case.get_value("CIMEROOT") comp_classes = case.get_value("COMP_CLASSES").split(',') diff --git a/utils/python/CIME/buildlib.py b/utils/python/CIME/buildlib.py index 13571cce64a3..0e94d05fc9a4 100644 --- a/utils/python/CIME/buildlib.py +++ b/utils/python/CIME/buildlib.py @@ -43,18 +43,18 @@ def build_data_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - case = Case(caseroot) + with Case(caseroot) as case: - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list (Filepath) - compname = "d" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s" %compname) + "\n") - out.write(os.path.join(cimeroot, "components", "data_comps", compname) + "\n") + # Write directory list (Filepath) + compname = "d" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s" %compname) + "\n") + out.write(os.path.join(cimeroot, "components", "data_comps", compname) + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def build_xcpl_lib(argv, compclass): @@ -62,19 +62,19 @@ def build_xcpl_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - case = Case(caseroot) + with Case(caseroot) as case: - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list - compname = "x" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") - out.write(os.path.join(cimeroot, "components", "xcpl_comps", "xshare") + "\n") - out.write(os.path.join(cimeroot, "components", "xcpl_comps",compname, "cpl") + "\n") + # Write directory list + compname = "x" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") + out.write(os.path.join(cimeroot, "components", "xcpl_comps", "xshare") + "\n") + out.write(os.path.join(cimeroot, "components", "xcpl_comps",compname, "cpl") + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def build_stub_lib(argv, compclass): @@ -82,19 +82,19 @@ def build_stub_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - case = Case(caseroot) + with Case(caseroot) as case: - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list - compname = "s" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") - out.write(os.path.join(cimeroot, "components", "stub_comps", "xshare") + "\n") - out.write(os.path.join(cimeroot, "components", "stub_comps",compname, "cpl") + "\n") + # Write directory list + compname = "s" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") + out.write(os.path.join(cimeroot, "components", "stub_comps", "xshare") + "\n") + out.write(os.path.join(cimeroot, "components", "stub_comps",compname, "cpl") + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def run_gmake(case, compclass, libroot, libname="", user_cppdefs=""): diff --git a/utils/python/CIME/buildnml.py b/utils/python/CIME/buildnml.py index 4fa26f222f56..c348b5b760fc 100644 --- a/utils/python/CIME/buildnml.py +++ b/utils/python/CIME/buildnml.py @@ -42,12 +42,13 @@ def build_xcpl_nml(argv, compclass): caseroot = parse_input(argv) - case = Case(caseroot) - - rundir = case.get_value("RUNDIR") - ninst = case.get_value("NINST_%s" % compclass.upper()) - nx = case.get_value("%s_NX" % compclass.upper()) - ny = case.get_value("%s_NY" % compclass.upper()) + with Case(caseroot) as case: + rundir = case.get_value("RUNDIR") + ninst = case.get_value("NINST_%s" % compclass.upper()) + nx = case.get_value("%s_NX" % compclass.upper()) + ny = case.get_value("%s_NY" % compclass.upper()) + if compname == "xrof": + flood_mode = case.get_value('XROF_FLOOD_MODE') extras = [] dtype = 1 @@ -69,7 +70,6 @@ def build_xcpl_nml(argv, compclass): dtype = 4 elif compname == "xrof": dtype = 11 - flood_mode = Case('XROF_FLOOD_MODE') if flood_mode == "ACTIVE": extras = [[".true.", "flood flag"]] else: @@ -98,10 +98,15 @@ def build_xcpl_nml(argv, compclass): ############################################################################### def build_data_nml(argv, compclass): ############################################################################### - + # This function is just a wrapper for the one below, to avoid having to + # indent everything for the "with" block. caseroot = parse_input(argv) + with Case(caseroot) as case: + _build_data_nml(case, compclass) - case = Case(caseroot) +############################################################################### +def _build_data_nml(case, compclass): +############################################################################### cimeroot = case.get_value("CIMEROOT") rundir = case.get_value("RUNDIR") diff --git a/utils/python/CIME/case.py b/utils/python/CIME/case.py index 51742e263505..296e5360626b 100644 --- a/utils/python/CIME/case.py +++ b/utils/python/CIME/case.py @@ -67,12 +67,11 @@ def __init__(self, case_root=None): if case_root is None: case_root = os.getcwd() - # Init first, if no valid case_root expect fails and tears down object, __del__ expects self._env_files_that_need_rewrite - self._env_files_that_need_rewrite = set() - logger.debug("Initializing Case.") self.read_xml(case_root) + self._env_files_that_need_rewrite = set() + # Hold arbitary values. In create_newcase we may set values # for xml files that haven't been created yet. We need a place # to store them until we are ready to create the file. At file @@ -91,8 +90,18 @@ def __init__(self, case_root=None): self._component_config_files = [] self._component_classes = [] + # Define __enter__ and __exit__ so that we can use this as a context manager + # and force a flush on exit. + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.flush() + return False + def read_xml(self, case_root): - expect(len(self._env_files_that_need_rewrite)==0,"Case object has modifications that would be overwritten by read_xml") + expect(len(self._env_files_that_need_rewrite)==0, + "Case object has modifications that would be overwritten by read_xml") self._env_entryid_files = [] self._env_entryid_files.append(EnvRun(case_root)) self._env_entryid_files.append(EnvBuild(case_root)) @@ -106,9 +115,6 @@ def read_xml(self, case_root): self._env_generic_files.append(EnvArchive(case_root)) self._files = self._env_entryid_files + self._env_generic_files - def __del__(self): - self.flush() - def _get_env(self, short_name): full_name = "env_%s.xml" % (short_name) for env_file in self._files: diff --git a/utils/python/CIME/check_input_data.py b/utils/python/CIME/check_input_data.py index 46c9b151c999..38dd96a75fde 100644 --- a/utils/python/CIME/check_input_data.py +++ b/utils/python/CIME/check_input_data.py @@ -55,12 +55,11 @@ def download_if_in_repo(svn_loc, input_data_root, rel_path): logging.info("SUCCESS\n") return True -def check_input_data(case=None, svn_loc=None, input_data_root=None, data_list_dir="Buildconf", download=False): +def check_input_data(case, svn_loc=None, input_data_root=None, data_list_dir="Buildconf", download=False): """ Return True if no files missing """ # Fill in defaults as needed - case = Case() if case is None else case svn_loc = SVN_LOCS[get_model()] if svn_loc is None else svn_loc input_data_root = case.get_value("DIN_LOC_ROOT") if input_data_root is None else input_data_root diff --git a/utils/python/CIME/system_test.py b/utils/python/CIME/system_test.py index fa9fa83e323d..f083e97d487e 100644 --- a/utils/python/CIME/system_test.py +++ b/utils/python/CIME/system_test.py @@ -529,12 +529,12 @@ def _xml_phase(self, test): shutil.copy(os.path.join(test_dir,"env_run.xml"), os.path.join(lockedfiles, "env_run.orig.xml")) - case = Case(test_dir) - case.set_value("SHAREDLIBROOT", - os.path.join(self._test_root, - "sharedlibroot.%s"%self._test_id)) + with Case(test_dir) as case: + case.set_value("SHAREDLIBROOT", + os.path.join(self._test_root, + "sharedlibroot.%s"%self._test_id)) + envtest.set_initial_values(case) - envtest.set_initial_values(case) return True ########################################################################### diff --git a/utils/python/tests/scripts_regression_tests.py b/utils/python/tests/scripts_regression_tests.py index 09deb3e20d29..c3bf0fe5c6fb 100755 --- a/utils/python/tests/scripts_regression_tests.py +++ b/utils/python/tests/scripts_regression_tests.py @@ -870,29 +870,33 @@ def test_cime_case(self): casedir = os.path.join(self._testroot, "%s.%s" % (CIME.utils.get_full_test_name("TESTRUNPASS_Mmpi-serial.f19_g16_rx1.A", machine=self._machine, compiler=self._compiler), self._baseline_name)) self.assertTrue(os.path.isdir(casedir), msg="Missing casedir '%s'" % casedir) - case = Case(casedir) - build_complete = case.get_value("BUILD_COMPLETE") - self.assertFalse(build_complete, - msg="Build complete had wrong value '%s'" % build_complete) + with Case(casedir) as case: + build_complete = case.get_value("BUILD_COMPLETE") + self.assertFalse(build_complete, + msg="Build complete had wrong value '%s'" % + build_complete) - case.set_value("BUILD_COMPLETE", True) - build_complete = case.get_value("BUILD_COMPLETE") - self.assertTrue(build_complete, - msg="Build complete had wrong value '%s'" % build_complete) + case.set_value("BUILD_COMPLETE", True) + build_complete = case.get_value("BUILD_COMPLETE") + self.assertTrue(build_complete, + msg="Build complete had wrong value '%s'" % + build_complete) - case.flush() + case.flush() - build_complete = run_cmd("./xmlquery BUILD_COMPLETE -value", from_dir=casedir) - self.assertTrue(build_complete, - msg="Build complete had wrong value '%s'" % build_complete) + build_complete = run_cmd("./xmlquery BUILD_COMPLETE -value", + from_dir=casedir) + self.assertTrue(build_complete, + msg="Build complete had wrong value '%s'" % + build_complete) - # Test some test properties - self.assertEqual(case.get_value("TESTCASE"), "TESTRUNPASS") - self.assertEqual(case.get_value("MPILIB"), "mpi-serial") + # Test some test properties + self.assertEqual(case.get_value("TESTCASE"), "TESTRUNPASS") + self.assertEqual(case.get_value("MPILIB"), "mpi-serial") - # Serial cases should not be using pnetcdf - self.assertEqual(case.get_value("PIO_TYPENAME"), "netcdf") + # Serial cases should not be using pnetcdf + self.assertEqual(case.get_value("PIO_TYPENAME"), "netcdf") ############################################################################### class TestSingleSubmit(TestCreateTestCommon): From d7ae79b7c87fff28b77dde1f31064b19576e6aca Mon Sep 17 00:00:00 2001 From: Sean Patrick Santos Date: Wed, 13 Jul 2016 16:38:54 -0600 Subject: [PATCH 02/15] Add read-only mode to `Case` objects. This commit prohibits modification of the env files outside of `with` blocks that use `Case` as a context manager. Passes `scripts_regression_tests`. --- cime_config/acme/machines/template.lt_archive | 4 +- cime_config/cesm/machines/template.lt_archive | 4 +- driver_cpl/cime_config/buildexe | 18 ++-- driver_cpl/cime_config/buildnml | 70 ++++++------- scripts/Tools/check_input_data | 12 +-- scripts/Tools/getTiming | 98 +++++++++---------- scripts/Tools/xmlquery | 38 ++++--- utils/python/CIME/buildlib.py | 58 +++++------ utils/python/CIME/buildnml.py | 23 ++--- utils/python/CIME/case.py | 26 +++-- 10 files changed, 177 insertions(+), 174 deletions(-) mode change 100755 => 100644 cime_config/acme/machines/template.lt_archive mode change 100755 => 100644 cime_config/cesm/machines/template.lt_archive diff --git a/cime_config/acme/machines/template.lt_archive b/cime_config/acme/machines/template.lt_archive old mode 100755 new mode 100644 index 990f59bd3540..fa121cc6302e --- a/cime_config/acme/machines/template.lt_archive +++ b/cime_config/acme/machines/template.lt_archive @@ -67,8 +67,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - with Case(caseroot) as case: - success = case_lt_archive(case) + case = Case(caseroot) + success = case_lt_archive(case) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.lt_archive b/cime_config/cesm/machines/template.lt_archive old mode 100755 new mode 100644 index 990f59bd3540..fa121cc6302e --- a/cime_config/cesm/machines/template.lt_archive +++ b/cime_config/cesm/machines/template.lt_archive @@ -67,8 +67,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - with Case(caseroot) as case: - success = case_lt_archive(case) + case = Case(caseroot) + success = case_lt_archive(case) sys.exit(0 if success else 1) diff --git a/driver_cpl/cime_config/buildexe b/driver_cpl/cime_config/buildexe index dd32139ee955..668aad0b5def 100755 --- a/driver_cpl/cime_config/buildexe +++ b/driver_cpl/cime_config/buildexe @@ -26,14 +26,16 @@ def _main_func(): logger.info("Building a single executable version of target coupled model") - with Case(caseroot) as case: - casetools = case.get_value("CASETOOLS") - cimeroot = case.get_value("CIMEROOT") - exeroot = case.get_value("EXEROOT") - gmake = case.get_value("GMAKE") - gmake_j = case.get_value("GMAKE_J") - model = case.get_value("MODEL") - os.environ["PIO_VERSION"] = str(case.get_value("PIO_VERSION")) + case = Case(caseroot) + + casetools = case.get_value("CASETOOLS") + cimeroot = case.get_value("CIMEROOT") + exeroot = case.get_value("EXEROOT") + gmake = case.get_value("GMAKE") + gmake_j = case.get_value("GMAKE_J") + model = case.get_value("MODEL") + + os.environ["PIO_VERSION"] = str(case.get_value("PIO_VERSION")) with open('Filepath', 'w') as out: out.write(os.path.join(caseroot, "SourceMods", "src.drv") + "\n") diff --git a/driver_cpl/cime_config/buildnml b/driver_cpl/cime_config/buildnml index f6bf496a4e43..ef2fb6d4458e 100755 --- a/driver_cpl/cime_config/buildnml +++ b/driver_cpl/cime_config/buildnml @@ -23,40 +23,42 @@ def _main_func(): caseroot = parse_input(sys.argv) - with Case(caseroot) as case: - cimeroot = case.get_value("CIMEROOT") - caseroot = case.get_value("CASEROOT") - casebuild = case.get_value("CASEBUILD") - rundir = case.get_value("RUNDIR") - grid = case.get_value("GRID") - atm_grid = case.get_value("ATM_GRID") - lnd_grid = case.get_value("LND_GRID") - ocn_grid = case.get_value("OCN_GRID") - rof_grid = case.get_value("ROF_GRID") - wav_grid = case.get_value("WAV_GRID") - comp_atm = case.get_value("COMP_ATM") - pio_version = case.get_value("PIO_VERSION") - - confdir = os.path.join(casebuild, "cplconf") - if not os.path.isdir(confdir): - os.makedirs(confdir) - - # create cplconf/namelist - infile_text = "" - if comp_atm == 'cam': - # *** FIXME - this is confusing!!!*** - # cam is actually changing the driver namelist settings - cam_config_opts = case.get_value("CAM_CONFIG_OPTS") - if "adiabatic" in cam_config_opts: - infile_text = "atm_adiabatic = .true." - if "ideal" in cam_config_opts: - infile_text = "atm_ideal_phys = .true." - if "aquaplanet" in cam_config_opts: - infile_text = "aqua_planet = .true. \n aqua_planet_sst = 1" - - user_nl_file = os.path.join(caseroot, "user_nl_cpl") - namelist_infile = os.path.join(confdir, "namelist") - create_namelist_infile(case, user_nl_file, namelist_infile, infile_text) + case = Case(caseroot) + + cimeroot = case.get_value("CIMEROOT") + caseroot = case.get_value("CASEROOT") + casebuild = case.get_value("CASEBUILD") + rundir = case.get_value("RUNDIR") + grid = case.get_value("GRID") + atm_grid = case.get_value("ATM_GRID") + lnd_grid = case.get_value("LND_GRID") + ocn_grid = case.get_value("OCN_GRID") + rof_grid = case.get_value("ROF_GRID") + wav_grid = case.get_value("WAV_GRID") + comp_atm = case.get_value("COMP_ATM") + pio_version = case.get_value("PIO_VERSION") + + confdir = os.path.join(casebuild, "cplconf") + if not os.path.isdir(confdir): + os.makedirs(confdir) + + # create cplconf/namelist + + infile_text = "" + if comp_atm == 'cam': + # *** FIXME - this is confusing!!!*** + # cam is actually changing the driver namelist settings + cam_config_opts = case.get_value("CAM_CONFIG_OPTS") + if "adiabatic" in cam_config_opts: + infile_text = "atm_adiabatic = .true." + if "ideal" in cam_config_opts: + infile_text = "atm_ideal_phys = .true." + if "aquaplanet" in cam_config_opts: + infile_text = "aqua_planet = .true. \n aqua_planet_sst = 1" + + user_nl_file = os.path.join(caseroot, "user_nl_cpl") + namelist_infile = os.path.join(confdir, "namelist") + create_namelist_infile(case, user_nl_file, namelist_infile, infile_text) # call build-namelist diff --git a/scripts/Tools/check_input_data b/scripts/Tools/check_input_data index 76fe0f363df1..6ac63c584f46 100755 --- a/scripts/Tools/check_input_data +++ b/scripts/Tools/check_input_data @@ -65,12 +65,12 @@ def _main_func(description): svn_loc, input_data_root, data_list_dir, download = parse_command_line(sys.argv, description) - with Case() as case: - sys.exit(0 if check_input_data(case, - svn_loc=svn_loc, - input_data_root=input_data_root, - data_list_dir=data_list_dir, - download=download) else 1) + case = Case() + sys.exit(0 if check_input_data(case, + svn_loc=svn_loc, + input_data_root=input_data_root, + data_list_dir=data_list_dir, + download=download) else 1) ############################################################################### diff --git a/scripts/Tools/getTiming b/scripts/Tools/getTiming index 1b1c6bccf453..0624b04581ba 100755 --- a/scripts/Tools/getTiming +++ b/scripts/Tools/getTiming @@ -120,55 +120,55 @@ class TimingParser: def getTiming(self): - with Case(self.caseroot) as case: - components=case.get_value("COMP_CLASSES").split(',') - components[components.index("DRV")]="CPL" - for s in components: - self.models[s] = getTimingInfo(s) - atm = self.models['ATM'] - lnd = self.models['LND'] - rof = self.models['ROF'] - wav = self.models['WAV'] - ice = self.models['ICE'] - ocn = self.models['OCN'] - glc = self.models['GLC'] - cpl = self.models['CPL'] - cime_model = case.get_value("MODEL") - caseid = case.get_value("CASE") - mach = case.get_value("MACH") - user = case.get_value("USER") - continue_run = case.get_value("CONTINUE_RUN") - rundir = case.get_value("RUNDIR") - run_type = case.get_value("RUN_TYPE") - ncpl_base_period = case.get_value("NCPL_BASE_PERIOD") - atm_ncpl = case.get_value("ATM_NCPL") - ocn_ncpl = case.get_value("OCN_NCPL") - ccsm_compset = case.get_value("CCSM_COMPSET") - if ccsm_compset is None: - ccsm_compset = "" - grid = case.get_value("GRID") - run_type = case.get_value("RUN_TYPE") - stop_option = case.get_value("STOP_OPTION") - stop_n = case.get_value("STOP_N") - cost_pes = case.get_value("COST_PES") - totalpes = case.get_value("TOTALPES") - pes_per_node = case.get_value("PES_PER_NODE") - - if cost_pes > 0: - pecost = cost_pes - else: - pecost = totalpes - - for m in self.models.values(): - for key in ["NTASKS", "ROOTPE", "PSTRID", "NTHRDS", "NINST"]: - if key == "NINST" and m.name == "CPL": - m.ninst = 1 - else: - setattr(m, key.lower(), - int(case.get_value("%s_%s" % (key, m.name)))) - - m.comp = case.get_value("COMP_%s" % (m.name)) - m.pemax = m.rootpe + m.ntasks * m.pstrid - 1 + case = Case(self.caseroot) + components=case.get_value("COMP_CLASSES").split(',') + components[components.index("DRV")]="CPL" + for s in components: + self.models[s] = getTimingInfo(s) + atm = self.models['ATM'] + lnd = self.models['LND'] + rof = self.models['ROF'] + wav = self.models['WAV'] + ice = self.models['ICE'] + ocn = self.models['OCN'] + glc = self.models['GLC'] + cpl = self.models['CPL'] + cime_model = case.get_value("MODEL") + caseid = case.get_value("CASE") + mach = case.get_value("MACH") + user = case.get_value("USER") + continue_run = case.get_value("CONTINUE_RUN") + rundir = case.get_value("RUNDIR") + run_type = case.get_value("RUN_TYPE") + ncpl_base_period = case.get_value("NCPL_BASE_PERIOD") + atm_ncpl = case.get_value("ATM_NCPL") + ocn_ncpl = case.get_value("OCN_NCPL") + ccsm_compset = case.get_value("CCSM_COMPSET") + if ccsm_compset is None: + ccsm_compset = "" + grid = case.get_value("GRID") + run_type = case.get_value("RUN_TYPE") + stop_option = case.get_value("STOP_OPTION") + stop_n = case.get_value("STOP_N") + cost_pes = case.get_value("COST_PES") + totalpes = case.get_value("TOTALPES") + pes_per_node = case.get_value("PES_PER_NODE") + + if cost_pes > 0: + pecost = cost_pes + else: + pecost = totalpes + + for m in self.models.values(): + for key in ["NTASKS", "ROOTPE", "PSTRID", "NTHRDS", "NINST"]: + if key == "NINST" and m.name == "CPL": + m.ninst = 1 + else: + setattr(m, key.lower(), + int(case.get_value("%s_%s" % (key, m.name)))) + + m.comp = case.get_value("COMP_%s" % (m.name)) + m.pemax = m.rootpe + m.ntasks * m.pstrid - 1 now = datetime.datetime.ctime(datetime.datetime.now()) inittype = "FALSE" diff --git a/scripts/Tools/xmlquery b/scripts/Tools/xmlquery index aedf710ab8c1..32106f398452 100755 --- a/scripts/Tools/xmlquery +++ b/scripts/Tools/xmlquery @@ -105,26 +105,24 @@ def xmlquery(caseroot, args, listofattributes=[] , subgroup=None, noecho=False, True """ # Initialize case ; read in all xml files from caseroot - with Case(caseroot) as case: - values = [] - results = [] # List of formatted strings containing the search results - - if(listofattributes and len(listofattributes) >= 1): - - for xmlattr in listofattributes: - # type_str = case.get_type_info(xmlattr) - logger.debug("Searching for %s", xmlattr) - attribute_hits = case.get_values(xmlattr, resolved=args.resolve, - subgroup=subgroup) - results += attribute_hits - - elif (args.listall): - logger.warning("Retrieving all values.") - results = case.get_values(None, resolved=args.resolve, - subgroup=subgroup) - else: - logger.warning("No attributes (%s) or listall option", - listofattributes) + case = Case(caseroot) + values = [] + results = [] # List of formatted strings containing the search results + + if(listofattributes and len(listofattributes) >= 1): + + for xmlattr in listofattributes: + # type_str = case.get_type_info(xmlattr) + logger.debug("Searching for %s", xmlattr) + attribute_hits = case.get_values(xmlattr, resolved=args.resolve, subgroup=subgroup) + + results += attribute_hits + + elif (args.listall): + logger.warning("Retrieving all values.") + results = case.get_values(None, resolved=args.resolve, subgroup=subgroup) + else: + logger.warning("No attributes (%s) or listall option" , listofattributes) # Formatting of return strings if ( len(results) > 0) : diff --git a/utils/python/CIME/buildlib.py b/utils/python/CIME/buildlib.py index 0e94d05fc9a4..13571cce64a3 100644 --- a/utils/python/CIME/buildlib.py +++ b/utils/python/CIME/buildlib.py @@ -43,18 +43,18 @@ def build_data_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - with Case(caseroot) as case: + case = Case(caseroot) - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list (Filepath) - compname = "d" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s" %compname) + "\n") - out.write(os.path.join(cimeroot, "components", "data_comps", compname) + "\n") + # Write directory list (Filepath) + compname = "d" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s" %compname) + "\n") + out.write(os.path.join(cimeroot, "components", "data_comps", compname) + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def build_xcpl_lib(argv, compclass): @@ -62,19 +62,19 @@ def build_xcpl_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - with Case(caseroot) as case: + case = Case(caseroot) - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list - compname = "x" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") - out.write(os.path.join(cimeroot, "components", "xcpl_comps", "xshare") + "\n") - out.write(os.path.join(cimeroot, "components", "xcpl_comps",compname, "cpl") + "\n") + # Write directory list + compname = "x" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") + out.write(os.path.join(cimeroot, "components", "xcpl_comps", "xshare") + "\n") + out.write(os.path.join(cimeroot, "components", "xcpl_comps",compname, "cpl") + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def build_stub_lib(argv, compclass): @@ -82,19 +82,19 @@ def build_stub_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - with Case(caseroot) as case: + case = Case(caseroot) - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list - compname = "s" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") - out.write(os.path.join(cimeroot, "components", "stub_comps", "xshare") + "\n") - out.write(os.path.join(cimeroot, "components", "stub_comps",compname, "cpl") + "\n") + # Write directory list + compname = "s" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") + out.write(os.path.join(cimeroot, "components", "stub_comps", "xshare") + "\n") + out.write(os.path.join(cimeroot, "components", "stub_comps",compname, "cpl") + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def run_gmake(case, compclass, libroot, libname="", user_cppdefs=""): diff --git a/utils/python/CIME/buildnml.py b/utils/python/CIME/buildnml.py index c348b5b760fc..4fa26f222f56 100644 --- a/utils/python/CIME/buildnml.py +++ b/utils/python/CIME/buildnml.py @@ -42,13 +42,12 @@ def build_xcpl_nml(argv, compclass): caseroot = parse_input(argv) - with Case(caseroot) as case: - rundir = case.get_value("RUNDIR") - ninst = case.get_value("NINST_%s" % compclass.upper()) - nx = case.get_value("%s_NX" % compclass.upper()) - ny = case.get_value("%s_NY" % compclass.upper()) - if compname == "xrof": - flood_mode = case.get_value('XROF_FLOOD_MODE') + case = Case(caseroot) + + rundir = case.get_value("RUNDIR") + ninst = case.get_value("NINST_%s" % compclass.upper()) + nx = case.get_value("%s_NX" % compclass.upper()) + ny = case.get_value("%s_NY" % compclass.upper()) extras = [] dtype = 1 @@ -70,6 +69,7 @@ def build_xcpl_nml(argv, compclass): dtype = 4 elif compname == "xrof": dtype = 11 + flood_mode = Case('XROF_FLOOD_MODE') if flood_mode == "ACTIVE": extras = [[".true.", "flood flag"]] else: @@ -98,15 +98,10 @@ def build_xcpl_nml(argv, compclass): ############################################################################### def build_data_nml(argv, compclass): ############################################################################### - # This function is just a wrapper for the one below, to avoid having to - # indent everything for the "with" block. + caseroot = parse_input(argv) - with Case(caseroot) as case: - _build_data_nml(case, compclass) -############################################################################### -def _build_data_nml(case, compclass): -############################################################################### + case = Case(caseroot) cimeroot = case.get_value("CIMEROOT") rundir = case.get_value("RUNDIR") diff --git a/utils/python/CIME/case.py b/utils/python/CIME/case.py index 296e5360626b..39d3a0577c71 100644 --- a/utils/python/CIME/case.py +++ b/utils/python/CIME/case.py @@ -68,9 +68,9 @@ def __init__(self, case_root=None): case_root = os.getcwd() logger.debug("Initializing Case.") - self.read_xml(case_root) - self._env_files_that_need_rewrite = set() + self._read_only_mode = True + self.read_xml(case_root) # Hold arbitary values. In create_newcase we may set values # for xml files that haven't been created yet. We need a place @@ -93,12 +93,20 @@ def __init__(self, case_root=None): # Define __enter__ and __exit__ so that we can use this as a context manager # and force a flush on exit. def __enter__(self): + self._read_only_mode = False return self def __exit__(self, exc_type, exc_value, traceback): self.flush() + self._read_only_mode = True return False + def schedule_rewrite(self, env_file): + assert not self._read_only_mode, \ + "case.py scripts error: attempted to modify an env file while in " \ + "read-only mode" + self._env_files_that_need_rewrite.add(env_file) + def read_xml(self, case_root): expect(len(self._env_files_that_need_rewrite)==0, "Case object has modifications that would be overwritten by read_xml") @@ -144,11 +152,9 @@ def copy(self, newcasename, newcaseroot, newcimeroot=None, newsrcroot=None): def flush(self, flushall=False): if flushall: for env_file in self._files: - env_file.write() - else: - for env_file in self._env_files_that_need_rewrite: - env_file.write() - + self.schedule_rewrite(env_file) + for env_file in self._env_files_that_need_rewrite: + env_file.write() self._env_files_that_need_rewrite = set() def get_value(self, item, attribute=None, resolved=True, subgroup=None): @@ -268,7 +274,7 @@ def set_value(self, item, value, subgroup=None, ignore_type=False): result = env_file.set_value(item, value, subgroup, ignore_type) if (result is not None): logger.debug("Will rewrite file %s",env_file.filename) - self._env_files_that_need_rewrite.add(env_file) + self.schedule_rewrite(env_file) return result if result is None: if item in self.lookups.keys() and self.lookups[item] is not None: @@ -516,7 +522,7 @@ def configure(self, compset_name, grid_name, machine_name=None, nodes = machobj.get_first_child_nodes(item) for node in nodes: env_mach_specific_obj.add_child(node) - self._env_files_that_need_rewrite.add(env_mach_specific_obj) + self.schedule_rewrite(env_mach_specific_obj) #-------------------------------------------- # pe payout @@ -575,7 +581,7 @@ def configure(self, compset_name, grid_name, machine_name=None, env_batch.set_batch_system(batch, batch_system_type=batch_system_type) env_batch.create_job_groups(bjobs) env_batch.set_job_defaults(bjobs, pesize=maxval, walltime=walltime) - self._env_files_that_need_rewrite.add(env_batch) + self.schedule_rewrite(env_batch) self.set_value("COMPSET",self._compsetname) From 215987aa09d952bcb68f862a25762298f11a15a1 Mon Sep 17 00:00:00 2001 From: Sean Patrick Santos Date: Wed, 13 Jul 2016 18:28:24 -0600 Subject: [PATCH 03/15] Add `read_only` flag to `Case` constructor. With this change, `Case` objects are read-only by default. If the flag `read_only=False` is passed in, the object can be modified within `with` blocks. Tested using `scripts_regression_tests`. --- cime_config/acme/machines/template.case.run | 2 +- cime_config/acme/machines/template.case.test | 2 +- cime_config/acme/machines/template.lt_archive | 4 +- cime_config/acme/machines/template.st_archive | 2 +- cime_config/cesm/machines/template.case.run | 2 +- cime_config/cesm/machines/template.case.test | 2 +- cime_config/cesm/machines/template.lt_archive | 4 +- cime_config/cesm/machines/template.st_archive | 2 +- driver_cpl/cime_config/buildexe | 18 ++-- driver_cpl/cime_config/buildnml | 70 +++++++------ scripts/Tools/case.build | 2 +- scripts/Tools/case.setup | 2 +- scripts/Tools/case.submit | 2 +- scripts/Tools/check_case | 2 +- scripts/Tools/check_input_data | 12 +-- scripts/Tools/getTiming | 98 +++++++++---------- scripts/Tools/preview_namelists | 2 +- scripts/Tools/xmlchange | 2 +- scripts/Tools/xmlquery | 38 +++---- scripts/create_clone | 2 +- scripts/create_newcase | 2 +- scripts/create_test | 2 +- utils/python/CIME/buildlib.py | 58 +++++------ utils/python/CIME/buildnml.py | 23 +++-- utils/python/CIME/case.py | 6 +- utils/python/CIME/system_test.py | 2 +- .../python/tests/scripts_regression_tests.py | 2 +- 27 files changed, 185 insertions(+), 180 deletions(-) mode change 100644 => 100755 cime_config/acme/machines/template.lt_archive mode change 100644 => 100755 cime_config/cesm/machines/template.lt_archive diff --git a/cime_config/acme/machines/template.case.run b/cime_config/acme/machines/template.case.run index 4cec0f8b8d36..4730160348bb 100755 --- a/cime_config/acme/machines/template.case.run +++ b/cime_config/acme/machines/template.case.run @@ -74,7 +74,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: success = case_run(case) sys.exit(0 if success else 1) diff --git a/cime_config/acme/machines/template.case.test b/cime_config/acme/machines/template.case.test index 7b6c4efbaea8..a5d7b2659d7d 100755 --- a/cime_config/acme/machines/template.case.test +++ b/cime_config/acme/machines/template.case.test @@ -66,7 +66,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, testname = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: success = case_test(case, testname) sys.exit(0 if success else 1) diff --git a/cime_config/acme/machines/template.lt_archive b/cime_config/acme/machines/template.lt_archive old mode 100644 new mode 100755 index fa121cc6302e..990f59bd3540 --- a/cime_config/acme/machines/template.lt_archive +++ b/cime_config/acme/machines/template.lt_archive @@ -67,8 +67,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_lt_archive(case) + with Case(caseroot) as case: + success = case_lt_archive(case) sys.exit(0 if success else 1) diff --git a/cime_config/acme/machines/template.st_archive b/cime_config/acme/machines/template.st_archive index fa4f79575d84..07acdc49b458 100755 --- a/cime_config/acme/machines/template.st_archive +++ b/cime_config/acme/machines/template.st_archive @@ -66,7 +66,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: success = case_st_archive(case) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.case.run b/cime_config/cesm/machines/template.case.run index 4cec0f8b8d36..4730160348bb 100755 --- a/cime_config/cesm/machines/template.case.run +++ b/cime_config/cesm/machines/template.case.run @@ -74,7 +74,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: success = case_run(case) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.case.test b/cime_config/cesm/machines/template.case.test index 7b6c4efbaea8..a5d7b2659d7d 100755 --- a/cime_config/cesm/machines/template.case.test +++ b/cime_config/cesm/machines/template.case.test @@ -66,7 +66,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, testname = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: success = case_test(case, testname) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.lt_archive b/cime_config/cesm/machines/template.lt_archive old mode 100644 new mode 100755 index fa121cc6302e..990f59bd3540 --- a/cime_config/cesm/machines/template.lt_archive +++ b/cime_config/cesm/machines/template.lt_archive @@ -67,8 +67,8 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - case = Case(caseroot) - success = case_lt_archive(case) + with Case(caseroot) as case: + success = case_lt_archive(case) sys.exit(0 if success else 1) diff --git a/cime_config/cesm/machines/template.st_archive b/cime_config/cesm/machines/template.st_archive index b52f7bd7ba10..a0d6c1102f79 100755 --- a/cime_config/cesm/machines/template.st_archive +++ b/cime_config/cesm/machines/template.st_archive @@ -67,7 +67,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: success = case_st_archive(case) sys.exit(0 if success else 1) diff --git a/driver_cpl/cime_config/buildexe b/driver_cpl/cime_config/buildexe index 668aad0b5def..dd32139ee955 100755 --- a/driver_cpl/cime_config/buildexe +++ b/driver_cpl/cime_config/buildexe @@ -26,16 +26,14 @@ def _main_func(): logger.info("Building a single executable version of target coupled model") - case = Case(caseroot) - - casetools = case.get_value("CASETOOLS") - cimeroot = case.get_value("CIMEROOT") - exeroot = case.get_value("EXEROOT") - gmake = case.get_value("GMAKE") - gmake_j = case.get_value("GMAKE_J") - model = case.get_value("MODEL") - - os.environ["PIO_VERSION"] = str(case.get_value("PIO_VERSION")) + with Case(caseroot) as case: + casetools = case.get_value("CASETOOLS") + cimeroot = case.get_value("CIMEROOT") + exeroot = case.get_value("EXEROOT") + gmake = case.get_value("GMAKE") + gmake_j = case.get_value("GMAKE_J") + model = case.get_value("MODEL") + os.environ["PIO_VERSION"] = str(case.get_value("PIO_VERSION")) with open('Filepath', 'w') as out: out.write(os.path.join(caseroot, "SourceMods", "src.drv") + "\n") diff --git a/driver_cpl/cime_config/buildnml b/driver_cpl/cime_config/buildnml index ef2fb6d4458e..f6bf496a4e43 100755 --- a/driver_cpl/cime_config/buildnml +++ b/driver_cpl/cime_config/buildnml @@ -23,42 +23,40 @@ def _main_func(): caseroot = parse_input(sys.argv) - case = Case(caseroot) - - cimeroot = case.get_value("CIMEROOT") - caseroot = case.get_value("CASEROOT") - casebuild = case.get_value("CASEBUILD") - rundir = case.get_value("RUNDIR") - grid = case.get_value("GRID") - atm_grid = case.get_value("ATM_GRID") - lnd_grid = case.get_value("LND_GRID") - ocn_grid = case.get_value("OCN_GRID") - rof_grid = case.get_value("ROF_GRID") - wav_grid = case.get_value("WAV_GRID") - comp_atm = case.get_value("COMP_ATM") - pio_version = case.get_value("PIO_VERSION") - - confdir = os.path.join(casebuild, "cplconf") - if not os.path.isdir(confdir): - os.makedirs(confdir) - - # create cplconf/namelist - - infile_text = "" - if comp_atm == 'cam': - # *** FIXME - this is confusing!!!*** - # cam is actually changing the driver namelist settings - cam_config_opts = case.get_value("CAM_CONFIG_OPTS") - if "adiabatic" in cam_config_opts: - infile_text = "atm_adiabatic = .true." - if "ideal" in cam_config_opts: - infile_text = "atm_ideal_phys = .true." - if "aquaplanet" in cam_config_opts: - infile_text = "aqua_planet = .true. \n aqua_planet_sst = 1" - - user_nl_file = os.path.join(caseroot, "user_nl_cpl") - namelist_infile = os.path.join(confdir, "namelist") - create_namelist_infile(case, user_nl_file, namelist_infile, infile_text) + with Case(caseroot) as case: + cimeroot = case.get_value("CIMEROOT") + caseroot = case.get_value("CASEROOT") + casebuild = case.get_value("CASEBUILD") + rundir = case.get_value("RUNDIR") + grid = case.get_value("GRID") + atm_grid = case.get_value("ATM_GRID") + lnd_grid = case.get_value("LND_GRID") + ocn_grid = case.get_value("OCN_GRID") + rof_grid = case.get_value("ROF_GRID") + wav_grid = case.get_value("WAV_GRID") + comp_atm = case.get_value("COMP_ATM") + pio_version = case.get_value("PIO_VERSION") + + confdir = os.path.join(casebuild, "cplconf") + if not os.path.isdir(confdir): + os.makedirs(confdir) + + # create cplconf/namelist + infile_text = "" + if comp_atm == 'cam': + # *** FIXME - this is confusing!!!*** + # cam is actually changing the driver namelist settings + cam_config_opts = case.get_value("CAM_CONFIG_OPTS") + if "adiabatic" in cam_config_opts: + infile_text = "atm_adiabatic = .true." + if "ideal" in cam_config_opts: + infile_text = "atm_ideal_phys = .true." + if "aquaplanet" in cam_config_opts: + infile_text = "aqua_planet = .true. \n aqua_planet_sst = 1" + + user_nl_file = os.path.join(caseroot, "user_nl_cpl") + namelist_infile = os.path.join(confdir, "namelist") + create_namelist_infile(case, user_nl_file, namelist_infile, infile_text) # call build-namelist diff --git a/scripts/Tools/case.build b/scripts/Tools/case.build index 6c1ee7815d1d..ca1e3fabe8cf 100755 --- a/scripts/Tools/case.build +++ b/scripts/Tools/case.build @@ -91,7 +91,7 @@ def _main_func(description): caseroot, sharedlib_only, model_only, cleanlist = parse_command_line(sys.argv, description) logging.info("calling build.case_build with caseroot=%s" %caseroot) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: testname = case.get_value('TESTCASE') if cleanlist: diff --git a/scripts/Tools/case.setup b/scripts/Tools/case.setup index caa71d38c463..34f7d0885eb0 100755 --- a/scripts/Tools/case.setup +++ b/scripts/Tools/case.setup @@ -58,7 +58,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, clean, test_mode, reset = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: case_setup(case, clean, test_mode, reset) if __name__ == "__main__": diff --git a/scripts/Tools/case.submit b/scripts/Tools/case.submit index 4377c2112fd8..8e6bc199f43a 100755 --- a/scripts/Tools/case.submit +++ b/scripts/Tools/case.submit @@ -56,7 +56,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, job, no_batch, prereq = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: submit(case, job=job, no_batch=no_batch, prereq_jobid=prereq) if __name__ == "__main__": diff --git a/scripts/Tools/check_case b/scripts/Tools/check_case index 4473ac3a3e6f..e2a837c915ad 100755 --- a/scripts/Tools/check_case +++ b/scripts/Tools/check_case @@ -54,7 +54,7 @@ def _main_func(description): check_lockedfiles() - with Case() as case: + with Case(read_only=False) as case: preview_namelists(case) build_complete = case.get_value("BUILD_COMPLETE") diff --git a/scripts/Tools/check_input_data b/scripts/Tools/check_input_data index 6ac63c584f46..76fe0f363df1 100755 --- a/scripts/Tools/check_input_data +++ b/scripts/Tools/check_input_data @@ -65,12 +65,12 @@ def _main_func(description): svn_loc, input_data_root, data_list_dir, download = parse_command_line(sys.argv, description) - case = Case() - sys.exit(0 if check_input_data(case, - svn_loc=svn_loc, - input_data_root=input_data_root, - data_list_dir=data_list_dir, - download=download) else 1) + with Case() as case: + sys.exit(0 if check_input_data(case, + svn_loc=svn_loc, + input_data_root=input_data_root, + data_list_dir=data_list_dir, + download=download) else 1) ############################################################################### diff --git a/scripts/Tools/getTiming b/scripts/Tools/getTiming index 0624b04581ba..1b1c6bccf453 100755 --- a/scripts/Tools/getTiming +++ b/scripts/Tools/getTiming @@ -120,55 +120,55 @@ class TimingParser: def getTiming(self): - case = Case(self.caseroot) - components=case.get_value("COMP_CLASSES").split(',') - components[components.index("DRV")]="CPL" - for s in components: - self.models[s] = getTimingInfo(s) - atm = self.models['ATM'] - lnd = self.models['LND'] - rof = self.models['ROF'] - wav = self.models['WAV'] - ice = self.models['ICE'] - ocn = self.models['OCN'] - glc = self.models['GLC'] - cpl = self.models['CPL'] - cime_model = case.get_value("MODEL") - caseid = case.get_value("CASE") - mach = case.get_value("MACH") - user = case.get_value("USER") - continue_run = case.get_value("CONTINUE_RUN") - rundir = case.get_value("RUNDIR") - run_type = case.get_value("RUN_TYPE") - ncpl_base_period = case.get_value("NCPL_BASE_PERIOD") - atm_ncpl = case.get_value("ATM_NCPL") - ocn_ncpl = case.get_value("OCN_NCPL") - ccsm_compset = case.get_value("CCSM_COMPSET") - if ccsm_compset is None: - ccsm_compset = "" - grid = case.get_value("GRID") - run_type = case.get_value("RUN_TYPE") - stop_option = case.get_value("STOP_OPTION") - stop_n = case.get_value("STOP_N") - cost_pes = case.get_value("COST_PES") - totalpes = case.get_value("TOTALPES") - pes_per_node = case.get_value("PES_PER_NODE") - - if cost_pes > 0: - pecost = cost_pes - else: - pecost = totalpes - - for m in self.models.values(): - for key in ["NTASKS", "ROOTPE", "PSTRID", "NTHRDS", "NINST"]: - if key == "NINST" and m.name == "CPL": - m.ninst = 1 - else: - setattr(m, key.lower(), - int(case.get_value("%s_%s" % (key, m.name)))) - - m.comp = case.get_value("COMP_%s" % (m.name)) - m.pemax = m.rootpe + m.ntasks * m.pstrid - 1 + with Case(self.caseroot) as case: + components=case.get_value("COMP_CLASSES").split(',') + components[components.index("DRV")]="CPL" + for s in components: + self.models[s] = getTimingInfo(s) + atm = self.models['ATM'] + lnd = self.models['LND'] + rof = self.models['ROF'] + wav = self.models['WAV'] + ice = self.models['ICE'] + ocn = self.models['OCN'] + glc = self.models['GLC'] + cpl = self.models['CPL'] + cime_model = case.get_value("MODEL") + caseid = case.get_value("CASE") + mach = case.get_value("MACH") + user = case.get_value("USER") + continue_run = case.get_value("CONTINUE_RUN") + rundir = case.get_value("RUNDIR") + run_type = case.get_value("RUN_TYPE") + ncpl_base_period = case.get_value("NCPL_BASE_PERIOD") + atm_ncpl = case.get_value("ATM_NCPL") + ocn_ncpl = case.get_value("OCN_NCPL") + ccsm_compset = case.get_value("CCSM_COMPSET") + if ccsm_compset is None: + ccsm_compset = "" + grid = case.get_value("GRID") + run_type = case.get_value("RUN_TYPE") + stop_option = case.get_value("STOP_OPTION") + stop_n = case.get_value("STOP_N") + cost_pes = case.get_value("COST_PES") + totalpes = case.get_value("TOTALPES") + pes_per_node = case.get_value("PES_PER_NODE") + + if cost_pes > 0: + pecost = cost_pes + else: + pecost = totalpes + + for m in self.models.values(): + for key in ["NTASKS", "ROOTPE", "PSTRID", "NTHRDS", "NINST"]: + if key == "NINST" and m.name == "CPL": + m.ninst = 1 + else: + setattr(m, key.lower(), + int(case.get_value("%s_%s" % (key, m.name)))) + + m.comp = case.get_value("COMP_%s" % (m.name)) + m.pemax = m.rootpe + m.ntasks * m.pstrid - 1 now = datetime.datetime.ctime(datetime.datetime.now()) inittype = "FALSE" diff --git a/scripts/Tools/preview_namelists b/scripts/Tools/preview_namelists index 32a4fac5b84d..5af4ced9fca1 100755 --- a/scripts/Tools/preview_namelists +++ b/scripts/Tools/preview_namelists @@ -55,7 +55,7 @@ def _main_func(description): sys.exit(1 if test_results.failed > 0 else 0) caseroot, dryrun = parse_command_line(sys.argv, description) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: preview_namelists(case, dryrun=False) if (__name__ == "__main__"): diff --git a/scripts/Tools/xmlchange b/scripts/Tools/xmlchange index 26d31961f758..7902d26e36f3 100755 --- a/scripts/Tools/xmlchange +++ b/scripts/Tools/xmlchange @@ -84,7 +84,7 @@ formatter_class=argparse.ArgumentDefaultsHelpFormatter def xmlchange(caseroot, listofsettings=None, xmlfile=None, xmlid=None, xmlval=None, subgroup=None, append=None, noecho=False, warn=None, force=False): - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: if listofsettings: for setting in listofsettings: (xmlid, xmlval) = setting.split('=', 1) diff --git a/scripts/Tools/xmlquery b/scripts/Tools/xmlquery index 32106f398452..aedf710ab8c1 100755 --- a/scripts/Tools/xmlquery +++ b/scripts/Tools/xmlquery @@ -105,24 +105,26 @@ def xmlquery(caseroot, args, listofattributes=[] , subgroup=None, noecho=False, True """ # Initialize case ; read in all xml files from caseroot - case = Case(caseroot) - values = [] - results = [] # List of formatted strings containing the search results - - if(listofattributes and len(listofattributes) >= 1): - - for xmlattr in listofattributes: - # type_str = case.get_type_info(xmlattr) - logger.debug("Searching for %s", xmlattr) - attribute_hits = case.get_values(xmlattr, resolved=args.resolve, subgroup=subgroup) - - results += attribute_hits - - elif (args.listall): - logger.warning("Retrieving all values.") - results = case.get_values(None, resolved=args.resolve, subgroup=subgroup) - else: - logger.warning("No attributes (%s) or listall option" , listofattributes) + with Case(caseroot) as case: + values = [] + results = [] # List of formatted strings containing the search results + + if(listofattributes and len(listofattributes) >= 1): + + for xmlattr in listofattributes: + # type_str = case.get_type_info(xmlattr) + logger.debug("Searching for %s", xmlattr) + attribute_hits = case.get_values(xmlattr, resolved=args.resolve, + subgroup=subgroup) + results += attribute_hits + + elif (args.listall): + logger.warning("Retrieving all values.") + results = case.get_values(None, resolved=args.resolve, + subgroup=subgroup) + else: + logger.warning("No attributes (%s) or listall option", + listofattributes) # Formatting of return strings if ( len(results) > 0) : diff --git a/scripts/create_clone b/scripts/create_clone index c27c0e248d1e..827cb4c18b4b 100755 --- a/scripts/create_clone +++ b/scripts/create_clone @@ -66,7 +66,7 @@ def _main_func(): expect(os.path.isdir(cloneroot), "Missing cloneroot directory %s " % cloneroot) - with Case(cloneroot) as clone: + with Case(cloneroot, read_only=False) as clone: clone.create_clone(case, keepexe, mach_dir, project) ############################################################################### diff --git a/scripts/create_newcase b/scripts/create_newcase index 5fe123728428..b7b84b8d2887 100755 --- a/scripts/create_newcase +++ b/scripts/create_newcase @@ -148,7 +148,7 @@ def _main_func(): expect(not (os.path.exists(caseroot) and not test), "Case directory %s already exists"%caseroot) - with Case(caseroot) as case: + with Case(caseroot, read_only=False) as case: # Set values for env_case.xml case.set_value("CASE", os.path.basename(caseroot)) case.set_value("CASEROOT", caseroot) diff --git a/scripts/create_test b/scripts/create_test index 82361d37a32f..dcae0aa7bea6 100755 --- a/scripts/create_test +++ b/scripts/create_test @@ -256,7 +256,7 @@ def single_submit_impl(machine_name, test_id, proc_pool, project, args, job_cost testcase_dirs = glob.glob("%s/*%s*/TestStatus" % (test_root, test_id)) expect(testcase_dirs, "No test case dirs found!?") first_case = os.path.abspath(os.path.dirname(testcase_dirs[0])) - with Case(first_case) as case: + with Case(first_case, read_only=False) as case: env_batch = case._get_env("batch") directives = env_batch.get_batch_directives(case, "case.run", raw=True) diff --git a/utils/python/CIME/buildlib.py b/utils/python/CIME/buildlib.py index 13571cce64a3..0e94d05fc9a4 100644 --- a/utils/python/CIME/buildlib.py +++ b/utils/python/CIME/buildlib.py @@ -43,18 +43,18 @@ def build_data_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - case = Case(caseroot) + with Case(caseroot) as case: - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list (Filepath) - compname = "d" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s" %compname) + "\n") - out.write(os.path.join(cimeroot, "components", "data_comps", compname) + "\n") + # Write directory list (Filepath) + compname = "d" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s" %compname) + "\n") + out.write(os.path.join(cimeroot, "components", "data_comps", compname) + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def build_xcpl_lib(argv, compclass): @@ -62,19 +62,19 @@ def build_xcpl_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - case = Case(caseroot) + with Case(caseroot) as case: - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list - compname = "x" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") - out.write(os.path.join(cimeroot, "components", "xcpl_comps", "xshare") + "\n") - out.write(os.path.join(cimeroot, "components", "xcpl_comps",compname, "cpl") + "\n") + # Write directory list + compname = "x" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") + out.write(os.path.join(cimeroot, "components", "xcpl_comps", "xshare") + "\n") + out.write(os.path.join(cimeroot, "components", "xcpl_comps",compname, "cpl") + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def build_stub_lib(argv, compclass): @@ -82,19 +82,19 @@ def build_stub_lib(argv, compclass): caseroot, libroot, bldroot = parse_input(argv) - case = Case(caseroot) + with Case(caseroot) as case: - cimeroot = case.get_value("CIMEROOT") + cimeroot = case.get_value("CIMEROOT") - # Write directory list - compname = "s" + compclass - with open('Filepath', 'w') as out: - out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") - out.write(os.path.join(cimeroot, "components", "stub_comps", "xshare") + "\n") - out.write(os.path.join(cimeroot, "components", "stub_comps",compname, "cpl") + "\n") + # Write directory list + compname = "s" + compclass + with open('Filepath', 'w') as out: + out.write(os.path.join(caseroot, "SourceMods", "src.%s", compname) + "\n") + out.write(os.path.join(cimeroot, "components", "stub_comps", "xshare") + "\n") + out.write(os.path.join(cimeroot, "components", "stub_comps",compname, "cpl") + "\n") - # Build the component - run_gmake(case, compclass, libroot) + # Build the component + run_gmake(case, compclass, libroot) ############################################################################### def run_gmake(case, compclass, libroot, libname="", user_cppdefs=""): diff --git a/utils/python/CIME/buildnml.py b/utils/python/CIME/buildnml.py index 4fa26f222f56..9007adca6836 100644 --- a/utils/python/CIME/buildnml.py +++ b/utils/python/CIME/buildnml.py @@ -42,12 +42,13 @@ def build_xcpl_nml(argv, compclass): caseroot = parse_input(argv) - case = Case(caseroot) - - rundir = case.get_value("RUNDIR") - ninst = case.get_value("NINST_%s" % compclass.upper()) - nx = case.get_value("%s_NX" % compclass.upper()) - ny = case.get_value("%s_NY" % compclass.upper()) + with Case(caseroot) as case: + rundir = case.get_value("RUNDIR") + ninst = case.get_value("NINST_%s" % compclass.upper()) + nx = case.get_value("%s_NX" % compclass.upper()) + ny = case.get_value("%s_NY" % compclass.upper()) + if compname == "xrof": + flood_mode = case.get_value('XROF_FLOOD_MODE') extras = [] dtype = 1 @@ -69,7 +70,6 @@ def build_xcpl_nml(argv, compclass): dtype = 4 elif compname == "xrof": dtype = 11 - flood_mode = Case('XROF_FLOOD_MODE') if flood_mode == "ACTIVE": extras = [[".true.", "flood flag"]] else: @@ -98,10 +98,15 @@ def build_xcpl_nml(argv, compclass): ############################################################################### def build_data_nml(argv, compclass): ############################################################################### - + # This function is just a wrapper for the one below, to avoid having to + # indent everything for the "with" block. caseroot = parse_input(argv) + with Case(caseroot) as case: + _build_data_nml(case, caseroot, compclass) - case = Case(caseroot) +############################################################################### +def _build_data_nml(case, caseroot, compclass): +############################################################################### cimeroot = case.get_value("CIMEROOT") rundir = case.get_value("RUNDIR") diff --git a/utils/python/CIME/case.py b/utils/python/CIME/case.py index 39d3a0577c71..d4276197f96e 100644 --- a/utils/python/CIME/case.py +++ b/utils/python/CIME/case.py @@ -62,7 +62,7 @@ class Case(object): by reading and interpreting the CIME config classes. """ - def __init__(self, case_root=None): + def __init__(self, case_root=None, read_only=True): if case_root is None: case_root = os.getcwd() @@ -70,6 +70,7 @@ def __init__(self, case_root=None): logger.debug("Initializing Case.") self._env_files_that_need_rewrite = set() self._read_only_mode = True + self._force_read_only = read_only self.read_xml(case_root) # Hold arbitary values. In create_newcase we may set values @@ -93,7 +94,8 @@ def __init__(self, case_root=None): # Define __enter__ and __exit__ so that we can use this as a context manager # and force a flush on exit. def __enter__(self): - self._read_only_mode = False + if not self._force_read_only: + self._read_only_mode = False return self def __exit__(self, exc_type, exc_value, traceback): diff --git a/utils/python/CIME/system_test.py b/utils/python/CIME/system_test.py index f083e97d487e..ec73fd443f43 100644 --- a/utils/python/CIME/system_test.py +++ b/utils/python/CIME/system_test.py @@ -529,7 +529,7 @@ def _xml_phase(self, test): shutil.copy(os.path.join(test_dir,"env_run.xml"), os.path.join(lockedfiles, "env_run.orig.xml")) - with Case(test_dir) as case: + with Case(test_dir, read_only=False) as case: case.set_value("SHAREDLIBROOT", os.path.join(self._test_root, "sharedlibroot.%s"%self._test_id)) diff --git a/utils/python/tests/scripts_regression_tests.py b/utils/python/tests/scripts_regression_tests.py index c3bf0fe5c6fb..ef09b435f6ac 100755 --- a/utils/python/tests/scripts_regression_tests.py +++ b/utils/python/tests/scripts_regression_tests.py @@ -871,7 +871,7 @@ def test_cime_case(self): "%s.%s" % (CIME.utils.get_full_test_name("TESTRUNPASS_Mmpi-serial.f19_g16_rx1.A", machine=self._machine, compiler=self._compiler), self._baseline_name)) self.assertTrue(os.path.isdir(casedir), msg="Missing casedir '%s'" % casedir) - with Case(casedir) as case: + with Case(casedir, read_only=False) as case: build_complete = case.get_value("BUILD_COMPLETE") self.assertFalse(build_complete, msg="Build complete had wrong value '%s'" % From 77e5a78fcc200a2f951e2ba5dafc4ccedc1a5c26 Mon Sep 17 00:00:00 2001 From: Jim Edwards Date: Wed, 13 Jul 2016 19:23:27 -0600 Subject: [PATCH 04/15] needed a flush in systems_tests_common --- .../CIME/SystemTests/system_tests_common.py | 1 + utils/python/CIME/case.py | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/utils/python/CIME/SystemTests/system_tests_common.py b/utils/python/CIME/SystemTests/system_tests_common.py index ea1d2dffce4e..742e7adf795e 100644 --- a/utils/python/CIME/SystemTests/system_tests_common.py +++ b/utils/python/CIME/SystemTests/system_tests_common.py @@ -46,6 +46,7 @@ def __init__(self, case, expected=None): case_setup(self._case, reset=True, test_mode=True) self._case.set_value("TEST",True) + self._case.flush() def build(self, sharedlib_only=False, model_only=False): build.case_build(self._caseroot, case=self._case, diff --git a/utils/python/CIME/case.py b/utils/python/CIME/case.py index 51742e263505..6e69bd5549c7 100644 --- a/utils/python/CIME/case.py +++ b/utils/python/CIME/case.py @@ -92,7 +92,12 @@ def __init__(self, case_root=None): self._component_classes = [] def read_xml(self, case_root): - expect(len(self._env_files_that_need_rewrite)==0,"Case object has modifications that would be overwritten by read_xml") + if(len(self._env_files_that_need_rewrite)>0): + files = "" + for env_file in self._env_files_that_need_rewrite: + files += " "+env_file.filename + expect(False,"Object(s) %s seem to have newer data than the corresponding case file"%files) + self._env_entryid_files = [] self._env_entryid_files.append(EnvRun(case_root)) self._env_entryid_files.append(EnvBuild(case_root)) @@ -177,9 +182,9 @@ def get_values(self, item=None, attribute=None, resolved=True, subgroup=None): """ Return info object for given item, return all info for all item if item is empty. """ - + logger.debug("(get_values) Input values: %s , %s , %s , %s , %s" , self.__class__.__name__ , item, attribute, resolved, subgroup) - + # Empty result list results = [] @@ -211,11 +216,11 @@ def get_values(self, item=None, attribute=None, resolved=True, subgroup=None): for r in result : if r['group'] == subgroup : found.append(r) - results += found - else: + results += found + else: results = results + result - - logger.debug("(get_values) Return value: %s" , results ) + + logger.debug("(get_values) Return value: %s" , results ) return results @@ -261,7 +266,7 @@ def set_value(self, item, value, subgroup=None, ignore_type=False): for env_file in self._env_entryid_files: result = env_file.set_value(item, value, subgroup, ignore_type) if (result is not None): - logger.debug("Will rewrite file %s",env_file.filename) + logger.debug("Will rewrite file %s %s",env_file.filename, item) self._env_files_that_need_rewrite.add(env_file) return result if result is None: From 83e7e0f02c91af33a3192e908a34623f30ea3b58 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Sat, 9 Jul 2016 11:32:41 -0600 Subject: [PATCH 05/15] removed esmf interfaces --- driver_cpl/cime_config/config_component.xml | 4 +- driver_cpl/driver/cesm_comp_mod.F90 | 326 +---- driver_cpl/driver/cesm_driver.F90 | 63 +- driver_cpl/driver/component_mod.F90 | 577 -------- driver_cpl/driver/component_type_mod.F90 | 11 - driver_cpl/driver/cpl_comp_esmf.F90 | 282 ---- driver_cpl/driver/seq_map_esmf.F90 | 231 --- driver_cpl/driver/seq_map_mod.F90 | 224 +-- driver_cpl/driver/seq_map_type_mod.F90 | 11 - driver_cpl/shr/seq_comm_mct.F90 | 54 +- driver_cpl/shr_esmf/esmf2mct_mod.F90 | 457 ------ driver_cpl/shr_esmf/esmfshr_attribute_mod.F90 | 301 ---- driver_cpl/shr_esmf/esmfshr_infodata_mod.F90 | 1249 ----------------- driver_cpl/shr_esmf/esmfshr_mod.F90 | 37 - driver_cpl/shr_esmf/esmfshr_util_mod.F90 | 664 --------- driver_cpl/shr_esmf/mct2esmf_mod.F90 | 954 ------------- 16 files changed, 18 insertions(+), 5427 deletions(-) delete mode 100644 driver_cpl/driver/cpl_comp_esmf.F90 delete mode 100644 driver_cpl/driver/seq_map_esmf.F90 delete mode 100644 driver_cpl/shr_esmf/esmf2mct_mod.F90 delete mode 100644 driver_cpl/shr_esmf/esmfshr_attribute_mod.F90 delete mode 100644 driver_cpl/shr_esmf/esmfshr_infodata_mod.F90 delete mode 100644 driver_cpl/shr_esmf/esmfshr_mod.F90 delete mode 100644 driver_cpl/shr_esmf/esmfshr_util_mod.F90 delete mode 100644 driver_cpl/shr_esmf/mct2esmf_mod.F90 diff --git a/driver_cpl/cime_config/config_component.xml b/driver_cpl/cime_config/config_component.xml index 0dcf5b0a8008..6e764974223f 100644 --- a/driver_cpl/cime_config/config_component.xml +++ b/driver_cpl/cime_config/config_component.xml @@ -680,11 +680,11 @@ char - MCT,ESMF + MCT MCT build_def env_build.xml - use MCT or ESMF component interfaces + use MCT component interface diff --git a/driver_cpl/driver/cesm_comp_mod.F90 b/driver_cpl/driver/cesm_comp_mod.F90 index 067745726037..6d5b314f3e04 100644 --- a/driver_cpl/driver/cesm_comp_mod.F90 +++ b/driver_cpl/driver/cesm_comp_mod.F90 @@ -43,16 +43,6 @@ module cesm_comp_mod ! component model interfaces (init, run, final methods) !---------------------------------------------------------------------------- -#ifdef ESMF_INTERFACE - use atm_comp_esmf , only: atm_register_esmf - use lnd_comp_esmf , only: lnd_register_esmf - use ocn_comp_esmf , only: ocn_register_esmf - use ice_comp_esmf , only: ice_register_esmf - use glc_comp_esmf , only: glc_register_esmf - use wav_comp_esmf , only: wav_register_esmf - use rof_comp_esmf , only: rof_register_esmf - use esp_comp_esmf , only: esp_register_esmf -#else use atm_comp_mct , only: atm_init=>atm_init_mct, atm_run=>atm_run_mct, atm_final=>atm_final_mct use lnd_comp_mct , only: lnd_init=>lnd_init_mct, lnd_run=>lnd_run_mct, lnd_final=>lnd_final_mct use ocn_comp_mct , only: ocn_init=>ocn_init_mct, ocn_run=>ocn_run_mct, ocn_final=>ocn_final_mct @@ -61,7 +51,6 @@ module cesm_comp_mod use wav_comp_mct , only: wav_init=>wav_init_mct, wav_run=>wav_run_mct, wav_final=>wav_final_mct use rof_comp_mct , only: rof_init=>rof_init_mct, rof_run=>rof_run_mct, rof_final=>rof_final_mct use esp_comp_mct , only: esp_init=>esp_init_mct, esp_run=>esp_run_mct, esp_final=>esp_final_mct -#endif !---------------------------------------------------------------------------- ! cpl7 modules @@ -81,11 +70,8 @@ module cesm_comp_mod use seq_comm_mct, only: num_inst_total, num_inst_max use seq_comm_mct, only: seq_comm_iamin, seq_comm_name, seq_comm_namelen use seq_comm_mct, only: seq_comm_init, seq_comm_setnthreads, seq_comm_getnthreads - use seq_comm_mct, only: seq_comm_getinfo => seq_comm_setptrs - use seq_comm_mct, only: seq_comm_petlist -#ifdef USE_ESMF_LIB - use seq_comm_mct, only: seq_comm_setcompstates -#endif + use seq_comm_mct, only: seq_comm_getinfo => seq_comm_setptrs + use seq_comm_mct, only: seq_comm_petlist ! clock & alarm routines and variables use seq_timemgr_mod, only: seq_timemgr_type @@ -164,10 +150,6 @@ module cesm_comp_mod use component_mod , only: component_init_cc, component_init_cx, component_run, component_final use component_mod , only: component_init_areacor, component_init_aream use component_mod , only: component_exch, component_diag -#ifdef ESMF_INTERFACE - use component_mod , only: component_init_update_petlist - use cpl_comp_esmf -#endif ! prep routines (includes mapping routines between components and merging routines) use prep_lnd_mod @@ -191,18 +173,10 @@ module cesm_comp_mod private public cesm_pre_init1, cesm_pre_init2, cesm_init, cesm_run, cesm_final -#ifdef USE_ESMF_LIB - public cesm_comp_register -#endif public timing_dir, mpicom_GLOID #include -#ifdef ESMF_INTERFACE - type(ESMF_GridComp) :: cplgc - type(ESMF_State) :: c2x_cx_state, x2c_cx_state -#endif - !---------------------------------------------------------------------------- ! temporary variables !---------------------------------------------------------------------------- @@ -781,12 +755,7 @@ subroutine cesm_pre_init1() #else write(logunit,'(2A)') subname,' USE_ESMF_LIB is NOT set, using esmf_wrf_timemgr' #endif -#ifdef MCT_INTERFACE write(logunit,'(2A)') subname,' MCT_INTERFACE is set' -#endif -#ifdef ESMF_INTERFACE - write(logunit,'(2A)') subname,' ESMF_INTERFACE is set' -#endif endif ! @@ -1121,16 +1090,9 @@ end subroutine cesm_pre_init2 !******************************************************************************* !=============================================================================== -#ifdef USE_ESMF_LIB -subroutine cesm_init(drvcomp) -#else subroutine cesm_init() -#endif implicit none -#ifdef USE_ESMF_LIB - type(ESMF_CplComp) :: drvcomp -#endif 101 format( A, 2i8, 12A, A, F8.2, A, F8.2 ) 102 format( A, 2i8, A, 8L3 ) @@ -1171,52 +1133,9 @@ subroutine cesm_init() call component_init_pre(esp, ESPID, CPLESPID, CPLALLESPID, infodata, ntype='esp') call t_stopf('comp_init_pre_all') -#ifdef ESMF_INTERFACE call t_startf('comp_init_cc_atm') call t_adj_detailf(+2) - call component_init_cc(Eclock_a, drvcomp, atm, atm_register_esmf, infodata, NLFilename) - call t_adj_detailf(-2) - call t_stopf('comp_init_cc_atm') - - call t_startf('comp_init_cc_lnd') - call t_adj_detailf(+2) - call component_init_cc(Eclock_l, drvcomp, lnd, lnd_register_esmf, infodata, NLFilename) - call t_adj_detailf(-2) - call t_stopf('comp_init_cc_lnd') - - call t_startf('comp_init_cc_rof') - call t_adj_detailf(+2) - call component_init_cc(Eclock_r, drvcomp, rof, rof_register_esmf, infodata, NLFilename) - call t_adj_detailf(-2) - call t_stopf('comp_init_cc_rof') - call t_startf('comp_init_cc_ocn') - call t_adj_detailf(+2) - call component_init_cc(Eclock_o, drvcomp, ocn, ocn_register_esmf, infodata, NLFilename) - call t_adj_detailf(-2) - call t_stopf('comp_init_cc_ocn') - - call t_startf('comp_init_cc_ice') - call t_adj_detailf(+2) - call component_init_cc(Eclock_i, drvcomp, ice, ice_register_esmf, infodata, NLFilename) - call t_adj_detailf(-2) - call t_stopf('comp_init_cc_ice') - - call t_startf('comp_init_cc_glc') - call t_adj_detailf(+2) - call component_init_cc(Eclock_g, drvcomp, glc, glc_register_esmf, infodata, NLFilename) - call t_adj_detailf(-2) - call t_stopf('comp_init_cc_glc') - - call t_startf('comp_init_cc_wav') - call t_adj_detailf(+2) - call component_init_cc(Eclock_w, drvcomp, wav, wav_register_esmf, infodata, NLFilename) - call component_init_cc(Eclock_e, drvcomp, esp, esp_register_esmf, infodata, NLFilename) - call t_adj_detailf(-2) - call t_stopf('comp_init_cc_wav') -#else - call t_startf('comp_init_cc_atm') - call t_adj_detailf(+2) call component_init_cc(Eclock_a, atm, atm_init, infodata, NLFilename) call t_adj_detailf(-2) call t_stopf('comp_init_cc_atm') @@ -1255,9 +1174,9 @@ subroutine cesm_init() call t_adj_detailf(+2) call component_init_cc(Eclock_w, wav, wav_init, infodata, NLFilename) call component_init_cc(Eclock_e, esp, esp_init, infodata, NLFilename) + call t_adj_detailf(-2) call t_stopf('comp_init_cc_wav') -#endif call t_startf('comp_init_cx_all') call t_adj_detailf(+2) @@ -1272,14 +1191,6 @@ subroutine cesm_init() call t_adj_detailf(-2) call t_stopf('comp_init_cx_all') -#ifdef ESMF_INTERFACE - if (iamin_CPLID) then - call ESMF_GridCompInitialize(cplgc, importState=c2x_cx_state, exportState=x2c_cx_state, & - rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - endif -#endif - ! Determine complist (list of comps for each id) call t_startf('comp_list_all') @@ -2008,11 +1919,7 @@ subroutine cesm_init() enddo ! Run atm_init_mct with init phase of 2 -#ifdef ESMF_INTERFACE - call component_init_cc(Eclock_a, drvcomp, atm, atm_register_esmf, & -#else call component_init_cc(Eclock_a, atm, atm_init, & -#endif infodata, NLFilename, & seq_flds_x2c_fluxes=seq_flds_x2a_fluxes, & seq_flds_c2x_fluxes=seq_flds_a2x_fluxes) @@ -2638,11 +2545,7 @@ subroutine cesm_run() !---------------------------------------------------------- if (ice_present .and. icerun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_i, ice, infodata, & -#else call component_run(Eclock_i, ice, ice_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2i_fluxes, & seq_flds_c2x_fluxes=seq_flds_i2x_fluxes, & comp_prognostic=ice_prognostic, comp_num=comp_num_ice, & @@ -2655,11 +2558,7 @@ subroutine cesm_run() !---------------------------------------------------------- if (lnd_present .and. lndrun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_l, lnd, infodata, & -#else call component_run(Eclock_l, lnd, lnd_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2l_fluxes, & seq_flds_c2x_fluxes=seq_flds_l2x_fluxes, & comp_prognostic=lnd_prognostic, comp_num=comp_num_lnd, & @@ -2672,11 +2571,7 @@ subroutine cesm_run() !---------------------------------------------------------- if (rof_present .and. rofrun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_r, rof, infodata, & -#else call component_run(Eclock_r, rof, rof_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2r_fluxes, & seq_flds_c2x_fluxes=seq_flds_r2x_fluxes, & comp_prognostic=rof_prognostic, comp_num=comp_num_rof, & @@ -2689,11 +2584,7 @@ subroutine cesm_run() !---------------------------------------------------------- if (wav_present .and. wavrun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_w, wav, infodata, & -#else call component_run(Eclock_w, wav, wav_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2w_fluxes, & seq_flds_c2x_fluxes=seq_flds_w2x_fluxes, & comp_prognostic=wav_prognostic, comp_num=comp_num_wav, & @@ -2708,11 +2599,7 @@ subroutine cesm_run() if ((trim(cpl_seq_option) == 'CESM1_ORIG_TIGHT' .or. & trim(cpl_seq_option) == 'CESM1_MOD_TIGHT' ) .and. & ocn_present .and. ocnrun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_o, ocn, infodata, & -#else call component_run(Eclock_o, ocn, ocn_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2o_fluxes, & seq_flds_c2x_fluxes=seq_flds_o2x_fluxes, & comp_prognostic=ocn_prognostic, comp_num=comp_num_ocn, & @@ -3339,11 +3226,7 @@ subroutine cesm_run() if ((trim(cpl_seq_option) /= 'CESM1_ORIG_TIGHT' .and. & trim(cpl_seq_option) /= 'CESM1_MOD_TIGHT' ) .and. & ocn_present .and. ocnrun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_o, ocn, infodata, & -#else call component_run(Eclock_o, ocn, ocn_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2o_fluxes, & seq_flds_c2x_fluxes=seq_flds_o2x_fluxes, & comp_prognostic=ocn_prognostic, comp_num=comp_num_ocn, & @@ -3356,11 +3239,7 @@ subroutine cesm_run() !---------------------------------------------------------- if (atm_present .and. atmrun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_a, atm, infodata, & -#else call component_run(Eclock_a, atm, atm_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2a_fluxes, & seq_flds_c2x_fluxes=seq_flds_a2x_fluxes, & comp_prognostic=atm_prognostic, comp_num=comp_num_atm, & @@ -3373,11 +3252,7 @@ subroutine cesm_run() !---------------------------------------------------------- if (glc_present .and. glcrun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_g, glc, infodata, & -#else call component_run(Eclock_g, glc, glc_run, infodata, & -#endif seq_flds_x2c_fluxes=seq_flds_x2g_fluxes, & seq_flds_c2x_fluxes=seq_flds_g2x_fluxes, & comp_prognostic=glc_prognostic, comp_num=comp_num_glc, & @@ -3389,11 +3264,7 @@ subroutine cesm_run() !| RUN ESP MODEL !---------------------------------------------------------- if (esp_present .and. esprun_alarm) then -#ifdef ESMF_INTERFACE - call component_run(Eclock_e, esp, infodata, & -#else call component_run(Eclock_e, esp, esp_run, infodata, & -#endif comp_prognostic=esp_prognostic, comp_num=comp_num_esp, & timer_barrier= 'CPL:ESP_RUN_BARRIER', timer_comp_run='CPL:ESP_RUN', & run_barriers=run_barriers, ymd=ymd, tod=tod,comp_layout=esp_layout) @@ -3874,15 +3745,6 @@ subroutine cesm_final() call seq_timemgr_EClockGetData( EClock_d, stepno=endstep) call shr_mem_getusage(msize,mrss) -#ifdef ESMF_INTERFACE - call component_final(EClock_a, atm) - call component_final(EClock_l, lnd) - call component_final(EClock_r, rof) - call component_final(EClock_i, ice) - call component_final(EClock_o, ocn) - call component_final(EClock_g, glc) - call component_final(EClock_w, wav) -#else call component_final(EClock_a, atm, atm_final) call component_final(EClock_l, lnd, lnd_final) call component_final(EClock_r, rof, rof_final) @@ -3890,7 +3752,6 @@ subroutine cesm_final() call component_final(EClock_o, ocn, ocn_final) call component_final(EClock_g, glc, glc_final) call component_final(EClock_w, wav, wav_final) -#endif !------------------------------------------------------------------------ ! End the run cleanly @@ -3999,187 +3860,6 @@ end subroutine seq_cesm_printlogheader !=============================================================================== -#ifdef USE_ESMF_LIB - -subroutine cesm_comp_init(drvcomp, importState, exportState, clock, rc) - use esmfshr_attribute_mod - implicit none - - !--------------------------------------------------------------- - ! - ! Arguments - type(ESMF_CplComp) :: drvcomp !top level cap gridded component - type(ESMF_State) :: importState, exportState !not used - type(ESMF_Clock) :: clock - integer, intent(out) :: rc - - ! Local variables - type(ESMF_State) :: attState - type(ESMF_GridComp) :: mapComp - type(ESMF_State) :: map_imp_state, map_exp_state - type(ESMF_GridComp) :: atmComp, lndComp, iceComp, ocnComp - type(ESMF_GridComp) :: rofComp, glcComp, wavComp - type(ESMF_VM) :: vm - integer, pointer :: cpl_petlist(:) - integer, pointer :: petlist(:) - integer :: localrc - !--------------------------------------------------------------- - - rc = ESMF_SUCCESS - - !------ - ! Create a state object to which the field level attributes will be - ! attached, and link the state to the specified component - !------ - attState = ESMF_StateCreate(name="cesm_atts", rc=localrc) - if (localrc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to create state for attributes') - - call ESMF_AttributeLink(drvcomp, attState, rc=localrc) - if (localrc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to link attributes') - - !------ - ! Create and setup cplgc and mapComp gridded components on the pl pes - ! import and export states are inout variables to register subroutines and their - ! values are changed in each iteration and saved in the seq_comm_type array. - !------ - - call seq_comm_petlist(CPLID, cpl_petlist) - - mapComp = ESMF_GridCompCreate(name="seq map comp", petList=cpl_petlist, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to create seq map comp') - call ESMF_GridCompSetServices(mapComp, seq_map_esmf_register, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to register mapComp') - map_imp_state = ESMF_StateCreate(name="seq map import", stateintent=ESMF_STATEINTENT_IMPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to create import seq map state') - map_exp_state = ESMF_StateCreate(name="seq map export", stateintent=ESMF_STATEINTENT_EXPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to create export seq map state') - - call seq_comm_setcompstates(CPLID, mapComp, map_imp_state, map_exp_state) - -#ifdef ESMF_INTERFACE - cplgc = ESMF_GridCompCreate(name="seq cpl comp", petList=cpl_petlist, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to create seq cpl comp') - call ESMF_GridCompSetServices(cplgc, cpl_esmf_register, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to register cplgc') - c2x_cx_state = ESMF_StateCreate(name="seq cpl import", stateintent=ESMF_STATEINTENT_IMPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to create import seq cpl state') - x2c_cx_state = ESMF_StateCreate(name="seq cpl export", stateintent=ESMF_STATEINTENT_EXPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort(subname//' failed to create export seq cpl state') - - call seq_comm_setcompstates(CPLID, cplgc, c2x_cx_state, x2c_cx_state) -#endif - - !------ - ! Process the CESM initialization - !------ - call cesm_init(drvcomp) - -#ifdef USE_ESMF_METADATA - !------ - ! Set the application and field level attributes - !------ - call esmfshr_attribute_appl_init(drvcomp, rc=localrc) - !call esmfshr_attribute_fields_init(attState, rc=localrc) -#endif - - !------ - ! Get the VM and root pet list to be used for the AttributeUpdate call - !------ - call ESMF_VMGetCurrent(vm, rc=localrc) - if (localrc /= 0) call shr_sys_abort(subname//' failed to get VM') - -#ifdef ESMF_INTERFACE - !------------------------------------------------------------------------- - ! The attribute handling part of the code is updated to loop - ! through ensemble instances. - !------------------------------------------------------------------------- - call component_init_update_petlist(atm, vm) - call component_init_update_petlist(lnd, vm) - call component_init_update_petlist(ice, vm) - call component_init_update_petlist(ocn, vm) - call component_init_update_petlist(glc, vm) - call component_init_update_petlist(rof, vm) - call component_init_update_petlist(wav, vm) - -#ifdef USE_ESMF_METADATA - !------ - ! Write out all of the attributes to the CIM compliant XML file - !------ - if (iamroot_GLOID) then - call ESMF_AttributeWrite( & - comp, & - convention='CIM', & - purpose='Model Component Simulation Description', & - attwriteflag=ESMF_ATTWRITE_XML, rc=localrc) - endif -#endif - -#endif - - rc = localrc - -end subroutine cesm_comp_init - -!=============================================================================== - -subroutine cesm_comp_run(drvcomp, importState, exportState, clock, rc) - implicit none - type(ESMF_CplComp) :: drvcomp - type(ESMF_State) :: importState, exportState - type(ESMF_Clock) :: clock - integer, intent(out) :: rc - - rc = ESMF_SUCCESS - - call cesm_run() - -end subroutine cesm_comp_run - -!=============================================================================== - -subroutine cesm_comp_final(drvcomp, importState, exportState, clock, rc) - implicit none - type(ESMF_CplComp) :: drvcomp - type(ESMF_State) :: importState, exportState - type(ESMF_Clock) :: clock - integer, intent(out) :: rc - - rc = ESMF_SUCCESS - - call cesm_final() - -end subroutine cesm_comp_final - - -!=============================================================================== -! -! This subroutine registers the initialization, run and finalization routines -! for the specified driver/coupler component. -! -subroutine cesm_comp_register(drvcomp, rc) - implicit none - type(ESMF_CplComp) :: drvcomp - integer, intent(out) :: rc - - rc = ESMF_SUCCESS - - call ESMF_CplCompSetEntryPoint(drvcomp, ESMF_METHOD_INITIALIZE, & - userRoutine=cesm_comp_init, rc=rc) - - call ESMF_CplCompSetEntryPoint(drvcomp, ESMF_METHOD_RUN, & - userRoutine=cesm_comp_run, rc=rc) - - call ESMF_CplCompSetEntryPoint(drvcomp, ESMF_METHOD_FINALIZE, & - userRoutine=cesm_comp_final, rc=rc) - -end subroutine cesm_comp_register - -!=============================================================================== - -#endif - -!=============================================================================== - subroutine cesm_comp_barriers(mpicom, timer) implicit none integer , intent(in) :: mpicom diff --git a/driver_cpl/driver/cesm_driver.F90 b/driver_cpl/driver/cesm_driver.F90 index e215e3dfe156..93caadd73b26 100644 --- a/driver_cpl/driver/cesm_driver.F90 +++ b/driver_cpl/driver/cesm_driver.F90 @@ -2,7 +2,7 @@ program cesm_driver !------------------------------------------------------------------------------- ! -! Purpose: Main program for NCAR CESM Can have different +! Purpose: Main program for CESM and ACME models. Can have different ! land, sea-ice, and ocean models plugged in at compile-time. ! These models can be either: stub, dead, data, or active ! components or some combination of the above. @@ -20,25 +20,18 @@ program cesm_driver !---------------------------------------------------------------------------- ! share code & libs !---------------------------------------------------------------------------- - use shr_sys_mod, only: shr_sys_abort use perf_mod use ESMF - use cesm_comp_mod + use cesm_comp_mod, only : cesm_pre_init1 + use cesm_comp_mod, only : cesm_pre_init2 + use cesm_comp_mod, only : cesm_init + use cesm_comp_mod, only : cesm_run + use cesm_comp_mod, only : cesm_final implicit none !-------------------------------------------------------------------------- - ! Local Variables - !-------------------------------------------------------------------------- - integer :: localrc -#ifdef USE_ESMF_LIB - character(len=ESMF_MAXSTR) :: compName - type(ESMF_CplComp) :: drvcomp -#endif - - - !-------------------------------------------------------------------------- - ! Setup and initialize the communications and logging. + ! Setup and initialize the communications and logging. !-------------------------------------------------------------------------- call cesm_pre_init1() @@ -59,46 +52,13 @@ program cesm_driver !-------------------------------------------------------------------------- call cesm_pre_init2() - call t_startf('CPL:INIT') - call t_adj_detailf(+1) -#ifdef USE_ESMF_LIB - - !-------------------------------------------------------------------------- - ! Create the "Cap" component and set the services using the register - ! routine. Setting the services is where the initialize, run and - ! finalize routines for this component are set. - !-------------------------------------------------------------------------- - compName = "CESM_Component" - drvcomp = ESMF_CplCompCreate(name=compName, rc=localrc) - if (localrc /= 0) call shr_sys_abort('failed to create CESM Component') - - call ESMF_CplCompSetServices(drvcomp, userRoutine=cesm_comp_register, & - rc=localrc) - if (localrc /= 0) call shr_sys_abort('failed to set services for CESM Comp') - !-------------------------------------------------------------------------- - ! Call the initialize, run and finalize routines registered with the - ! cap component. + ! Call the initialize, run and finalize routines. !-------------------------------------------------------------------------- - call ESMF_CplCompInitialize(drvcomp, rc=localrc) - if (localrc /= 0) call shr_sys_abort('failed to esmf initialize') - - call t_adj_detailf(-1) - call t_stopf('CPL:INIT') - - call ESMF_CplCompRun(drvcomp, rc=localrc) - if (localrc /= 0) call shr_sys_abort('failed to esmf run') - - call ESMF_CplCompFinalize(drvcomp, rc=localrc) - if (localrc /= 0) call shr_sys_abort('failed to esmf finalize') - -#else + call t_startf('CPL:INIT') + call t_adj_detailf(+1) - !-------------------------------------------------------------------------- - ! If ESMF is not defined, then just call the initialize, run and finalize - ! routines directly. - !-------------------------------------------------------------------------- call cesm_init() call t_adj_detailf(-1) @@ -107,12 +67,9 @@ program cesm_driver call cesm_run() call cesm_final() -#endif - !-------------------------------------------------------------------------- ! Clean-up !-------------------------------------------------------------------------- call ESMF_Finalize( ) - end program cesm_driver diff --git a/driver_cpl/driver/component_mod.F90 b/driver_cpl/driver/component_mod.F90 index 06d5aebb3b92..79a0cd493266 100644 --- a/driver_cpl/driver/component_mod.F90 +++ b/driver_cpl/driver/component_mod.F90 @@ -32,9 +32,6 @@ module component_mod use mct_mod ! mct_ wrappers for mct lib use perf_mod use ESMF -#ifdef ESMF_INTERFACE - use esmfshr_mod -#endif implicit none @@ -52,9 +49,6 @@ module component_mod public :: component_init_cx public :: component_init_aream public :: component_init_areacor -#ifdef ESMF_INTERFACE - public :: component_init_update_petlist !esmf only -#endif public :: component_run ! mct and esmf versions public :: component_final ! mct and esmf versions public :: component_exch @@ -168,7 +162,6 @@ end subroutine component_init_pre !=============================================================================== -#ifndef ESMF_INTERFACE subroutine component_init_cc(Eclock, comp, comp_init, infodata, NLFilename, & seq_flds_x2c_fluxes, seq_flds_c2x_fluxes) @@ -283,406 +276,6 @@ end subroutine comp_init end do end subroutine component_init_cc -#endif - - !=============================================================================== - -#ifdef ESMF_INTERFACE - subroutine component_init_cc(Eclock, drvcomp, comp, gridcomp_register, & - infodata, NlFilename, seq_flds_x2c_fields, seq_flds_c2x_fields, & - seq_flds_x2c_fluxes, seq_flds_c2x_fluxes) - - !--------------------------------------------------------------- - ! Uses - use esmf2mct_mod, only: esmf2mct_init, esmf2mct_copy - use mct2esmf_mod, only: mct2esmf_init - use seq_flds_mod, only: seq_flds_dom_coord, seq_flds_dom_other, seq_flds_dom_fields - ! - ! Arguments - type(ESMF_Clock) , intent(inout) :: EClock - type(ESMF_CplComp) , intent(inout) :: drvComp - type(component_type) , intent(inout) :: comp(:) - interface - subroutine gridcomp_register(gridcomp, rc) - use ESMF - implicit none - type(ESMF_GridComp) :: gridcomp - integer, intent(out) :: rc - end subroutine gridcomp_register - end interface - type (seq_infodata_type) , intent(inout) :: infodata - character(len=*) , intent(in), optional :: NLFilename - character(len=*) , intent(in), optional :: seq_flds_x2c_fields - character(len=*) , intent(in), optional :: seq_flds_c2x_fields - character(len=*) , intent(in), optional :: seq_flds_x2c_fluxes - character(len=*) , intent(in), optional :: seq_flds_c2x_fluxes - ! - ! Local Variables - integer :: k1, k2 - integer :: nx, ny - integer :: eci - integer :: rc, urc - integer :: init_phase - integer :: lsize - type(ESMF_DistGrid) :: distgrid_cc - type(ESMF_DistGrid) :: distgrid_cx - type(ESMF_Array) :: dom_cc_array - type(ESMF_Array) :: dom_cx_array - type(ESMF_Array) :: x2c_cc_array - type(ESMF_Array) :: x2c_cx_array - type(ESMF_Array) :: c2x_cc_array - type(ESMF_Array) :: c2x_cx_array - integer , pointer :: petlist(:) - real(R8), pointer :: fptr(:,:) ! pointer into array data - character(len=1) :: cid - character(len=8196) :: mct_names_x2c, mct_names_c2x, mct_names_dom - character(*), parameter :: subname = '(component_init_cc:esmf)' - character(*), parameter :: F00 = "('"//subname//" : ', 4A )" - !--------------------------------------------------------------- - - if (present(seq_flds_x2c_fluxes) .and. present(seq_flds_c2x_fluxes)) then - init_phase = 2 - else - init_phase = 1 - end if - - do eci = 1,size(comp) - - if (init_phase == 1) then - - ! Create gridcomp for this instance - - call seq_comm_petlist(comp(eci)%compid, petlist) - - comp(eci)%gridcomp_cc = ESMF_GridCompCreate(name=trim(comp(eci)%name), petList=petlist, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_GridCompSetServices(comp(eci)%gridcomp_cc, userRoutine=gridcomp_register, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! create import and export states state_x2c_cc and state_c2x_cc - - comp(eci)%x2c_cc_state = ESMF_StateCreate(name=trim(comp(eci)%ntype)//" x2c_cc", & - stateintent=ESMF_STATEINTENT_IMPORT, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - comp(eci)%c2x_cc_state = ESMF_StateCreate(name=trim(comp(eci)%ntype)//" c2x_cc", & - stateintent=ESMF_STATEINTENT_EXPORT, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! link attributes - - call ESMF_AttributeLink(drvcomp, comp(eci)%gridcomp_cc, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - end if - - !-------------------------------------------------- - ! COMPONENT-CPL PES - !-------------------------------------------------- - ! Transfer infodata from coupler pes -> component pes - - if (comp(1)%iamin_cplallcompid) then - call seq_infodata_exchange(infodata, comp(1)%cplallcompid, & - 'cpl2'//comp(1)%ntype(1:3)//'_init') - end if - - !-------------------------------------------------- - ! COMPONENT PES - !-------------------------------------------------- - - ! The following initializes the component instance values of x2c_cc and c2x_cc - ! Only apply to components which communicate with the coupler - - if (iamroot_CPLID .and. comp(eci)%present .and. comp(eci)%iamin_cplcompid) then - write(logunit,F00) 'Initialize component '//trim(comp(eci)%ntype) - call shr_sys_flush(logunit) - end if - - if (comp(eci)%iamin_compid .and. comp(eci)%iamin_cplcompid) then - - if (comp(eci)%present) then - - if (drv_threading) call seq_comm_setnthreads(comp(eci)%nthreads_compid) - call shr_sys_flush(logunit) - - if (init_phase == 1) then - call ESMF_AttributeSet(comp(eci)%c2x_cc_state, name="ID", & - value=comp(eci)%compid, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - end if - - ! Set init_phase attribute value - call ESMF_AttributeSet(comp(eci)%c2x_cc_state, name=trim(comp(eci)%ntype)//"_phase", & - value=init_phase, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Convert infodata information into appropriate export state attributes - call esmfshr_infodata_infodata2state(infodata, comp(eci)%c2x_cc_state, & - id=comp(eci)%compid, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Rescale the attribute vector before sending for phase 2 of atm initialization - ! Note that x2c_cc attribute vector and x2c_cc_array share the same memory - ! (set in init_phase=1) - - if (init_phase == 2) then ! phase 2 (only for atm for now) - call ESMF_StateGet(comp(eci)%x2c_cc_state, itemName="x2d", array=x2c_cc_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call mct_avect_vecmult(comp(eci)%x2c_cc, comp(eci)%drv2mdl, seq_flds_x2c_fluxes, mask_spval=.true.) - end if - - !----------------------------------- - ! *** call into ESMF init method *** - !----------------------------------- - call t_set_prefixf(comp(1)%oneletterid//"_i:") - call ESMF_GridCompInitialize(comp(eci)%gridcomp_cc, & - importState=comp(eci)%x2c_cc_state, exportState=comp(eci)%c2x_cc_state, & - clock=EClock, userRc=urc, rc=rc) - if (urc /= ESMF_SUCCESS) call ESMF_Finalize(rc=urc, endflag=ESMF_END_ABORT) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc , endflag=ESMF_END_ABORT) - call t_unset_prefixf() - !----------------------------------- - - if (init_phase == 2) then - ! Rescale the attribute vector after receiving for phase 2 of atm initialization - call ESMF_StateGet(comp(eci)%c2x_cc_state, itemName="d2x", array=c2x_cc_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call mct_avect_vecmult(comp(eci)%c2x_cc, comp(eci)%mdl2drv, seq_flds_c2x_fluxes, mask_spval=.true.) - end if - - ! Convert appropriate export state attributes back to infodata, - ! the new nextsw_cday is updated in infodata - call esmfshr_infodata_state2infodata(comp(eci)%c2x_cc_state, infodata, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! The following is only from infodata updates on the component pes - - cid = comp(1)%oneletterid -#ifdef CPRPGI - if (cid=='a') call seq_infodata_getData(infodata, atm_present=comp(eci)%present, atm_nx=nx, atm_ny=ny) - if (cid=='l') call seq_infodata_getData(infodata, lnd_present=comp(eci)%present, lnd_nx=nx, lnd_ny=ny) - if (cid=='i') call seq_infodata_getData(infodata, ice_present=comp(eci)%present, ice_nx=nx, ice_ny=ny) - if (cid=='o') call seq_infodata_getData(infodata, ocn_present=comp(eci)%present, ocn_nx=nx, ocn_ny=ny) - if (cid=='r') call seq_infodata_getData(infodata, rof_present=comp(eci)%present, rof_nx=nx, rof_ny=ny) - if (cid=='g') call seq_infodata_getData(infodata, glc_present=comp(eci)%present, glc_nx=nx, glc_ny=ny) - if (cid=='w') call seq_infodata_getData(infodata, wav_present=comp(eci)%present, wav_nx=nx, wav_ny=ny) - if (cid=='e') then - ! We really shouldn't get here but let's do something in case - call seq_infodata_getData(infodata, esp_present=comp(eci)%present) - nx = 0 - ny = 0 - end if -#else - call seq_infodata_getData(cid, infodata, comp_present=comp(eci)%present, comp_nx=nx, comp_ny=ny) -#endif - - if (init_phase == 1 .and. comp(eci)%present) then - - ! allocate memory and initialize dom_cc%data, x2c_cc and c2x_cc attribute vectors - - if (.not. associated(comp(eci)%x2c_cc)) allocate(comp(eci)%x2c_cc) - if (.not. associated(comp(eci)%c2x_cc)) allocate(comp(eci)%c2x_cc) - if (.not. associated(comp(eci)%dom_cc)) allocate(comp(eci)%dom_cc) - - call ESMF_StateGet(comp(eci)%x2c_cc_state, itemName="x2d", array=x2c_cc_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateGet(comp(eci)%c2x_cc_state, itemName="d2x", array=c2x_cc_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateGet(comp(eci)%c2x_cc_state, itemName="domain", array=dom_cc_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! initialize MCT gsmap_cc global seg map from ESMF distgrid_cc - - call ESMF_ArrayGet(c2x_cc_array, distgrid=distgrid_cc, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call esmf2mct_init(distgrid_cc, comp(eci)%compid, comp(eci)%gsmap_cc, & - comp(eci)%mpicom_compid, nx*ny, rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! initialize MCT x2c_cc and c2x_cc attribute vectors from ESMF arrays - - call esmf2mct_init(x2c_cc_array, comp(eci)%x2c_cc, rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - call esmf2mct_copy(x2c_cc_array, comp(eci)%x2c_cc, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call esmf2mct_init(c2x_cc_array, comp(eci)%c2x_cc, rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - call esmf2mct_copy(c2x_cc_array, comp(eci)%c2x_cc, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! initialize MCT ggrid dom_cc from ESMF array - - call ESMF_DistGridGet(distgrid_cc, localDe=0, elementCount=lsize, rc=rc) - if(rc /= 0) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call mct_gGrid_init(comp(eci)%dom_cc, coordchars=seq_flds_dom_coord, & - otherchars=seq_flds_dom_other, lsize=lsize ) - - call esmf2mct_copy(dom_cc_array, comp(eci)%dom_cc%data, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! destroy original ESMF arrays, x2c_cc_array, c2x_cc_array and c2x_dom_array - ! in preparation for creating new ones that share memory with MCT attribute vecs - ! *** But this will remove any attributes that were originally in the ESMF array - ! so need to extract this info out first **** - - call ESMF_AttributeGet(x2c_cc_array, name='mct_names', value=mct_names_x2c, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayDestroy(x2c_cc_array, rc=rc) ! destroy the Array - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeGet(c2x_cc_array, name='mct_names', value=mct_names_c2x, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayDestroy(c2x_cc_array, rc=rc) ! destroy the Array - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeGet(dom_cc_array, name='mct_names', value=mct_names_dom, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayDestroy(dom_cc_array, rc=rc) ! destroy the Array - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! create new ESMF arrays - ! - x2c_cc_array shares memory with comp(eci)%x2c_cc attribute vector - ! - c2x_cc_array shares memory with comp(eci)%c2x_cc attribute vector - ! - c2x_dom_array shares memory with comp(eci)%dom_cc%data attribute vector - - x2c_cc_array = ESMF_ArrayCreate(distgrid=distgrid_cc, farrayPtr=comp(eci)%x2c_cc%rattr, & - distgridToArrayMap=(/2/), name="x2d", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - c2x_cc_array = ESMF_ArrayCreate(distgrid=distgrid_cc, farrayPtr=comp(eci)%c2x_cc%rattr, & - distgridToArrayMap=(/2/), name="d2x", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - dom_cc_array = ESMF_ArrayCreate(distgrid=distgrid_cc, farrayPtr=comp(eci)%dom_cc%data%rattr, & - distgridToArrayMap=(/2/), name="domain", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(x2c_cc_array, name="mct_names", value=trim(mct_names_x2c), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(c2x_cc_array, name="mct_names", value=trim(mct_names_c2x), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(dom_cc_array, name="mct_names", value=trim(mct_names_dom), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateReplace(comp(eci)%x2c_cc_state, (/x2c_cc_array/), rc=rc) - call ESMF_StateReplace(comp(eci)%c2x_cc_state, (/c2x_cc_array/), rc=rc) - call ESMF_StateReplace(comp(eci)%c2x_cc_state, (/dom_cc_array/), rc=rc) - - end if - - ! Convert appropriate export state attributes back to infodata, - ! the new nextsw_cday is updated in infodata - call esmfshr_infodata_state2infodata(comp(eci)%c2x_cc_state, infodata, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - if (drv_threading) call seq_comm_setnthreads(nthreads_GLOID) - - end if ! end of comp(eci)%present - end if ! end of comp(eci)%iamin_compid - - ! allocate memory for attribute vectors that are in cpl id - if compid and cplid - ! are not the same - if (comp(eci)%iamin_cplcompid) then - if (init_phase == 1 .and. comp(eci)%present) then - if (.not. associated(comp(eci)%x2c_cc)) allocate(comp(eci)%x2c_cc) - if (.not. associated(comp(eci)%c2x_cc)) allocate(comp(eci)%c2x_cc) - if (.not. associated(comp(eci)%dom_cc)) allocate(comp(eci)%dom_cc) - end if - end if - - end do ! end of loop over instances - - !-------------------------------------------------- - ! COMPONENT -CPL PES - !-------------------------------------------------- - ! Transfer infodata between component pes -> coupler pes - - if (comp(1)%iamin_cplcompid) then - call seq_infodata_exchange(infodata, comp(1)%cplcompid, & - comp(1)%ntype(1:3)//'2cpl_init') - endif - - ! Determine final value of comp_present in infodata (after component initialization) - - do eci = 1,size(comp) -#ifdef CPRPGI - if (comp(1)%oneletterid == 'a') call seq_infodata_getData(infodata, atm_present=comp(eci)%present) - if (comp(1)%oneletterid == 'l') call seq_infodata_getData(infodata, lnd_present=comp(eci)%present) - if (comp(1)%oneletterid == 'i') call seq_infodata_getData(infodata, ice_present=comp(eci)%present) - if (comp(1)%oneletterid == 'o') call seq_infodata_getData(infodata, ocn_present=comp(eci)%present) - if (comp(1)%oneletterid == 'r') call seq_infodata_getData(infodata, rof_present=comp(eci)%present) - if (comp(1)%oneletterid == 'g') call seq_infodata_getData(infodata, glc_present=comp(eci)%present) - if (comp(1)%oneletterid == 'w') call seq_infodata_getData(infodata, wav_present=comp(eci)%present) - if (comp(1)%oneletterid == 'e') call seq_infodata_getData(infodata, esp_present=comp(eci)%present) -#else - call seq_infodata_getData(comp(1)%oneletterid, infodata, comp_present=comp(eci)%present) -#endif - end do - - !-------------------------------------------------- - ! COMPONENT PES - !-------------------------------------------------- - ! Initialize aream, set it to area for now until maps are read - ! in some cases, maps are not read at all !! - ! Entire domain must have reasonable values before calling xxx2xxx init - - do eci = 1,size(comp) - if (comp(eci)%iamin_compid .and. comp(eci)%present) then - if (drv_threading) call seq_comm_setnthreads(comp(eci)%nthreads_compid) - k1 = mct_aVect_indexRa(comp(eci)%cdata_cc%dom%data, "area" ,perrWith='aa area ') - k2 = mct_aVect_indexRa(comp(eci)%cdata_cc%dom%data, "aream" ,perrWith='aa aream') - - comp(eci)%cdata_cc%dom%data%rAttr(k2,:) = comp(eci)%cdata_cc%dom%data%rAttr(k1,:) - - if (drv_threading) call seq_comm_setnthreads(nthreads_GLOID) - endif - end do - - end subroutine component_init_cc -#endif - - !=============================================================================== - -#ifdef ESMF_INTERFACE - subroutine component_init_update_petlist(comp, vm) - - !--------------------------------------------------------------- - ! Arguments - type(component_type), intent(inout) :: comp(:) - type(ESMF_VM) :: vm - ! - ! Local variables - integer :: eci - integer :: rc - integer, pointer :: petlist(:) - character(*), parameter :: subname = '(component_init_update_petlist)' - !--------------------------------------------------------------- - - ! Update petlist attribute - do eci = 1, size(comp) -!BUG write(6,*)'DEBUG: comp is ',trim(comp(eci)%name) - call seq_comm_petlist(comp(eci)%compid, petlist) -!BUG write(6,*)'DEBUG: petlist is ',petlist -!BUG call ESMF_AttributeUpdate(comp(eci)%gridcomp_cc, vm, rootList=petlist, rc=rc) -!BUG if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) -!BUG write(6,*)'DEBUG: successfully updated attributes' - enddo - - end subroutine component_init_update_petlist -#endif !=============================================================================== @@ -969,7 +562,6 @@ end subroutine component_init_areacor !=============================================================================== -#ifndef ESMF_INTERFACE subroutine component_run(Eclock, comp, comp_run, infodata, & seq_flds_x2c_fluxes, seq_flds_c2x_fluxes, & comp_prognostic, comp_num, timer_barrier, timer_comp_run, & @@ -1119,142 +711,9 @@ end subroutine comp_run 107 format( 3A, 2i8, A, f12.4, A, f12.4 ) end subroutine component_run -#endif - - !=============================================================================== - -#ifdef ESMF_INTERFACE - subroutine component_run(Eclock, comp, infodata, & - seq_flds_x2c_fluxes, seq_flds_c2x_fluxes, & - comp_prognostic, comp_num, timer_barrier, timer_comp_run, & - run_barriers, ymd, tod, comp_layout) - - !--------------------------------------------------------------- - ! Description - ! Run component model - ! Note that the optional arguments, seq_flds_x2c_fluxes and - ! seq_flds_c2x_fluxes, are not passed for external models (ESP) - ! since these type of models do not interact through the coupler. - ! The absence of these inputs should be used to avoid coupler- - ! based actions in component_run - ! - ! Arguments - type(ESMF_Clock) , intent(inout) :: EClock - type(component_type) , intent(inout) :: comp(:) - type (seq_infodata_type) , intent(inout) :: infodata - character(len=*) , intent(in), optional :: seq_flds_x2c_fluxes - character(len=*) , intent(in), optional :: seq_flds_c2x_fluxes - logical , intent(in) :: comp_prognostic - integer , intent(in), optional :: comp_num - character(len=*) , intent(in), optional :: timer_barrier - character(len=*) , intent(in), optional :: timer_comp_run - logical , intent(in), optional :: run_barriers - integer , intent(in), optional :: ymd ! Current date (YYYYMMDD) - integer , intent(in), optional :: tod ! Current time of day (seconds) - character(len=*) , intent(in), optional :: comp_layout - ! - ! Local Variables - type(ESMF_Array) :: x2d_array - type(ESMF_Array) :: d2x_array - integer :: rc, urc - integer :: eci - integer :: ierr - integer :: num_inst - real(r8) :: time_brun ! Start time - real(r8) :: time_erun ! Ending time - real(r8) :: cktime ! delta time - real(r8) :: cktime_acc(10) ! cktime accumulator array 1 = all, 2 = atm, etc - integer :: cktime_cnt(10) ! cktime counter array - character(*), parameter :: subname = '(component_run:esmf)' - !--------------------------------------------------------------- - - num_inst = size(comp) - do eci = 1,num_inst - if (comp(eci)%iamin_compid) then - - if (present(timer_barrier)) then - if (present(run_barriers)) then - if (run_barriers) then - call t_drvstartf (trim(timer_barrier)) - call mpi_barrier(comp(eci)%mpicom_compid, ierr) - call t_drvstopf (trim(timer_barrier)) - time_brun = mpi_wtime() - endif - end if - end if - - if (present(timer_comp_run)) then - call t_drvstartf (trim(timer_comp_run), barrier=comp(eci)%mpicom_compid) - end if - if (drv_threading) call seq_comm_setnthreads(comp(1)%nthreads_compid) - - ! Put infodata information into export state (NOTE - not into import state) - call esmfshr_infodata_infodata2state(infodata, comp(eci)%c2x_cc_state, & - id=comp(eci)%compid, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - if (comp(eci)%iamin_compid .and. comp(eci)%iamin_cplcompid) then - ! Determine import state into component - ! Remember that import state array and import attribute vector share memory now - call ESMF_StateGet(comp(eci)%x2c_cc_state, itemName="x2d", array=x2d_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Apply area correction factor from x2c on mct attribute vector - if (comp_prognostic .and. present(seq_flds_x2c_fluxes)) then - call mct_avect_vecmult(comp(eci)%x2c_cc, comp(eci)%drv2mdl, seq_flds_x2c_fluxes, mask_spval=.true.) - end if - - ! Convert mct attribute vector to esmf array - call mct2esmf_copy(comp(eci)%x2c_cc, x2d_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - end if - - !---------------------------------------------- - ! *** Run the component on component pes*** - !---------------------------------------------- - call t_set_prefixf(comp(1)%oneletterid//":") - call ESMF_GridCompRun(comp(eci)%gridcomp_cc, & - importState=comp(eci)%x2c_cc_state, exportState=comp(eci)%c2x_cc_state, & - clock=EClock, userRc=urc, rc=rc) - if (urc /= ESMF_SUCCESS) call ESMF_Finalize(rc=urc, endflag=ESMF_END_ABORT) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc , endflag=ESMF_END_ABORT) - call t_unset_prefixf() - !---------------------------------------------- - - call ESMF_AttributeSet(comp(eci)%c2x_cc_state, name="ID", value=comp(eci)%compid, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Convert export state back to infodata, the new nextsw_cday is updated in infodata - call esmfshr_infodata_state2infodata(comp(eci)%c2x_cc_state, infodata, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - if (present(seq_flds_c2x_fluxes)) then - ! Determine export state and obtain output esmf array - call ESMF_StateGet(comp(eci)%c2x_cc_state, itemName="d2x", array=d2x_array, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Convert output esmf array to mct attribute vector - call esmf2mct_copy(d2x_array, comp(eci)%c2x_cc, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Apply area correction for c2x on mct attribute vector - call mct_avect_vecmult(comp(eci)%c2x_cc, comp(eci)%mdl2drv, seq_flds_c2x_fluxes, mask_spval=.true.) - end if - - if (drv_threading) call seq_comm_setnthreads(nthreads_GLOID) - - if (present(timer_comp_run)) then - call t_drvstopf (trim(timer_comp_run)) - end if - end if - end do - - end subroutine component_run -#endif !=============================================================================== -#ifndef ESMF_INTERFACE subroutine component_final(Eclock, comp, comp_final) !--------------------------------------------------------------- @@ -1295,42 +754,6 @@ end subroutine comp_final end do end subroutine component_final -#endif - - !=============================================================================== - -#ifdef ESMF_INTERFACE - subroutine component_final(Eclock, comp) - - !--------------------------------------------------------------- - ! - ! Arguments - type(ESMF_Clock) , intent(inout) :: EClock - type(component_type) , intent(inout) :: comp(:) - ! - ! Local Variables - integer :: eci - integer :: rc, urc - integer :: num_inst - character(*), parameter :: subname = '(component_final:esmf)' - !--------------------------------------------------------------- - call t_set_prefixf(comp(1)%oneletterid//"_f:") - - num_inst = size(comp) - do eci = 1,num_inst - - ! This calls xxx_final_esmf - call ESMF_GridCompFinalize(comp(eci)%gridcomp_cc, & - importState=comp(eci)%x2c_cc_state, exportState=comp(eci)%c2x_cc_state, & - userRc=urc, rc=rc) - if (urc /= ESMF_SUCCESS) call ESMF_Finalize(rc=urc, endflag=ESMF_END_ABORT) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc , endflag=ESMF_END_ABORT) - - end do - - call t_unset_prefixf() - end subroutine component_final -#endif !=============================================================================== diff --git a/driver_cpl/driver/component_type_mod.F90 b/driver_cpl/driver/component_type_mod.F90 index f12ed4500bb3..3f31d26bfaf8 100644 --- a/driver_cpl/driver/component_type_mod.F90 +++ b/driver_cpl/driver/component_type_mod.F90 @@ -13,7 +13,6 @@ module component_type_mod use seq_comm_mct , only: num_inst_ocn, num_inst_ice, num_inst_glc use seq_comm_mct , only: num_inst_wav, num_inst_esp use mct_mod - use ESMF implicit none save @@ -61,11 +60,6 @@ module component_type_mod type(mct_gsMap) , pointer :: gsMap_cx => null() ! decomposition on coupler pes (same for all instances) type(mct_aVect) , pointer :: x2c_cx => null() ! type(mct_aVect) , pointer :: c2x_cx => null() -#ifdef ESMF_INTERFACE - type(ESMF_Array) :: x2c_cx_array ! valid values only on component pes - type(ESMF_Array) :: c2x_cx_array ! valid values only on component pes - type(ESMF_Array) :: dom_cx_array ! valid values only on component pes -#endif ! ! Component pes ! @@ -74,11 +68,6 @@ module component_type_mod type(mct_gsMap) , pointer :: gsMap_cc => null() ! decomposition on component pes type(mct_aVect) , pointer :: x2c_cc => null() type(mct_aVect) , pointer :: c2x_cc => null() -#ifdef ESMF_INTERFACE - type(ESMF_GridComp) :: gridcomp_cc ! valid values only on component pes - type(ESMF_State) :: x2c_cc_state ! valid values only on component pes - type(ESMF_State) :: c2x_cc_state ! valid values only on component pes -#endif real(r8) , pointer :: drv2mdl(:) => null() ! area correction factors real(r8) , pointer :: mdl2drv(:) => null() ! area correction factors ! diff --git a/driver_cpl/driver/cpl_comp_esmf.F90 b/driver_cpl/driver/cpl_comp_esmf.F90 deleted file mode 100644 index 65467daf5743..000000000000 --- a/driver_cpl/driver/cpl_comp_esmf.F90 +++ /dev/null @@ -1,282 +0,0 @@ -module cpl_comp_esmf - -#ifdef ESMF_INTERFACE - - ! !USES: - use esmf - use esmfshr_mod - use component_type_mod, only: atm, lnd, ice, ocn, wav, rof, glc - use mct_mod - ! - ! !PUBLIC TYPES: - implicit none - save - private ! except - - !-------------------------------------------------------------------------- - ! Public interfaces - !-------------------------------------------------------------------------- - - public :: cpl_esmf_init - public :: cpl_esmf_run - public :: cpl_esmf_final - public :: cpl_esmf_register - - !-------------------------------------------------------------------------- - ! Private interfaces - !-------------------------------------------------------------------------- - private :: cpl_esmf_init_states - - !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -CONTAINS - !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - subroutine cpl_esmf_register(comp, rc) - - implicit none - - type(ESMF_GridComp), intent(inout) :: comp - integer, intent(out) :: rc - - rc = ESMF_SUCCESS - - - ! Register the callback routines. - - call ESMF_GridCompSetEntryPoint(comp, ESMF_METHOD_INITIALIZE, & - cpl_esmf_init, phase=1, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_GridCompSetEntryPoint(comp, ESMF_METHOD_RUN, & - cpl_esmf_run, phase=1, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_GridCompSetEntryPoint(comp, ESMF_METHOD_FINALIZE, & - cpl_esmf_final, phase=1, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - end subroutine cpl_esmf_register - - !=============================================================================== - - subroutine cpl_esmf_init(cplgc, c2x_cx_state, x2c_cx_state, EClock, rc) - - !--------------------------------------------------------------- - use seq_flds_mod - ! - ! Arguments - type(ESMF_GridComp) :: cplgc - type(ESMF_State) :: c2x_cx_state - type(ESMF_State) :: x2c_cx_state - type(ESMF_Clock) :: EClock - integer, intent(out) :: rc - ! - ! Local Variables - integer :: eci - logical, save :: first_time = .true. - !--------------------------------------------------------------- - - if (first_time) then - do eci = 1,size(atm) - if (atm(eci)%present) then - call cpl_esmf_init_states(atm(eci)%gsmap_cx, & - atm(eci)%x2c_cx, atm(eci)%c2x_cx, atm(eci)%dom_cx, & - seq_flds_a2x_fields, seq_flds_x2a_fields, & - atm(eci)%c2x_cx_array, atm(eci)%x2c_cx_array, atm(eci)%dom_cx_array, & - c2x_cx_state, x2c_cx_state) - end if - end do - - do eci = 1,size(lnd) - if (lnd(eci)%present) then - call cpl_esmf_init_states(lnd(eci)%gsmap_cx, & - lnd(eci)%x2c_cx, lnd(eci)%c2x_cx, lnd(eci)%dom_cx, & - seq_flds_l2x_fields, seq_flds_x2l_fields, & - lnd(eci)%c2x_cx_array, lnd(eci)%x2c_cx_array, lnd(eci)%dom_cx_array, & - c2x_cx_state, x2c_cx_state) - end if - end do - - do eci = 1,size(ice) - if (ice(eci)%present) then - call cpl_esmf_init_states(ice(eci)%gsmap_cx, & - ice(eci)%x2c_cx, ice(eci)%c2x_cx, ice(eci)%dom_cx, & - seq_flds_i2x_fields, seq_flds_x2i_fields, & - ice(eci)%c2x_cx_array, ice(eci)%x2c_cx_array, ice(eci)%dom_cx_array, & - c2x_cx_state, x2c_cx_state) - end if - end do - - do eci = 1,size(ocn) - if (ocn(eci)%present) then - call cpl_esmf_init_states(ocn(eci)%gsmap_cx, & - ocn(eci)%x2c_cx, ocn(eci)%c2x_cx, ocn(eci)%dom_cx, & - seq_flds_o2x_fields, seq_flds_x2o_fields, & - ocn(eci)%c2x_cx_array, ocn(eci)%x2c_cx_array, ocn(eci)%dom_cx_array, & - c2x_cx_state, x2c_cx_state) - end if - end do - - do eci = 1,size(rof) - if (rof(eci)%present) then - call cpl_esmf_init_states(rof(eci)%gsmap_cx, & - rof(eci)%x2c_cx, rof(eci)%c2x_cx, rof(eci)%dom_cx, & - seq_flds_r2x_fields, seq_flds_x2r_fields, & - rof(eci)%c2x_cx_array, rof(eci)%x2c_cx_array, rof(eci)%dom_cx_array, & - c2x_cx_state, x2c_cx_state) - end if - end do - - do eci = 1,size(glc) - if (glc(eci)%present) then - call cpl_esmf_init_states(glc(eci)%gsmap_cx, & - glc(eci)%x2c_cx, glc(eci)%c2x_cx, glc(eci)%dom_cx, & - seq_flds_g2x_fields, seq_flds_x2g_fields, & - glc(eci)%c2x_cx_array, glc(eci)%x2c_cx_array, glc(eci)%dom_cx_array, & - c2x_cx_state, x2c_cx_state) - end if - end do - - do eci = 1,size(wav) - if (wav(eci)%present) then - call cpl_esmf_init_states(wav(eci)%gsmap_cx, & - wav(eci)%x2c_cx, wav(eci)%c2x_cx, wav(eci)%dom_cx, & - seq_flds_w2x_fields, seq_flds_x2w_fields, & - wav(eci)%c2x_cx_array, wav(eci)%x2c_cx_array, wav(eci)%dom_cx_array, & - c2x_cx_state, x2c_cx_state) - end if - end do - else - !TODO - call prep functions - end if - - rc = ESMF_SUCCESS - - end subroutine cpl_esmf_init - - !=============================================================================== - - subroutine cpl_esmf_run(comp, import_state, export_state, EClock, rc) - - !--------------------------------------------------------------- - ! - ! Arguments - type(ESMF_GridComp) :: comp - type(ESMF_State) :: import_state - type(ESMF_State) :: export_state - type(ESMF_Clock) :: EClock - integer, intent(out) :: rc - ! - ! Local Variables - !------------------------------------------------------------------------------- - - rc = ESMF_SUCCESS - - ! For now this does nothing - - end subroutine cpl_esmf_run - - !=============================================================================== - - subroutine cpl_esmf_final(comp, import_state, export_state, EClock, rc) - - implicit none - - ! !INPUT/OUTPUT PARAMETERS: - type(ESMF_GridComp) :: comp - type(ESMF_State) :: import_state - type(ESMF_State) :: export_state - type(ESMF_Clock) :: EClock - integer, intent(out) :: rc - !EOP - - end subroutine cpl_esmf_final - - !=============================================================================== - - subroutine cpl_esmf_init_states(gsmap_cx, & - x2c_cx, c2x_cx, dom_cx, & - seq_flds_c2x_fields, seq_flds_x2c_fields, & - c2x_cx_array, x2c_cx_array, dom_cx_array, c2x_cx_state, x2c_cx_state) - - !--------------------------------------------------------------- - use seq_flds_mod, only: seq_flds_dom_fields - ! - ! Arguments - type(mct_gsmap) , intent(inout) :: gsmap_cx - type(mct_avect) , intent(inout) :: c2x_cx - type(mct_avect) , intent(inout) :: x2c_cx - type(mct_ggrid) , intent(inout) :: dom_cx - character(len=*) , intent(in) :: seq_flds_x2c_fields - character(len=*) , intent(in) :: seq_flds_c2x_fields - type(ESMF_Array) , intent(inout) :: c2x_cx_array - type(ESMF_Array) , intent(inout) :: x2c_cx_array - type(ESMF_Array) , intent(inout) :: dom_cx_array - type(ESMF_State) , intent(inout) :: c2x_cx_state - type(ESMF_State) , intent(inout) :: x2c_cx_state - ! - ! Local Variables - integer :: lsize - integer :: lpet - integer :: vm_comm_id, mct_comm_id - type(ESMF_VM) :: vm - integer :: rc - integer, pointer :: gindex(:) - type(ESMF_DistGrid) :: distgrid_cx - !--------------------------------------------------------------- - - call ESMF_VMGetCurrent(vm, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_VMGet(vm, localPet=lpet, mpiCommunicator=vm_comm_id, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call MPI_Comm_Dup(vm_comm_id, mct_comm_id, rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - lsize = mct_gsMap_lsize(gsmap_cx, comm=mct_comm_id) - allocate(gindex(lsize), stat=rc) - if(rc /= 0) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call mct_gsMap_OrderedPoints(gsmap_cx, peno=lpet, points=gindex) - - distgrid_cx = ESMF_DistGridCreate(arbSeqIndexList=gindex, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - deallocate(gindex) - - c2x_cx_array = ESMF_ArrayCreate(distgrid=distgrid_cx, farrayPtr=c2x_cx%rattr, & - distgridToArrayMap=(/2/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - x2c_cx_array = ESMF_ArrayCreate(distgrid=distgrid_cx, farrayPtr=x2c_cx%rattr, & - distgridToArrayMap=(/2/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - dom_cx_array = ESMF_ArrayCreate(distgrid=distgrid_cx, farrayPtr=dom_cx%data%rattr, & - distgridToArrayMap=(/2/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(c2x_cx_array, name="mct_names", value=trim(seq_flds_c2x_fields), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(x2c_cx_array, name="mct_names", value=trim(seq_flds_x2c_fields), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(dom_cx_array, name="mct_names", value=trim(seq_flds_dom_fields), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(c2x_cx_state, (/c2x_cx_array/), rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(x2c_cx_state, (/x2c_cx_array/), rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(c2x_cx_state, (/dom_cx_array/), rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - end subroutine cpl_esmf_init_states - -#endif - -end module cpl_comp_esmf diff --git a/driver_cpl/driver/seq_map_esmf.F90 b/driver_cpl/driver/seq_map_esmf.F90 deleted file mode 100644 index e6eea79d323e..000000000000 --- a/driver_cpl/driver/seq_map_esmf.F90 +++ /dev/null @@ -1,231 +0,0 @@ -module seq_map_esmf -#ifdef USE_ESMF_LIB - -! !USES: - use esmf - use esmfshr_mod -! -! !PUBLIC TYPES: - implicit none - save - private ! except - -!-------------------------------------------------------------------------- -! Public interfaces -!-------------------------------------------------------------------------- - - public :: seq_map_esmf_init - public :: seq_map_esmf_run - public :: seq_map_esmf_final - public :: seq_map_esmf_register - -!-------------------------------------------------------------------------- -! Private data interfaces -!-------------------------------------------------------------------------- - -! -! Author: Fei Liu -! ESMF compliant coupler component -!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -CONTAINS -!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -subroutine seq_map_esmf_register(comp, rc) - - implicit none - - type(ESMF_GridComp), intent(inout) :: comp - integer, intent(out) :: rc - - rc = ESMF_SUCCESS - - ! Register the callback routines. - - call ESMF_GridCompSetEntryPoint(comp, ESMF_METHOD_INITIALIZE, & - seq_map_esmf_init, phase=1, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_GridCompSetEntryPoint(comp, ESMF_METHOD_RUN, & - seq_map_esmf_run, phase=1, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_GridCompSetEntryPoint(comp, ESMF_METHOD_FINALIZE, & - seq_map_esmf_final, phase=1, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - -end subroutine - -!=============================================================================== -!BOP =========================================================================== -! -! !IROUTINE: seq_map_esmf_init -! -! !DESCRIPTION: -! initialize dead seq_map model -! -! !REVISION HISTORY: -! -! !INTERFACE: ------------------------------------------------------------------ - -subroutine seq_map_esmf_init(comp, import_state, export_state, EClock, rc) - - implicit none - -! !INPUT/OUTPUT PARAMETERS: - type(ESMF_GridComp) :: comp - type(ESMF_State) :: import_state - type(ESMF_State) :: export_state - type(ESMF_Clock) :: EClock - integer, intent(out) :: rc - -!EOP - - !--- local variables --- - - type(ESMF_Array) :: gindex_s, gindex_d, factorArray, factorIndexArray - type(ESMF_Array) :: array_s, array_d - type(ESMF_Routehandle) :: routehandle - integer, pointer :: gindex(:), factorIndexList(:,:) - real(ESMF_KIND_R8), pointer :: factorList(:) - character(len=64) :: string = 'seq_map_esmf_init' - - !---------------------------- - ! Initial Setup - !---------------------------- - ! Get temporary Arrays from States - call ESMF_StateGet(import_state, itemName='gindex_s', array=gindex_s, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateGet(export_state, itemName='gindex_d', array=gindex_d, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateGet(export_state, itemName='factorArray', array=factorArray, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateGet(export_state, itemName='factorIndexArray', array=factorIndexArray, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Using gindex lists to set up Arrays for routehandle calculation - ! These temporary Arrays are 2D of the size (1, size(gindex)) - call ESMF_ArrayGet(gindex_s, farrayPtr=gindex, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - array_s = mct2esmf_init(gindex, 'temparray_s', name='temparray_s', rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayGet(gindex_d, farrayPtr=gindex, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - array_d = mct2esmf_init(gindex, 'temparray_d', name='temparray_d', rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayGet(factorArray, farrayPtr=factorList, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayGet(factorIndexArray, farrayPtr=factorIndexList, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! SMM Store - call ESMF_ArraySMMStore(srcArray=array_s, dstArray=array_d, routehandle=routehandle, & - factorList=factorList, factorIndexList=factorIndexList, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Attach routehandle to export State - call ESMF_RoutehandleSet(routehandle, name="routehandle", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(export_state, (/routehandle/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Attach temporary Arrays to import/export State - call ESMF_StateAdd(import_state, (/array_s/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(export_state, (/array_d/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - rc = ESMF_SUCCESS - -end subroutine seq_map_esmf_init - -!=============================================================================== -!BOP =========================================================================== -! -! !IROUTINE: seq_map_esmf_run -! -! !DESCRIPTION: -! run method for dead seq_map model -! -! !REVISION HISTORY: -! -! !INTERFACE: ------------------------------------------------------------------ - -subroutine seq_map_esmf_run(comp, import_state, export_state, EClock, rc) - - implicit none - -! !INPUT/OUTPUT PARAMETERS: - type(ESMF_GridComp) :: comp - type(ESMF_State) :: import_state - type(ESMF_State) :: export_state - type(ESMF_Clock) :: EClock - integer, intent(out) :: rc - -!EOP - - !--- local variables --- - - type(ESMF_Array) :: array_s, array_d - type(ESMF_Routehandle) :: routehandle - -!------------------------------------------------------------------------------- -! -!------------------------------------------------------------------------------- - - rc = ESMF_SUCCESS - - ! Retrieve src and dst Arrays and routehandles - call ESMF_StateGet(import_state, itemName='array_s', array=array_s, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateGet(export_state, itemName='array_d', array=array_d, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateGet(export_state, itemName='routehandle', routehandle=routehandle, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! SMM execution - call ESMF_ArraySMM(srcArray=array_s, dstArray=array_d, routehandle=routehandle, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - -end subroutine seq_map_esmf_run - -!=============================================================================== -!BOP =========================================================================== -! -! !IROUTINE: seq_map_esmf_final -! -! !DESCRIPTION: -! finalize method for dead model -! -! !REVISION HISTORY: -! -! !INTERFACE: ------------------------------------------------------------------ - -subroutine seq_map_esmf_final(comp, import_state, export_state, EClock, rc) - - implicit none - -! !INPUT/OUTPUT PARAMETERS: - type(ESMF_GridComp) :: comp - type(ESMF_State) :: import_state - type(ESMF_State) :: export_state - type(ESMF_Clock) :: EClock - integer, intent(out) :: rc -!EOP - -end subroutine seq_map_esmf_final -!=============================================================================== - -#endif -end module seq_map_esmf diff --git a/driver_cpl/driver/seq_map_mod.F90 b/driver_cpl/driver/seq_map_mod.F90 index 91f96c8dfdaf..19050115e21d 100644 --- a/driver_cpl/driver/seq_map_mod.F90 +++ b/driver_cpl/driver/seq_map_mod.F90 @@ -18,11 +18,6 @@ module seq_map_mod use shr_mct_mod, only: shr_mct_sMatPInitnc, shr_mct_queryConfigFile use mct_mod use seq_comm_mct -#ifdef USE_ESMF_LIB - use esmf - use esmfshr_mod - use seq_map_esmf -#endif use component_type_mod use seq_map_type_mod @@ -40,9 +35,6 @@ module seq_map_mod public :: seq_map_map ! cpl pes public :: seq_map_mapvect ! cpl pes public :: seq_map_readdata ! cpl pes -#ifdef USE_ESMF_LIB - public :: seq_map_register ! cpl pes -#endif interface seq_map_avNorm module procedure seq_map_avNormArr @@ -65,34 +57,6 @@ module seq_map_mod contains !======================================================================= -#ifdef USE_ESMF_LIB - subroutine seq_map_register(petlist, comp, import_state, export_state) - - implicit none - - integer, pointer :: petlist(:) - type(ESMF_GridComp), intent(out) :: comp - type(ESMF_State), intent(out) :: import_state, export_state - - integer :: rc - - comp = ESMF_GridCompCreate(name="seq map comp", petList=petlist, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort('failed to create seq map comp') - - call ESMF_GridCompSetServices(comp, seq_map_esmf_register, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort('failed to register atm comp') - - import_state = ESMF_StateCreate(name="seq map import", stateintent=ESMF_STATEINTENT_IMPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort('failed to create import seq map state') - - export_state = ESMF_StateCreate(name="seq map export", stateintent=ESMF_STATEINTENT_EXPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort('failed to create export seq map state') - - end subroutine -#endif - - !=============================================================================== - subroutine seq_map_init_rcfile( mapper, comp_s, comp_d, & maprcfile, maprcname, maprctype, samegrid, string, esmf_map) @@ -120,17 +84,6 @@ subroutine seq_map_init_rcfile( mapper, comp_s, comp_d, & character(CL) :: maptype integer(IN) :: mapid integer(IN) :: ssize,dsize -#ifdef USE_ESMF_LIB - type(ESMF_GridComp) :: comp - type(ESMF_State) :: imp_state, exp_state - type(ESMF_Array) :: gindex_s, gindex_d - type(ESMF_Array) :: factorArray, factorIndexArray - integer, pointer :: factorIndexList(:,:) - real(ESMF_KIND_R8), pointer :: factorList(:) - integer :: rc, urc, row_idx, col_idx, wgt_idx, nwgt - logical :: has_weight=.true. - integer, pointer :: petmap(:) -#endif character(len=*),parameter :: subname = "(seq_map_init_rcfile) " !----------------------------------------------------- @@ -192,102 +145,7 @@ subroutine seq_map_init_rcfile( mapper, comp_s, comp_d, & if (present(esmf_map)) mapper%esmf_map = esmf_map if (mapper%esmf_map) then -#ifdef USE_ESMF_LIB - !------------------------------------------------------ - ! ESMF: - ! Set up routehandle - ! This section of the code handles the creation of routehandle - ! for ESMF SMM communication calls. First, the existing MCT - ! sparsematmul descriptor is reused (although this part can be - ! done completely without MCT, doing a distributed IO from maprcfile). - ! The weight matrix and indicies vectors are wrapped into ESMF Arrays - ! based on simple block distributed DistGrid. - ! These Arrays are passed into a coupler component set up during - ! CESM driver initialization and stored in global seq_comm_type array - ! at the driver level. The coupler component is indexed by CPLID in - ! the seq_comm_type array. In the coupler component initialization phase - ! the SMM routehandle is computed and attached to export state of - ! a specific mapper object. Routehandle in a mapper object can be reused - ! for the same regridding model component pair. - ! - ! Fei Liu - !------------------------------------------------------ - ! has_weight can be controlled through namelist to determine - ! if weights are computed offline or to be computed online - ! during initialization. - if(has_weight) then - ! Retrieve weights and indicies from mapper object - row_idx = mct_sMat_indexIA(mapper%sMatp%matrix, 'grow') - col_idx = mct_sMat_indexIA(mapper%sMatp%matrix, 'gcol') - wgt_idx = mct_sMat_indexRA(mapper%sMatp%matrix, 'weight') - nwgt = size(mapper%sMatp%matrix%data%rattr(wgt_idx, :)) - !write(logunit,*) trim(string), row_idx, col_idx, wgt_idx, nwgt - allocate(factorIndexList(2, nwgt), factorList(nwgt), stat=rc) - if(rc /= 0) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - factorIndexList(1,:) = mapper%sMatp%matrix%data%iattr(col_idx, :) - factorIndexList(2,:) = mapper%sMatp%matrix%data%iattr(row_idx, :) - factorList = mapper%sMatp%matrix%data%rattr(wgt_idx,:) - - ! Get coupler pet map in global setting - call seq_comm_petlist(CPLID, petmap) - - ! Set up temporary arrays to compute ESMF SMM routes. - gindex_s = mct2esmf_create(gsMap_s, mpicom=mpicom, petmap=petmap, & - name="gindex_s", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - gindex_d = mct2esmf_create(gsMap_d, mpicom=mpicom, petmap=petmap, & - name="gindex_d", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - factorArray = mct2esmf_create(factorList, mpicom=mpicom, petmap=petmap, & - name="factorArray", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - factorIndexArray = mct2esmf_create(factorIndexList, mpicom=mpicom, & - petmap=petmap, name="factorIndexArray", rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Get the coupler component - ! Create mapper specific import and export States - call seq_comm_getcompstates(CPLID, comp=comp) - - mapper%imp_state = ESMF_StateCreate(name="import", stateintent=ESMF_STATEINTENT_IMPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort('failed to create import atm state') - mapper%exp_state = ESMF_StateCreate(name="export", stateintent=ESMF_STATEINTENT_EXPORT, rc=rc) - if(rc /= ESMF_SUCCESS) call shr_sys_abort('failed to create export atm state') - - ! Attach Arrays to the States - call ESMF_StateAdd(mapper%imp_state, (/gindex_s/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(mapper%exp_state, (/gindex_d/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(mapper%exp_state, (/factorArray/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(mapper%exp_state, (/factorIndexArray/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Call into ESMF init method - call ESMF_GridCompInitialize(comp, importState=mapper%imp_state, exportState=mapper%exp_state, & - userRc=urc, rc=rc) - if (urc /= ESMF_SUCCESS) call ESMF_Finalize(rc=urc, endflag=ESMF_END_ABORT) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - deallocate(factorIndexList, factorList) - - else - ! Compute the routehandle online here: - ! 1. Read in source and destination Grid description files - ! 2. Construct Grids or Meshes and dummy Fields on top - ! 3. Call FieldRegridStore to compute routehandle - ! 4. Save routehandle in mapper - endif -#else - call shr_sys_abort(subname//' ERROR: esmf SMM not allowed without USE_ESMF_LIB') -#endif + call shr_sys_abort(subname//' ERROR: esmf SMM not supported') endif ! esmf_map endif ! mapid >= 0 @@ -965,12 +823,6 @@ subroutine seq_map_avNormArr(mapper, av_i, av_o, norm_i, rList, norm) logical :: lnorm character(*),parameter :: subName = '(seq_map_avNormArr) ' character(len=*),parameter :: ffld = 'norm8wt' ! want something unique -#ifdef USE_ESMF_LIB - type(ESMF_Array) :: array_s, array_d, temparray_s, temparray_d - type(ESMF_DistGrid) :: distgrid - type(ESMF_GridComp) :: comp - integer :: rc, urc -#endif !----------------------------------------------------- sMatp = mapper%sMatp @@ -1025,84 +877,12 @@ subroutine seq_map_avNormArr(mapper, av_i, av_o, norm_i, rList, norm) !--- map --- if (mapper%esmf_map) then -#ifdef USE_ESMF_LIB - !--- ESMF SMM --- - ! The 2nd part of the code in seq_map_mod.F90 handles the execution of ESMF SMM. Based - ! on the number of input and output physical fields, temporary input and output ESMF Arrays - ! are created and reference data pointer directly in input/output MCT AttributeVectors. These - ! Arrays are attached to the import and export State retrieved from the mapper object of - ! the regridding model component pair prior to the component run method. - ! Inside the component run method, a SMM execution is performed with the input/output Arrays - ! and the routehandle. Afterwards, the temporary input/output Array are removed from - ! the States and destroyed. - - ! Create the temporary input array and attach to import State - ! - ! Query DistGrid - call ESMF_StateGet(mapper%imp_state, itemName='temparray_s', array=temparray_s, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - call ESMF_ArrayGet(temparray_s, distgrid=distgrid, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Create the temporary input array - array_s = ESMF_ArrayCreate(distgrid=distgrid, farrayPtr=avp_i%rattr, & - distgridToArrayMap=(/2/), & - name='array_s', rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(array_s, name='mct_names', & - value=trim(mct_aVect_exportRList2c(avp_i)), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Attach to import State - call ESMF_StateAdd(mapper%imp_state, (/array_s/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Create the temporary output array and attach to export State - call ESMF_StateGet(mapper%exp_state, itemName='temparray_d', array=temparray_d, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - call ESMF_ArrayGet(temparray_d, distgrid=distgrid, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - array_d = ESMF_ArrayCreate(distgrid=distgrid, farrayPtr=avp_o%rattr, & - distgridToArrayMap=(/2/), & - name='array_d', rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(array_d, name='mct_names', & - value=trim(mct_aVect_exportRList2c(avp_o)), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateAdd(mapper%exp_state, (/array_d/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Query coupler gridcomp component and call into ESMF comp run method for SMM execution - call seq_comm_getcompstates(CPLID, comp=comp) - call ESMF_GridCompRun(comp, importState=mapper%imp_state, exportState=mapper%exp_state, & - userRc=urc, rc=rc) - if (urc /= ESMF_SUCCESS) call ESMF_Finalize(rc=urc, endflag=ESMF_END_ABORT) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - ! Remove the input/output arrays from import/export States and destroy them - call ESMF_StateRemove(mapper%imp_state, itemName='array_s', rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - call ESMF_ArrayDestroy(array_s, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - - call ESMF_StateRemove(mapper%exp_state, itemName='array_d', rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - call ESMF_ArrayDestroy(array_d, rc=rc) - if (rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) -#else - call shr_sys_abort(subname//' ERROR: esmf SMM not allowed without USE_ESMF_LIB') -#endif - + call shr_sys_abort(subname//' ERROR: esmf SMM not supported') else ! MCT based SMM call mct_sMat_avMult(avp_i, sMatp, avp_o, VECTOR=mct_usevector) endif - !--- renormalize avp_o by mapped norm_i --- if (lnorm) then diff --git a/driver_cpl/driver/seq_map_type_mod.F90 b/driver_cpl/driver/seq_map_type_mod.F90 index 61f37eaf31a3..c12e9de99abf 100644 --- a/driver_cpl/driver/seq_map_type_mod.F90 +++ b/driver_cpl/driver/seq_map_type_mod.F90 @@ -7,11 +7,6 @@ module seq_map_type_mod use shr_const_mod use seq_comm_mct, only: logunit, CPLID, seq_comm_iamroot use mct_mod -#ifdef USE_ESMF_LIB - use esmf - use esmfshr_mod - use seq_map_esmf -#endif type seq_map logical :: copy_only @@ -39,12 +34,6 @@ module seq_map_type_mod real(R8), pointer :: clat_d(:) integer(IN) :: mpicom ! mpicom ! -#ifdef USE_ESMF_LIB - !---- import and export States for this mapper object, - !---- routehandle is stored in the exp_state for repeated remapping use - type(ESMF_State) :: imp_state - type(ESMF_State) :: exp_state -#endif end type seq_map public seq_map diff --git a/driver_cpl/shr/seq_comm_mct.F90 b/driver_cpl/shr/seq_comm_mct.F90 index 9e2c95efb6cd..44dbd98f2ed2 100644 --- a/driver_cpl/shr/seq_comm_mct.F90 +++ b/driver_cpl/shr/seq_comm_mct.F90 @@ -2,7 +2,7 @@ module seq_comm_mct !--------------------------------------------------------------------- ! -! Purpose: MCT utitlity functions used in sequential CCSM. +! Purpose: Set up necessary communications ! Note that if no MPI, will call MCTs fake version ! (including mpif.h) will be utilized ! @@ -20,9 +20,6 @@ module seq_comm_mct use shr_sys_mod , only : shr_sys_abort, shr_sys_flush use shr_mpi_mod , only : shr_mpi_chkerr, shr_mpi_bcast, shr_mpi_max use shr_file_mod, only : shr_file_getUnit, shr_file_freeUnit -#ifdef USE_ESMF_LIB - use esmf -#endif implicit none @@ -53,10 +50,6 @@ module seq_comm_mct public seq_comm_getnthreads public seq_comm_printcomms public seq_comm_get_ncomps -#ifdef USE_ESMF_LIB - public seq_comm_getcompstates - public seq_comm_setcompstates -#endif !-------------------------------------------------------------------------- ! Public data @@ -172,12 +165,6 @@ module seq_comm_mct logical :: set ! has this datatype been set integer, pointer :: petlist(:) ! esmf pet list logical :: petlist_allocated ! whether the petlist pointer variable was allocated -#ifdef USE_ESMF_LIB - type(ESMF_GridComp) :: esmf_comp ! esmf gridded component - ! The following state members are not needed in 520r. - type(ESMF_State) :: imp_state ! esmf import state for the gridded component - type(ESMF_State) :: exp_state ! esmf export state for the gridded component -#endif end type seq_comm_type type(seq_comm_type) :: seq_comms(ncomps) @@ -1655,45 +1642,6 @@ subroutine seq_comm_petlist(ID,petlist) end subroutine seq_comm_petlist !--------------------------------------------------------- -#ifdef USE_ESMF_LIB - subroutine seq_comm_getcompstates(ID,comp,imp_state,exp_state) - - implicit none - integer, intent(in) :: ID - type(ESMF_GridComp), optional, intent(out) :: comp - type(ESMF_State), optional, intent(out) :: imp_state, exp_state - character(*),parameter :: subName = '(seq_comm_getcompstates) ' - - if ((ID > 0) .and. (ID <= ncomps)) then - if(present(comp)) comp = seq_comms(ID)%esmf_comp - if(present(imp_state)) imp_state = seq_comms(ID)%imp_state - if(present(imp_state)) exp_state = seq_comms(ID)%exp_state - else - write(logunit,*) subname,' ID out of range, ',ID - call shr_sys_abort(subname//' ERROR: ID out of range') - end if - - end subroutine seq_comm_getcompstates -!--------------------------------------------------------- - subroutine seq_comm_setcompstates(ID,comp,imp_state,exp_state) - - implicit none - integer, intent(in) :: ID - type(ESMF_GridComp), optional, intent(in) :: comp - type(ESMF_State) , optional, intent(in) :: imp_state, exp_state - character(*),parameter :: subName = '(seq_comm_setcompstates) ' - - if ((ID > 0) .and. (ID <= ncomps)) then - if(present(comp)) seq_comms(ID)%esmf_comp = comp - if(present(imp_state)) seq_comms(ID)%imp_state = imp_state - if(present(imp_state)) seq_comms(ID)%exp_state = exp_state - else - write(logunit,*) subname,' ID out of range, ',ID - call shr_sys_abort(subname//' ERROR: ID out of range') - end if - - end subroutine seq_comm_setcompstates -#endif !--------------------------------------------------------- integer function seq_comm_inst(ID) diff --git a/driver_cpl/shr_esmf/esmf2mct_mod.F90 b/driver_cpl/shr_esmf/esmf2mct_mod.F90 deleted file mode 100644 index 91e93d4702bc..000000000000 --- a/driver_cpl/shr_esmf/esmf2mct_mod.F90 +++ /dev/null @@ -1,457 +0,0 @@ -module esmf2mct_mod -#ifdef USE_ESMF_LIB - -use ESMF -use esmfshr_util_mod, only: esmfshr_util_ArrayCopy -use mct_mod -use esmfshr_util_mod -use shr_kind_mod, only: IN=>SHR_KIND_IN, R8=>SHR_KIND_R8 -use shr_sys_mod , only: shr_sys_abort -use shr_log_mod, only: shr_log_unit, shr_log_level - -implicit none - -! -! Author: Fei Liu -! -! This module implements methods that work with ESMF_Array and MCT attribute -! vectors (attrVect) and global segmentation map (gsMap). -! Another layer of utils take these -! array related methods and put them into interface blocks. user using -! the higher level utils module see/use names such as esmf2mct_init, etc -! Array, AttrVect, and gsMap APIs - -public esmf2mct_init -public esmf2mct_copy - -private -interface esmf2mct_init - module procedure esmf2mct_init_AvsGSmap_Arrays - module procedure esmf2mct_init_Av_Array - module procedure esmf2mct_init_GGrid_Array - module procedure esmf2mct_init_GSmap_Gindex - module procedure esmf2mct_init_GSmap_Distgrid - module procedure esmf2mct_init_GSmap_Array - module procedure esmf2mct_init_Gindex_Distgrid - module procedure esmf2mct_init_Gindex_Array -end interface - -interface esmf2mct_copy - module procedure esmf2mct_copy_a - module procedure esmf2mct_copy_alist -end interface - -contains -!-------------------------------------------------------------------------- - -! initialize an AttrVect from ESMF_Array -subroutine esmf2mct_init_Av_Array(array, attrVect, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(inout) :: array - type(mct_aVect), intent(out) :: attrVect - integer, intent(out), optional :: rc - - ! local variables - integer :: localrc, dsize - character(len=8096) :: mct_names - character(len=*),parameter :: subname = 'esmf2mct_init_Av_Array' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_AttributeGet(array, name="mct_names", value=mct_names, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! construct AttrVect - ! compute dsize for mct - PE local - call esmfshr_util_ArrayGetSize(array, lsize2=dsize) - - call mct_aVect_init(aV=attrVect, rList=trim(mct_names), lsize=dsize) - -end subroutine esmf2mct_init_Av_Array - -!-------------------------------------------------------------------------- - -! initialize a GGrid from ESMF_Array -subroutine esmf2mct_init_GGrid_Array(array, ggrid, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(inout) :: array - type(mct_ggrid), intent(out) :: ggrid - integer, intent(out), optional :: rc - - ! local variables - integer :: localrc, dsize, lsize - character(len=8096) :: mct_names - integer, pointer :: gindex(:) - type(ESMF_distgrid) :: distgrid - character(len=*),parameter :: subname = 'esmf2mct_init_GGrid_Array' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_AttributeGet(array, name="mct_names", value=mct_names, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! construct ggrid - ! compute dsize for mct - PE local - call esmfshr_util_ArrayGetSize(array, lsize2=dsize) - - if (len_trim(mct_names) == 0 .and. dsize == 0) then - return ! empty domain - endif - - call mct_gGrid_init( GGrid=ggrid, & - CoordChars=trim(mct_names), lsize=dsize) - call mct_aVect_zero(ggrid%data) - - call ESMF_ArrayGet(array, distgrid=distgrid, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_DistgridGet(distgrid,localDE=0,elementCount=lsize,rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - if (dsize /= lsize) then - write(shr_log_unit,*) trim(subname),' ERROR: inconsistent sizes ',dsize,lsize - call shr_sys_abort(trim(subname)) - endif - - allocate(gindex(lsize)) - call ESMF_DistgridGet(distgrid,localDE=0,seqIndexList=gindex,rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call mct_gGrid_importIAttr(ggrid,'GlobGridNum',gindex,lsize) - - deallocate(gindex) - -end subroutine esmf2mct_init_GGrid_Array - -!-------------------------------------------------------------------------- - -! initialize a gsMap from an array -subroutine esmf2mct_init_GSmap_Array(array, COMPID, gsmap, mpicom, gsize, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(in) :: array - integer, intent(in) :: COMPID - type(mct_gsMap), intent(out) :: gsmap - integer, intent(in) :: mpicom - integer, intent(in), optional :: gsize - integer, intent(out), optional :: rc - - ! local variables - type(ESMF_DistGrid) :: distgrid - integer :: localrc - character(len=*),parameter :: subname = 'esmf2mct_init_GSmap_Array' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, distgrid=distgrid, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - if (present(gsize)) then - call esmf2mct_init_GSmap_Distgrid(distgrid, COMPID, gsmap, mpicom, gsize, rc=localrc) - else - call esmf2mct_init_GSmap_Distgrid(distgrid, COMPID, gsmap, mpicom, rc=localrc) - endif - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end subroutine esmf2mct_init_GSmap_Array - -!-------------------------------------------------------------------------- - -! initialize a gsMap from an array -subroutine esmf2mct_init_Gindex_Array(array, gindex, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(in) :: array - integer, intent(inout), pointer :: gindex(:) - integer, intent(out), optional :: rc - - ! local variables - type(ESMF_DistGrid) :: distgrid - integer :: localrc - character(len=*),parameter :: subname = 'esmf2mct_init_Gindex_Array' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, distgrid=distgrid, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call esmf2mct_init_Gindex_Distgrid(distgrid,gindex,rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end subroutine esmf2mct_init_Gindex_Array - -!-------------------------------------------------------------------------- - -! initialize a gsMap from a distgrid -subroutine esmf2mct_init_GSmap_Distgrid(distgrid, COMPID, gsmap, mpicom, gsize, rc) - - implicit none - - ! inout parameters - type(ESMF_DistGrid), intent(in) :: distgrid - integer, intent(in) :: COMPID - type(mct_gsMap), intent(out) :: gsmap - integer, intent(in) :: mpicom - integer, intent(in), optional :: gsize - integer, intent(out), optional :: rc - - ! local variables - type(ESMF_VM) :: vm - integer :: dsize, localrc - integer, allocatable :: gindex(:) - character(len=*),parameter :: subname = 'esmf2mct_init_GSmap_Distgrid' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - ! query index list - call ESMF_DistGridGet(distgrid, localDe=0, elementCount=dsize, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - allocate(gindex(dsize), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_DistGridGet(distgrid, localDe=0, seqIndexList=gindex, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! finally, construct the gsMap - if(present(gsize)) then - call mct_gsMap_init(gsMap, gindex, mpicom, COMPID, dsize, gsize) - else - call mct_gsMap_init(gsMap, gindex, mpicom, COMPID, dsize) - endif - deallocate(gindex) - -end subroutine esmf2mct_init_GSmap_Distgrid - -!-------------------------------------------------------------------------- - -! initialize a gsMap from a distgrid -subroutine esmf2mct_init_Gindex_Distgrid(distgrid, gindex, rc) - - implicit none - - ! inout parameters - type(ESMF_DistGrid), intent(in) :: distgrid - integer, intent(inout), pointer :: gindex(:) - integer, intent(out), optional :: rc - - ! local variables - integer :: dsize, localrc - character(len=*),parameter :: subname = 'esmf2mct_init_Gindex_Distgrid' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - ! query index list - call ESMF_DistGridGet(distgrid, localDe=0, elementCount=dsize, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - allocate(gindex(dsize), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_DistGridGet(distgrid, localDe=0, seqIndexList=gindex, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end subroutine esmf2mct_init_Gindex_Distgrid - -!-------------------------------------------------------------------------- - -! initialize a gsMap from a gindex -subroutine esmf2mct_init_GSmap_Gindex(gindex, COMPID, gsmap, mpicom, gsize, rc) - - implicit none - - ! inout parameters - integer, intent(in) :: gindex(:) - integer, intent(in) :: COMPID - type(mct_gsMap), intent(out) :: gsmap - integer, intent(in) :: mpicom - integer, intent(in), optional :: gsize - integer, intent(out), optional :: rc - - ! local variables - type(ESMF_VM) :: vm - integer :: dsize, localrc - character(len=*),parameter :: subname = 'esmf2mct_init_GSmap_Gindex' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - ! construct the gsMap - dsize = size(gindex, 1) - if(present(gsize)) then - call mct_gsMap_init(gsMap, gindex, mpicom, COMPID, dsize, gsize) - else - call mct_gsMap_init(gsMap, gindex, mpicom, COMPID, dsize) - endif - -end subroutine esmf2mct_init_GSmap_Gindex - -!-------------------------------------------------------------------------- - -! copy data from ESMF_Array to attrVect -subroutine esmf2mct_copy_a(array, attrVect, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(in) :: array - type(mct_aVect), intent(inout) :: attrVect - integer, intent(out), optional :: rc - - ! local variables - integer :: a_dsize, a_nfields, localrc - real(ESMF_KIND_R8), pointer :: a_fptr(:,:) - integer :: av_dsize, av_nfields - integer :: i, j, a_off1, a_off2 - character(len=*),parameter :: subname = 'esmf2mct_copy_a' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, localDe=0, farrayPtr=a_fptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -! tcraig - this call seems to change answers, why!! -! call esmfshr_util_ArrayGetSize(array, lsize1=a_nfields, lsize2=a_dsize) - a_dsize = ubound(a_fptr, 2)-lbound(a_fptr, 2)+1 - a_nfields = ubound(a_fptr, 1)-lbound(a_fptr, 1)+1 - - av_dsize = mct_aVect_lsize(aV=attrVect) - av_nfields = mct_aVect_nRAttr(aV=attrVect) - - if (a_dsize == 0 .or. a_nfields == 0) then - ! nothing to copy, skip size check too - return - endif - - if(a_dsize /= av_dsize .or. a_nfields /= av_nfields) then - write(shr_log_unit,*) trim(subname),' ERROR in sizes ',a_dsize,av_dsize,a_nfields,av_nfields - write(shr_log_unit,*) trim(subname),' ERROR av nflds = ',trim(mct_aVect_exportRlist2c(attrVect)) - call shr_sys_abort(trim(subname)) - endif - - ! attrVect%rattr = a_fptr - a_off2 = lbound(a_fptr, 2)-1 - a_off1 = lbound(a_fptr, 1)-1 - - do j = 1, a_dsize - do i = 1, a_nfields - attrVect%rattr(i, j) = a_fptr(a_off1+i, a_off2+j) - enddo - enddo - -end subroutine esmf2mct_copy_a - -!-------------------------------------------------------------------------- - -! copy data from ESMF_Array to attrVect -subroutine esmf2mct_copy_alist(array, attrVect, list, rc) - - ! inout parameters - type(ESMF_Array), intent(inout) :: array - type(mct_aVect), intent(inout) :: attrVect - character(len=*), intent(in) :: list - integer, intent(out), optional :: rc - - ! local variables - type(ESMF_Array) :: dstArray - type(ESMF_DistGrid) :: distgrid - integer :: localrc - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, distgrid=distgrid, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - !-------------------------------------------------------------------------- - ! use the attribute vector Fortran array pointer to create a temporary Array; - ! this avoids unnecessary memory copy and code is more efficient - !-------------------------------------------------------------------------- - dstArray = ESMF_ArrayCreate(farrayPtr=attrVect%rattr, distgrid=distgrid, distgridToArrayMap=(/2/), & - rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(dstArray, name="mct_names", & - value=trim(mct_aVect_exportRList2c(attrVect)), rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! do a field name based copy between incongruent src and dst Array pairs - call esmfshr_util_ArrayCopy(array, dstArray, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayDestroy(dstArray, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end subroutine esmf2mct_copy_alist - -!-------------------------------------------------------------------------- - -! convert ESMF_Array to Attribute Vector and Global Segmentation Map -subroutine esmf2mct_init_AvsGSmap_Arrays(importArray, exportArray, COMPID, mpicom, importAttrVect, exportAttrVect, gsmap, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(inout) :: importArray - type(ESMF_Array), intent(inout) :: exportArray - integer, intent(in) :: COMPID - integer, intent(in) :: mpicom - type(mct_aVect), intent(out) :: importAttrVect - type(mct_aVect), intent(out) :: exportAttrVect - type(mct_gsMap), intent(out) :: gsmap - integer, intent(out), optional :: rc - - ! internal variables - integer :: localrc - type(ESMF_DistGrid) :: i_distgrid, e_distgrid - character(len=*),parameter :: subname = 'esmf2mct_init_AvsGSmap_Arrays' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - ! query array for distgrid - call ESMF_ArrayGet(importArray, distgrid=i_distgrid, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayGet(exportArray, distgrid=e_distgrid, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -! if(.not. ESMF_DistGridMatch(i_distgrid, e_distgrid)) then -! call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) -! endif - if (ESMF_DistGridMatch(i_distgrid, e_distgrid) /= ESMF_DISTGRIDMATCH_EXACT) then - call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! initializations - call esmf2mct_init_GSmap_Distgrid(i_distgrid, COMPID, gsmap, mpicom, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call esmf2mct_init_Av_Array(importArray, importAttrVect, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call esmf2mct_init_Av_Array(exportArray, exportAttrVect, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end subroutine esmf2mct_init_AvsGSmap_Arrays - -!-------------------------------------------------------------------------- - -#endif -end module diff --git a/driver_cpl/shr_esmf/esmfshr_attribute_mod.F90 b/driver_cpl/shr_esmf/esmfshr_attribute_mod.F90 deleted file mode 100644 index 36f3bf30a8b1..000000000000 --- a/driver_cpl/shr_esmf/esmfshr_attribute_mod.F90 +++ /dev/null @@ -1,301 +0,0 @@ -module esmfshr_attribute_mod - - use seq_flds_mod - use seq_comm_mct - use ESMF - - implicit none - - private - - public :: esmfshr_attribute_appl_init, esmfshr_attribute_fields_init - -!---------------------------------------------------------------------------- - contains -!---------------------------------------------------------------------------- - - -!---------------------------------------------------------------------------- -! Application attribute initialization -!---------------------------------------------------------------------------- - - subroutine esmfshr_attribute_appl_init(comp, rc) - - implicit none - - type(ESMF_CplComp), intent(inout) :: comp - integer, intent(out) :: rc - - integer :: localrc - character(ESMF_MAXSTR) :: convCIM, purpComp - - rc = ESMF_SUCCESS -#ifdef USE_ESMF_METADATA - convCIM = 'CIM' - purpComp = 'Model Component Simulation Description' - - call ESMF_AttributeAdd(comp, & - convention=convCIM, purpose=purpComp, rc=localrc) - - call ESMF_AttributeSet(comp, & - 'ShortName', 'CESM', & - convention=convCIM, purpose=purpComp, rc=localrc) - call ESMF_AttributeSet(comp, & - 'LongName', & - 'Community Earth System Model', & - convention=convCIM, purpose=purpComp, rc=localrc) - call ESMF_AttributeSet(comp, & - 'Description', & - "The Community Earth System Model (CESM) is " // & - "a coupled climate model for simulating the " // & - "earth's climate system. Composed of four " // & - "separate models simultaneously simulating " // & - "the earth's atmosphere, ocean, land surface " // & - "and sea-ice, and one central coupler " // & - "component, the CESM allows researchers to " // & - "conduct fundamental research into the " // & - "earth's past, present and future climate " // & - "states.", & - convention=convCIM, purpose=purpComp, rc=localrc) - call ESMF_AttributeSet(comp, & - 'ReleaseDate', '2010', & - convention=convCIM, purpose=purpComp, rc=localrc) - call ESMF_AttributeSet(comp, & - 'ModelType', 'Earth System', & - convention=convCIM, purpose=purpComp, rc=localrc) - call ESMF_AttributeSet(comp, & - 'URL', 'www.cesm.ucar.edu', & - convention=convCIM, purpose=purpComp, rc=localrc) - - rc = localrc -#endif - - end subroutine - - -!---------------------------------------------------------------------------- -! Field attribute initialization -!---------------------------------------------------------------------------- - - subroutine esmfshr_attribute_fields_init(cesmState, rc) - - implicit none - - type(ESMF_State), intent(inout) :: cesmState - integer, intent(out) :: rc - - ! Local variables - integer :: localrc - - rc = ESMF_SUCCESS -#ifdef USE_ESMF_METADATA - -! call ESMF_LogWrite('a2x fields = >'//trim(seq_flds_a2x_fields)//'<', & -! ESMF_LOG_INFO, rc=localrc) - - call esmfshr_attribute_field_init( & - seq_flds_a2x_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_x2a_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_i2x_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_x2i_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_l2x_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_x2l_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_o2x_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_x2o_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_g2x_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_x2g_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_xao_fields, cesmState, rc=localrc) - call esmfshr_attribute_field_init( & - seq_flds_r2x_fields, cesmState, rc=localrc) - - rc = localrc -#endif - - end subroutine - - - subroutine esmfshr_attribute_field_init(fieldList, state, rc) - - implicit none - - character(len=*), intent(in) :: fieldList - type(ESMF_State), intent(inout) :: state - integer, intent(out) :: rc - - ! Local variables - character(ESMF_MAXSTR) :: convCIM, purpField - character(ESMF_MAXSTR),dimension(4) :: attrList - - integer :: i - integer :: localrc - integer :: nFields - integer :: curIndex, preIndex - - character(len=80) :: shortname, longname, stdname, units - character(len=80) :: str - - type(ESMF_Field), allocatable, dimension(:) :: fields - type(ESMF_FieldBundle) :: fbundle - !type(ESMF_LOG) :: alog - - rc = ESMF_SUCCESS - -#ifdef USE_ESMF_METADATA - ! Set up the attribute descriptions - convCIM = 'CIM' - purpField = 'Inputs Description' - - !--- make sure field list is not empty --- - if (trim(fieldList) /= ':') then - - !--- get number of fields in the list --- - nFields = 0 - do i = 1, len_trim(fieldList) - if (fieldList(i:i) == ':') nFields = nFields+1 - end do - nFields = nFields +1 - - !--- write log --- -! call ESMF_LogWrite('Field list = >'//trim(fieldList)//'<', & -! ESMF_LOG_INFO, rc=localrc) -! write(str, fmt='("Field count = ", I5)') nFields -! call ESMF_LogWrite(str, ESMF_LOG_INFO, rc=localrc) - - !--- allocate ESMF_Field array --- - if (allocated(fields)) deallocate(fields) - allocate(fields(nFields)) - - !--- set initial values of indices --- - curIndex = index(fieldList, ':') - preIndex = 1 - - !--- set attribute list --- - attrList(1) = 'ShortName' - attrList(2) = 'StandardName' - attrList(3) = 'LongName' - attrList(4) = 'Units' -! -! KDS: Do I need to add these attributes for each of the fields, or for just -! specific fields??? -! - !attrList(5) = 'InputType' - !attrList(6) = 'InputTargetComponent' - !attrList(7) = 'InputSpatialRegriddingMethod' - !attrList(8) = 'InputSpatialRegriddingType' - !attrList(9) = 'InputFrequency' - !attrList(10) = 'InputTimeTransformationType' - - ! Go through the list of fields in fieldList - i = 0 - do while (curIndex > preIndex) - - i = i + 1 - shortname = fieldList(preIndex:curIndex - 1) -! call ESMF_LogWrite('KDS: shortname => ' //trim(shortname)// ' <', & -! ESMF_LOG_INFO, rc=localrc) - - !--- create empty ESMF_Field --- - fields(i) = ESMF_FieldEmptyCreate(name=trim(shortname), rc=localrc) - - !--- get field metadata --- - call seq_flds_esmf_metadata_get(shortname, longname, stdname, units) - -! call ESMF_LogWrite(trim(shortname)//' '// & -! trim(longname)//' '// & -! trim(stdname)//' '// & -! trim(units), ESMF_LOG_INFO, rc=localrc) - - !--- add attributes --- - call ESMF_AttributeAdd(fields(i), & - convention=convCIM, purpose=purpField, & - rc=localrc) - - call ESMF_AttributeSet(fields(i), & - name=attrList(1), value=trim(shortname), & - convention=convCIM, purpose=purpField, & - rc=localrc) - call ESMF_AttributeSet(fields(i), & - name=attrList(2), value=trim(stdname), & - convention=convCIM, purpose=purpField, & - rc=localrc) - call ESMF_AttributeSet(fields(i), & - name=attrList(3), value=trim(longname), & - convention=convCIM, purpose=purpField, & - rc=localrc) - call ESMF_AttributeSet(fields(i), & - name=attrList(4), value=trim(units), & - convention=convCIM, purpose=purpField, & - rc=localrc) - - !--- set current and previous index --- - preIndex = curIndex + 1 - curIndex = curIndex + index(fieldList(preIndex:), ':') - - end do - -! -! KDS: There is a smarter way to do this than to just repeat this stuff... -! maybe use a for loop instead of a do loop... is there a for loop in -! fortran??? -! - i = i + 1 - shortname = fieldList(preIndex:curIndex - 1) - - !--- create empty ESMF_Field --- - fields(i) = ESMF_FieldEmptyCreate(name=trim(shortname), rc=localrc) - - !--- get field metadata --- - call seq_flds_esmf_metadata_get(shortname, longname, stdname, units) - - !--- add attributes --- - call ESMF_AttributeAdd(fields(i), & - convention=convCIM, purpose=purpField, & - rc=localrc) - - call ESMF_AttributeSet(fields(i), & - name=attrList(1), value=trim(shortname), & - convention=convCIM, purpose=purpField, & - rc=localrc) - call ESMF_AttributeSet(fields(i), & - name=attrList(2), value=trim(stdname), & - convention=convCIM, purpose=purpField, & - rc=localrc) - call ESMF_AttributeSet(fields(i), & - name=attrList(3), value=trim(longname), & - convention=convCIM, purpose=purpField, & - rc=localrc) - call ESMF_AttributeSet(fields(i), & - name=attrList(4), value=trim(units), & - convention=convCIM, purpose=purpField, & - rc=localrc) - - !--- create ESMF FieldBundle --- - fbundle = ESMF_FieldBundleCreate(name="fbundle", rc=localrc) - - !--- add the Fields to the FieldBundle --- - nFields = i - do i = 1, nFields - call ESMF_FieldBundleAdd(fbundle, (/Fields(i)/), rc=localrc) - end do - - !--- create ESMF State using ESMF FieldBundle --- - call ESMF_StateAdd(state, (/fbundle/), rc=localrc) - - end if - - rc = localrc -#endif - - end subroutine - -end module esmfshr_attribute_mod diff --git a/driver_cpl/shr_esmf/esmfshr_infodata_mod.F90 b/driver_cpl/shr_esmf/esmfshr_infodata_mod.F90 deleted file mode 100644 index bf11be0abc31..000000000000 --- a/driver_cpl/shr_esmf/esmfshr_infodata_mod.F90 +++ /dev/null @@ -1,1249 +0,0 @@ -module esmfshr_infodata_mod -#ifdef USE_ESMF_LIB - -use ESMF -use seq_infodata_mod -use shr_kind_mod, only : SHR_KIND_CS, SHR_KIND_CL, SHR_KIND_IN, & - SHR_KIND_R8, SHR_KIND_I8 -use shr_sys_mod, only : shr_sys_abort - -implicit none - -public esmfshr_infodata_state2infodata -public esmfshr_infodata_infodata2state -private - -contains - -!-------------------------------------------------------------------- -subroutine esmfshr_infodata_infodata2state(infodata, state, ID, rc) - - implicit none - - !inout parameters - type(seq_infodata_type), intent(inout) :: infodata - type(ESMF_State), intent(inout) :: state - integer, intent(in), optional :: ID - integer, intent(out), optional :: rc - - integer :: localrc, lID - character(len=*),parameter :: subname = 'esmfshr_infodata_infodata2state' - - if(present(rc)) rc = ESMF_SUCCESS - - lID = -1 - if (present(ID)) then - lID = ID - endif - - call esmfshr_infodata_convert(infodata,lID,state,'i2s',localrc) - -end subroutine esmfshr_infodata_infodata2state -!-------------------------------------------------------------------- -subroutine esmfshr_infodata_state2infodata(state, infodata, ID, rc) - - implicit none - - !inout parameters - type(seq_infodata_type), intent(inout) :: infodata - type(ESMF_State), intent(inout) :: state - integer, intent(out), optional :: ID - integer, intent(out), optional :: rc - - integer :: localrc, lID - character(len=*),parameter :: subname = 'esmfshr_infodata_state2infodata' - - if(present(rc)) rc = ESMF_SUCCESS - - call esmfshr_infodata_convert(infodata,lID,state,'s2i',localrc) - - if (present(ID)) then - ID = lID - endif - -end subroutine esmfshr_infodata_state2infodata -!-------------------------------------------------------------------- - -subroutine esmfshr_infodata_convert(infodata,ID,state,direction,rc) - - type(seq_infodata_type), intent(inout) :: infodata - integer, intent(inout) :: ID - type(ESMF_State), intent(inout) :: state - character(len=*), intent(in) :: direction - integer, intent(out), optional :: rc - - ! local variables - integer :: int_buf - logical :: log_buf - real(SHR_KIND_R8) :: real_buf - character(SHR_KIND_CL) :: char_buf - logical :: i2s - - integer :: localrc - character(len=*),parameter :: subname = 'esmfshr_infodata_convert' - - if(present(rc)) rc = ESMF_SUCCESS - - if (trim(direction) == 'i2s') then - i2s = .true. - elseif (trim(direction) == 's2i') then - i2s = .false. - else - write(6,*) subname,' ERROR: unknown direction ',trim(direction) - call shr_sys_abort() - endif - - if (i2s) then - call ESMF_AttributeSet(state, name="ID", value=ID, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ID", value=ID, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, start_type=char_buf) - call ESMF_AttributeSet(state, name="start_type", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="start_type", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, start_type=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, case_name=char_buf) - call ESMF_AttributeSet(state, name="case_name", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="case_name", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, case_name=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, case_desc=char_buf) - call ESMF_AttributeSet(state, name="case_desc", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="case_desc", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, case_desc=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, model_version=char_buf) - call ESMF_AttributeSet(state, name="model_version", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="model_version", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, model_version=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, username=char_buf) - call ESMF_AttributeSet(state, name="username", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="username", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, username=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, hostname=char_buf) - call ESMF_AttributeSet(state, name="hostname", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="hostname", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, hostname=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, timing_dir=char_buf) - call ESMF_AttributeSet(state, name="timing_dir", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="timing_dir", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, timing_dir=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, tchkpt_dir=char_buf) - call ESMF_AttributeSet(state, name="tchkpt_dir", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="tchkpt_dir", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, tchkpt_dir=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_adiabatic=log_buf) - call ESMF_AttributeSet(state, name="atm_adiabatic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_adiabatic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_adiabatic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_ideal_phys=log_buf) - call ESMF_AttributeSet(state, name="atm_ideal_phys", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_ideal_phys", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_ideal_phys=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, aqua_planet=log_buf) - call ESMF_AttributeSet(state, name="aqua_planet", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="aqua_planet", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, aqua_planet=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, run_barriers=log_buf) - call ESMF_AttributeSet(state, name="run_barriers", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="run_barriers", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, run_barriers=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, brnch_retain_casename=log_buf) - call ESMF_AttributeSet(state, name="brnch_retain_casename", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="brnch_retain_casename", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, brnch_retain_casename=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, read_restart=log_buf) - call ESMF_AttributeSet(state, name="read_restart", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="read_restart", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, read_restart=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, restart_pfile=char_buf) - call ESMF_AttributeSet(state, name="restart_pfile", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="restart_pfile", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, restart_pfile=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, restart_file=char_buf) - call ESMF_AttributeSet(state, name="restart_file", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="restart_file", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, restart_file=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, single_column=log_buf) - call ESMF_AttributeSet(state, name="single_column", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="single_column", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, single_column=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, scmlat=real_buf) - call ESMF_AttributeSet(state, name="scmlat", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="scmlat", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, scmlat=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, scmlon=real_buf) - call ESMF_AttributeSet(state, name="scmlon", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="scmlon", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, scmlon=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, logFilePostFix=char_buf) - call ESMF_AttributeSet(state, name="logFilePostFix", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="logFilePostFix", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, logFilePostFix=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, outPathRoot=char_buf) - call ESMF_AttributeSet(state, name="outPathRoot", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="outPathRoot", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, outPathRoot=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, perpetual=log_buf) - call ESMF_AttributeSet(state, name="perpetual", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="perpetual", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, perpetual=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, perpetual_ymd=int_buf) - call ESMF_AttributeSet(state, name="perpetual_ymd", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="perpetual_ymd", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, perpetual_ymd=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_mode=char_buf) - call ESMF_AttributeSet(state, name="orb_mode", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_mode", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_mode=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_iyear=int_buf) - call ESMF_AttributeSet(state, name="orb_iyear", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_iyear", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_iyear=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_iyear_align=int_buf) - call ESMF_AttributeSet(state, name="orb_iyear_align", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_iyear_align", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_iyear_align=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_eccen=real_buf) - call ESMF_AttributeSet(state, name="orb_eccen", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_eccen", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_eccen=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_obliqr=real_buf) - call ESMF_AttributeSet(state, name="orb_obliqr", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_obliqr", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_obliqr=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_lambm0=real_buf) - call ESMF_AttributeSet(state, name="orb_lambm0", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_lambm0", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_lambm0=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_mvelpp=real_buf) - call ESMF_AttributeSet(state, name="orb_mvelpp", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_mvelpp", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_mvelpp=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_obliq=real_buf) - call ESMF_AttributeSet(state, name="orb_obliq", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_obliq", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_obliq=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, orb_mvelp=real_buf) - call ESMF_AttributeSet(state, name="orb_mvelp", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="orb_mvelp", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, orb_mvelp=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, flux_epbal=char_buf) - call ESMF_AttributeSet(state, name="flux_epbal", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="flux_epbal", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, flux_epbal=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, flux_albav=log_buf) - call ESMF_AttributeSet(state, name="flux_albav", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="flux_albav", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, flux_albav=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, wall_time_limit=real_buf) - call ESMF_AttributeSet(state, name="wall_time_limit", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="wall_time_limit", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, wall_time_limit=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, force_stop_at=char_buf) - call ESMF_AttributeSet(state, name="force_stop_at", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="force_stop_at", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, force_stop_at=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_gnam=char_buf) - call ESMF_AttributeSet(state, name="atm_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_gnam=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, lnd_gnam=char_buf) - call ESMF_AttributeSet(state, name="lnd_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="lnd_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, lnd_gnam=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ocn_gnam=char_buf) - call ESMF_AttributeSet(state, name="ocn_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ocn_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ocn_gnam=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ice_gnam=char_buf) - call ESMF_AttributeSet(state, name="ice_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ice_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ice_gnam=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rof_gnam=char_buf) - call ESMF_AttributeSet(state, name="rof_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rof_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rof_gnam=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glc_gnam=char_buf) - call ESMF_AttributeSet(state, name="glc_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glc_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glc_gnam=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, wav_gnam=char_buf) - call ESMF_AttributeSet(state, name="wav_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="wav_gnam", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, wav_gnam=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, shr_map_dopole=log_buf) - call ESMF_AttributeSet(state, name="shr_map_dopole", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="shr_map_dopole", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, shr_map_dopole=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, vect_map=char_buf) - call ESMF_AttributeSet(state, name="vect_map", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="vect_map", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, vect_map=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, aoflux_grid=char_buf) - call ESMF_AttributeSet(state, name="aoflux_grid", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="aoflux_grid", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, aoflux_grid=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, cpl_seq_option=char_buf) - call ESMF_AttributeSet(state, name="cpl_seq_option", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="cpl_seq_option", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, cpl_seq_option=char_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, cpl_cdf64=log_buf) - call ESMF_AttributeSet(state, name="cpl_cdf64", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="cpl_cdf64", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, cpl_cdf64=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, do_budgets=log_buf) - call ESMF_AttributeSet(state, name="do_budgets", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="do_budgets", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, do_budgets=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, budget_inst=int_buf) - call ESMF_AttributeSet(state, name="budget_inst", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="budget_inst", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, budget_inst=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, budget_daily=int_buf) - call ESMF_AttributeSet(state, name="budget_daily", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="budget_daily", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, budget_daily=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, budget_month=int_buf) - call ESMF_AttributeSet(state, name="budget_month", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="budget_month", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, budget_month=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, budget_ann=int_buf) - call ESMF_AttributeSet(state, name="budget_ann", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="budget_ann", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, budget_ann=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, budget_ltann=int_buf) - call ESMF_AttributeSet(state, name="budget_ltann", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="budget_ltann", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, budget_ltann=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, budget_ltend=int_buf) - call ESMF_AttributeSet(state, name="budget_ltend", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="budget_ltend", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, budget_ltend=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, drv_threading=log_buf) - call ESMF_AttributeSet(state, name="drv_threading", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="drv_threading", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, drv_threading=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, eps_frac=real_buf) - call ESMF_AttributeSet(state, name="eps_frac", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="eps_frac", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, eps_frac=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, eps_amask=real_buf) - call ESMF_AttributeSet(state, name="eps_amask", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="eps_amask", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, eps_amask=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, eps_agrid=real_buf) - call ESMF_AttributeSet(state, name="eps_agrid", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="eps_agrid", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, eps_agrid=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, eps_aarea=real_buf) - call ESMF_AttributeSet(state, name="eps_aarea", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="eps_aarea", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, eps_aarea=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, eps_omask=real_buf) - call ESMF_AttributeSet(state, name="eps_omask", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="eps_omask", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, eps_omask=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, eps_ogrid=real_buf) - call ESMF_AttributeSet(state, name="eps_ogrid", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="eps_ogrid", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, eps_ogrid=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, eps_oarea=real_buf) - call ESMF_AttributeSet(state, name="eps_oarea", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="eps_oarea", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, eps_oarea=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, info_debug=int_buf) - call ESMF_AttributeSet(state, name="info_debug", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="info_debug", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, info_debug=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, bfbflag=log_buf) - call ESMF_AttributeSet(state, name="bfbflag", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="bfbflag", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, bfbflag=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_present=log_buf) - call ESMF_AttributeSet(state, name="atm_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_prognostic=log_buf) - call ESMF_AttributeSet(state, name="atm_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, lnd_present=log_buf) - call ESMF_AttributeSet(state, name="lnd_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="lnd_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, lnd_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, lnd_prognostic=log_buf) - call ESMF_AttributeSet(state, name="lnd_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="lnd_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, lnd_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rof_present=log_buf) - call ESMF_AttributeSet(state, name="rof_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rof_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rof_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rofice_present=log_buf) - call ESMF_AttributeSet(state, name="rofice_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rofice_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rofice_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rof_prognostic=log_buf) - call ESMF_AttributeSet(state, name="rof_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rof_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rof_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, flood_present=log_buf) - call ESMF_AttributeSet(state, name="flood_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="flood_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, flood_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ocn_present=log_buf) - call ESMF_AttributeSet(state, name="ocn_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ocn_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ocn_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ocn_prognostic=log_buf) - call ESMF_AttributeSet(state, name="ocn_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ocn_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ocn_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ocnrof_prognostic=log_buf) - call ESMF_AttributeSet(state, name="ocnrof_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ocnrof_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ocnrof_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ice_present=log_buf) - call ESMF_AttributeSet(state, name="ice_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ice_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ice_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ice_prognostic=log_buf) - call ESMF_AttributeSet(state, name="ice_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ice_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ice_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, iceberg_prognostic=log_buf) - call ESMF_AttributeSet(state, name="iceberg_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="iceberg_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, iceberg_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glc_present=log_buf) - call ESMF_AttributeSet(state, name="glc_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glc_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glc_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glclnd_present=log_buf) - call ESMF_AttributeSet(state, name="glclnd_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glclnd_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glclnd_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glcocn_present=log_buf) - call ESMF_AttributeSet(state, name="glcocn_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glcocn_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glcocn_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glcice_present=log_buf) - call ESMF_AttributeSet(state, name="glcice_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glcice_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glcice_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glc_prognostic=log_buf) - call ESMF_AttributeSet(state, name="glc_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glc_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glc_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, wav_present=log_buf) - call ESMF_AttributeSet(state, name="wav_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="wav_present", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, wav_present=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, wav_prognostic=log_buf) - call ESMF_AttributeSet(state, name="wav_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="wav_prognostic", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, wav_prognostic=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, dead_comps=log_buf) - call ESMF_AttributeSet(state, name="dead_comps", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="dead_comps", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, dead_comps=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_nx=int_buf) - call ESMF_AttributeSet(state, name="atm_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_nx=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_ny=int_buf) - call ESMF_AttributeSet(state, name="atm_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_ny=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, lnd_nx=int_buf) - call ESMF_AttributeSet(state, name="lnd_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="lnd_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, lnd_nx=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, lnd_ny=int_buf) - call ESMF_AttributeSet(state, name="lnd_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="lnd_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, lnd_ny=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ice_nx=int_buf) - call ESMF_AttributeSet(state, name="ice_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ice_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ice_nx=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ice_ny=int_buf) - call ESMF_AttributeSet(state, name="ice_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ice_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ice_ny=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ocn_nx=int_buf) - call ESMF_AttributeSet(state, name="ocn_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ocn_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ocn_nx=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ocn_ny=int_buf) - call ESMF_AttributeSet(state, name="ocn_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ocn_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ocn_ny=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rof_nx=int_buf) - call ESMF_AttributeSet(state, name="rof_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rof_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rof_nx=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rof_ny=int_buf) - call ESMF_AttributeSet(state, name="rof_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rof_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rof_ny=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glc_nx=int_buf) - call ESMF_AttributeSet(state, name="glc_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glc_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glc_nx=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glc_ny=int_buf) - call ESMF_AttributeSet(state, name="glc_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glc_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glc_ny=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, wav_nx=int_buf) - call ESMF_AttributeSet(state, name="wav_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="wav_nx", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, wav_nx=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, wav_ny=int_buf) - call ESMF_AttributeSet(state, name="wav_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="wav_ny", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, wav_ny=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, nextsw_cday=real_buf) - call ESMF_AttributeSet(state, name="nextsw_cday", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="nextsw_cday", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, nextsw_cday=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, precip_fact=real_buf) - call ESMF_AttributeSet(state, name="precip_fact", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="precip_fact", value=real_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, precip_fact=real_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_phase=int_buf) - call ESMF_AttributeSet(state, name="atm_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_phase=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, lnd_phase=int_buf) - call ESMF_AttributeSet(state, name="lnd_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="lnd_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, lnd_phase=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rof_phase=int_buf) - call ESMF_AttributeSet(state, name="rof_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rof_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rof_phase=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ice_phase=int_buf) - call ESMF_AttributeSet(state, name="ice_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ice_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ice_phase=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, ocn_phase=int_buf) - call ESMF_AttributeSet(state, name="ocn_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="ocn_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, ocn_phase=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glc_phase=int_buf) - call ESMF_AttributeSet(state, name="glc_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glc_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glc_phase=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, wav_phase=int_buf) - call ESMF_AttributeSet(state, name="wav_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="wav_phase", value=int_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, wav_phase=int_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glcrun_alarm=log_buf) - call ESMF_AttributeSet(state, name="glcrun_alarm", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glcrun_alarm", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glcrun_alarm=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, atm_aero=log_buf) - call ESMF_AttributeSet(state, name="atm_aero", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="atm_aero", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, atm_aero=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, glc_g2lupdate=log_buf) - call ESMF_AttributeSet(state, name="glc_g2lupdate", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="glc_g2lupdate", value=log_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, glc_g2lupdate=log_buf) - endif - - if (i2s) then - call seq_infodata_Getdata(infodata, rest_case_name=char_buf) - call ESMF_AttributeSet(state, name="rest_case_name", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(state, name="rest_case_name", value=char_buf, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call seq_infodata_Putdata(infodata, rest_case_name=char_buf) - endif - -end subroutine esmfshr_infodata_convert - -!-------------------------------------------------------------------- - -#endif -end module esmfshr_infodata_mod diff --git a/driver_cpl/shr_esmf/esmfshr_mod.F90 b/driver_cpl/shr_esmf/esmfshr_mod.F90 deleted file mode 100644 index 5297d9af43b7..000000000000 --- a/driver_cpl/shr_esmf/esmfshr_mod.F90 +++ /dev/null @@ -1,37 +0,0 @@ -module esmfshr_mod -#ifdef USE_ESMF_LIB - -! Author: Fei Liu - -use esmf2mct_mod -use mct2esmf_mod -use esmfshr_util_mod -use esmfshr_infodata_mod - -implicit none - -private - -public esmf2mct_init -public esmf2mct_copy -public mct2esmf_init -public mct2esmf_copy -public mct2esmf_create -public esmfshr_util_ArrayGetIndex -public esmfshr_util_ArrayGetName -public esmfshr_util_ArrayGetSize -public esmfshr_util_ArrayGetField -public esmfshr_util_ArrayPutField -public esmfshr_util_DistgridCreate -public esmfshr_util_StateArrayDestroy -public esmfshr_util_StateADistgridDestroy -public esmfshr_util_CheckRC -public esmfshr_util_ArrayCopy -public esmfshr_util_ArraySum -public esmfshr_util_ArrayZero -public esmfshr_util_ArrayAvg -public esmfshr_infodata_infodata2state -public esmfshr_infodata_state2infodata - -#endif -end module diff --git a/driver_cpl/shr_esmf/esmfshr_util_mod.F90 b/driver_cpl/shr_esmf/esmfshr_util_mod.F90 deleted file mode 100644 index 1e5403887352..000000000000 --- a/driver_cpl/shr_esmf/esmfshr_util_mod.F90 +++ /dev/null @@ -1,664 +0,0 @@ -module esmfshr_util_mod -#ifdef USE_ESMF_LIB - -use ESMF -use shr_kind_mod, only : SHR_KIND_IN -use shr_string_mod, only : shr_string_ListGetNum -use shr_string_mod, only : shr_string_ListGetIndexF -use shr_string_mod, only : shr_string_ListGetName -use shr_sys_mod, only : shr_sys_flush, shr_sys_abort -use shr_log_mod, only : shr_log_unit, shr_log_level - -implicit none - -! -! Author: Fei Liu -! -! public methods from this module, another layer of utils take these -! array related methods and put them into interface blocks. user using -! the higher level utils module see/use names such as esmf2mct_init, etc -! -public esmfshr_util_ArrayCopy -public esmfshr_util_ArraySum -public esmfshr_util_ArrayZero -public esmfshr_util_ArrayAvg -public esmfshr_util_ArrayGetIndex -public esmfshr_util_ArrayGetName -public esmfshr_util_ArrayGetSize -public esmfshr_util_ArrayPutField -public esmfshr_util_ArrayGetField -public esmfshr_util_DistgridCreate -public esmfshr_util_StateArrayDestroy -public esmfshr_util_StateADistgridDestroy -public esmfshr_util_CheckRC - -private - -contains - -!-------------------------------------------------------------------------- - -! query the n-th index position of a string from colon delimited strings -! it's not the position of the rattr. -function esmfshr_util_ArrayGetIndex(array, rattr, meta_attname, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(inout) :: array - character(len=*), intent(in) :: rattr - character(len=*), intent(in), optional :: meta_attname - integer, intent(out), optional :: rc - - ! return - integer :: esmfshr_util_ArrayGetIndex - - ! local - integer :: attr_len, shift, localrc - character(len=9) :: meta_str = 'mct_names' - character(len=8196) :: rattrs - logical :: found, last - character(len=*),parameter :: subname = 'esmfshr_util_ArrayGetIndex' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - esmfshr_util_ArrayGetIndex = 0 - found = .false. - last = .false. - - attr_len = len_trim(rattr) - - if(present(meta_attname)) then - call ESMF_AttributeGet(array, name=meta_attname, value=rattrs, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(array, name=meta_str, value=rattrs, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - esmfshr_util_ArrayGetIndex = shr_string_listGetIndexF(trim(rattrs),trim(rattr)) - -end function esmfshr_util_ArrayGetIndex - -!-------------------------------------------------------------------------- - -! query the n-th index position of a string from colon delimited strings -! it's not the position of the rattr. -subroutine esmfshr_util_ArrayGetName(array, kfld, name, meta_attname, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(inout) :: array - integer, intent(in) :: kfld - character(len=*), intent(out) :: name - character(len=*), intent(in), optional :: meta_attname - integer, intent(out), optional :: rc - - ! local - integer :: localrc - character(len=9) :: meta_str = 'mct_names' - character(len=8196) :: rattrs - character(len=*),parameter :: subname = 'esmfshr_util_ArrayGetName' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - name = '' - - if(present(meta_attname)) then - call ESMF_AttributeGet(array, name=meta_attname, value=rattrs, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_AttributeGet(array, name=meta_str, value=rattrs, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - call shr_string_listGetName(trim(rattrs),kfld,name) - -end subroutine esmfshr_util_ArrayGetName - -!-------------------------------------------------------------------------- - -! query the n-th index position of a string from colon delimited strings -! it's not the position of the rattr. -subroutine esmfshr_util_ArrayGetSize(array, lsize1, lsize2, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(in) :: array - integer, intent(out),optional :: lsize1 - integer, intent(out),optional :: lsize2 - integer, intent(out),optional :: rc - - ! local - integer :: s1, s2, lrc - real(ESMF_KIND_R8), pointer :: fptr(:, :) - character(len=*),parameter :: subname = 'esmfshr_util_ArrayGetSize' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, localDe=0, farrayPtr = fptr, rc=lrc) - if(lrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=lrc, endflag=ESMF_END_ABORT) -! call ESMF_ArrayGet(array, dim=1, localDe=0, indexCount=s1) -! call ESMF_ArrayGet(array, dim=2, localDe=0, indexCount=s2) - - s1 = ubound(fptr,1) - lbound(fptr,1) + 1 - s2 = ubound(fptr,2) - lbound(fptr,2) + 1 - - if (present(lsize1)) then - lsize1 = s1 - endif - - if (present(lsize2)) then - lsize2 = s2 - endif - -end subroutine esmfshr_util_ArrayGetSize - -!-------------------------------------------------------------------------- - -! put a field into the array -subroutine esmfshr_util_ArrayPutField(array, fname, buf, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(inout) :: array - character(len=*), intent(in) :: fname - real*8, pointer, intent(in) :: buf(:) - integer, intent(out), optional :: rc - - ! local - integer :: localrc,sa,sb,lba2,uba2 - integer :: nfld - real(ESMF_KIND_R8), pointer :: fptr(:,:) - character(len=*),parameter :: subname = 'esmfshr_util_ArrayPutField' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - sa = -999 - sb = -999 - lba2 = -999 - uba2 = -999 - nfld = -999 - - nfld = esmfshr_util_ArrayGetIndex(array,fname) - - if (nfld < 1) then - write(shr_log_unit,*) subname,' ERROR: fld not found on array ',trim(fname) -!! call shr_sys_abort(subname) - endif - - sb = size(buf) - call esmfshr_util_ArrayGetSize(array, lsize2=sa) - - call ESMF_ArrayGet(array, localDe=0, farrayPtr=fptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - lba2 = lbound(fptr,2) - uba2 = ubound(fptr,2) - - if (sb /= sa .or. sa /= uba2-lba2+1 ) then - write(shr_log_unit,*) subname,' ERROR: sb /= sa',sb,sa,trim(fname),lba2,uba2 - call shr_sys_abort(subname) - endif - - fptr(nfld,lba2:uba2) = buf(1:sa) - -end subroutine esmfshr_util_ArrayPutField -!-------------------------------------------------------------------------- - -! put a field into the array -subroutine esmfshr_util_ArrayGetField(array, fname, buf, rc) - - implicit none - - ! inout parameters - type(ESMF_Array), intent(inout) :: array - character(len=*), intent(in) :: fname - real*8, intent(inout) :: buf(:) - integer, intent(out), optional :: rc - - ! local - integer :: localrc,sa,sb,lba2,uba2 - integer :: nfld - real(ESMF_KIND_R8), pointer :: fptr(:,:) - character(len=*),parameter :: subname = 'esmfshr_util_ArrayGetField' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - sa = -999 - sb = -999 - lba2 = -999 - uba2 = -999 - nfld = -999 - - nfld = esmfshr_util_ArrayGetIndex(array,fname) - if (nfld < 1) then - write(shr_log_unit,*) subname,' ERROR: fname not on array ',trim(fname) -!! call shr_sys_abort(subname) - endif - - sb = size(buf) - call esmfshr_util_ArrayGetSize(array, lsize2=sa) - - call ESMF_ArrayGet(array, localDe=0, farrayPtr=fptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - lba2 = lbound(fptr,2) - uba2 = ubound(fptr,2) - - if (sa /= sb .or. sa /= uba2-lba2+1) then - write(shr_log_unit,*) subname,' ERROR: sa /= sb',sb,sa,trim(fname),lba2,uba2 - call shr_sys_abort(subname) - endif - - buf = 0.0 - buf(1:sa) = fptr(nfld,lba2:uba2) - -end subroutine esmfshr_util_ArrayGetField -!-------------------------------------------------------------------------- - -! put a field into the array -subroutine esmfshr_util_StateArrayDestroy(state, array_name, rc) - - implicit none - - ! inout parameters - type(ESMF_State), intent(inout) :: state - character(len=*), intent(in) :: array_name - integer, intent(out), optional :: rc - - ! local - type(ESMF_Array) :: array - type(ESMF_DistGrid) :: distgrid - integer :: lrc - character(len=*),parameter :: subname = 'esmfshr_util_StateArrayDestroy' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_StateGet(state, itemName=trim(array_name), array=array, rc=lrc) - call esmfshr_util_CheckRC(lrc,trim(subname)//':StateGet array') - - call ESMF_ArrayGet(array, distgrid=distgrid, rc=lrc) - call esmfshr_util_CheckRC(lrc,trim(subname)//':ArrayGet distgrid') - -! not safe in esmf -! call ESMF_DistgridDestroy(distgrid, rc=lrc) -! call esmfshr_util_CheckRC(lrc,trim(subname)//':DistgridDestroy distgrid') - - call ESMF_ArrayDestroy(array, rc=lrc) - call esmfshr_util_CheckRC(lrc,trim(subname)//':ArrayDestroy array') - -end subroutine esmfshr_util_StateArrayDestroy - -!-------------------------------------------------------------------------- - -! initialize a distgrid -subroutine esmfshr_util_DistgridCreate(distgrid, gsize,nxg,nyg,mpicom,decomp,rc) - - implicit none - - ! inout parameters - type(ESMF_distgrid), intent(inout) :: distgrid - integer(SHR_KIND_IN),intent(out) :: gsize - integer(SHR_KIND_IN),intent(in) :: nxg - integer(SHR_KIND_IN),intent(in) :: nyg - integer(SHR_KIND_IN),intent(in) :: mpicom - character(len=*), intent(in) :: decomp - integer, intent(out), optional :: rc - - ! local - - integer(SHR_KIND_IN) :: k,n,npes,ierr,i, my_task - integer(SHR_KIND_IN), pointer :: start(:) ! for gsmap initialization - integer(SHR_KIND_IN), pointer :: length(:) ! for gsmap initialization - integer(SHR_KIND_IN), pointer :: pe_loc(:) ! for gsmap initialization - integer(SHR_KIND_IN), pointer :: arbIndex(:) ! for gsmap initialization - integer(SHR_KIND_IN), pointer :: deBlockList(:,:,:) ! for gsmap initialization - character(*), parameter :: subname = '(distgrid_create) ' - character(*), parameter :: F00 = "('(distgrid_create) ',8a)" - character(*), parameter :: F01 = "('(distgrid_create) ',a,7i8)" - character(*), parameter :: F02 = "('(distgrid_create) ',a,4i8)" - - ! --------------------------------------------- - rc = ESMF_SUCCESS - - call mpi_comm_size(mpicom,npes,ierr) - call mpi_comm_rank(mpicom,my_task,ierr) - allocate(start(npes),length(npes),pe_loc(npes)) - - start = 0 - length = 0 - gsize = nxg*nyg - if (gsize > 0) then - allocate(deBlockList(1,2,npes)) - do n = 1,npes - if (trim(decomp) == '1d') then - length(n) = gsize/npes - if (n <= mod(gsize,npes)) length(n) = length(n) + 1 - elseif (trim(decomp) == 'root') then - length = 0 - length(1) = gsize - else - call shr_sys_abort(subname//' ERROR decomp not allowed') - endif - if (n == 1) then - start(n) = 1 - else - start(n) = start(n-1) + length(n-1) - endif - pe_loc(n) = n-1 -!debug if (my_task == 0) then -! write(shr_log_unit,F01) 'gsmap: ',my_task,k,n,start(n),length(n),pe_loc(n), gsize -! call shr_sys_flush(shr_log_unit) -! endif - deBlockList(:,1,n) = (/start(n)/) - deBlockList(:,2,n) = (/start(n)+length(n)-1/) - enddo - distgrid = ESMF_DistGridCreate(minIndex=(/1/), maxIndex=(/gsize/), deBlockList=deBlockList, rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - deallocate(deBlockList) - else - distgrid = ESMF_DistGridCreate(minIndex=(/0/), maxIndex=(/-1/), rc=rc) - if(rc /= ESMF_SUCCESS) call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT) - endif - - deallocate(start,length,pe_loc) - -end subroutine esmfshr_util_DistgridCreate - -!-------------------------------------------------------------------------- - -! put a field into the array -subroutine esmfshr_util_StateADistgridDestroy(state, array_name, rc) - - implicit none - - ! inout parameters - type(ESMF_State), intent(inout) :: state - character(len=*), intent(in) :: array_name - integer, intent(out), optional :: rc - - ! local - type(ESMF_Array) :: array - type(ESMF_DistGrid) :: distgrid - integer :: lrc - character(len=*),parameter :: subname = 'esmfshr_util_StateADistgridDestroy' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_StateGet(state, itemName=trim(array_name), array=array, rc=lrc) - call esmfshr_util_CheckRC(lrc,trim(subname)//':StateGet array') - - call ESMF_ArrayGet(array, distgrid=distgrid, rc=lrc) - call esmfshr_util_CheckRC(lrc,trim(subname)//':ArrayGet distgrid') - - call ESMF_DistgridDestroy(distgrid, rc=lrc) - call esmfshr_util_CheckRC(lrc,trim(subname)//':DistgridDestroy distgrid') - -end subroutine esmfshr_util_StateADistgridDestroy -!-------------------------------------------------------------------------- - -! put a field into the array -subroutine esmfshr_util_CheckRC(rc,string,abort) - - implicit none - - ! inout parameters - integer , intent(in) :: rc - character(len=*), intent(in), optional :: string - logical , intent(in), optional :: abort - - ! local - character(len=1024) :: lstring - integer :: lrc - logical :: labort - character(len=*),parameter :: subname = 'esmfshr_util_CheckRC' - !--------------------------------------- - - lstring = '' - if (present(string)) then - lstring = trim(string) - endif - - labort = .true. - if (present(abort)) then - labort = abort - endif - - if (rc /= ESMF_SUCCESS) then - write(shr_log_unit,*) trim(subname),' ERROR: ',trim(lstring) - if (labort) then - call shr_sys_abort(trim(subname)//' ERROR: '//trim(lstring)) - call ESMF_Finalize(rc=lrc, endflag=ESMF_END_ABORT) - endif - endif - -end subroutine esmfshr_util_CheckRC - -!-------------------------------------------------------------------------- - -! copy matching data from src Array to dst Array -subroutine esmfshr_util_ArrayCopy(srcArray, dstArray, rc) - - implicit none - - ! arguments - type(ESMF_Array), intent(inout) :: srcArray - type(ESMF_Array), intent(inout) :: dstArray - integer, intent(out),optional :: rc - - ! local - real(ESMF_KIND_R8), pointer :: srcFptr(:,:), dstFptr(:,:) - integer :: srcLB(2), dstLB(2), srcUB(2), dstUB(2) - integer :: i, j, localrc - integer :: src_nfields, dst_nfields, im - integer, allocatable :: src2dst_map(:) - integer, allocatable :: s1(:),s2(:),d1(:),d2(:) - integer, allocatable :: srcidx(:), dstidx(:) - integer :: ssize,dsize, map_nfields - character(len=8196) :: src_attname, dst_attname - character(len=128) :: src_att, dst_att - character(len=*),parameter :: subname = 'esmfshr_util_ArrayCopy' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(srcArray, localDe=0, farrayPtr=srcFptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call ESMF_ArrayGet(dstArray, localDe=0, farrayPtr=dstFptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeGet(srcArray, name="mct_names", value=src_attname, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call ESMF_AttributeGet(dstArray, name="mct_names", value=dst_attname, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - src_nfields = shr_string_ListGetNum(src_attname) - dst_nfields = shr_string_ListGetNum(dst_attname) - - if (src_nfields < 1 .or. dst_nfields < 1) then - return - endif - - allocate(src2dst_map(src_nfields), stat=localrc) - allocate(s1(src_nfields),s2(src_nfields),stat=localrc) - allocate(d1(dst_nfields),d2(dst_nfields),stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ssize = len_trim(src_attname) - s1(1) = 1 - s2(src_nfields) = ssize - do i = 2,src_nfields - s1(i) = s1(i-1) + index(src_attname(s1(i-1):ssize),':') - s2(i-1) = s1(i) - 2 - enddo - - dsize = len_trim(dst_attname) - d1(1) = 1 - d2(dst_nfields) = dsize - do i = 2,dst_nfields - d1(i) = d1(i-1) + index(dst_attname(d1(i-1):dsize),':') - d2(i-1) = d1(i) - 2 - enddo - - src2dst_map = -1 - ! build the map in O(n*n) time - do i = 1, src_nfields - src_att = src_attname(s1(i):s2(i)) - do j = 1, dst_nfields - dst_att = dst_attname(d1(j):d2(j)) - if(trim(src_att) == trim(dst_att)) then - if(src2dst_map(i) == -1) then - src2dst_map(i) = j - exit ! early exit - else - ! cannot have a single key maps to multiple values, abort - call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - endif - enddo - enddo - - deallocate(s1,s2,d1,d2) - - srcLB = lbound(srcFptr) - dstLB = lbound(dstFptr) - srcUB = ubound(srcFptr) - dstUB = ubound(dstFptr) - if(srcLB(2) /= dstLB(2) .or. srcUB(2) /= dstUB(2)) then - ! src and dst Array must have identical shape, otherwise abort - call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! construct index arrays to speed up copy in linear time - map_nfields = 0 - do i = srcLB(1), srcUB(1) - if(src2dst_map(i) /= -1) map_nfields = map_nfields + 1 - enddo - allocate(srcidx(map_nfields), dstidx(map_nfields), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - j = 1 - do i = srcLB(1), srcUB(1) - if(src2dst_map(i) /= -1) then - srcidx(j) = i - dstidx(j) = src2dst_map(i-srcLB(1)+1) + dstLB(1) - 1 - j = j + 1 - endif - enddo - - ! do data copy, this is faster than reverse loop order and block copy - do j = srcLB(2), srcUB(2) - do i = 1, map_nfields - dstFptr(dstidx(i), j) = srcFptr(srcidx(i), j) - enddo - enddo - - deallocate(src2dst_map, srcidx, dstidx) - -end subroutine esmfshr_util_ArrayCopy - -!-------------------------------------------------------------------------- - -! add matching data values from src Array to dst Array -subroutine esmfshr_util_ArraySum(srcArray, dstArray, rc) - - implicit none - - ! arguments - type(ESMF_Array), intent(inout) :: srcArray - type(ESMF_Array), intent(inout) :: dstArray - integer, intent(out),optional :: rc - ! local - real(ESMF_KIND_R8), pointer :: srcFptr(:,:), dstFptr(:,:) - integer :: srcLB(2), dstLB(2), srcUB(2), dstUB(2) - integer :: i, j, localrc - character(len=*),parameter :: subname = 'esmfshr_util_ArraySum' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(srcArray, localDe=0, farrayPtr=srcFptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call ESMF_ArrayGet(dstArray, localDe=0, farrayPtr=dstFptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - srcLB = lbound(srcFptr) - dstLB = lbound(dstFptr) - srcUB = ubound(srcFptr) - dstUB = ubound(dstFptr) - if(srcLB(1) /= dstLB(1) .or. srcLB(2) /= dstLB(2) .or. & - srcUB(1) /= dstUB(1) .or. srcUB(2) /= dstUB(2)) then - call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - do j = srcLB(2), srcUB(2) - do i = srcLB(1), srcUB(1) - dstFptr(i, j) = dstFptr(i, j) + srcFptr(i, j) - enddo - enddo - -end subroutine esmfshr_util_ArraySum - -!-------------------------------------------------------------------------- - -! zero the values of a esmf Array -subroutine esmfshr_util_ArrayZero(array, rc) - - implicit none - - ! arguments - type(ESMF_Array), intent(inout) :: array - integer, intent(out),optional :: rc - ! local - real(ESMF_KIND_R8), pointer :: fptr(:, :) - integer :: localrc - character(len=*),parameter :: subname = 'esmfshr_util_ArrayZero' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, localDe=0, farrayPtr=fptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - fptr(:, :) = 0.0_ESMF_KIND_R8 - -end subroutine esmfshr_util_ArrayZero - -!-------------------------------------------------------------------------- - -! Average the values of a esmf Array -subroutine esmfshr_util_ArrayAvg(array, count, rc) - - implicit none - - ! arguments - type(ESMF_Array), intent(inout) :: array - integer, intent(in) :: count - integer, intent(out),optional :: rc - ! local - real(ESMF_KIND_R8), pointer :: fptr(:, :) - integer :: localrc - character(len=*),parameter :: subname = 'esmfshr_util_ArrayAvg' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, localDe=0, farrayPtr=fptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - fptr(:, :) = fptr(:, :)/count - -end subroutine esmfshr_util_ArrayAvg - -#endif -end module diff --git a/driver_cpl/shr_esmf/mct2esmf_mod.F90 b/driver_cpl/shr_esmf/mct2esmf_mod.F90 deleted file mode 100644 index 609e7a80c0e7..000000000000 --- a/driver_cpl/shr_esmf/mct2esmf_mod.F90 +++ /dev/null @@ -1,954 +0,0 @@ -module mct2esmf_mod -#ifdef USE_ESMF_LIB - -use ESMF -use esmfshr_util_mod, only : esmfshr_util_ArrayGetSize, esmfshr_util_ArrayCopy -use mct_mod -use esmfshr_util_mod -use shr_string_mod, only: shr_string_listGetNum -use shr_log_mod, only: shr_log_unit, shr_log_level -use shr_sys_mod, only: shr_sys_flush, shr_sys_abort - -implicit none - -! -! Author: Fei Liu -! -! This module implements methods that work with ESMF_Array and MCT attribute -! vectors (attrVect) and global segmentation map (gsMap) -! These methods converts attrVect and gsMap to Array and distgrid. -! Another layer of utils take these -! array related methods and put them into interface blocks. user using -! the higher level utils module see/use names such as esmf2mct_init, etc - -public mct2esmf_copy -public mct2esmf_init -public mct2esmf_create - -private - -interface mct2esmf_init - module procedure mct2esmf_init_Distgrid_GSmap - module procedure mct2esmf_init_Distgrid_Gindex - module procedure mct2esmf_init_Array_AvGSmap - module procedure mct2esmf_init_Array_ArrayGSmap - module procedure mct2esmf_init_Arrays_AvsGSmap - module procedure mct2esmf_init_Array_GindexList - module procedure mct2esmf_init_Array_DistgridList - module procedure mct2esmf_init_Array_gsMapNF - module procedure mct2esmf_init_Array_gsMaprList -end interface - -interface mct2esmf_copy - module procedure mct2esmf_copy_Array_Av - module procedure mct2esmf_copy_alist -end interface - -interface mct2esmf_create - module procedure mct2esmf_create_Array_GSmap - module procedure mct2esmf_create_Array_farrayPtr2DI4 - module procedure mct2esmf_create_Array_farrayPtr1DI4 - module procedure mct2esmf_create_Array_farrayPtr1DR8 -end interface - -#include - -contains -!-------------------------------------------------------------------------- - -! create a ESMF_Array from a 2D I4 Fortray array pointer: the indices vectors. -! First dim is undist dim, 2nd dim is distdim. -! A de-block based distgrid is created from the the distributed dimension of the pointer. -! The pointer is stored as a data pointer inside the created ESMF_Array. -function mct2esmf_create_Array_farrayPtr2DI4(farrayPtr, mpicom, petmap, name, rc) - - implicit none - - ! inout parameters - integer, pointer :: farrayPtr(:,:) ! data pointer - integer, intent(in) , optional :: mpicom ! mpi communicator - integer, pointer, optional :: petmap(:) ! 1 based local to global petmap - character(len=*), intent(in), optional :: name - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_create_Array_farrayPtr2DI4 - - ! local variables - integer :: localrc, listsize, lpet - integer :: vm_comm_id, l_mpicom - type(ESMF_VM) :: vm - type(ESMF_DistGrid) :: distgrid - type(ESMF_DElayout) :: delayout - integer :: localSize(1) ! number of local indices - integer, allocatable :: globalSizes(:) ! array of all sizes - integer :: petCount ! num pets - integer, allocatable :: deblock(:,:,:) ! Array of sizes - integer :: i, csum ! loop variable - integer :: minC(1), maxC(1)! min/max corner - integer :: pet(1) - integer, pointer :: l_petMap(:) ! for custom delayout - character(len=*),parameter :: subname = 'mct2esmf_create_Array_farrayPtr2DI4' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - if(present(mpicom)) then - l_mpicom = mpicom - call MPI_COMM_RANK(mpicom, lpet, localrc) - call MPI_COMM_SIZE(mpicom, petCount, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_VMGetCurrent(vm, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_VMGet(vm, localPet=lpet, petCount=petCount, mpiCommunicator=vm_comm_id, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call MPI_Comm_Dup(vm_comm_id, l_mpicom, localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! now use the mpi com - ! number of local indices - localSize(1) = size(farrayPtr, 2) - - ! gather all sizes locally - allocate(globalSizes(petCount), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call MPI_AllGATHER(localSize, 1, MPI_INTEGER, globalSizes, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! set up the deblocks - allocate(deblock(1,2,petCount), stat=localrc) - csum = 0 - do i=1,petCount - deblock(1,1,i) = csum + 1 ! min - csum = csum + globalSizes(i) - deblock(1,2,i) = csum ! max - enddo - - ! prepare to create fitting DELayout - if(present(petmap)) then - l_petMap => petmap - else - call MPI_COMM_RANK(l_mpicom, pet(1), localrc) - allocate(petMap(petCount), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call MPI_AllGATHER(pet, 1, MPI_INTEGER, l_petMap, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! create fitting DELayout - delayout = ESMF_DELayoutCreate(petMap=l_petMap, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create fitting DistGrid - minC(1) = deblock(1,1,1) - maxC(1) = deblock(1,2,petCount) - distgrid = ESMF_DistGridCreate(minC, maxC, deBlockList=deblock, & - delayout=delayout, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create an Array with the index list - if(present(name)) then - mct2esmf_create_Array_farrayPtr2DI4 = ESMF_ArrayCreate(farrayPtr=farrayPtr, distgrid=distgrid, & - distgridToArrayMap=(/2/), name=name, rc=localrc) - else - mct2esmf_create_Array_farrayPtr2DI4 = ESMF_ArrayCreate(farrayPtr=farrayPtr, distgrid=distgrid, & - distgridToArrayMap=(/2/), rc=localrc) - endif - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - deallocate(deblock, globalSizes) - if(.not. present(petmap)) deallocate(l_petmap) - -end function mct2esmf_create_Array_farrayPtr2DI4 - -!-------------------------------------------------------------------------- - -! create a ESMF_Array from a 1D R8 Fortray array pointer. -! The pointer is stored as a data pointer inside the created ESMF_Array. -function mct2esmf_create_Array_farrayPtr1DR8(farrayPtr, mpicom, petmap, name, rc) - - implicit none - - ! inout parameters - real(ESMF_KIND_R8), pointer :: farrayPtr(:) - integer, intent(in) , optional :: mpicom - integer, pointer, optional :: petmap(:) - character(len=*), intent(in), optional :: name - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_create_Array_farrayPtr1DR8 - - ! local variables - integer :: localrc, listsize, lpet - integer :: vm_comm_id, l_mpicom - type(ESMF_VM) :: vm - type(ESMF_DistGrid) :: distgrid - type(ESMF_DElayout) :: delayout - integer :: localSize(1) ! number of local indices - integer, allocatable :: globalSizes(:) ! array of all sizes - integer :: petCount ! num pets - integer, allocatable :: deblock(:,:,:) ! Array of sizes - integer :: i, csum ! loop variable - integer :: minC(1), maxC(1)! min/max corner - integer :: pet(1) - integer, pointer :: l_petMap(:) ! for custom delayout - character(len=*),parameter :: subname = 'mct2esmf_create_Array_farrayPtr1DR8' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - if(present(mpicom)) then - l_mpicom = mpicom - call MPI_COMM_RANK(mpicom, lpet, localrc) - call MPI_COMM_SIZE(mpicom, petCount, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_VMGetCurrent(vm, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_VMGet(vm, localPet=lpet, petCount=petCount, mpiCommunicator=vm_comm_id, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call MPI_Comm_Dup(vm_comm_id, l_mpicom, localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! now use the mpi com - ! number of local indices - localSize(1) = size(farrayPtr) - - ! gather all sizes locally - allocate(globalSizes(petCount)) - call MPI_AllGATHER(localSize, 1, MPI_INTEGER, globalSizes, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! set up the deblocks - allocate(deblock(1,2,petCount)) - csum = 0 - do i=1,petCount - deblock(1,1,i) = csum + 1 ! min - csum = csum + globalSizes(i) - deblock(1,2,i) = csum ! max - enddo - - ! prepare to create fitting DELayout - if(present(petmap)) then - l_petMap => petmap - else - call MPI_COMM_RANK(l_mpicom, pet(1), localrc) - allocate(petMap(petCount), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call MPI_AllGATHER(pet, 1, MPI_INTEGER, l_petMap, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! create fitting DELayout - delayout = ESMF_DELayoutCreate(petMap=l_petMap, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create fitting DistGrid - minC(1) = deblock(1,1,1) - maxC(1) = deblock(1,2,petCount) - distgrid = ESMF_DistGridCreate(minC, maxC, deBlockList=deblock, delayout=delayout, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create an Array with the index list - if(present(name)) then - mct2esmf_create_Array_farrayPtr1DR8 = ESMF_ArrayCreate(farrayPtr=farrayPtr, distgrid=distgrid, name=name, rc=localrc) - else - mct2esmf_create_Array_farrayPtr1DR8 = ESMF_ArrayCreate(farrayPtr=farrayPtr, distgrid=distgrid, rc=localrc) - endif - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - deallocate(deblock, globalSizes) - if(.not. present(petmap)) deallocate(l_petmap) - -end function mct2esmf_create_Array_farrayPtr1DR8 - -!-------------------------------------------------------------------------- -! create a ESMF_Array from a 1D integer Fortray array pointer. -! The pointer is stored as a data pointer inside the created ESMF_Array. -function mct2esmf_create_Array_farrayPtr1DI4(farrayPtr, mpicom, petmap, name, rc) - - implicit none - - ! inout parameters - integer, pointer :: farrayPtr(:) - integer, intent(in) , optional :: mpicom - integer, pointer, optional :: petmap(:) - character(len=*), intent(in), optional :: name - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_create_Array_farrayPtr1DI4 - - ! local variables - integer :: localrc, listsize, lpet - integer :: vm_comm_id, l_mpicom - type(ESMF_VM) :: vm - type(ESMF_DistGrid) :: distgrid - type(ESMF_DElayout) :: delayout - integer :: localSize(1) ! number of local indices - integer, allocatable :: globalSizes(:) ! array of all sizes - integer :: petCount ! num pets - integer, allocatable :: deblock(:,:,:) ! Array of sizes - integer :: i, csum ! loop variable - integer :: minC(1), maxC(1)! min/max corner - integer, pointer :: gindex(:) - integer :: pet(1) - integer, pointer :: l_petMap(:) ! for custom delayout - character(len=*),parameter :: subname = 'mct2esmf_create_Array_farrayPtr1DI4' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - if(present(mpicom)) then - l_mpicom = mpicom - call MPI_COMM_RANK(mpicom, lpet, localrc) - call MPI_COMM_SIZE(mpicom, petCount, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_VMGetCurrent(vm, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_VMGet(vm, localPet=lpet, petCount=petCount, mpiCommunicator=vm_comm_id, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call MPI_Comm_Dup(vm_comm_id, l_mpicom, localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! now use the mpi com - ! number of local indices - localSize(1) = size(farrayPtr) - - ! gather all sizes locally - allocate(globalSizes(petCount)) - call MPI_AllGATHER(localSize, 1, MPI_INTEGER, globalSizes, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! set up the deblocks - allocate(deblock(1,2,petCount)) - csum = 0 - do i=1,petCount - deblock(1,1,i) = csum + 1 ! min - csum = csum + globalSizes(i) - deblock(1,2,i) = csum ! max - enddo - - ! prepare to create fitting DELayout - if(present(petmap)) then - l_petMap => petmap - else - call MPI_COMM_RANK(l_mpicom, pet(1), localrc) - allocate(petMap(petCount), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call MPI_AllGATHER(pet, 1, MPI_INTEGER, l_petMap, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! create fitting DELayout - delayout = ESMF_DELayoutCreate(petMap=l_petMap, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create fitting DistGrid - minC(1) = deblock(1,1,1) - maxC(1) = deblock(1,2,petCount) - distgrid = ESMF_DistGridCreate(minC, maxC, deBlockList=deblock, delayout=delayout, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create an Array with the index list - if(present(name)) then - mct2esmf_create_Array_farrayPtr1DI4 = ESMF_ArrayCreate(farrayPtr=farrayPtr, distgrid=distgrid, name=name, rc=localrc) - else - mct2esmf_create_Array_farrayPtr1DI4 = ESMF_ArrayCreate(farrayPtr=farrayPtr, distgrid=distgrid, rc=localrc) - endif - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - deallocate(deblock, globalSizes) - if(.not. present(petmap)) deallocate(l_petmap) - -end function mct2esmf_create_Array_farrayPtr1DI4 - -!-------------------------------------------------------------------------- - -! create a ESMF_Array from a gsMap, the arb. index list is stored as a -! data pointer inside the created ESMF_Array. -function mct2esmf_create_Array_GSmap(gsMap, mpicom, petmap, name, rc) - - implicit none - - ! inout parameters - type(mct_gsMap), intent(in) :: gsMap - integer, intent(in) , optional :: mpicom - integer, pointer, optional :: petmap(:) - character(len=*), intent(in), optional :: name - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_create_Array_GSmap - - ! local variables - integer :: localrc, listsize, lpet - integer :: vm_comm_id, l_mpicom - type(ESMF_VM) :: vm - type(ESMF_DistGrid) :: distgrid - type(ESMF_DElayout) :: delayout - integer :: localSize(1) ! number of local indices - integer, allocatable :: globalSizes(:) ! array of all sizes - integer :: petCount ! num pets - integer, allocatable :: deblock(:,:,:) ! Array of sizes - integer :: i, csum ! loop variable - integer :: minC(1), maxC(1)! min/max corner - integer, pointer :: gindex(:) - integer :: pet(1) - integer, pointer :: l_petMap(:) ! for custom delayout - character(len=*),parameter :: subname = 'mct2esmf_create_Array_GSmap' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - if(present(mpicom)) then - l_mpicom = mpicom - call MPI_COMM_RANK(mpicom, lpet, localrc) - call MPI_COMM_SIZE(mpicom, petCount, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_VMGetCurrent(vm, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_VMGet(vm, localPet=lpet, petCount=petCount, mpiCommunicator=vm_comm_id, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call MPI_Comm_Dup(vm_comm_id, l_mpicom, localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - listsize = mct_gsMap_lsize(gsMap, comm=l_mpicom) - allocate(gindex(listsize), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call mct_gsMap_OrderedPoints(gsMap, PEno=lpet, Points=gindex) - - ! now use the mpi com - ! number of local indices - localSize(1) = listsize - - ! gather all sizes locally - allocate(globalSizes(petCount)) - call MPI_AllGATHER(localSize, 1, MPI_INTEGER, globalSizes, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! set up the deblocks - allocate(deblock(1,2,petCount)) - csum = 0 - do i=1,petCount - deblock(1,1,i) = csum + 1 ! min - csum = csum + globalSizes(i) - deblock(1,2,i) = csum ! max - enddo - - ! prepare to create fitting DELayout - if(present(petmap)) then - l_petMap => petmap - else - call MPI_COMM_RANK(l_mpicom, pet(1), localrc) - allocate(petMap(petCount), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call MPI_AllGATHER(pet, 1, MPI_INTEGER, l_petMap, 1, MPI_INTEGER, l_mpicom, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! create fitting DELayout - delayout = ESMF_DELayoutCreate(petMap=l_petMap, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create fitting DistGrid - minC(1) = deblock(1,1,1) - maxC(1) = deblock(1,2,petCount) - distgrid = ESMF_DistGridCreate(minC, maxC, deBlockList=deblock, delayout=delayout, rc=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create an Array with the index list - if(present(name)) then - mct2esmf_create_Array_GSmap = ESMF_ArrayCreate(farrayPTR=gindex, distgrid=distgrid, name=name, rc=localrc) - else - mct2esmf_create_Array_GSmap = ESMF_ArrayCreate(farrayPTR=gindex, distgrid=distgrid, rc=localrc) - endif - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - deallocate(deblock, globalSizes) - if(.not. present(petmap)) deallocate(l_petmap) - -end function mct2esmf_create_Array_GSmap - -!-------------------------------------------------------------------------- - -! create a ESMF_DistGrid from a gsMap -function mct2esmf_init_Distgrid_GSmap(gsMap, mpicom, rc) - - implicit none - - ! inout parameters - type(mct_gsMap), intent(in) :: gsMap - integer, intent(in) , optional :: mpicom - integer, intent(out), optional :: rc - - ! return - type(ESMF_DistGrid) :: mct2esmf_init_Distgrid_GSmap - - ! local variables - integer :: localrc, listsize, lpet - integer :: vm_comm_id, mct_comm_id - type(ESMF_VM) :: vm - integer, pointer :: gindex(:) - character(len=*),parameter :: subname = 'mct2esmf_init_Distgrid_GSmap' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - if(present(mpicom)) then - mct_comm_id = mpicom - call MPI_COMM_RANK(mpicom, lpet, localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - else - call ESMF_VMGetCurrent(vm, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_VMGet(vm, localPet=lpet, mpiCommunicator=vm_comm_id, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call MPI_Comm_Dup(vm_comm_id, mct_comm_id, localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - listsize = mct_gsMap_lsize(gsMap, comm=mct_comm_id) - allocate(gindex(listsize), stat=localrc) - if(localrc /= 0) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - call mct_gsMap_OrderedPoints(gsMap, PEno=lpet, Points=gindex) - - mct2esmf_init_Distgrid_GSmap = ESMF_DistGridCreate(arbSeqIndexList=gindex, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - deallocate(gindex) - -end function mct2esmf_init_Distgrid_GSmap - -!-------------------------------------------------------------------------- - -! create an ESMF_Array from an AttrVect and a gsMap (for the distgrid) -function mct2esmf_init_Array_AvGSmap(attrVect, gsMap, name, rc) - - implicit none - - ! inout parameters - type(mct_aVect), intent(in) :: attrVect - type(mct_gsMap), intent(in) :: gsMap - character(len=*), intent(in), optional :: name - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_init_Array_AvGSmap - - ! local variables - type(ESMF_DistGrid) :: distgrid - type(ESMF_ArraySpec) :: arrayspec - integer :: localrc, nfields - character(len=256) :: lname - character(len=8096) :: mct_names - character(len=*),parameter :: subname = 'mct2esmf_init_Array_AvGSmap' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - lname = 'undefined' - if (present(name)) then - lname = trim(name) - endif - - distgrid = mct2esmf_init_Distgrid_GSmap(gsMap, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - mct_names = mct_aVect_exportRList2c(attrVect) - - mct2esmf_init_Array_AvGSmap = mct2esmf_init_Array_DistgridList(distgrid,mct_names,name,rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end function mct2esmf_init_Array_AvGSmap - -!-------------------------------------------------------------------------- -! create an ESMF_Array from an Array and a gsMap (for the distgrid) -function mct2esmf_init_Array_ArrayGSmap(array, gsMap, name, rc) - - implicit none - - ! inout parameters - type(ESMF_array), intent(inout) :: array - type(mct_gsMap), intent(in) :: gsMap - character(len=*), intent(in), optional :: name - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_init_Array_ArrayGSmap - - ! local variables - type(ESMF_DistGrid) :: distgrid - type(ESMF_ArraySpec) :: arrayspec - character(len=8096) :: mct_names - integer :: localrc, nfields - character(len=256) :: lname - character(len=*),parameter :: subname = 'mct2esmf_init_Arrays_ArrayGSmap' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - lname = 'undefined' - if (present(name)) then - lname = trim(name) - endif - - distgrid = mct2esmf_init_Distgrid_GSmap(gsMap, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeGet(array, name="mct_names", value=mct_names, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - mct2esmf_init_Array_ArrayGSmap = mct2esmf_init_Array_DistgridList(distgrid,mct_names,name,rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end function mct2esmf_init_Array_ArrayGSmap - -!-------------------------------------------------------------------------- - -! copy data from attrVect to ESMF_Array -subroutine mct2esmf_copy_Array_Av(attrVect, array, rc) - - implicit none - - ! inout parameters - type(mct_aVect), intent(in) :: attrVect - type(ESMF_Array), intent(inout) :: array - integer, intent(out), optional :: rc - - ! local variables - integer :: a_dsize, a_nfields, localrc - real(ESMF_KIND_R8), pointer :: a_fptr(:,:) - integer :: av_dsize, av_nfields - integer :: i, j, a_off1, a_off2 - character(len=*),parameter :: subname = 'mct2esmf_copy_Array_Av' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, localDe=0, farrayPtr=a_fptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -! tcraig - this call seems to change answers, why!! -! call esmfshr_util_ArrayGetSize(array, lsize1=a_nfields, lsize2=a_dsize) - a_dsize = ubound(a_fptr, 2)-lbound(a_fptr, 2)+1 - a_nfields = ubound(a_fptr, 1)-lbound(a_fptr, 1)+1 - - av_dsize = mct_aVect_lsize(aV=attrVect) - av_nfields = mct_aVect_nRAttr(aV=attrVect) - - if (av_dsize == 0 .or. av_nfields == 0) then - ! nothing to copy, skip size check too - return - endif - - if(a_dsize /= av_dsize .or. a_nfields /= av_nfields) then - write(shr_log_unit,*) subname,' ERROR: size ',a_dsize,av_dsize,a_nfields,av_nfields - call shr_sys_flush(shr_log_unit) - call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - endif - - ! a_fptr = attrVect%rattr - a_off2 = lbound(a_fptr, 2)-1 - a_off1 = lbound(a_fptr, 1)-1 - do j = 1, a_dsize - do i = 1, a_nfields - a_fptr(a_off1+i, a_off2+j) = attrVect%rattr(i, j) - enddo - enddo - -end subroutine mct2esmf_copy_Array_Av - -!-------------------------------------------------------------------------- - -! convert Attribute Vectors and Global Segmentation Map to Arrays -function mct2esmf_init_Arrays_AvsGSmap(importAttrVect, exportAttrVect, gsmap, importArray, exportArray, rc) - - implicit none - - ! return - integer :: mct2esmf_init_Arrays_AvsGSmap - - ! inout parameters - type(mct_aVect), intent(in) :: importAttrVect - type(mct_aVect), intent(in) :: exportAttrVect - type(mct_gsMap), intent(in) :: gsmap - type(ESMF_Array), intent(inout) :: importArray - type(ESMF_Array), intent(inout) :: exportArray - integer, intent(out), optional :: rc - - ! internal variables - integer :: localrc - character(len=*),parameter :: subname = 'mct2esmf_init_Arrays_AvsGSmap' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - ! initializations - importArray = mct2esmf_init_Array_AvGSmap(importAttrVect, gsmap, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - exportArray = mct2esmf_init_Array_AvGSmap(exportAttrVect, gsmap, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - mct2esmf_init_Arrays_AvsGSmap = ESMF_SUCCESS - -end function mct2esmf_init_Arrays_AvsGSmap - -!-------------------------------------------------------------------------- -function mct2esmf_init_Distgrid_Gindex(gindex, rc) - - implicit none - - ! inout parameters - integer, intent(in) :: gindex(:) - integer, intent(out), optional :: rc - - ! return - type(ESMF_DistGrid) :: mct2esmf_init_Distgrid_Gindex - - ! local variables - integer :: localrc - character(len=*),parameter :: subname = 'mct2esmf_init_Distgrid_Gindex' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - mct2esmf_init_Distgrid_Gindex = ESMF_DistGridCreate(arbSeqIndexList=gindex, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end function mct2esmf_init_Distgrid_Gindex - -!-------------------------------------------------------------------------- - -! create a 2d Array from index list and colon delimited string -function mct2esmf_init_Array_GindexList(gindex, attname, name, value, rc) - - implicit none - - ! inout parameters - integer, intent(in) :: gindex(:) ! index list - character(*), intent(in) :: attname ! encoded name used later to create mct - character(*), intent(in), optional :: name ! encoded name used later to create mct - real*8, intent(in),optional :: value ! initial value - integer, intent(out),optional :: rc - - type(ESMF_Array) :: mct2esmf_init_Array_Gindexlist - - type(ESMF_DistGrid) :: distgrid - integer :: localrc - character(len=*),parameter :: subname = 'mct2esmf_init_Array_GindexList' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - ! create 1d arbitrarily distributed distgrid - distgrid = mct2esmf_init_Distgrid_Gindex(gindex, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - if ( present(name) .and. present(value)) then - mct2esmf_init_Array_GindexList = mct2esmf_init_Array_DistgridList(distgrid,attname,name,value,rc=localrc) - elseif ( present(name) .and. .not.present(value)) then - mct2esmf_init_Array_GindexList = mct2esmf_init_Array_DistgridList(distgrid,attname,name,rc=localrc) - elseif (.not.present(name) .and. present(value)) then - mct2esmf_init_Array_GindexList = mct2esmf_init_Array_DistgridList(distgrid,attname,value=value,rc=localrc) - elseif (.not.present(name) .and. .not.present(value)) then - mct2esmf_init_Array_GindexList = mct2esmf_init_Array_DistgridList(distgrid,attname,rc=localrc) - endif - - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end function mct2esmf_init_Array_GindexList - -!-------------------------------------------------------------------------- - -! create a 2d Array from distgrid and colon delimited string -function mct2esmf_init_Array_DistgridList(distgrid, attname, name, value, rc) - - implicit none - - ! inout parameters - type(ESMF_DistGrid),intent(in) :: distgrid ! input decomp - character(*), intent(in) :: attname ! fields list - character(*), intent(in), optional :: name ! name of array - real*8, intent(in),optional :: value ! initial value - integer, intent(out),optional :: rc - - type(ESMF_Array) :: mct2esmf_init_Array_DistgridList - - ! internal variables - type(ESMF_ArraySpec) :: arrayspec - real(ESMF_KIND_R8), pointer :: fptr(:,:) - integer :: localrc, nfields,lsize1,lsize2 - character(len=256) :: lname - character(len=*),parameter :: subname = 'mct2esmf_init_Array_DistgridList' - !--------------------------------------- - - if(present(rc)) rc = ESMF_SUCCESS - - lname = 'undefined' - if (present(name)) then - lname = trim(name) - endif - - call ESMF_ArraySpecSet(arrayspec, rank=2, typekind=ESMF_TYPEKIND_R8, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! convert name to attribute and attach to Array - - nfields = shr_string_listGetNum(attname) - - ! create a 2D array, 1d undistributed index of fields, 2d is packed data - mct2esmf_init_Array_DistgridList = ESMF_ArrayCreate(distgrid=distgrid, arrayspec=arrayspec, distgridToArrayMap=(/2/), & - undistLBound=(/1/), undistUBound=(/nfields/), & - !indexflag = ESMF_INDEX_DELOCAL, & - name=trim(lname), & - rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(mct2esmf_init_Array_DistgridList, name="mct_names", value=attname, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayGet(mct2esmf_init_Array_DistgridList, localDe=0, farrayPtr=fptr, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - if (present(value)) then - fptr = value - else - fptr = 0.0_ESMF_KIND_R8 - endif - -end function mct2esmf_init_Array_DistgridList - -!-------------------------------------------------------------------------- - -! create an ESMF_Array from an nFields and a gsMap (for the distgrid) -function mct2esmf_init_Array_gsMapNF(nFields, gsMap, mpicom, name, rc) - - ! inout parameters - integer, intent(in) :: nFields - type(mct_gsMap), intent(in) :: gsMap - character(len=*), intent(in), optional :: name - integer, intent(in), optional :: mpicom - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_init_Array_gsMapNF - - ! local variables - type(ESMF_DistGrid) :: distgrid - type(ESMF_ArraySpec) :: arrayspec - integer :: localrc - - if(present(rc)) rc = ESMF_SUCCESS - - distgrid = mct2esmf_init_DistGrid_GSmap(gsMap, mpicom=mpicom, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_ArraySpecSet(arrayspec, rank=2, typekind=ESMF_TYPEKIND_R8, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! create a 2D array, 1d undistributed index of fields, 2d is packed data - mct2esmf_init_Array_gsMapNF = ESMF_ArrayCreate(distgrid=distgrid, arrayspec=arrayspec, distgridToArrayMap=(/2/), & - undistLBound=(/1/), undistUBound=(/nfields/), & - name = name, & - rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end function mct2esmf_init_Array_gsMapNF - -!-------------------------------------------------------------------------- - -! create an ESMF_Array from an rList and a gsMap (for the distgrid) -function mct2esmf_init_Array_gsMaprList(gsMap, rList, name, rc) - - ! inout parameters - type(mct_gsMap), intent(in) :: gsMap - character(len=*), intent(in) :: rList - character(len=*), intent(in), optional :: name - integer, intent(out), optional :: rc - - ! return - type(ESMF_Array) :: mct2esmf_init_Array_gsMaprList - - ! local variables - type(ESMF_DistGrid) :: distgrid - type(ESMF_ArraySpec) :: arrayspec - integer :: localrc, nfields - type(mct_List) :: aList - - if(present(rc)) rc = ESMF_SUCCESS - - distgrid = mct2esmf_init_DistGrid_GSmap(gsMap, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - mct2esmf_init_Array_gsMaprList = mct2esmf_init_Array_DistgridList(distgrid, rList, name, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end function mct2esmf_init_Array_gsMaprList - -!-------------------------------------------------------------------------- - -!-------------------------------------------------------------------------- - -! copy data from attrVect to ESMF_Array -! src and dst object must have identical distribution, the ArrayCopy routine will check it. -subroutine mct2esmf_copy_alist(attrVect, array, list, rc) - - ! inout parameters - type(mct_aVect), intent(in) :: attrVect - type(ESMF_Array), intent(inout) :: array - character(len=*), intent(in) :: list - integer, intent(out), optional :: rc - - ! local variables - type(ESMF_Array) :: srcArray - type(ESMF_DistGrid) :: distgrid - character(len=4096) :: flist - integer :: localrc - - if(present(rc)) rc = ESMF_SUCCESS - - call ESMF_ArrayGet(array, distgrid=distgrid, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - !-------------------------------------------------------------------------- - ! use the attribute vector Fortran array pointer to create a temporary Array; - ! this avoids unnecessary memory copy and code is more efficient - !-------------------------------------------------------------------------- - srcArray = ESMF_ArrayCreate(farrayPtr=attrVect%rattr, distgrid=distgrid, distgridToArrayMap=(/2/), & - rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_AttributeSet(srcArray, name="mct_names", & - value=trim(mct_aVect_exportRList2c(attrVect)), rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - ! do a field name based copy between incongruent src and dst Array pairs - call esmfshr_util_ArrayCopy(srcArray, array, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - - call ESMF_ArrayDestroy(srcArray, rc=localrc) - if(localrc /= ESMF_SUCCESS) call ESMF_Finalize(rc=localrc, endflag=ESMF_END_ABORT) - -end subroutine mct2esmf_copy_alist - -#endif -end module From e989229a76097f6740f18c65a16d3ca871807314 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Sat, 9 Jul 2016 19:36:32 -0600 Subject: [PATCH 06/15] Removed all code related to using the ESMF interfaces in driver_cpl directory --- ChangeLog | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ChangeLog b/ChangeLog index 47ebaca41b8d..053d3cca6c51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,39 @@ ====================================================================== +Originator: mvertens +Date: July 9, 2016 +Tag: cime4.5.23 +Answer Changes: None +Tests: Ran prealph intel tests and compared to cesm1_5_alpha07e +Dependencies: None + +Brief Summary: Removed all code related to using the ESMF interfaces + +Modified files: git diff --name-status + +M cime_config/cesm/config_grids.xml +M driver_cpl/cime_config/config_component.xml +M driver_cpl/driver/cesm_comp_mod.F90 +M driver_cpl/driver/cesm_driver.F90 +M driver_cpl/driver/component_mod.F90 +M driver_cpl/driver/component_type_mod.F90 +M driver_cpl/driver/seq_diag_mct.F90 +M driver_cpl/driver/seq_map_mod.F90 +M driver_cpl/driver/seq_map_type_mod.F90 +M driver_cpl/shr/seq_comm_mct.F90 + +Deleted files: + +D driver_cpl/driver/cpl_comp_esmf.F90 +D driver_cpl/driver/seq_map_esmf.F90 +D driver_cpl/shr_esmf/esmf2mct_mod.F90 +D driver_cpl/shr_esmf/esmfshr_attribute_mod.F90 +D driver_cpl/shr_esmf/esmfshr_infodata_mod.F90 +D driver_cpl/shr_esmf/esmfshr_mod.F90 +D driver_cpl/shr_esmf/esmfshr_util_mod.F90 +D driver_cpl/shr_esmf/mct2esmf_mod.F90 +====================================================================== + Originator: fischer-ncar Date: July 7, 2016 Tag: cime4.5.22 From 42d19e757adb69096dab35901eb9ccea11f571b5 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Thu, 14 Jul 2016 12:55:04 -0600 Subject: [PATCH 07/15] fixes for pre-alpha cesm tests --- .../cesm/allactive/config_compsets.xml | 396 +++++++++--------- utils/python/CIME/SystemTests/pfs.py | 2 +- utils/python/CIME/preview_namelists.py | 7 +- 3 files changed, 204 insertions(+), 201 deletions(-) diff --git a/cime_config/cesm/allactive/config_compsets.xml b/cime_config/cesm/allactive/config_compsets.xml index c21a9261a76b..168852d53557 100644 --- a/cime_config/cesm/allactive/config_compsets.xml +++ b/cime_config/cesm/allactive/config_compsets.xml @@ -64,169 +64,169 @@ BC5L45BGC - 2000_CAM5_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV + 2000_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV BC4FCHML40CNR - 2000_CAM4%FCHM_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + 2000_CAM40%FCHM_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV BC4TMOZL40SPR - 2000_CAM4%TMOZ_CLM40%SP_CICE_POP2_RTM_SGLC_SWAV + 2000_CAM40%TMOZ_CLM40%SP_CICE_POP2_RTM_SGLC_SWAV B1850C5L40SPR - 1850_CAM5_CLM40%SP_CICE_POP2_RTM_SGLC_SWAV + 1850_CAM50_CLM40%SP_CICE_POP2_RTM_SGLC_SWAV Bi1850C5 - 1850_CAM5%WISOall_CLM40%SP_WISO_CICE%WISO_POP2%ISO_RTM%WISO_SGLC_SWAV + 1850_CAM50%WISOall_CLM40%SP_WISO_CICE%WISO_POP2%ISO_RTM%WISO_SGLC_SWAV B1850C4L40CNR - 1850_CAM4_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + 1850_CAM40_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV B1850C5L40CNR - 1850_CAM5_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + 1850_CAM50_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV Bi1850C5CN - 1850_CAM5%WISOall_CLM40%CN_WISO_CICE%WISO_POP2%ISO_RTM%WISO_SGLC_SWAV + 1850_CAM50%WISOall_CLM40%CN_WISO_CICE%WISO_POP2%ISO_RTM%WISO_SGLC_SWAV B1850C5L45BGCR - 1850_CAM5_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV + 1850_CAM50_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV B1850C5L45BGC - 1850_CAM5_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV + 1850_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV B1850C4RCO2L40CNR - 1850_CAM4%RCO2_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + 1850_CAM40%RCO2_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV B1850C5WCCML45CNR - 1850_CAM5%WCCM_CLM45%CN_CICE_POP2_RTM_SGLC_SWAV + 1850_CAM50%WCCM_CLM45%CN_CICE_POP2_RTM_SGLC_SWAV B1850C5WCCML45CN - 1850_CAM5%WCCM_CLM45%CN_CICE_POP2_MOSART_SGLC_SWAV + 1850_CAM50%WCCM_CLM45%CN_CICE_POP2_MOSART_SGLC_SWAV BC4WCBCL40CNR - 2013_CAM4%WCBC_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + 2013_CAM40%WCBC_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV B1850C4L40CNRBDRD - 1850_CAM4_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BDRD + 1850_CAM40_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BDRD BHISTC5L40CNRWs - HIST_CAM5_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + HIST_CAM50_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV BiHISTC5CN - HIST_CAM5_CLM40%CN_WISO_CICE%WISO_POP2%ISO_RTM%WISO_SGLC_SWAV + HIST_CAM50_CLM40%CN_WISO_CICE%WISO_POP2%ISO_RTM%WISO_SGLC_SWAV BHISTC5L40CNR - HIST_CAM5_CLM40%CN_CICE_POP2_RTM_SGLC_WW3 + HIST_CAM50_CLM40%CN_CICE_POP2_RTM_SGLC_WW3 BHISTC5L45BGCRWs - HIST_CAM5_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV + HIST_CAM50_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV BHISTC5L45BGCR - HIST_CAM5_CLM45%BGC_CICE_POP2_RTM_SGLC_WW3 + HIST_CAM50_CLM45%BGC_CICE_POP2_RTM_SGLC_WW3 BHISTC5L45BGCWs - HIST_CAM5_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV + HIST_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV BHISTC5L45BGC - HIST_CAM5_CLM45%BGC_CICE_POP2_MOSART_SGLC_WW3 + HIST_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_WW3 BHISTC4FCHML40CNRWs - HIST_CAM4%FCHM_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + HIST_CAM40%FCHM_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV BHISTC4FCHML40CNR - HIST_CAM4%FCHM_CLM40%CN_CICE_POP2_RTM_SGLC_WW3 + HIST_CAM40%FCHM_CLM40%CN_CICE_POP2_RTM_SGLC_WW3 BRCP26C4L40CNR - RCP2_CAM4_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV + RCP2_CAM40_CLM40%CN_CICE_POP2_RTM_SGLC_SWAV BRCP45C4L40CNRBDRD - RCP4_CAM4_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BDRD + RCP4_CAM40_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BDRD BRCP85C4L40CNRBPRP - RCP8_CAM4_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BPRP + RCP8_CAM40_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BPRP BRCP85C5L45BGCR - RCP8_CAM5_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV + RCP8_CAM50_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV BRCP85C5L45BGC - RCP8_CAM5_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV + RCP8_CAM50_CLM45%BGC_CICE_POP2_MOSART_SGLC_SWAV B1850C4L45BGCRBPRP - 1850_CAM4_CLM45%BGC_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BPRP + 1850_CAM40_CLM45%BGC_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BPRP B1850C4L45BGCBPRP - 1850_CAM4_CLM45%BGC_CICE_POP2%ECO_MOSART_SGLC_SWAV_BGC%BPRP + 1850_CAM40_CLM45%BGC_CICE_POP2%ECO_MOSART_SGLC_SWAV_BGC%BPRP B1850C5L45BGCRBPRP - 1850_CAM5_CLM45%BGC_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BPRP + 1850_CAM50_CLM45%BGC_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BPRP BHISTC4L40CNRBDRD - HIST_CAM4_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BDRD + HIST_CAM40_CLM40%CN_CICE_POP2%ECO_RTM_SGLC_SWAV_BGC%BDRD @@ -234,17 +234,17 @@ BC5L45BGCRG - 2000_CAM5_CLM45%BGC_CICE_POP2_RTM_CISM1_SWAV + 2000_CAM50_CLM45%BGC_CICE_POP2_RTM_CISM1_SWAV BC5L45BGCR - 2000_CAM5_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV + 2000_CAM50_CLM45%BGC_CICE_POP2_RTM_SGLC_SWAV B1850C5L45BGCRG2 - 1850_CAM5_CLM45%BGC_CICE_POP2_RTM_CISM2_SWAV + 1850_CAM50_CLM45%BGC_CICE_POP2_RTM_CISM2_SWAV @@ -261,7 +261,7 @@ E1850C5L45TEST - 1850_CAM5_CLM45%SP_CICE_DOCN%SOM_MOSART_SGLC_SWAV_TEST + 1850_CAM50_CLM45%SP_CICE_DOCN%SOM_MOSART_SGLC_SWAV_TEST diff --git a/utils/python/CIME/SystemTests/pfs.py b/utils/python/CIME/SystemTests/pfs.py index 82c560a5d846..e810dfba2bf5 100644 --- a/utils/python/CIME/SystemTests/pfs.py +++ b/utils/python/CIME/SystemTests/pfs.py @@ -18,7 +18,7 @@ def __init__(self, case): SystemTestsCommon.__init__(self, case) def run(self): - self._case_set_value("STOP_OPTION", "ndays") + self._case.set_value("STOP_OPTION", "ndays") self._case.set_value("STOP_N", 20) self._case.set_value("REST_OPTION","none") self._case.set_value("CONTINUE_RUN", False) diff --git a/utils/python/CIME/preview_namelists.py b/utils/python/CIME/preview_namelists.py index b829ea07843c..c02b5817c85b 100644 --- a/utils/python/CIME/preview_namelists.py +++ b/utils/python/CIME/preview_namelists.py @@ -72,9 +72,12 @@ def preview_namelists(case, dryrun=False, casedir=None): cmd = os.path.join(config_dir, "buildnml") logger.info("Running %s"%cmd) if (logger.level == logging.DEBUG): - run_cmd("PREVIEW_NML=1 %s %s" % (cmd, caseroot)) + rc, out, err = run_cmd("PREVIEW_NML=1 %s %s" % (cmd, caseroot), ok_to_fail=True) + expect(rc==0,"Command %s failed rc=%d\nout=%s\nerr=%s"%(cmd,rc,out,err)) else: - run_cmd("%s %s" % (cmd, caseroot)) + rc, out, err = run_cmd("%s %s" % (cmd, caseroot), ok_to_fail=True) + expect(rc==0,"Command %s failed rc=%d\nout=%s\nerr=%s"%(cmd,rc,out,err)) + # refresh case xml object from file case.read_xml(caseroot) # Save namelists to docdir From 5e13ecd4c3394bc89f26aa34b1243c5eb5293ce7 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Thu, 14 Jul 2016 13:55:01 -0600 Subject: [PATCH 08/15] removed NOC test --- cime_config/cesm/allactive/testlist_allactive.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/cime_config/cesm/allactive/testlist_allactive.xml b/cime_config/cesm/allactive/testlist_allactive.xml index edfe2502978c..577957ee654a 100644 --- a/cime_config/cesm/allactive/testlist_allactive.xml +++ b/cime_config/cesm/allactive/testlist_allactive.xml @@ -250,15 +250,6 @@ - - - - - - - - - From 302c66c97f86a90bf4ac5a730734e7d84b0a9629 Mon Sep 17 00:00:00 2001 From: James Foucar Date: Thu, 14 Jul 2016 15:19:32 -0600 Subject: [PATCH 09/15] Port performance archiving scripts to python. 1) Add SAVE_TIMING_DIR run parameter 2) Define this paramter for melvin and skybrige 3) Add --save-timing to create_test to enable timing archiving via create_test 4) Fix exception hiding in system_test_common 5) Convert case_run.py to PEP-compliant naming conventions for functions 6) Add utility functions for easy zipping and touching of files 7) Add regression test that runs create_test with --save-timing --- cime_config/acme/machines/cesm_postbuild | 32 --- .../acme/machines/cesm_postbuild.perf_archive | 78 ------ cime_config/acme/machines/cesm_postrun | 59 ----- .../acme/machines/cesm_postrun.perf_archive | 153 ----------- cime_config/acme/machines/cesm_postrun2 | 59 ----- .../acme/machines/cesm_postrun2.perf_archive | 133 ---------- cime_config/acme/machines/cesm_prerun | 128 --------- .../acme/machines/cesm_prerun.perf_archive | 247 ------------------ cime_config/acme/machines/config_machines.xml | 2 + driver_cpl/cime_config/config_component.xml | 9 + scripts/create_test | 14 +- .../CIME/SystemTests/system_tests_common.py | 1 + utils/python/CIME/case_run.py | 220 +++++++++++++--- utils/python/CIME/system_test.py | 6 +- utils/python/CIME/utils.py | 42 ++- .../python/tests/scripts_regression_tests.py | 21 ++ 16 files changed, 264 insertions(+), 940 deletions(-) delete mode 100755 cime_config/acme/machines/cesm_postbuild delete mode 100755 cime_config/acme/machines/cesm_postbuild.perf_archive delete mode 100755 cime_config/acme/machines/cesm_postrun delete mode 100755 cime_config/acme/machines/cesm_postrun.perf_archive delete mode 100755 cime_config/acme/machines/cesm_postrun2 delete mode 100755 cime_config/acme/machines/cesm_postrun2.perf_archive delete mode 100755 cime_config/acme/machines/cesm_prerun delete mode 100755 cime_config/acme/machines/cesm_prerun.perf_archive diff --git a/cime_config/acme/machines/cesm_postbuild b/cime_config/acme/machines/cesm_postbuild deleted file mode 100755 index ae92085b2a5d..000000000000 --- a/cime_config/acme/machines/cesm_postbuild +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/csh -f -# cesm_postbuild without support for performance data archving: -# ./cesm_postbuild with the following required argument keyword/value pairs, in any order -# -cesmid <$LID in cesm-lingo> -# -cesmroot -# -caseroot -# -exedir - -set lid = 'unknown' -set cesmroot = '.' -set caseroot = '.' -set exe_dir = '.' - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmroot') then - @ i = $i + 1 - set cesmroot = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-exedir') then - @ i = $i + 1 - set exe_dir = $argv[$i] - endif - @ i = $i + 1 -end - - diff --git a/cime_config/acme/machines/cesm_postbuild.perf_archive b/cime_config/acme/machines/cesm_postbuild.perf_archive deleted file mode 100755 index 474c1502aef3..000000000000 --- a/cime_config/acme/machines/cesm_postbuild.perf_archive +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/csh -f -# cesm_postbuild with support for performance data archiving: -# ./cesm_postbuild.perf_archive with the following required argument keyword/value pairs, in any order -# -cesmid <$LID in cesm-lingo> -# -cesmroot -# -caseroot -# -exedir - -set lid = 'unknown' -set cesmroot = '.' -set caseroot = '.' -set exe_dir = '.' - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmroot') then - @ i = $i + 1 - set cesmroot = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-exedir') then - @ i = $i + 1 - set exe_dir = $argv[$i] - endif - @ i = $i + 1 -end - -#--- save model provenance with the executable -cd $cesmroot - -if (-d $cesmroot/.git) then - git describe > $exe_dir/GIT_DESCRIBE.$lid - chmod 664 $exe_dir/GIT_DESCRIBE.$lid - /bin/cp -p $exe_dir/GIT_DESCRIBE.$lid $exe_dir/GIT_DESCRIBE - - if (-f $cesmroot/.git/logs/HEAD) then - /bin/cp $cesmroot/.git/logs/HEAD $exe_dir/GIT_LOGS_HEAD.$lid - chmod 664 $exe_dir/GIT_LOGS_HEAD.$lid - /bin/cp -p $exe_dir/GIT_LOGS_HEAD.$lid $exe_dir/GIT_LOGS_HEAD - else - /bin/rm -f $exe_dir/GIT_LOGS_HEAD - touch $exe_dir/GIT_LOGS_HEAD - endif -endif - -if (-d $cesmroot/.svn) then - svn info > $exe_dir/SVN_INFO.$lid - chmod 664 $exe_dir/SVN_INFO.$lid - /bin/cp -p $exe_dir/SVN_INFO.$lid $exe_dir/SVN_INFO - - if (-f $cesmroot/.svn/wc.db) then - /bin/cp $cesmroot/.svn/wc.db $exe_dir/SVN_WC.DB.$lid - chmod 664 $exe_dir/SVN_WC.DB.$lid - /bin/cp -p $exe_dir/SVN_WC.DB.$lid $exe_dir/SVN_WC.DB - else - /bin/rm -f $exe_dir/SVN_WC.DB - touch $exe_dir/SVN_WC.DB - endif -endif - -if (-d $caseroot/SourceMods) then - cd $caseroot - /bin/tar cf $exe_dir/SourceMods.$lid.tar SourceMods - cd $exe_dir - /bin/cp SourceMods.$lid.tar SourceMods.tar -endif - -if (-f $caseroot/software_environment.txt) then - cd $caseroot - /bin/cp software_environment.txt $exe_dir/build_environment.$lid.txt - cd $exe_dir - /bin/cp build_environment.$lid.txt build_environment.txt -endif - diff --git a/cime_config/acme/machines/cesm_postrun b/cime_config/acme/machines/cesm_postrun deleted file mode 100755 index 76f386bf8dd3..000000000000 --- a/cime_config/acme/machines/cesm_postrun +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/csh -f -# cesm_postrun without performance data archiving: -# ./cesm_postrun with the following argument keyword/value pairs, in any order -# -machine -# -case -# -jobid for Cobalt> -# -cesmid <$LID in cesm-lingo> -# -user -# -caseroot -# -rundir -# -save -# -archive -# -sampling - -set machine = 'unknown' -set case = 'unknown' -set app_jobid = 'unknown' -set lid = 'unknown' -set user = 'unknown' -set caseroot = '.' -set run_dir = '.' -set save_timing = 'FALSE' -set save_timing_dir = '/UNSET' - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-machine') then - @ i = $i + 1 - set machine = $argv[$i] - else if ("X$argv[$i]" == 'X-case') then - @ i = $i + 1 - set case = $argv[$i] - else if ("X$argv[$i]" == 'X-jobid') then - @ i = $i + 1 - set app_jobid = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-user') then - @ i = $i + 1 - set user = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-rundir') then - @ i = $i + 1 - set run_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-save') then - @ i = $i + 1 - set save_timing = $argv[$i] - else if ("X$argv[$i]" == 'X-archive') then - @ i = $i + 1 - set save_timing_dir = $argv[$i] - endif - @ i = $i + 1 -end - -set sdate = `date +"%Y-%m-%d %H:%M:%S"` -echo "model run ended $sdate" >>& $caseroot/CaseStatus diff --git a/cime_config/acme/machines/cesm_postrun.perf_archive b/cime_config/acme/machines/cesm_postrun.perf_archive deleted file mode 100755 index ada3a1908a47..000000000000 --- a/cime_config/acme/machines/cesm_postrun.perf_archive +++ /dev/null @@ -1,153 +0,0 @@ -#!/bin/csh -f -# cesm_postrun with performance data archiving: -# ./cesm_postrun.perf_archive with the following argument keyword/value pairs, in any order -# -machine -# -case -# -jobid for Cobalt> -# -cesmid <$LID in cesm-lingo> -# -user -# -caseroot -# -rundir -# -save -# -archive -# -sampling - -set machine = 'unknown' -set case = 'unknown' -set app_jobid = 'unknown' -set lid = 'unknown' -set user = 'unknown' -set caseroot = '.' -set run_dir = '.' -set save_timing = 'FALSE' -set save_timing_dir = '/UNSET' - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-machine') then - @ i = $i + 1 - set machine = $argv[$i] - else if ("X$argv[$i]" == 'X-case') then - @ i = $i + 1 - set case = $argv[$i] - else if ("X$argv[$i]" == 'X-jobid') then - @ i = $i + 1 - set app_jobid = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-user') then - @ i = $i + 1 - set user = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-rundir') then - @ i = $i + 1 - set run_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-save') then - @ i = $i + 1 - set save_timing = $argv[$i] - else if ("X$argv[$i]" == 'X-archive') then - @ i = $i + 1 - set save_timing_dir = $argv[$i] - endif - @ i = $i + 1 -end - -set sdate = `date +"%Y-%m-%d %H:%M:%S"` -echo "model run ended $sdate" >>& $caseroot/CaseStatus - -if ($app_jobid == 'unknown') then - if ($machine == 'titan') then - - set app_jobid = $PBS_JOBID - - else if (($machine == 'edison') || ($machine == 'corip1')) then - - set app_jobid = $SLURM_JOB_ID - - else if ($machine == 'mira') then - - set app_jobid = $COBALT_JOBID - - endif -endif - -if ($app_jobid != 'unknown') then - - set syslog_jobid = 0 - if (-e $run_dir/syslog_jobid.$app_jobid) then - set syslog_jobid = `cat $run_dir/syslog_jobid.$app_jobid` - /bin/rm -f $run_dir/syslog_jobid.$app_jobid - endif - - if ($syslog_jobid != 0) then - if { kill -0 $syslog_jobid } then - kill $syslog_jobid - endif - endif - -endif - -if (($save_timing == 'TRUE') || ($save_timing == 'true')) then - - if (-d $save_timing_dir) then - cd $save_timing_dir - - if !(-d performance_archive) then - mkdir performance_archive - chmod 777 performance_archive - chmod +s performance_archive - endif - cd performance_archive - - if !(-d $user) then - mkdir $user - chmod 775 $user - chmod +s $user - endif - cd $user - - if !(-d $case) then - mkdir $case - chmod 775 $case - chmod +s $case - endif - cd $case - - if !(-d $lid) then - mkdir $lid - chmod 775 $lid - chmod +s $lid - endif - - cd $caseroot - - if ($machine == 'titan') then - - set string = `ls $app_jobid*OU` - cp -p $string $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - chmod a+r $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - - else if ($machine == 'mira') then - - set string = `ls $app_jobid*output` - cp -p $string $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - chmod a+r $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - - set string = `ls $app_jobid*cobaltlog` - cp -p $string $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - chmod a+r $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - - else if (($machine == 'edison') || ($machine == 'corip1')) then - - set string = `ls $case` - cp -p $string $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - chmod a+r $save_timing_dir/performance_archive/$user/$case/$lid/$string.$lid - - endif - - endif - -endif diff --git a/cime_config/acme/machines/cesm_postrun2 b/cime_config/acme/machines/cesm_postrun2 deleted file mode 100755 index b129367b9b93..000000000000 --- a/cime_config/acme/machines/cesm_postrun2 +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/csh -f -# cesm_postrun2 without performance data archiving: -# ./cesm_postrun2 with the following argument keyword/value pairs, in any order -# -machine -# -case -# -cesmid <$LID in cesm-lingo> -# -user -# -caseroot -# -rundir -# -exedir -# -save -# -archive - -set machine = 'unknown' -set case = 'unknown' -set lid = 'unknown' -set user = 'unknown' -set caseroot = '.' -set run_dir = '.' -set exe_dir = '.' -set save_timing = 'FALSE' -set save_timing_dir = '/UNSET' - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-machine') then - @ i = $i + 1 - set machine = $argv[$i] - else if ("X$argv[$i]" == 'X-case') then - @ i = $i + 1 - set case = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-user') then - @ i = $i + 1 - set user = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-rundir') then - @ i = $i + 1 - set run_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-exedir') then - @ i = $i + 1 - set exe_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-save') then - @ i = $i + 1 - set save_timing = $argv[$i] - else if ("X$argv[$i]" == 'X-archive') then - @ i = $i + 1 - set save_timing_dir = $argv[$i] - endif - @ i = $i + 1 -end - -set sdate = `date +"%Y-%m-%d %H:%M:%S"` -echo "CESM postrun ended $sdate" >>& $caseroot/CaseStatus - diff --git a/cime_config/acme/machines/cesm_postrun2.perf_archive b/cime_config/acme/machines/cesm_postrun2.perf_archive deleted file mode 100755 index 443c9737006b..000000000000 --- a/cime_config/acme/machines/cesm_postrun2.perf_archive +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/csh -f -# cesm_postrun2 with performance data archiving: -# ./cesm_postrun2.perf_archive with the following argument keyword/value pairs, in any order -# -machine -# -case -# -cesmid <$LID in cesm-lingo> -# -user -# -caseroot -# -rundir -# -exedir -# -save -# -archive - -set machine = 'unknown' -set case = 'unknown' -set lid = 'unknown' -set user = 'unknown' -set caseroot = '.' -set run_dir = '.' -set exe_dir = '.' -set save_timing = 'FALSE' -set save_timing_dir = '/UNSET' - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-machine') then - @ i = $i + 1 - set machine = $argv[$i] - else if ("X$argv[$i]" == 'X-case') then - @ i = $i + 1 - set case = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-user') then - @ i = $i + 1 - set user = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-rundir') then - @ i = $i + 1 - set run_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-exedir') then - @ i = $i + 1 - set exe_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-save') then - @ i = $i + 1 - set save_timing = $argv[$i] - else if ("X$argv[$i]" == 'X-archive') then - @ i = $i + 1 - set save_timing_dir = $argv[$i] - endif - @ i = $i + 1 -end - -set sdate = `date +"%Y-%m-%d %H:%M:%S"` -echo "CESM postrun ended $sdate" >>& $caseroot/CaseStatus - -if (($save_timing == 'TRUE') || ($save_timing == 'true')) then - cd $run_dir - - if (-e timing) then - mv timing timing.$lid - endif - tar cf timing.$lid.tar timing.$lid - gzip timing.$lid.tar - rm -rf timing.$lid - - if (-d $save_timing_dir) then - cd $save_timing_dir - - if !(-d performance_archive) then - mkdir performance_archive - chmod 777 performance_archive - chmod +s performance_archive - endif - cd performance_archive - - if !(-d $user) then - mkdir $user - chmod 775 $user - chmod +s $user - endif - cd $user - - if !(-d $case) then - mkdir $case - chmod 775 $case - chmod +s $case - endif - cd $case - - if !(-d $lid) then - mkdir $lid - chmod 775 $lid - chmod +s $lid - endif - cd $lid - - cp -p $run_dir/timing.$lid.tar.gz timing.$lid.tar.gz - cp -p $caseroot/logs/cesm.log.$lid.gz cesm.log.$lid.gz - cp -p $caseroot/logs/cpl.log.$lid.gz cpl.log.$lid.gz - cp -p $caseroot/timing/*.$lid $caseroot/timing/*.$lid.gz . - cp -p $caseroot/CaseStatus CaseStatus.$lid - - if (-f $exe_dir/GIT_DESCRIBE) then - cp -p $exe_dir/GIT_DESCRIBE GIT_DESCRIBE.$lid - endif - if (-f $exe_dir/GIT_LOGS_HEAD) then - cp -p $exe_dir/GIT_LOGS_HEAD GIT_LOGS_HEAD.$lid - endif - if (-f $exe_dir/SVN_INFO) then - cp -p $exe_dir/SVN_INFO SVN_INFO.$lid - endif - if (-f $exe_dir/SVN_WC.DB) then - cp -p $exe_dir/SVN_WC.DB SVN_WC.DB.$lid - endif - if (-f $exe_dir/SourceMods.tar) then - cp -p $exe_dir/SourceMods.tar SourceMods.$lid.tar - endif - if (-f $exe_dir/build_environment.txt) then - cp -p $exe_dir/build_environment.txt build_environment.$lid - endif - - chmod -R a+rX * - gzip -r * - endif - - cd $caseroot - touch timing/timing.$lid.saved - -endif diff --git a/cime_config/acme/machines/cesm_prerun b/cime_config/acme/machines/cesm_prerun deleted file mode 100755 index 4072211483d0..000000000000 --- a/cime_config/acme/machines/cesm_prerun +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/csh -f -# cesm_prerun without performance data archiving: -# ./cesm_prerun with the following argument keyword/value pairs, in any order -# -machine -# -compiler -# -case -# -jobid for Cobalt> -# -cesmid <$LID in cesm-lingo> -# -user -# -caseroot -# -rundir -# -save -# -archive -# -sampling - -set machine = 'unknown' -set compiler = 'unknown' -set case = 'unknown' -set app_jobid = 'unknown' -set lid = 'unknown' -set user = 'unknown' -set caseroot = '.' -set run_dir = '.' -set save_timing = 'FALSE' -set save_timing_dir = '/UNSET' -set sample_interval = 0 - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-machine') then - @ i = $i + 1 - set machine = $argv[$i] - else if ("X$argv[$i]" == 'X-compiler') then - @ i = $i + 1 - set compiler = $argv[$i] - else if ("X$argv[$i]" == 'X-case') then - @ i = $i + 1 - set case = $argv[$i] - else if ("X$argv[$i]" == 'X-jobid') then - @ i = $i + 1 - set app_jobid = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-user') then - @ i = $i + 1 - set user = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-rundir') then - @ i = $i + 1 - set run_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-save') then - @ i = $i + 1 - set save_timing = $argv[$i] - else if ("X$argv[$i]" == 'X-archive') then - @ i = $i + 1 - set save_timing_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-sampling') then - @ i = $i + 1 - set sample_interval = $argv[$i] - endif - @ i = $i + 1 -end - -if (-e $run_dir/cesm_prerun_done) then - /bin/rm $run_dir/cesm_prerun_done -endif - -if ($app_jobid == 'unknown') then - if ($machine == 'titan') then - - set app_jobid = $PBS_JOBID - - else if (($machine == 'edison') || ($machine == 'corip1')) then - - set app_jobid = $SLURM_JOB_ID - - else if ($machine == 'mira') then - - set app_jobid = $COBALT_JOBID - - endif -endif - -if ($machine == 'titan') then - - set string = `qstat -f $app_jobid | grep ctime` - echo "job $app_jobid created: $string" >>& $caseroot/CaseStatus - - set string = `qstat -f $app_jobid | grep qtime` - echo "job $app_jobid queued: $string" >>& $caseroot/CaseStatus - - set string = `qstat -f $app_jobid | grep etime` - echo "job $app_jobid eligible to run: $string" >>& $caseroot/CaseStatus - - set string = `qstat -f $app_jobid | grep start_time` - echo "job $app_jobid started: $string" >>& $caseroot/CaseStatus - -else if (($machine == 'edison') || ($machine == 'corip1')) then - - set string = `sqs -f $app_jobid | grep SubmitTime | sed 's/ *\(SubmitTime=\S*\) *\(EligibleTime=\S*\) */\1/' ` - echo "job $app_jobid submitted: $string" >>& $caseroot/CaseStatus - - set string = `sqs -f $app_jobid | grep SubmitTime | sed 's/ *\(SubmitTime=\S*\) *\(EligibleTime=\S*\) */\2/' ` - echo "job $app_jobid eligible: $string" >>& $caseroot/CaseStatus - - set string = `sqs -f $app_jobid | grep StartTime | sed 's/ *\(StartTime=\S*\) *\(EndTime=\S*\) */\1/' ` - echo "job $app_jobid started: $string" >>& $caseroot/CaseStatus - -else if ($machine == 'mira') then - - set string = `qstat -lf $app_jobid | grep SubmitTime` - echo "job $app_jobid submitted: $string" >>& $caseroot/CaseStatus - - set string = `qstat -lf $app_jobid | grep StartTime` - echo "job $app_jobid started: $string" >>& $caseroot/CaseStatus - -endif - -sleep 10 - -set sdate = `date +"%Y-%m-%d %H:%M:%S"` -echo "model started $sdate" >>& $caseroot/CaseStatus - -touch $run_dir/cesm_prerun_done - diff --git a/cime_config/acme/machines/cesm_prerun.perf_archive b/cime_config/acme/machines/cesm_prerun.perf_archive deleted file mode 100755 index bde22af9152c..000000000000 --- a/cime_config/acme/machines/cesm_prerun.perf_archive +++ /dev/null @@ -1,247 +0,0 @@ -#!/bin/csh -f -# cesm_prerun with performance data archiving: -# ./cesm_prerun.perf_archive with the following argument keyword/value pairs, in any order -# -machine -# -compiler -# -case -# -jobid for Cobalt> -# -cesmid <$LID in cesm-lingo> -# -user -# -caseroot -# -rundir -# -save -# -archive -# -sampling - -set machine = 'unknown' -set compiler = 'unknown' -set case = 'unknown' -set app_jobid = 'unknown' -set lid = 'unknown' -set user = 'unknown' -set caseroot = '.' -set run_dir = '.' -set save_timing = 'FALSE' -set save_timing_dir = '/UNSET' -set sample_interval = 0 - -set i = 1 -while ($i < $#argv) - if ("X$argv[$i]" == 'X-machine') then - @ i = $i + 1 - set machine = $argv[$i] - else if ("X$argv[$i]" == 'X-compiler') then - @ i = $i + 1 - set compiler = $argv[$i] - else if ("X$argv[$i]" == 'X-case') then - @ i = $i + 1 - set case = $argv[$i] - else if ("X$argv[$i]" == 'X-jobid') then - @ i = $i + 1 - set app_jobid = $argv[$i] - else if ("X$argv[$i]" == 'X-cesmid') then - @ i = $i + 1 - set lid = $argv[$i] - else if ("X$argv[$i]" == 'X-user') then - @ i = $i + 1 - set user = $argv[$i] - else if ("X$argv[$i]" == 'X-caseroot') then - @ i = $i + 1 - set caseroot = $argv[$i] - else if ("X$argv[$i]" == 'X-rundir') then - @ i = $i + 1 - set run_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-save') then - @ i = $i + 1 - set save_timing = $argv[$i] - else if ("X$argv[$i]" == 'X-archive') then - @ i = $i + 1 - set save_timing_dir = $argv[$i] - else if ("X$argv[$i]" == 'X-sampling') then - @ i = $i + 1 - set sample_interval = $argv[$i] - endif - @ i = $i + 1 -end - -if (-e $run_dir/cesm_prerun_done) then - /bin/rm $run_dir/cesm_prerun_done -endif - -if ($app_jobid == 'unknown') then - if ($machine == 'titan') then - - set app_jobid = $PBS_JOBID - - else if (($machine == 'edison') || ($machine == 'corip1')) then - - set app_jobid = $SLURM_JOB_ID - - else if ($machine == 'mira') then - - set app_jobid = $COBALT_JOBID - - endif -endif - -if ($machine == 'titan') then - - set string = `qstat -f $app_jobid | grep ctime` - echo "job $app_jobid created: $string" >>& $caseroot/CaseStatus - - set string = `qstat -f $app_jobid | grep qtime` - echo "job $app_jobid queued: $string" >>& $caseroot/CaseStatus - - set string = `qstat -f $app_jobid | grep etime` - echo "job $app_jobid eligible to run: $string" >>& $caseroot/CaseStatus - - set string = `qstat -f $app_jobid | grep start_time` - echo "job $app_jobid started: $string" >>& $caseroot/CaseStatus - -else if (($machine == 'edison') || ($machine == 'corip1')) then - - set string = `sqs -f $app_jobid | grep SubmitTime | sed 's/ *\(SubmitTime=\S*\) *\(EligibleTime=\S*\) */\1/' ` - echo "job $app_jobid submitted: $string" >>& $caseroot/CaseStatus - - set string = `sqs -f $app_jobid | grep SubmitTime | sed 's/ *\(SubmitTime=\S*\) *\(EligibleTime=\S*\) */\2/' ` - echo "job $app_jobid eligible: $string" >>& $caseroot/CaseStatus - - set string = `sqs -f $app_jobid | grep StartTime | sed 's/ *\(StartTime=\S*\) *\(EndTime=\S*\) */\1/' ` - echo "job $app_jobid started: $string" >>& $caseroot/CaseStatus - -else if ($machine == 'mira') then - - set string = `qstat -lf $app_jobid | grep SubmitTime` - echo "job $app_jobid submitted: $string" >>& $caseroot/CaseStatus - - set string = `qstat -lf $app_jobid | grep StartTime` - echo "job $app_jobid started: $string" >>& $caseroot/CaseStatus - -endif - -if (($save_timing == 'TRUE') || ($save_timing == 'true')) then - - if (-d $save_timing_dir) then - cd $save_timing_dir - - if !(-d performance_archive) then - mkdir performance_archive - chmod 777 performance_archive - chmod +s performance_archive - endif - cd performance_archive - - if !(-d $user) then - mkdir $user - chmod 775 $user - chmod +s $user - endif - cd $user - - if !(-d $case) then - mkdir $case - chmod 775 $case - chmod +s $case - endif - cd $case - - if !(-d $lid) then - mkdir $lid - chmod 775 $lid - chmod +s $lid - endif - cd $lid - - if !(-d checkpoints) then - mkdir checkpoints - chmod 775 checkpoints - chmod +s checkpoints - endif - - if ($machine == 'mira') then - qstat -lf > qstatf.$lid - qstat -lf $app_jobid > qstatf_jobid.$lid - chmod a+r * - gzip qstatf.$lid qstatf_jobid.$lid - else if ($machine == 'corip1') then - sqs -f > sqsf.$lid - sqs -w -a > sqsw.$lid - sqs -f $app_jobid > sqsf_jobid.$lid -# ssh cmom01 xtdb2proc -f $save_timing_dir/performance_archive/$user/$case/$lid/xtdb2proc.$lid - squeue > squeue.$lid - chmod a+r * - gzip sqsf.$lid sqsw.$lid sqsf_jobid.$lid squeue.$lid -# gzip xtdb2proc.$lid - else if ($machine == 'edison') then -# xtprocadmin > xtprocadmin.$lid - sqs -f > sqsf.$lid - sqs -w -a > sqsw.$lid - sqs -f $app_jobid > sqsf_jobid.$lid -# xtnodestat > xtnodestat.$lid - squeue > squeue.$lid - chmod a+r * - gzip sqsf.$lid sqsw.$lid sqsf_jobid.$lid squeue.$lid -# gzip xtprocadmin.$lid xtnodestat.$lid - else if ($machine == 'titan') then - xtdb2proc -f xtdb2proc.$lid - qstat -f > qstatf.$lid - qstat -f $app_jobid > qstatf_jobid.$lid - xtnodestat > xtnodestat.$lid - showq > showq.$lid - chmod a+r * - gzip xtdb2proc.$lid qstatf.$lid qstatf_jobid.$lid xtnodestat.$lid showq.$lid - endif - - mkdir CaseDocs.$lid - chmod 775 CaseDocs.$lid - chmod +s CaseDocs.$lid - cd CaseDocs.$lid - cp -p $caseroot/CaseDocs/* . - cp -p $caseroot/*.run . - cp -p $caseroot/*.xml . - cp -p $caseroot/user_nl_* . - cp -p $caseroot/env_mach_specific . - cp -p $caseroot/Macros . - cp -p $caseroot/README.case . - if (-f $caseroot/Depends.$machine) then - cp -p $caseroot/Depends.$machine . - endif - if (-f $caseroot/Depends.$compiler) then - cp -p $caseroot/Depends.$compiler . - endif - if (-f $caseroot/Depends.$machine.$compiler) then - cp -p $caseroot/Depends.$machine.$compiler . - endif - chmod a+r * - - if ($machine == 'titan') then - cd $caseroot/Tools - ./mdiag_reduce.csh > mdiag_reduce.$lid - chmod a+r mdiag_reduce.$lid - gzip mdiag_reduce.$lid - mv mdiag_reduce.$lid.gz $save_timing_dir/performance_archive/$user/$case/$lid/mdiag_reduce.$lid.gz - endif - - if ($app_jobid != 'unknown') then - if ($sample_interval > 0) then - touch $run_dir/cesm.log.$lid - cd $caseroot/Tools - ./mach_syslog $sample_interval $app_jobid $lid $run_dir $run_dir/timing/checkpoints $save_timing_dir/performance_archive/$user/$case/$lid/checkpoints & - set syslog_jobid = $! - cat >> $run_dir/syslog_jobid.$app_jobid << EOF1 -$syslog_jobid -EOF1 - endif - endif - - endif - -endif - -sleep 10 - -set sdate = `date +"%Y-%m-%d %H:%M:%S"` -echo "model run started $sdate" >>& $caseroot/CaseStatus - -touch $run_dir/cesm_prerun_done - diff --git a/cime_config/acme/machines/config_machines.xml b/cime_config/acme/machines/config_machines.xml index 8cc7bc587e5b..dc9683813097 100644 --- a/cime_config/acme/machines/config_machines.xml +++ b/cime_config/acme/machines/config_machines.xml @@ -345,6 +345,7 @@ $CESMSCRATCHROOT/archive/$CASE csm/$CASE /sems-data-store/ACME/baselines + /sems-data-store/ACME/timings /sems-data-store/ACME/cprnc/build/cprnc jgfouca at sandia dot gov @@ -448,6 +449,7 @@ USERDEFINED_optional_run /projects/ccsm/ccsm_baselines /projects/ccsm/cprnc/build/cprnc_wrap + /projects/ccsm/timings slurm jgfouca at sandia dot gov 8 diff --git a/driver_cpl/cime_config/config_component.xml b/driver_cpl/cime_config/config_component.xml index 56b194fddf79..f4edcd215e98 100644 --- a/driver_cpl/cime_config/config_component.xml +++ b/driver_cpl/cime_config/config_component.xml @@ -892,6 +892,15 @@ logical to save timing files in rundir + + char + + UNSET + run_flags + env_run.xml + Where to auto archive timing data + + integer 12 diff --git a/scripts/create_test b/scripts/create_test index 7f7967e811d7..dd8c31526367 100755 --- a/scripts/create_test +++ b/scripts/create_test @@ -14,7 +14,6 @@ import update_acme_tests from CIME.system_test import SystemTest, RUN_PHASE from CIME.utils import expect, convert_to_seconds, compute_total_time, convert_to_babylonian_time, run_cmd from CIME.XML.machines import Machines -from CIME.XML.batch import Batch from CIME.case import Case import argparse, math, glob @@ -77,6 +76,9 @@ OR parser.add_argument("-u", "--use-existing", action="store_true", help="Use pre-existing case directories. Requires test-id") + parser.add_argument("--save-timing", action="store_true", + help="Enable archiving of performance data.") + parser.add_argument("--no-batch", action="store_true", help="Do not submit jobs to batch system, run locally." " If false, will default to machine setting.") @@ -208,7 +210,7 @@ OR args.test_root, args.baseline_root, args.clean, args.compare, args.generate, \ args.baseline_name, args.namelists_only, args.project, args.test_id, args.parallel_jobs, \ args.xml_machine, args.xml_compiler, args.xml_category, args.xml_testlist, args.walltime, \ - args.single_submit, args.proc_pool, args.use_existing + args.single_submit, args.proc_pool, args.use_existing, args.save_timing ############################################################################### def single_submit_impl(machine_name, test_id, proc_pool, project, args, job_cost_map, wall_time, test_root): @@ -314,7 +316,7 @@ def create_test(testargs, compiler, machine_name, no_run, no_build, no_batch, te baseline_root, clean, compare, generate, baseline_name, namelists_only, project, test_id, parallel_jobs, xml_machine, xml_compiler, xml_category, xml_testlist, walltime, - single_submit, proc_pool, use_existing): + single_submit, proc_pool, use_existing, save_timing): ############################################################################### if testargs and machine_name is None and compiler is None: for test in testargs: @@ -341,7 +343,7 @@ def create_test(testargs, compiler, machine_name, no_run, no_build, no_batch, te project=project, parallel_jobs=parallel_jobs, xml_machine=xml_machine, xml_compiler=xml_compiler, xml_category=xml_category, xml_testlist=xml_testlist, walltime=walltime, - proc_pool=proc_pool, use_existing=use_existing) + proc_pool=proc_pool, use_existing=use_existing, save_timing=save_timing) success = impl.system_test() @@ -380,13 +382,13 @@ def _main_func(description): testargs, compiler, machine_name, no_run, no_build, no_batch, test_root, baseline_root, clean, \ compare, generate, baseline_name, namelists_only, project, test_id, parallel_jobs, \ xml_machine, xml_compiler, xml_category, xml_testlist, walltime, single_submit, proc_pool, \ - use_existing \ + use_existing, save_timing \ = parse_command_line(sys.argv, description) sys.exit(create_test(testargs, compiler, machine_name, no_run, no_build, no_batch, test_root, baseline_root, clean, compare, generate, baseline_name, namelists_only, project, test_id, parallel_jobs, xml_machine, xml_compiler, xml_category, - xml_testlist, walltime, single_submit, proc_pool, use_existing)) + xml_testlist, walltime, single_submit, proc_pool, use_existing, save_timing)) ############################################################################### diff --git a/utils/python/CIME/SystemTests/system_tests_common.py b/utils/python/CIME/SystemTests/system_tests_common.py index ea1d2dffce4e..2dc127d73587 100644 --- a/utils/python/CIME/SystemTests/system_tests_common.py +++ b/utils/python/CIME/SystemTests/system_tests_common.py @@ -84,6 +84,7 @@ def _run(self, suffix="base", coupler_log_path=None, st_archive=False): # being marked FAIL success = False self._runstatus = "FAIL" + logger.warning("Exception during run: %s" % (sys.exc_info()[1])) return success diff --git a/utils/python/CIME/case_run.py b/utils/python/CIME/case_run.py index d983e0fdfd5a..a2690b2c6976 100644 --- a/utils/python/CIME/case_run.py +++ b/utils/python/CIME/case_run.py @@ -5,19 +5,19 @@ from CIME.XML.component import Component from CIME.XML.machines import Machines from CIME.case import Case -from CIME.utils import expect, get_model, run_cmd, append_status +from CIME.utils import expect, get_model, run_cmd, append_status, touch from CIME.XML.env_mach_specific import EnvMachSpecific -from CIME.utils import expect +from CIME.utils import expect, gzip_existing_file from CIME.check_lockedfiles import check_lockedfiles from CIME.preview_namelists import preview_namelists from CIME.task_maker import TaskMaker -import gzip, shutil, time, sys, os +import gzip, shutil, time, sys, os, getpass, tarfile, glob, signal logger = logging.getLogger(__name__) ############################################################################### -def preRunCheck(case): +def pre_run_check(case): ############################################################################### # Pre run initialization code.. @@ -82,7 +82,7 @@ def preRunCheck(case): logger.info( "-------------------------------------------------------------------------") ############################################################################### -def runModel(case): +def run_model(case): ############################################################################### # Set OMP_NUM_THREADS @@ -103,7 +103,7 @@ def runModel(case): logger.info( "%s MODEL EXECUTION HAS FINISHED" %(time.strftime("%Y-%m-%d %H:%M:%S"))) ############################################################################### -def postRunCheck(case, lid): +def post_run_check(case, lid): ############################################################################### caseroot = case.get_value("CASEROOT") @@ -137,7 +137,162 @@ def postRunCheck(case, lid): expect (False, msg) ############################################################################### -def getTimings(case, lid): +def _get_batch_job_id(case): +############################################################################### + mach = case.get_value("MACH") + if mach == 'titan': + return os.environ("PBS_JOBID") + elif mach in ['edison', 'corip1']: + return os.environ("SLURM_JOB_ID") + elif mach == 'mira': + return os.environ("COBALT_JOBID") + else: + return None + +############################################################################### +def save_timing_setup_acme(case, lid): +############################################################################### + if not case.get_value("SAVE_TIMING") or case.get_value("MODEL") != "acme": + return + + timing_dir = case.get_value("SAVE_TIMING_DIR") + if timing_dir is None: + logger.warning("ACME requires SAVE_TIMING_DIR to be set in order to save timings. Skipping save timings") + return + + rundir = case.get_value("RUNDIR") + caseroot = case.get_value("CASEROOT") + cimeroot = case.get_value("CIMEROOT") + base_case = case.get_value("CASEBASEID") + full_timing_dir = os.path.join(timing_dir, "performance_archive", getpass.getuser(), base_case, lid) + expect(not os.path.exists(full_timing_dir), "%s already exists" % full_timing_dir) + + os.makedirs(full_timing_dir) + mach = case.get_value("MACH") + compiler = case.get_value("COMPILER") + + # For some batch machines save queue info + job_id = _get_batch_job_id(case) + if mach == "mira": + for cmd, filename in [("qstat -lf", "qstatf"), ("qstat -lf %s" % job_id, "qstatf_jobid")]: + run_cmd("%s > %s" % (cmd, filename), from_dir=full_timing_dir) + gzip_existing_file(os.path.join(full_timing_dir, filename)) + elif mach == ["corip1", "edison"]: + for cmd, filename in [("sqs -f", "sqsf"), ("sqs -w -a", "sqsw"), ("sqs -f %s" % job_id, "sqsf_jobid"), ("squeue", "squeuef")]: + run_cmd("%s > %s" % (cmd, filename), from_dir=full_timing_dir) + gzip_existing_file(os.path.join(full_timing_dir, filename)) + elif mach == "titan": + for cmd, filename in [("xtdb2proc -f xtdb2proc", "xtdb2procf"), + ("qstat -f > qstat", "qstatf"), + ("qstat -f %s > qstatf_jobid" % job_id, "qstatf_jobid"), + ("xtnodestat > xtnodestat", "xtnodestatf"), + ("showq > showqf", "showqf")]: + run_cmd(cmd, from_dir=full_timing_dir) + gzip_existing_file(os.path.join(full_timing_dir, filename)) + + mdiag_reduce = os.path.join(full_timing_dir, "mdiag_reduce") + run_cmd("./mdiag_reduce.csh > %s" % mdiag_reduce, from_dir=os.path.join(caseroot, "Tools")) + gzip_existing_file(mdiag_reduce) + + # copy/tar SourceModes + source_mods_dir = os.path.join(caseroot, "SourceMods") + if os.path.isdir(source_mods_dir): + with tarfile.open(os.path.join(full_timing_dir, "SourceMods.tar.gz"), "w:gz") as tfd: + tfd.add(source_mods_dir) + + # Save various case configuration items + case_docs = os.path.join(full_timing_dir, "CaseDocs") + os.mkdir(case_docs) + globs_to_copy = [ + "CaseDocs/*", + "*.run", + "*.xml", + "user_nl_*", + "*env_mach_specific*", + "Macros", + "README.case", + "Depends.%s" % mach, + "Depends.%s" % compiler, + "Depends.%s.%s" % (mach, compiler), + "software_environment.txt" + ] + for glob_to_copy in globs_to_copy: + for item in glob.glob(os.path.join(caseroot, glob_to_copy)): + shutil.copy(item, case_docs) + + if job_id is not None: + sample_interval = case.get_value("SYSLOG_N") + if sample_interval > 0: + archive_checkpoints = os.path.join(full_timing_dir, "checkpoints") + os.mkdir(archive_checkpoints) + touch("%s/acme.log.%s" % (rundir, lid)) + syslog_jobid = run_cmd("./mach_syslog %d %s %s %s %s/timing/checkpoints %s/checkpoints >& /dev/null & echo $!" % (sample_interval, job_id, lid, rundir, rundir, archive_checkpoints), from_dir=os.path.join(caseroot, "Tools")) + with open(os.path.join(rundir, "syslog_jobid", ".%s" % job_id), "w") as fd: + fd.write("%s\n" % syslog_jobid) + + # Save state of repo + run_cmd("git describe > %s" % os.path.join(full_timing_dir, "GIT_DESCRIBE"), from_dir=cimeroot) + +############################################################################### +def save_timing_cesm(case, lid): +############################################################################### + rundir = case.get_value("RUNDIR") + timing_dir = case.get_value("SAVE_TIMING_DIR") + timing_dir = os.path.join(timing_dir, case.get_value("CASE")) + shutil.move(os.path.join(rundir,"timing"), + os.path.join(timing_dir,"timing."+lid)) + +############################################################################### +def save_timing_acme(case, lid): +############################################################################### + rundir = case.get_value("RUNDIR") + timing_dir = case.get_value("SAVE_TIMING_DIR") + caseroot = case.get_value("CASEROOT") + mach = case.get_value("MACH") + base_case = case.get_value("CASEBASEID") + full_timing_dir = os.path.join(timing_dir, "performance_archive", getpass.getuser(), base_case, lid) + + # Kill mach_syslog + job_id = _get_batch_job_id(case) + if job_id is not None: + syslog_jobid_path = os.path.join(rundir, "syslog_jobid", ".%s" % job_id) + if os.path.exists(syslog_jobid_path): + try: + with open(syslog_jobid_path, "r") as fd: + syslog_jobid = int(fd.read().strip()) + os.kill(syslog_jobid, signal.SIGTERM) + except (ValueError, OSError) as e: + logger.warning("Failed to kill syslog: %s" % e) + finally: + os.remove(syslog_jobid_path) + + # copy/tar timings + with tarfile.open(os.path.join(full_timing_dir, "timing.tar.gz"), "w:gz") as tfd: + tfd.add(os.path.join(rundir, "timing")) + + # + # save output files and logs + # + globs_to_copy = [] + if mach == "titan": + globs_to_copy.append("%s*OU" % job_id) + elif mach == "mira": + globs_to_copy.append("%s*output" % job_id) + globs_to_copy.append("%s*cobaltlog" % job_id) + elif mach in ["edison", "corip1"]: + globs_to_copy.append("%s" % case.get_value("CASE")) + + globs_to_copy.append("logs/acme.log.%s.gz" % lid) + globs_to_copy.append("logs/cpl.log.%s.gz" % lid) + globs_to_copy.append("timing/*.%s" % lid) + globs_to_copy.append("CaseStatus") + + for glob_to_copy in globs_to_copy: + for item in glob.glob(os.path.join(caseroot, glob_to_copy)): + shutil.copy(item, full_timing_dir) + +############################################################################### +def get_timings(case, lid): ############################################################################### check_timing = case.get_value("CHECK_TIMING") if check_timing: @@ -150,27 +305,25 @@ def getTimings(case, lid): cmd = "%s -lid %s " %(os.path.join(caseroot,"Tools","getTiming"), lid) run_cmd(cmd) - # save the timing files if desired + # save the timing files if desired. Some of the details here are + # model dependent. + model = case.get_value("MODEL") save_timing = case.get_value("SAVE_TIMING") if save_timing: - rundir = case.get_value("RUNDIR") - shutil.move(os.path.join(rundir,"timing"), - os.path.join(rundir,"timing."+lid)) + if model == "acme": + save_timing_acme(case, lid) + else: + save_timing_cesm(case, lid) # compress relevant timing files logger.info( "gzipping timing stats.." ) - model = case.get_value("MODEL") timingfile = os.path.join(timingDir, model + "_timing_stats." + lid) - with open(timingfile, 'rb') as f_in: - with gzip.open(timingfile + '.gz', 'wb') as f_out: - shutil.copyfileobj(f_in, f_out) - os.remove(timingfile) + gzip_existing_file(timingfile) logger.info("Done with timings") ############################################################################### -def saveLogs(case, lid): +def save_logs(case, lid): ############################################################################### - logdir = case.get_value("LOGDIR") if logdir is not None and len(logdir) > 0: if not os.path.isdir(logdir): @@ -192,17 +345,12 @@ def saveLogs(case, lid): for comp in comps: logfile = os.path.join(rundir, comp + '.log.' + lid) if os.path.isfile(logfile): - with open(logfile, 'r') as f_in: - with gzip.open(logfile + '.gz', 'wb') as f_out: - f_out.writelines(f_in) - - os.remove(logfile) - logfile_copy = logfile + '.gz' - shutil.copy(logfile_copy, - os.path.join(caseroot, logdir, os.path.basename(logfile_copy))) + logfile_gz = gzip_existing_file(logfile) + shutil.copy(logfile_gz, + os.path.join(caseroot, logdir, os.path.basename(logfile_gz))) ############################################################################### -def resubmitCheck(case): +def resubmit_check(case): ############################################################################### # check to see if we need to do resubmission from this particular job, @@ -229,7 +377,7 @@ def resubmitCheck(case): submit(case, job=job, resubmit=True) ############################################################################### -def DoDataAssimilation(case, da_script, lid): +def do_data_assimilation(case, da_script, lid): ############################################################################### cmd = da_script + "1> da.log.%s 2>&1" %(lid) logger.debug("running %s" %da_script) @@ -255,15 +403,17 @@ def case_run(case): lid = time.strftime("%y%m%d-%H%M%S") os.environ["LID"] = lid + save_timing_setup_acme(case, lid) + for _ in range(data_assimilation_cycles): - preRunCheck(case) - runModel(case) - postRunCheck(case, lid) - saveLogs(case, lid) # Copy log files back to caseroot - getTimings(case, lid) # Run the getTiming script + pre_run_check(case) + run_model(case) + post_run_check(case, lid) + save_logs(case, lid) # Copy log files back to caseroot + get_timings(case, lid) # Run the getTiming script if data_assimilation: - DoDataAssimilation(case, data_assimilation_script, lid) + do_data_assimilation(case, data_assimilation_script, lid) - resubmitCheck(case) + resubmit_check(case) return True diff --git a/utils/python/CIME/system_test.py b/utils/python/CIME/system_test.py index fa9fa83e323d..0ffd6e6283ae 100644 --- a/utils/python/CIME/system_test.py +++ b/utils/python/CIME/system_test.py @@ -44,11 +44,13 @@ def __init__(self, test_names, project=None, parallel_jobs=None, xml_machine=None, xml_compiler=None, xml_category=None, xml_testlist=None, walltime=None, proc_pool=None, - use_existing=False): + use_existing=False, save_timing=False): ########################################################################### self._cime_root = CIME.utils.get_cime_root() self._cime_model = CIME.utils.get_model() + self._save_timing = save_timing + # needed for perl interface os.environ["CIMEROOT"] = self._cime_root @@ -533,6 +535,8 @@ def _xml_phase(self, test): case.set_value("SHAREDLIBROOT", os.path.join(self._test_root, "sharedlibroot.%s"%self._test_id)) + if self._save_timing: + case.set_value("SAVE_TIMING", True) envtest.set_initial_values(case) return True diff --git a/utils/python/CIME/utils.py b/utils/python/CIME/utils.py index 7aa6d82d760d..614fc1402675 100644 --- a/utils/python/CIME/utils.py +++ b/utils/python/CIME/utils.py @@ -2,12 +2,7 @@ Common functions used by cime python scripts Warning: you cannot use CIME Classes in this module as it causes circular dependencies """ -import logging -import logging.config -import sys -import os -import time -import re +import sys, os, time, re, logging, gzip, shutil from ConfigParser import SafeConfigParser as config_parser # Return this error code if the scripts worked but tests failed @@ -123,13 +118,10 @@ def get_model(): model = 'acme' logger.info("Guessing CIME_MODEL=%s, set environment variable if this is incorrect"%model) - if model is not None: set_model(model) return model - - modelroot = os.path.join(get_cime_root(), "cime_config") models = os.listdir(modelroot) msg = ".cime/config or environment variable CIME_MODEL must be set to one of: " @@ -826,3 +818,35 @@ def get_build_threaded(case): if case.get_value("NTHRDS_%s"%comp_class) > 1: return True return False + +def gunzip_existing_file(filepath): + with gzip.open(filepath, "rb") as fd: + return fd.read() + +def gzip_existing_file(filepath): + """ + Gzips an existing file, removes the unzipped version, returns path to zip file + + >>> import tempfile + >>> fd, filename = tempfile.mkstemp(text=True) + >>> _ = os.write(fd, "Hello World") + >>> os.close(fd) + >>> gzfile = gzip_existing_file(filename) + >>> gunzip_existing_file(gzfile) + 'Hello World' + >>> os.remove(gzfile) + """ + gzpath = '%s.gz' % filepath + with open(filepath, "rb") as f_in: + with gzip.open(gzpath, "wb") as f_out: + shutil.copyfileobj(f_in, f_out) + + os.remove(filepath) + + return gzpath + +def touch(fname): + if os.path.exists(fname): + os.utime(fname, None) + else: + open(fname, 'a').close() diff --git a/utils/python/tests/scripts_regression_tests.py b/utils/python/tests/scripts_regression_tests.py index 09deb3e20d29..4857c9b4b6c4 100755 --- a/utils/python/tests/scripts_regression_tests.py +++ b/utils/python/tests/scripts_regression_tests.py @@ -917,6 +917,27 @@ def test_single_submit(self): self.assertEqual(stat, 0, msg="COMMAND SHOULD HAVE WORKED\nwait_for_tests output:\n%s\n\nerrput:\n%s\n\ncode: %d" % (output, errput, stat)) +############################################################################### +class TestSaveTimings(TestCreateTestCommon): +############################################################################### + + ########################################################################### + def test_save_timings(self): + ########################################################################### + create_test_cmd = "%s/create_test SMS_Ln9_Mmpi-serial.f19_g16_rx1.A --save-timing --walltime 0:15:00 -t %s" % (SCRIPT_DIR, self._baseline_name) + if NO_BATCH: + create_test_cmd += " --no-batch" + + stat, output, errput = run_cmd(create_test_cmd, ok_to_fail=True) + self.assertEqual(stat, 0, + msg="COMMAND SHOULD HAVE WORKED\ncreate_test output:\n%s\n\nerrput:\n%s\n\ncode: %d" % (output, errput, stat)) + + if (self._hasbatch): + stat, output, errput = run_cmd("%s/wait_for_tests *%s*/TestStatus" % (TOOLS_DIR, self._baseline_name), + ok_to_fail=True, from_dir=self._testroot) + self.assertEqual(stat, 0, + msg="COMMAND SHOULD HAVE WORKED\nwait_for_tests output:\n%s\n\nerrput:\n%s\n\ncode: %d" % (output, errput, stat)) + ############################################################################### class TestXMLQuery(unittest.TestCase): # Testing command line scripts From e3dcd0b347ab1ad60b8f0e4855ab6ee9bae28b68 Mon Sep 17 00:00:00 2001 From: James Foucar Date: Fri, 15 Jul 2016 11:36:50 -0600 Subject: [PATCH 10/15] Minor fix --- utils/python/CIME/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/python/CIME/utils.py b/utils/python/CIME/utils.py index 7aa6d82d760d..a8eff21a7ced 100644 --- a/utils/python/CIME/utils.py +++ b/utils/python/CIME/utils.py @@ -807,7 +807,7 @@ def wait_for_unlocked(filepath): file_object = open(filepath, 'a', buffer_size) if file_object: locked = False - except IOError, message: + except IOError: locked = True time.sleep(1) finally: From d3de6ae3171cca6a909ffd12316a06e9b1c3fe94 Mon Sep 17 00:00:00 2001 From: James Foucar Date: Fri, 15 Jul 2016 11:58:31 -0600 Subject: [PATCH 11/15] Trying to get reasonable error when using python 3 --- utils/python/CIME/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/python/CIME/utils.py b/utils/python/CIME/utils.py index a8eff21a7ced..d7f1b3f0333c 100644 --- a/utils/python/CIME/utils.py +++ b/utils/python/CIME/utils.py @@ -8,7 +8,6 @@ import os import time import re -from ConfigParser import SafeConfigParser as config_parser # Return this error code if the scripts worked but tests failed TESTS_FAILED_ERR_CODE = 100 @@ -40,6 +39,8 @@ def _read_cime_config_file(): CIME_MODEL=acme,cesm PROJECT=someprojectnumber """ + from ConfigParser import SafeConfigParser as config_parser + cime_config_file = os.path.abspath(os.path.join(os.path.expanduser("~"), ".cime","config")) cime_config = config_parser() From f70029d84dd86d1643f9d1aa26a8e4a4655bfdc4 Mon Sep 17 00:00:00 2001 From: James Foucar Date: Fri, 15 Jul 2016 12:32:31 -0600 Subject: [PATCH 12/15] Python3 users should get a better error now --- utils/python/CIME/utils.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/utils/python/CIME/utils.py b/utils/python/CIME/utils.py index d7f1b3f0333c..b3c3c4674392 100644 --- a/utils/python/CIME/utils.py +++ b/utils/python/CIME/utils.py @@ -124,13 +124,10 @@ def get_model(): model = 'acme' logger.info("Guessing CIME_MODEL=%s, set environment variable if this is incorrect"%model) - if model is not None: set_model(model) return model - - modelroot = os.path.join(get_cime_root(), "cime_config") models = os.listdir(modelroot) msg = ".cime/config or environment variable CIME_MODEL must be set to one of: " @@ -139,7 +136,6 @@ def get_model(): and model != "xml_schemas"]) expect(False, msg) - _hack=object() def run_cmd(cmd, ok_to_fail=False, input_str=None, from_dir=None, verbose=None, arg_stdout=_hack, arg_stderr=_hack): @@ -379,7 +375,8 @@ def get_cime_location_within_acme(): """ return "cime" -def get_model_config_location_within_cime(model=get_model()): +def get_model_config_location_within_cime(model=None): + model = get_model() if model is None else model return os.path.join("cime_config", model) def get_acme_root(): @@ -408,13 +405,14 @@ def get_python_libs_root(): """ return os.path.join(get_cime_root(), get_python_libs_location_within_cime()) -def get_model_config_root(model=get_model()): +def get_model_config_root(model=None): """ Get absolute path to model config area" >>> os.path.isdir(get_model_config_root()) True """ + model = get_model() if model is None else model return os.path.join(get_cime_root(), get_model_config_location_within_cime(model)) def stop_buffering_output(): From d4c503b2c5935aee09f67412dc3145315465916d Mon Sep 17 00:00:00 2001 From: James Foucar Date: Fri, 15 Jul 2016 12:38:17 -0600 Subject: [PATCH 13/15] Minor improvement to error message --- utils/python/CIME/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/python/CIME/utils.py b/utils/python/CIME/utils.py index b3c3c4674392..9de6392cb827 100644 --- a/utils/python/CIME/utils.py +++ b/utils/python/CIME/utils.py @@ -212,7 +212,7 @@ def check_minimum_python_version(major, minor): >>> """ expect(sys.version_info[0] == major and sys.version_info[1] >= minor, - "Python %d.%d+ is required, you have %d.%d" % + "Python %d, minor verion %d+ is required, you have %d.%d" % (major, minor, sys.version_info[0], sys.version_info[1])) def normalize_case_id(case_id): From 9239984189e4b18da9c7a3ba0af86268b17611ad Mon Sep 17 00:00:00 2001 From: James Foucar Date: Fri, 15 Jul 2016 12:55:17 -0600 Subject: [PATCH 14/15] Suffix all files with lid --- utils/python/CIME/case_run.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/utils/python/CIME/case_run.py b/utils/python/CIME/case_run.py index a2690b2c6976..63f06eb20af3 100644 --- a/utils/python/CIME/case_run.py +++ b/utils/python/CIME/case_run.py @@ -12,7 +12,7 @@ from CIME.preview_namelists import preview_namelists from CIME.task_maker import TaskMaker -import gzip, shutil, time, sys, os, getpass, tarfile, glob, signal +import shutil, time, sys, os, getpass, tarfile, glob, signal logger = logging.getLogger(__name__) @@ -175,11 +175,11 @@ def save_timing_setup_acme(case, lid): job_id = _get_batch_job_id(case) if mach == "mira": for cmd, filename in [("qstat -lf", "qstatf"), ("qstat -lf %s" % job_id, "qstatf_jobid")]: - run_cmd("%s > %s" % (cmd, filename), from_dir=full_timing_dir) + run_cmd("%s > %s.%s" % (cmd, filename, lid), from_dir=full_timing_dir) gzip_existing_file(os.path.join(full_timing_dir, filename)) elif mach == ["corip1", "edison"]: for cmd, filename in [("sqs -f", "sqsf"), ("sqs -w -a", "sqsw"), ("sqs -f %s" % job_id, "sqsf_jobid"), ("squeue", "squeuef")]: - run_cmd("%s > %s" % (cmd, filename), from_dir=full_timing_dir) + run_cmd("%s > %s.%s" % (cmd, filename, lid), from_dir=full_timing_dir) gzip_existing_file(os.path.join(full_timing_dir, filename)) elif mach == "titan": for cmd, filename in [("xtdb2proc -f xtdb2proc", "xtdb2procf"), @@ -187,17 +187,17 @@ def save_timing_setup_acme(case, lid): ("qstat -f %s > qstatf_jobid" % job_id, "qstatf_jobid"), ("xtnodestat > xtnodestat", "xtnodestatf"), ("showq > showqf", "showqf")]: - run_cmd(cmd, from_dir=full_timing_dir) - gzip_existing_file(os.path.join(full_timing_dir, filename)) + run_cmd(cmd + "." + lid, from_dir=full_timing_dir) + gzip_existing_file(os.path.join(full_timing_dir, filename + "." + lid)) - mdiag_reduce = os.path.join(full_timing_dir, "mdiag_reduce") + mdiag_reduce = os.path.join(full_timing_dir, "mdiag_reduce." + lid) run_cmd("./mdiag_reduce.csh > %s" % mdiag_reduce, from_dir=os.path.join(caseroot, "Tools")) gzip_existing_file(mdiag_reduce) # copy/tar SourceModes source_mods_dir = os.path.join(caseroot, "SourceMods") if os.path.isdir(source_mods_dir): - with tarfile.open(os.path.join(full_timing_dir, "SourceMods.tar.gz"), "w:gz") as tfd: + with tarfile.open(os.path.join(full_timing_dir, "SourceMods.%s.tar.gz" % lid), "w:gz") as tfd: tfd.add(source_mods_dir) # Save various case configuration items @@ -218,7 +218,7 @@ def save_timing_setup_acme(case, lid): ] for glob_to_copy in globs_to_copy: for item in glob.glob(os.path.join(caseroot, glob_to_copy)): - shutil.copy(item, case_docs) + shutil.copy(item, os.path.join(case_docs, os.path.basename(item) + "." + lid)) if job_id is not None: sample_interval = case.get_value("SYSLOG_N") @@ -267,7 +267,7 @@ def save_timing_acme(case, lid): os.remove(syslog_jobid_path) # copy/tar timings - with tarfile.open(os.path.join(full_timing_dir, "timing.tar.gz"), "w:gz") as tfd: + with tarfile.open(os.path.join(full_timing_dir, "timing.%s.tar.gz" % lid), "w:gz") as tfd: tfd.add(os.path.join(rundir, "timing")) # From fb3aeeaf04604721782f3891336558479644478d Mon Sep 17 00:00:00 2001 From: James Foucar Date: Fri, 15 Jul 2016 13:02:33 -0600 Subject: [PATCH 15/15] Fix unit tests. Unsafe defaults were being used --- utils/python/CIME/utils.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/utils/python/CIME/utils.py b/utils/python/CIME/utils.py index 9de6392cb827..bd2fd295028c 100644 --- a/utils/python/CIME/utils.py +++ b/utils/python/CIME/utils.py @@ -60,6 +60,13 @@ def get_cime_config(): return _CIMECONFIG +def reset_cime_config(): + """ + Useful to keep unit tests from interfering with each other + """ + global _CIMECONFIG + _CIMECONFIG = None + def get_python_libs_location_within_cime(): """ From within CIME, return subdirectory of python libraries @@ -104,6 +111,7 @@ def get_model(): >>> set_model('rocky') >>> get_model() 'rocky' + >>> reset_cime_config() """ model = os.environ.get("CIME_MODEL") if (model is not None):