source: flex_extract.git/source/python/submit.py @ 274f9ef

ctbtodev
Last change on this file since 274f9ef was 274f9ef, checked in by Anne Philipp <anne.philipp@…>, 6 years ago

Converted docstrings to numpy style and build first structure for sphinxdocumentation (incl API)

  • Property mode set to 100755
File size: 5.9 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#*******************************************************************************
4# @Author: Anne Fouilloux (University of Oslo)
5#
6# @Date: October 2014
7#
8# @Change History:
9#
10#    November 2015 - Leopold Haimberger (University of Vienna):
11#        - job submission on ecgate and cca
12#        - job templates suitable for twice daily operational dissemination
13#
14#    February 2018 - Anne Philipp (University of Vienna):
15#        - applied PEP8 style guide
16#        - added documentation
17#        - minor changes in programming style (for consistence)
18#        - changed path names to variables from config file
19#        - added option for writing mars requests to extra file
20#          additionally,as option without submitting the mars jobs
21#
22# @License:
23#    (C) Copyright 2014-2018.
24#
25#    This software is licensed under the terms of the Apache Licence Version 2.0
26#    which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
27#
28# @Program Functionality:
29#    This program is the main program of flex_extract and controls the
30#    program flow.
31#    If it is supposed to work locally then it works through the necessary
32#    functions get_mars_data and prepareFlexpart. Otherwise it prepares
33#    a shell job script which will do the necessary work on the
34#    ECMWF server and is submitted via ecaccess-job-submit.
35#
36# @Program Content:
37#    - main
38#    - submit
39#
40#*******************************************************************************
41
42# ------------------------------------------------------------------------------
43# MODULES
44# ------------------------------------------------------------------------------
45import os
46import sys
47import subprocess
48import inspect
49import collections
50
51# software specific classes and modules from flex_extract
52import _config
53from mods.tools import (normal_exit, get_cmdline_arguments,
54                        submit_job_to_ecserver, read_ecenv)
55from mods.get_mars_data import get_mars_data
56from mods.prepare_flexpart import prepare_flexpart
57from classes.ControlFile import ControlFile
58
59# ------------------------------------------------------------------------------
60# FUNCTIONS
61# ------------------------------------------------------------------------------
62
63def main():
64    '''Get the arguments from script call and from CONTROL file.
65    Decides from the argument "queue" if the local version
66    is done "queue=None" or the gateway version with "queue=ecgate"
67    or "queue=cca".
68
69    Parameters
70    ----------
71
72    Return
73    ------
74
75    '''
76
77    args = get_cmdline_arguments()
78    c = ControlFile(args.controlfile)
79
80    env_parameter = read_ecenv(_config.PATH_ECMWF_ENV)
81    c.assign_args_to_control(args)
82    c.assign_envs_to_control(env_parameter)
83    c.check_conditions(args.queue)
84
85    # on local side
86    # on ECMWF server this would also be the local side
87    called_from_dir = os.getcwd()
88    if args.queue is None:
89        if c.inputdir[0] != '/':
90            c.inputdir = os.path.join(called_from_dir, c.inputdir)
91        if c.outputdir[0] != '/':
92            c.outputdir = os.path.join(called_from_dir, c.outputdir)
93        get_mars_data(c)
94        if c.request == 0 or c.request == 2:
95            prepare_flexpart(args.ppid, c)
96            normal_exit(c.mailfail, 'FLEX_EXTRACT IS DONE!')
97        else:
98            normal_exit(c.mailfail, 'PRINTING MARS_REQUESTS DONE!')
99    # send files to ECMWF server and install there
100    else:
101        submit(args.job_template, c, args.queue)
102
103    return
104
105def submit(jtemplate, c, queue):
106    '''Prepares the job script and submit it to the specified queue.
107
108    Parameters
109    ----------
110    jtemplate : :obj:`string`
111        Job template file from sub-directory "_templates" for
112        submission to ECMWF. It contains all necessary
113        module and variable settings for the ECMWF environment as well as
114        the job call and mail report instructions.
115        Default is "job.temp".
116
117    c : :obj:`ControlFile`
118        Contains all the parameters of CONTROL file and
119        command line.
120
121    queue : :obj:`string`
122        Name of queue for submission to ECMWF (e.g. ecgate or cca )
123
124    Return
125    ------
126
127    '''
128
129    # read template file and get index for CONTROL input
130    with open(os.path.join(_config.PATH_TEMPLATES, jtemplate)) as f:
131        lftext = f.read().split('\n')
132    insert_point = lftext.index('EOF')
133
134    if not c.basetime:
135    # --------- create on demand job script ------------------------------------
136        if c.maxstep > 24:
137            print('---- Pure forecast mode! ----')
138        else:
139            print('---- On-demand mode! ----')
140        job_file = os.path.join(_config.PATH_JOBSCRIPTS,
141                                jtemplate[:-4] + 'ksh')
142        clist = c.to_list()
143
144        lftextondemand = lftext[:insert_point] + clist + lftext[insert_point:]
145
146        with open(job_file, 'w') as f:
147            f.write('\n'.join(lftextondemand))
148
149        submit_job_to_ecserver(queue, job_file)
150
151    else:
152    # --------- create operational job script ----------------------------------
153        print('---- Operational mode! ----')
154        job_file = os.path.join(_config.PATH_JOBSCRIPTS,
155                                jtemplate[:-5] + 'oper.ksh')
156
157        if c.maxstep:
158            mt = int(c.maxstep)
159        else:
160            mt = 0
161
162        c.start_date = '${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY}'
163        c.end_date = '${MSJ_YEAR}${MSJ_MONTH}${MSJ_DAY}'
164        c.base_time = '${MSJ_BASETIME}'
165        if mt > 24:
166            c.time = '${MSJ_BASETIME} {MSJ_BASETIME}'
167
168        colist = c.to_list()
169
170        lftextoper = lftext[:insert_point] + colist + lftext[insert_point + 2:]
171
172        with open(job_file, 'w') as f:
173            f.write('\n'.join(lftextoper))
174
175        submit_job_to_ecserver(queue, job_file)
176
177    # --------------------------------------------------------------------------
178    print('You should get an email with subject flex.hostname.pid')
179
180    return
181
182if __name__ == "__main__":
183    main()
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG