Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring run_neon for PLUMBER2 part1 #2315

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
240 changes: 240 additions & 0 deletions python/ctsm/site_and_regional/neon_arg_parse.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
"""
Argument parser to use throughout run_neon.py
"""

import argparse
import logging
import os
import sys

# Get the ctsm util tools and then the cime tools.
_CTSM_PYTHON = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "python"))
sys.path.insert(1, _CTSM_PYTHON)

# pylint: disable=wrong-import-position, import-error, unused-import, wrong-import-order
from ctsm import add_cime_to_path
from ctsm.utils import parse_isoduration
from CIME.utils import parse_args_and_handle_standard_logging_options
from CIME.utils import setup_standard_logging_options


def get_parser(args, description, valid_neon_sites):
"""
Get parser object for this script.
"""
parser = argparse.ArgumentParser(
description=description, formatter_class=argparse.RawDescriptionHelpFormatter
)

setup_standard_logging_options(parser)

parser.print_usage = parser.print_help

parser.add_argument(
"--neon-sites",
help="4-letter neon site code.",
action="store",
required=False,
choices=valid_neon_sites + ["all"],
dest="neon_sites",
default=["OSBS"],
nargs="+",
)

parser.add_argument(
"--base-case",
help="""
Root Directory of base case build
[default: %(default)s]
""",
action="store",
dest="base_case_root",
type=str,
required=False,
default=None,
)

parser.add_argument(
"--output-root",
help="""
Root output directory of cases
[default: %(default)s]
""",
action="store",
dest="output_root",
type=str,
required=False,
default="CIME_OUTPUT_ROOT as defined in cime",
)

parser.add_argument(
"--overwrite",
help="""
overwrite existing case directories
[default: %(default)s]
""",
action="store_true",
dest="overwrite",
required=False,
default=False,
)

parser.add_argument(
"--setup-only",
help="""
Only setup the requested cases, do not build or run
[default: %(default)s]
""",
action="store_true",
dest="setup_only",
required=False,
default=False,
)

parser.add_argument(
"--rerun",
help="""
If the case exists but does not appear to be complete, restart it.
[default: %(default)s]
""",
action="store_true",
dest="rerun",
required=False,
default=False,
)

parser.add_argument(
"--no-batch",
help="""
Run locally, do not use batch queueing system (if defined for Machine)
[default: %(default)s]
""",
action="store_true",
dest="no_batch",
required=False,
default=False,
)

parser.add_argument(
"--run-type",
help="""
Type of run to do
[default: %(default)s]
""",
choices=["ad", "postad", "transient"], # , "sasu"],
default="transient",
)

parser.add_argument(
"--prism",
help="""
Uses the PRISM reanaylsis precipitation data for the site instead of the NEON data
(only available over Continental US)
""",
action="store_true",
dest="prism",
required=False,
default=False,
)

parser.add_argument(
"--experiment",
help="""
Appends the case name with string for model experiment
""",
action="store",
dest="experiment",
type=str,
required=False,
default=None,
)

parser.add_argument(
"--run-length",
help="""
How long to run (modified ISO 8601 duration)
[default: %(default)s]
""",
required=False,
type=str,
default="0Y",
)

parser.add_argument(
"--run-from-postad",
help="""
For transient runs only - should we start from the postad spinup or finidat?
By default start from finidat, if this flag is used the postad run must be available.
""",
action="store_true",
required=False,
default=False,
)
parser.add_argument(
"--neon-version",
help="""
Neon data version to use for this simulation.
[default: use the latest data available]
""",
action="store",
dest="user_version",
required=False,
type=str,
choices=["v1", "v2", "v3"],
)

args = parse_args_and_handle_standard_logging_options(args, parser)

if "all" in args.neon_sites:
neon_sites = valid_neon_sites
else:
neon_sites = args.neon_sites
for site in neon_sites:
if site not in valid_neon_sites:
raise ValueError("Invalid site name {}".format(site))

if "CIME_OUTPUT_ROOT" in args.output_root:
args.output_root = None

if args.run_length == "0Y":
if args.run_type == "ad":
run_length = "100Y"
elif args.run_type == "postad":
run_length = "100Y"
else:
# The transient run length is set by cdeps atm buildnml to
# the last date of the available tower data
# this value is not used
run_length = "4Y"
else:
run_length = args.run_length

run_length = parse_isoduration(run_length)

base_case_root = None
if args.base_case_root:
base_case_root = os.path.abspath(args.base_case_root)
if not os.path.exists(base_case_root):
raise ValueError("Base case root does not exist: {}".format(base_case_root))

# Reduce output level for this script unless --debug or
# --verbose is provided on the command line
if not args.debug and not args.verbose:
root_logger = logging.getLogger()
root_logger.setLevel(logging.WARN)

return (
neon_sites,
args.output_root,
args.run_type,
args.experiment,
args.prism,
args.overwrite,
run_length,
base_case_root,
args.run_from_postad,
args.setup_only,
args.no_batch,
args.rerun,
args.user_version,
)
Loading
Loading