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
RevLine 
[d69b677]1#!/usr/bin/env python
[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
[ff99eae]24#        - BUG: 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:
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
[ff99eae]39#    via get_mars_data by doing for example the necessary conversion to get
[991df6a]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
[ff99eae]47#    - prepare_flexpart
[991df6a]48#
49#*******************************************************************************
50
[efdb01a]51# ------------------------------------------------------------------------------
52# MODULES
53# ------------------------------------------------------------------------------
[d69b677]54import datetime
[efdb01a]55import os
56import inspect
57import sys
[d69b677]58import socket
59
[ff99eae]60# software specific classes and modules from flex_extract
[70fee58]61
62sys.path.append(os.path.dirname(os.path.abspath(
63    inspect.getfile(inspect.currentframe()))) + '/../')
[2fb99de]64import _config
[25b14be]65from classes.UioFiles import UioFiles
[ca867de]66from classes.ControlFile import ControlFile
[5bad6ec]67from tools import clean_up, get_cmdline_arguments, read_ecenv, make_dir
[25b14be]68from classes.EcFlexpart import EcFlexpart
[ff99eae]69
70ecapi = 'ecmwf' not in socket.gethostname()
[d69b677]71try:
72    if ecapi:
73        import ecmwfapi
74except ImportError:
[64cf353]75    ecapi = False
76
[efdb01a]77# ------------------------------------------------------------------------------
78# FUNCTION
79# ------------------------------------------------------------------------------
[991df6a]80def main():
[02c8c50]81    '''
82    @Description:
[ff99eae]83        If prepare_flexpart is called from command line, this function controls
[991df6a]84        the program flow and calls the argumentparser function and
[ff99eae]85        the prepare_flexpart function for preparation of GRIB data for FLEXPART.
[991df6a]86
87    @Input:
88        <nothing>
[02c8c50]89
[991df6a]90    @Return:
91        <nothing>
92    '''
[54a8a01]93
94    args = get_cmdline_arguments()
[4971f63]95    c = ControlFile(args.controlfile)
[2fb99de]96
97    env_parameter = read_ecenv(_config.PATH_ECMWF_ENV)
[295ff45]98    c.assign_args_to_control(args)
[54a8a01]99    c.assign_envs_to_control(env_parameter)
[2fb99de]100    c.check_conditions(args.queue)
[295ff45]101
[54a8a01]102    prepare_flexpart(args.ppid, c)
[991df6a]103
104    return
105
[54a8a01]106def prepare_flexpart(ppid, c):
[991df6a]107    '''
108    @Description:
[ff99eae]109        Lists all grib files retrieved from MARS with get_mars_data and
[991df6a]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.
[d69b677]114
[02c8c50]115    @Input:
[54a8a01]116        ppid: int
117            Contains the ppid number of the current ECMWF job. If it is called
118            from this script, it is "None".
[d69b677]119
[991df6a]120        c: instance of class ControlFile
[27fe969]121            Contains all the parameters of CONTROL file and
122            command line.
[02c8c50]123            For more information about format and content of the parameter
124            see documentation.
125
126    @Return:
127        <nothing>
128    '''
[64cf353]129
[54a8a01]130    if not ppid:
[02c8c50]131        c.ppid = str(os.getppid())
[d69b677]132    else:
[54a8a01]133        c.ppid = ppid
[02c8c50]134
135    c.ecapi = ecapi
[d69b677]136
[02c8c50]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:]))
[d69b677]141
[02c8c50]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:]))
[d69b677]145
[54a8a01]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)
[d69b677]151
[2fb99de]152    print('Prepare ' + start.strftime("%Y%m%d") +
153           "/to/" + end.strftime("%Y%m%d"))
[d69b677]154
[02c8c50]155    # create output dir if necessary
[d69b677]156    if not os.path.exists(c.outputdir):
[5bad6ec]157        make_dir(c.outputdir)
[64cf353]158
[54a8a01]159    # get all files with flux data to be deaccumulated
[70fee58]160    inputfiles = UioFiles(c.inputdir, '*OG_acc_SL*.' + str(c.ppid) + '.*')
[54a8a01]161
[02c8c50]162    # deaccumulate the flux data
[ff99eae]163    flexpart = EcFlexpart(c, fluxes=True)
[c5074d2]164    flexpart.write_namelist(c)
[d69b677]165    flexpart.deacc_fluxes(inputfiles, c)
166
[02c8c50]167    # get a list of all files from the root inputdir
[70fee58]168    inputfiles = UioFiles(c.inputdir, '????__??.*' + str(c.ppid) + '.*')
[d69b677]169
[54a8a01]170    # produce FLEXPART-ready GRIB files and process them -
[02c8c50]171    # copy/transfer/interpolate them or make them GRIB2
[ff99eae]172    flexpart = EcFlexpart(c, fluxes=False)
[02c8c50]173    flexpart.create(inputfiles, c)
174    flexpart.process_output(c)
[27fe969]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)
[02c8c50]179
180    # check if in debugging mode, then store all files
[efdb01a]181    # otherwise delete temporary files
[27fe969]182    if c.debug:
[2fb99de]183        print('\nTemporary files left intact')
[d69b677]184    else:
[ff99eae]185        clean_up(c)
[02c8c50]186
187    return
[d69b677]188
189if __name__ == "__main__":
[991df6a]190    main()
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG