source: flex_extract.git/source/python/mods/prepare_flexpart.py @ e811e1a

dev
Last change on this file since e811e1a was e811e1a, checked in by Anne Philipp <anne.philipp@…>, 9 months ago

adapted calc_extra_elda parameter list

  • Property mode set to 100755
File size: 6.4 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#        - BUGFIX: 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-2019.
32#    Anne Philipp, Leopold Haimberger
33#
34#    This work is licensed under the Creative Commons Attribution 4.0
35#    International License. To view a copy of this license, visit
36#    http://creativecommons.org/licenses/by/4.0/ or send a letter to
37#    Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
38#*******************************************************************************
39'''This script prepares the final version of the grib files which are
40then used by FLEXPART.
41
42It converts the bunch of grib files extracted via get_mars_data before,
43by doing the necessary conversion to get consistent grids or the
44disaggregation of flux data. Finally, the data fields are combined
45in files per available hour with the naming convention xxYYMMDDHH,
46where xx should be 2 arbitrary letters (mostly xx is chosen to be "EN").
47
48This file can also be imported as a module which then contains the following
49functions:
50
51    * main
52    * prepare_flexpart
53
54Type: prepare_flexpart.py --help
55to get information about command line parameters.
56Read the documentation for usage instructions.
57'''
58
59# ------------------------------------------------------------------------------
60# MODULES
61# ------------------------------------------------------------------------------
62import datetime
63import os
64import inspect
65import sys
66import socket
67
68# software specific classes and modules from flex_extract
69# add path to local main python path for flex_extract to get full access
70sys.path.append(os.path.dirname(os.path.abspath(
71    inspect.getfile(inspect.currentframe()))) + '/../')
72import _config
73from checks import check_ppid
74from classes.UioFiles import UioFiles
75from classes.ControlFile import ControlFile
76from tools import clean_up, get_cmdline_args, read_ecenv, make_dir
77from classes.EcFlexpart import EcFlexpart
78
79ecapi = 'ecmwf' not in socket.gethostname()
80try:
81    if ecapi:
82        import ecmwfapi
83except ImportError:
84    ecapi = False
85
86# ------------------------------------------------------------------------------
87# FUNCTION
88# ------------------------------------------------------------------------------
89def main():
90    '''Controls the program to prepare flexpart input files from mars data.
91
92    This is done if it is called directly from command line.
93    Then it also takes program call arguments and control file input.
94
95    Parameters
96    ----------
97
98    Return
99    ------
100
101    '''
102
103    args = get_cmdline_args()
104    c = ControlFile(args.controlfile)
105
106    env_parameter = read_ecenv(_config.PATH_ECMWF_ENV)
107    c.assign_args_to_control(args)
108    c.assign_envs_to_control(env_parameter)
109    c.check_conditions(args.queue)
110
111    prepare_flexpart(args.ppid, c)
112
113    return
114
115def prepare_flexpart(ppid, c):
116    '''Converts the mars data into flexpart ready input files.
117
118    Specific data fields are converted to a different grid and the flux
119    data are going to be disaggregated. The data fields are collected by
120    hour and stored in a file with a specific FLEXPART relevant naming
121    convention.
122
123    Parameters
124    ----------
125    ppid : int
126        Contains the ppid number of the current ECMWF job. It will be None if
127        the method was called within this module.
128
129    c : ControlFile
130        Contains all the parameters of CONTROL file and
131        command line.
132
133    Return
134    ------
135
136    '''
137    check_ppid(c, ppid)
138
139    c.ecapi = ecapi
140
141    # create the start and end date
142    start = datetime.date(year=int(c.start_date[:4]),
143                          month=int(c.start_date[4:6]),
144                          day=int(c.start_date[6:]))
145
146    end = datetime.date(year=int(c.end_date[:4]),
147                        month=int(c.end_date[4:6]),
148                        day=int(c.end_date[6:]))
149
150    # if basetime is 00
151    # assign starting date minus 1 day
152    # since we need the 12 hours upfront
153    # (the day before from 12 UTC to current day 00 UTC)
154    if c.basetime == 0:
155        start = start - datetime.timedelta(days=1)
156
157    print('Prepare ' + start.strftime("%Y%m%d") +
158           "/to/" + end.strftime("%Y%m%d"))
159
160    # create output dir if necessary
161    if not os.path.exists(c.outputdir):
162        make_dir(c.outputdir)
163
164    # get all files with flux data to be deaccumulated
165    inputfiles = UioFiles(c.inputdir, '*OG_acc_SL*.' + str(c.ppid) + '.*')
166
167    # deaccumulate the flux data
168    flexpart = EcFlexpart(c, fluxes=True)
169    flexpart.write_namelist(c)
170    flexpart.deacc_fluxes(inputfiles, c)
171
172    # get a list of all other files
173    inputfiles = UioFiles(c.inputdir, '????__??.*' + str(c.ppid) + '.*')
174
175    # produce FLEXPART-ready GRIB files and process them -
176    # copy/transfer/interpolate them or make them GRIB2
177    flexpart = EcFlexpart(c, fluxes=False)
178    flexpart.create(inputfiles, c)
179    if c.stream.lower() == 'elda':
180        flexpart.calc_extra_elda(c.inputdir, c.prefix)
181    flexpart.process_output(c)
182
183    # make use of a possible conversion to a
184    # specific flexpart binary format
185    if c.grib2flexpart:
186        flexpart.prepare_fp_files(c)
187
188    # check if in debugging mode, then store all files
189    # otherwise delete temporary files
190    if c.debug:
191        print('\nTemporary files left intact')
192    else:
193        clean_up(c)
194
195    return
196
197if __name__ == "__main__":
198    main()
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG