source: flex_extract.git/source/python/mods/prepare_flexpart.py @ 70fee58

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

some bug corrections, minor code improvements

  • Property mode set to 100755
File size: 6.3 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#        - using the WebAPI also for general MARS retrievals
12#        - job submission on ecgate and cca
13#        - job templates suitable for twice daily operational dissemination
14#        - dividing retrievals of longer periods into digestable chunks
15#        - retrieve also longer term forecasts, not only analyses and
16#          short term forecast data
17#        - conversion into GRIB2
18#        - conversion into .fp format for faster execution of FLEXPART
19#
20#    February 2018 - Anne Philipp (University of Vienna):
21#        - applied PEP8 style guide
22#        - added documentation
23#        - minor changes in programming style for consistence
24#        - BUG: removed call of clean_up-Function after call of
25#               prepareFlexpart in main since it is already called in
26#               prepareFlexpart at the end!
27#        - created function main and moved the two function calls for
28#          arguments and prepare_flexpart into it
29#
30# @License:
31#    (C) Copyright 2014-2018.
32#
33#    This software is licensed under the terms of the Apache Licence Version 2.0
34#    which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
35#
36# @Program Functionality:
37#    This program prepares the final version of the grib files which are
38#    then used by FLEXPART. It converts the bunch of grib files extracted
39#    via get_mars_data by doing for example the necessary conversion to get
40#    consistent grids or the disaggregation of flux data. Finally, the
41#    program combines the data fields in files per available hour with the
42#    naming convention xxYYMMDDHH, where xx should be 2 arbitrary letters
43#    (mostly xx is chosen to be "EN").
44#
45# @Program Content:
46#    - main
47#    - prepare_flexpart
48#
49#*******************************************************************************
50
51# ------------------------------------------------------------------------------
52# MODULES
53# ------------------------------------------------------------------------------
54import datetime
55import os
56import inspect
57import sys
58import socket
59
60# software specific classes and modules from flex_extract
61
62sys.path.append(os.path.dirname(os.path.abspath(
63    inspect.getfile(inspect.currentframe()))) + '/../')
64import _config
65from classes.UioFiles import UioFiles
66from classes.ControlFile import ControlFile
67from tools import clean_up, get_cmdline_arguments, read_ecenv, make_dir
68from classes.EcFlexpart import EcFlexpart
69
70ecapi = 'ecmwf' not in socket.gethostname()
71try:
72    if ecapi:
73        import ecmwfapi
74except ImportError:
75    ecapi = False
76
77# ------------------------------------------------------------------------------
78# FUNCTION
79# ------------------------------------------------------------------------------
80def main():
81    '''
82    @Description:
83        If prepare_flexpart is called from command line, this function controls
84        the program flow and calls the argumentparser function and
85        the prepare_flexpart function for preparation of GRIB data for FLEXPART.
86
87    @Input:
88        <nothing>
89
90    @Return:
91        <nothing>
92    '''
93
94    args = get_cmdline_arguments()
95    c = ControlFile(args.controlfile)
96
97    env_parameter = read_ecenv(_config.PATH_ECMWF_ENV)
98    c.assign_args_to_control(args)
99    c.assign_envs_to_control(env_parameter)
100    c.check_conditions(args.queue)
101
102    prepare_flexpart(args.ppid, c)
103
104    return
105
106def prepare_flexpart(ppid, c):
107    '''
108    @Description:
109        Lists all grib files retrieved from MARS with get_mars_data and
110        uses prepares data for the use in FLEXPART. Specific data fields
111        are converted to a different grid and the flux data are going to be
112        disaggregated. The data fields are collected by hour and stored in
113        a file with a specific FLEXPART relevant naming convention.
114
115    @Input:
116        ppid: int
117            Contains the ppid number of the current ECMWF job. If it is called
118            from this script, it is "None".
119
120        c: instance of class ControlFile
121            Contains all the parameters of CONTROL file and
122            command line.
123            For more information about format and content of the parameter
124            see documentation.
125
126    @Return:
127        <nothing>
128    '''
129
130    if not ppid:
131        c.ppid = str(os.getppid())
132    else:
133        c.ppid = ppid
134
135    c.ecapi = ecapi
136
137    # create the start and end date
138    start = datetime.date(year=int(c.start_date[:4]),
139                          month=int(c.start_date[4:6]),
140                          day=int(c.start_date[6:]))
141
142    end = datetime.date(year=int(c.end_date[:4]),
143                        month=int(c.end_date[4:6]),
144                        day=int(c.end_date[6:]))
145
146    # assign starting date minus 1 day
147    # since for basetime 00 we need the 12 hours upfront
148    # (the day before from 12 UTC to current day 00 UTC)
149    if c.basetime == '00':
150        start = start - datetime.timedelta(days=1)
151
152    print('Prepare ' + start.strftime("%Y%m%d") +
153           "/to/" + end.strftime("%Y%m%d"))
154
155    # create output dir if necessary
156    if not os.path.exists(c.outputdir):
157        make_dir(c.outputdir)
158
159    # get all files with flux data to be deaccumulated
160    inputfiles = UioFiles(c.inputdir, '*OG_acc_SL*.' + str(c.ppid) + '.*')
161
162    # deaccumulate the flux data
163    flexpart = EcFlexpart(c, fluxes=True)
164    flexpart.write_namelist(c)
165    flexpart.deacc_fluxes(inputfiles, c)
166
167    # get a list of all files from the root inputdir
168    inputfiles = UioFiles(c.inputdir, '????__??.*' + str(c.ppid) + '.*')
169
170    # produce FLEXPART-ready GRIB files and process them -
171    # copy/transfer/interpolate them or make them GRIB2
172    flexpart = EcFlexpart(c, fluxes=False)
173    flexpart.create(inputfiles, c)
174    flexpart.process_output(c)
175    if c.grib2flexpart:
176        # prepare environment for a FLEXPART run
177        # to convert grib to flexpart binary format
178        flexpart.prepare_fp_files(c)
179
180    # check if in debugging mode, then store all files
181    # otherwise delete temporary files
182    if c.debug:
183        print('\nTemporary files left intact')
184    else:
185        clean_up(c)
186
187    return
188
189if __name__ == "__main__":
190    main()
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG