clm5/python/ctsm/lilac_download_input_data.py
2024-05-09 15:14:01 +08:00

94 lines
2.9 KiB
Python

"""Functions implementing LILAC's download_input_data command"""
import argparse
import logging
import os
import re
from CIME.case import Case # pylint: disable=import-error
from ctsm.ctsm_logging import (
setup_logging_pre_config,
add_logging_args,
process_logging_args,
)
logger = logging.getLogger(__name__)
# ========================================================================
# Define some constants
# ========================================================================
# In lilac_in, file names match this pattern: The variable name ends with 'filename', so
# that is the last thing before the equals sign on the line.
_LILAC_FILENAME = r"filename *="
# ========================================================================
# Public functions
# ========================================================================
def main():
"""Main function called when download_input_data is run from the command-line"""
setup_logging_pre_config()
args = _commandline_args()
process_logging_args(args)
download_input_data(rundir=args.rundir)
def download_input_data(rundir):
"""Implementation of the download_input_data command
Args:
rundir: str - path to directory containing input_data_list files
"""
_create_lilac_input_data_list(rundir)
case = Case(os.path.realpath(os.path.join(rundir, os.pardir, "case")))
case.check_all_input_data(data_list_dir=rundir, download=True, chksum=False)
os.remove(os.path.join(rundir, "lilac.input_data_list"))
# ========================================================================
# Private functions
# ========================================================================
def _commandline_args():
"""Parse and return command-line arguments"""
description = """
Script to download any missing input data for CTSM and LILAC
"""
parser = argparse.ArgumentParser(
description=description, formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument(
"--rundir",
default=os.getcwd(),
help="Full path of the run directory\n"
"(This directory should contain clm.input_data_list and lilac_in,\n"
"among other files.)\n"
"(Note: it is assumed that this directory exists alongside the other\n"
"directories created by build_ctsm: 'case' and 'inputdata'.)",
)
add_logging_args(parser)
args = parser.parse_args()
return args
def _create_lilac_input_data_list(rundir):
with open(os.path.join(rundir, "lilac_in")) as lilac_in:
with open(os.path.join(rundir, "lilac.input_data_list"), "w") as input_data_list:
for line in lilac_in:
if re.search(_LILAC_FILENAME, line):
# Remove quotes from filename, then output this line
line = line.replace('"', "")
line = line.replace("'", "")
input_data_list.write(line)