source: flex_extract.git/Source/Python/Mods/prepare_flexpart.py @ 0f89116

ctbtodev
Last change on this file since 0f89116 was 0f89116, checked in by Anne Philipp <anne.philipp@…>, 4 years ago

diverse changes due to PEP8 style guide and eliminating grib2flexpart; removed unused parameter

  • Property mode set to 100755
File size: 6.2 KB
RevLine 
[8463d78]1#!/usr/bin/env python3
[02c8c50]2# -*- coding: utf-8 -*-
[991df6a]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
[6f951ca]24#        - BUGFIX: removed call of clean_up-Function after call of
[991df6a]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
[ff99eae]28#          arguments and prepare_flexpart into it
[991df6a]29#
30# @License:
[6f951ca]31#    (C) Copyright 2014-2019.
32#    Anne Philipp, Leopold Haimberger
[991df6a]33#
[44174de]34#    SPDX-License-Identifier: CC-BY-4.0
35#
[6f951ca]36#    This work is licensed under the Creative Commons Attribution 4.0
37#    International License. To view a copy of this license, visit
38#    http://creativecommons.org/licenses/by/4.0/ or send a letter to
39#    Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
[0f89116]40# *******************************************************************************
41# pylint: disable=ungrouped-imports
42# not necessary that we group the imports
[6f951ca]43'''This script prepares the final version of the grib files which are
44then used by FLEXPART.
45
46It converts the bunch of grib files extracted via get_mars_data before,
47by doing the necessary conversion to get consistent grids or the
48disaggregation of flux data. Finally, the data fields are combined
49in files per available hour with the naming convention xxYYMMDDHH,
50where xx should be 2 arbitrary letters (mostly xx is chosen to be "EN").
51
52This file can also be imported as a module which then contains the following
53functions:
54
55    * main
56    * prepare_flexpart
57
58Type: prepare_flexpart.py --help
59to get information about command line parameters.
60Read the documentation for usage instructions.
61'''
[991df6a]62
[efdb01a]63# ------------------------------------------------------------------------------
64# MODULES
65# ------------------------------------------------------------------------------
[0e08483]66from __future__ import print_function
67
[d69b677]68import datetime
[efdb01a]69import os
70import inspect
71import sys
[d69b677]72
[ff99eae]73# software specific classes and modules from flex_extract
[6f951ca]74# add path to local main python path for flex_extract to get full access
[70fee58]75sys.path.append(os.path.dirname(os.path.abspath(
76    inspect.getfile(inspect.currentframe()))) + '/../')
[0f89116]77# pylint: disable=wrong-import-position
78#import _config
[ba99230]79from Mods.checks import check_ppid
80from Classes.UioFiles import UioFiles
[0f89116]81#from Classes.ControlFile import ControlFile
82from Mods.tools import (setup_controldata, clean_up, make_dir, normal_exit)
[ba99230]83from Classes.EcFlexpart import EcFlexpart
[0f89116]84# pylint: enable=wrong-import-position
[ff99eae]85
[efdb01a]86# ------------------------------------------------------------------------------
87# FUNCTION
88# ------------------------------------------------------------------------------
[991df6a]89def main():
[274f9ef]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    ----------
[991df6a]97
[274f9ef]98    Return
99    ------
[02c8c50]100
[991df6a]101    '''
[54a8a01]102
[f20af73]103    c, ppid, _, _ = setup_controldata()
104    prepare_flexpart(ppid, c)
105    normal_exit('Preparing FLEXPART output files: Done!')
[991df6a]106
107    return
108
[54a8a01]109def prepare_flexpart(ppid, c):
[274f9ef]110    '''Converts the mars data into flexpart ready input files.
111
112    Specific data fields are converted to a different grid and the flux
113    data are going to be disaggregated. The data fields are collected by
114    hour and stored in a file with a specific FLEXPART relevant naming
115    convention.
116
117    Parameters
118    ----------
[6f951ca]119    ppid : int
[274f9ef]120        Contains the ppid number of the current ECMWF job. It will be None if
121        the method was called within this module.
122
[6f951ca]123    c : ControlFile
[274f9ef]124        Contains all the parameters of CONTROL file and
125        command line.
126
127    Return
128    ------
129
[02c8c50]130    '''
[3f36e42]131    check_ppid(c, ppid)
[02c8c50]132
133    # create the start and end date
134    start = datetime.date(year=int(c.start_date[:4]),
135                          month=int(c.start_date[4:6]),
136                          day=int(c.start_date[6:]))
[d69b677]137
[02c8c50]138    end = datetime.date(year=int(c.end_date[:4]),
139                        month=int(c.end_date[4:6]),
140                        day=int(c.end_date[6:]))
[d69b677]141
[38e83ba]142    # if basetime is 00
[54a8a01]143    # assign starting date minus 1 day
[38e83ba]144    # since we need the 12 hours upfront
[54a8a01]145    # (the day before from 12 UTC to current day 00 UTC)
[d4696e0]146    if c.basetime == 0:
[54a8a01]147        start = start - datetime.timedelta(days=1)
[d69b677]148
[2fb99de]149    print('Prepare ' + start.strftime("%Y%m%d") +
[0f89116]150          '/to/' + end.strftime("%Y%m%d"))
[d69b677]151
[02c8c50]152    # create output dir if necessary
[d69b677]153    if not os.path.exists(c.outputdir):
[5bad6ec]154        make_dir(c.outputdir)
[64cf353]155
[54a8a01]156    # get all files with flux data to be deaccumulated
[70fee58]157    inputfiles = UioFiles(c.inputdir, '*OG_acc_SL*.' + str(c.ppid) + '.*')
[54a8a01]158
[02c8c50]159    # deaccumulate the flux data
[ff99eae]160    flexpart = EcFlexpart(c, fluxes=True)
[c5074d2]161    flexpart.write_namelist(c)
[d69b677]162    flexpart.deacc_fluxes(inputfiles, c)
163
[38e83ba]164    # get a list of all other files
[70fee58]165    inputfiles = UioFiles(c.inputdir, '????__??.*' + str(c.ppid) + '.*')
[d69b677]166
[54a8a01]167    # produce FLEXPART-ready GRIB files and process them -
[02c8c50]168    # copy/transfer/interpolate them or make them GRIB2
[ff99eae]169    flexpart = EcFlexpart(c, fluxes=False)
[02c8c50]170    flexpart.create(inputfiles, c)
[90a1ca0]171    if c.stream.lower() == 'elda' and c.doubleelda:
[e811e1a]172        flexpart.calc_extra_elda(c.inputdir, c.prefix)
[02c8c50]173    flexpart.process_output(c)
[38e83ba]174
[02c8c50]175    # check if in debugging mode, then store all files
[efdb01a]176    # otherwise delete temporary files
[27fe969]177    if c.debug:
[2fb99de]178        print('\nTemporary files left intact')
[d69b677]179    else:
[ff99eae]180        clean_up(c)
[02c8c50]181
182    return
[d69b677]183
184if __name__ == "__main__":
[991df6a]185    main()
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG