123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #!/usr/bin/env python2.7
- import os
- import shutil
- # Local imports
- import locator
- import nml
- import run
- def parse_args():
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("date", metavar="DATE",
- help="Run date.")
- parser.add_argument("-w", "--work-dir", default=os.getcwd())
- parser.add_argument("-f", "--forecast-types", default="forecast",
- help="Choice of forecast,persistence,climatology")
- parser.add_argument("-l", "--lead-times", default="12",
- help="Forecast lead times")
- parser.add_argument("-o", "--obs-types", default="profbfiles",
- help="Choice of namobs types.")
- parser.add_argument("--class4", dest="ln_cl4", action="store_true",
- help="Flag to choose class 4 file outputs")
- parser.add_argument("--dry-run", action="store_true",
- help="Flag to test namelist building without submitting.")
- parser.add_argument("--cmd", dest="command", default="./opa",
- help="Submit task to run.")
- parser.add_argument("-v", "--verbose", action="store_true",
- help="Prints difference between before and after namelists.")
- parser.add_argument("namelist", metavar="NAMELIST",
- help="NEMO namelist to edit.")
- args = parser.parse_args()
- args.forecast_types = args.forecast_types.split(',')
- args.obs_types = args.obs_types.split(',')
- args.lead_times = map(int, args.lead_times.split(','))
- return args
- def printdiff(text1, text2):
- # Provides nice text difference summary of namelists
- import difflib
- lines1 = text1.splitlines()
- lines2 = text2.splitlines()
- d = difflib.Differ()
- result = list(d.compare(lines1, lines2))
- text = '\n'.join(result)
- print text
- def main():
- args = parse_args()
- date = args.date
- print "Processing", args.namelist, " for", args.date
-
- # Move to working directory
- if not os.path.exists(args.work_dir):
- os.makedirs(args.work_dir)
- os.chdir(args.work_dir)
- # Collect forecast files
- types = args.forecast_types
- lead_times = args.lead_times
- namooo, namcl4 = locator.forecasts(date=date,
- types=types,
- lead_times=lead_times)
- # Process NEMO namelist
- text = nml.reader(args.namelist)
- sublists = nml.namelists(text)
- # Verbose save original text
- if args.verbose:
- original_text = text
- # namooo
- if "namooo" not in sublists:
- # Attach boilerplate
- text += nml.new("namooo")
- text = nml.update("namooo", text, data=namooo)
- # namcl4
- if "namcl4" not in sublists:
- # Attach boilerplate
- text += nml.new("namcl4")
- namcl4["cl4_leadtime"] = lead_times
- namcl4["cl4_date"] = nml.quote(date)
- namcl4["cl4_match_len"] = len(namcl4["cl4_vars"])
- namcl4["cl4_fcst_len"] = len(namcl4["cl4_leadtime"])
- # Add naming convention
- namcl4["cl4_sys"] = "FOAM"
- namcl4["cl4_cfg"] = "orca025"
- namcl4["cl4_vn"] = "'1.0'"
- namcl4["cl4_prefix"] = "class4"
- namcl4["cl4_contact"] = "example@example.com"
- namcl4["cl4_inst"] = "institute"
- text = nml.update("namcl4", text, data=namcl4)
- # namrun
- namrun = {"nn_date0": nml.quote(date)}
- text = nml.update("namrun", text, data=namrun)
- # namobs
- namobs = locator.observations(date=date,
- types=args.obs_types)
- namobs["ln_cl4"] = args.ln_cl4
- text = nml.update("namobs", text, data=namobs)
- # Verbose print namelist differences
- if args.verbose:
- printdiff(original_text, text)
- # pipe text to file
- tmp = args.namelist+".tmp"
- nml.writer(tmp, text)
- shutil.move(tmp, args.namelist)
- # Run job
- if not args.dry_run:
- run.submit(command=args.command)
-
- if __name__ == '__main__':
- main()
|