source: flex_extract.git/Source/Python/Mods/prepare_flexpart.py @ 8463d78

ctbtodev
Last change on this file since 8463d78 was 8463d78, checked in by Anne Philipp <anne.philipp@…>, 5 years ago

made python3 again, now working

  • Property mode set to 100755
File size: 6.2 KB
Line 
1#!/usr/bin/env python3
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# ------------------------------------------------------------------------------
62from __future__ import print_function
63
64import datetime
65import os
66import inspect
67import sys
68import socket
69
70# software specific classes and modules from flex_extract
71# add path to local main python path for flex_extract to get full access
72sys.path.append(os.path.dirname(os.path.abspath(
73    inspect.getfile(inspect.currentframe()))) + '/../')
74import _config
75from Mods.checks import check_ppid
76from Classes.UioFiles import UioFiles
77from Classes.ControlFile import ControlFile
78from Mods.tools import (setup_controldata, clean_up, get_cmdline_args,
79                        read_ecenv, make_dir, normal_exit)
80from Classes.EcFlexpart import EcFlexpart
81
82# ------------------------------------------------------------------------------
83# FUNCTION
84# ------------------------------------------------------------------------------
85def main():
86    '''Controls the program to prepare flexpart input files from mars data.
87
88    This is done if it is called directly from command line.
89    Then it also takes program call arguments and control file input.
90
91    Parameters
92    ----------
93
94    Return
95    ------
96
97    '''
98
99    c, ppid, _, _ = setup_controldata()
100    prepare_flexpart(ppid, c)
101    normal_exit('Preparing FLEXPART output files: Done!')
102
103    return
104
105def prepare_flexpart(ppid, c):
106    '''Converts the mars data into flexpart ready input files.
107
108    Specific data fields are converted to a different grid and the flux
109    data are going to be disaggregated. The data fields are collected by
110    hour and stored in a file with a specific FLEXPART relevant naming
111    convention.
112
113    Parameters
114    ----------
115    ppid : int
116        Contains the ppid number of the current ECMWF job. It will be None if
117        the method was called within this module.
118
119    c : ControlFile
120        Contains all the parameters of CONTROL file and
121        command line.
122
123    Return
124    ------
125
126    '''
127    check_ppid(c, ppid)
128
129    # create the start and end date
130    start = datetime.date(year=int(c.start_date[:4]),
131                          month=int(c.start_date[4:6]),
132                          day=int(c.start_date[6:]))
133
134    end = datetime.date(year=int(c.end_date[:4]),
135                        month=int(c.end_date[4:6]),
136                        day=int(c.end_date[6:]))
137
138    # if basetime is 00
139    # assign starting date minus 1 day
140    # since we need the 12 hours upfront
141    # (the day before from 12 UTC to current day 00 UTC)
142    if c.basetime == 0:
143        start = start - datetime.timedelta(days=1)
144
145    print('Prepare ' + start.strftime("%Y%m%d") +
146           "/to/" + end.strftime("%Y%m%d"))
147
148    # create output dir if necessary
149    if not os.path.exists(c.outputdir):
150        make_dir(c.outputdir)
151
152    # get all files with flux data to be deaccumulated
153    inputfiles = UioFiles(c.inputdir, '*OG_acc_SL*.' + str(c.ppid) + '.*')
154
155    # deaccumulate the flux data
156    flexpart = EcFlexpart(c, fluxes=True)
157    flexpart.write_namelist(c)
158    flexpart.deacc_fluxes(inputfiles, c)
159
160    # get a list of all other files
161    inputfiles = UioFiles(c.inputdir, '????__??.*' + str(c.ppid) + '.*')
162
163    # produce FLEXPART-ready GRIB files and process them -
164    # copy/transfer/interpolate them or make them GRIB2
165    flexpart = EcFlexpart(c, fluxes=False)
166    flexpart.create(inputfiles, c)
167    if c.stream.lower() == 'elda' and c.doubleelda:
168        flexpart.calc_extra_elda(c.inputdir, c.prefix)
169    flexpart.process_output(c)
170
171    # make use of a possible conversion to a
172    # specific flexpart binary format
173    if c.grib2flexpart:
174        flexpart.prepare_fp_files(c)
175
176    # check if in debugging mode, then store all files
177    # otherwise delete temporary files
178    if c.debug:
179        print('\nTemporary files left intact')
180    else:
181        clean_up(c)
182
183    return
184
185if __name__ == "__main__":
186    main()
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG