New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
ooo.py in branches/UKMO/r5518_INGV1_WAVE-coupling/NEMOGCM/TOOLS/OBSTOOLS/OOO/ooo – NEMO

source: branches/UKMO/r5518_INGV1_WAVE-coupling/NEMOGCM/TOOLS/OBSTOOLS/OOO/ooo/ooo.py @ 7152

Last change on this file since 7152 was 7152, checked in by jcastill, 7 years ago

Initial implementation of wave coupling branch - INGV wave branch + UKMO wave coupling branch

  • Property svn:executable set to *
File size: 3.9 KB
Line 
1#!/usr/bin/env python2.7
2
3import os
4import shutil
5
6# Local imports
7import locator
8import nml
9import run
10
11def parse_args():
12    import argparse
13    parser = argparse.ArgumentParser()
14    parser.add_argument("date", metavar="DATE", 
15                        help="Run date.")
16    parser.add_argument("-w", "--work-dir", default=os.getcwd())
17    parser.add_argument("-f", "--forecast-types", default="forecast",
18                        help="Choice of forecast,persistence,climatology")
19    parser.add_argument("-l", "--lead-times", default="12",
20                        help="Forecast lead times")
21    parser.add_argument("-o", "--obs-types", default="profbfiles",
22                        help="Choice of namobs types.")
23    parser.add_argument("--class4", dest="ln_cl4", action="store_true",
24                        help="Flag to choose class 4 file outputs")
25    parser.add_argument("--dry-run", action="store_true",
26                        help="Flag to test namelist building without submitting.")
27    parser.add_argument("--cmd", dest="command", default="./opa",
28                        help="Submit task to run.")
29    parser.add_argument("-v", "--verbose", action="store_true",
30                        help="Prints difference between before and after namelists.")
31    parser.add_argument("namelist", metavar="NAMELIST", 
32                        help="NEMO namelist to edit.")
33    args = parser.parse_args()
34    args.forecast_types = args.forecast_types.split(',')
35    args.obs_types = args.obs_types.split(',')
36    args.lead_times = map(int, args.lead_times.split(','))
37    return args
38
39def printdiff(text1, text2):
40    # Provides nice text difference summary of namelists
41    import difflib
42    lines1 = text1.splitlines()
43    lines2 = text2.splitlines()
44    d = difflib.Differ()
45    result = list(d.compare(lines1, lines2))
46    text = '\n'.join(result)
47    print text
48
49def main():
50    args = parse_args()
51    date = args.date
52    print "Processing", args.namelist, " for", args.date
53   
54    # Move to working directory
55    if not os.path.exists(args.work_dir):
56        os.makedirs(args.work_dir)
57    os.chdir(args.work_dir)
58
59    # Collect forecast files
60    types = args.forecast_types
61    lead_times = args.lead_times
62    namooo, namcl4 = locator.forecasts(date=date,
63                                       types=types,
64                                       lead_times=lead_times)
65
66    # Process NEMO namelist
67    text = nml.reader(args.namelist)
68    sublists = nml.namelists(text)
69
70    # Verbose save original text
71    if args.verbose:
72        original_text = text
73
74    # namooo
75    if "namooo" not in sublists:
76        # Attach boilerplate
77        text += nml.new("namooo")
78    text = nml.update("namooo", text, data=namooo)
79
80    # namcl4
81    if "namcl4" not in sublists:
82        # Attach boilerplate
83        text += nml.new("namcl4")
84    namcl4["cl4_leadtime"] = lead_times
85    namcl4["cl4_date"] = nml.quote(date)
86    namcl4["cl4_match_len"] = len(namcl4["cl4_vars"])
87    namcl4["cl4_fcst_len"] = len(namcl4["cl4_leadtime"])
88    # Add naming convention
89    namcl4["cl4_sys"] = "FOAM"
90    namcl4["cl4_cfg"] = "orca025"
91    namcl4["cl4_vn"] = "'1.0'"
92    namcl4["cl4_prefix"] = "class4"
93    namcl4["cl4_contact"] = "example@example.com"
94    namcl4["cl4_inst"] = "institute"
95    text = nml.update("namcl4", text, data=namcl4)
96
97    # namrun
98    namrun = {"nn_date0": nml.quote(date)}
99    text = nml.update("namrun", text, data=namrun)
100
101    # namobs
102    namobs = locator.observations(date=date,
103                                  types=args.obs_types)
104    namobs["ln_cl4"] = args.ln_cl4
105    text = nml.update("namobs", text, data=namobs)
106
107    # Verbose print namelist differences
108    if args.verbose:
109        printdiff(original_text, text)
110
111    # pipe text to file
112    tmp = args.namelist+".tmp"
113    nml.writer(tmp, text)
114    shutil.move(tmp, args.namelist)
115
116    # Run job
117    if not args.dry_run:
118        run.submit(command=args.command)
119   
120
121
122if __name__ == '__main__':
123    main()
124
Note: See TracBrowser for help on using the repository browser.