source: flex_extract.git/source/python/mods/prepare_flexpart.py @ 27fe969

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

put grib2flexpart part of code into its own function; changed function documentation of input controlfile parameter

  • Property mode set to 100755
File size: 6.1 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
[2fb99de]61import _config
[25b14be]62from classes.UioFiles import UioFiles
[54a8a01]63from tools import clean_up, get_cmdline_arguments, read_ecenv
[25b14be]64from classes.EcFlexpart import EcFlexpart
[ff99eae]65
66ecapi = 'ecmwf' not in socket.gethostname()
[d69b677]67try:
68    if ecapi:
69        import ecmwfapi
70except ImportError:
[64cf353]71    ecapi = False
72
[efdb01a]73# ------------------------------------------------------------------------------
74# FUNCTION
75# ------------------------------------------------------------------------------
[991df6a]76def main():
[02c8c50]77    '''
78    @Description:
[ff99eae]79        If prepare_flexpart is called from command line, this function controls
[991df6a]80        the program flow and calls the argumentparser function and
[ff99eae]81        the prepare_flexpart function for preparation of GRIB data for FLEXPART.
[991df6a]82
83    @Input:
84        <nothing>
[02c8c50]85
[991df6a]86    @Return:
87        <nothing>
88    '''
[54a8a01]89
90    args = get_cmdline_arguments()
[4971f63]91    c = ControlFile(args.controlfile)
[2fb99de]92
93    env_parameter = read_ecenv(_config.PATH_ECMWF_ENV)
[295ff45]94    c.assign_args_to_control(args)
[54a8a01]95    c.assign_envs_to_control(env_parameter)
[2fb99de]96    c.check_conditions(args.queue)
[295ff45]97
[54a8a01]98    prepare_flexpart(args.ppid, c)
[991df6a]99
100    return
101
[54a8a01]102def prepare_flexpart(ppid, c):
[991df6a]103    '''
104    @Description:
[ff99eae]105        Lists all grib files retrieved from MARS with get_mars_data and
[991df6a]106        uses prepares data for the use in FLEXPART. Specific data fields
107        are converted to a different grid and the flux data are going to be
108        disaggregated. The data fields are collected by hour and stored in
109        a file with a specific FLEXPART relevant naming convention.
[d69b677]110
[02c8c50]111    @Input:
[54a8a01]112        ppid: int
113            Contains the ppid number of the current ECMWF job. If it is called
114            from this script, it is "None".
[d69b677]115
[991df6a]116        c: instance of class ControlFile
[27fe969]117            Contains all the parameters of CONTROL file and
118            command line.
[02c8c50]119            For more information about format and content of the parameter
120            see documentation.
121
122    @Return:
123        <nothing>
124    '''
[64cf353]125
[54a8a01]126    if not ppid:
[02c8c50]127        c.ppid = str(os.getppid())
[d69b677]128    else:
[54a8a01]129        c.ppid = ppid
[02c8c50]130
131    c.ecapi = ecapi
[d69b677]132
[02c8c50]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
[54a8a01]142    # assign starting date minus 1 day
143    # since for basetime 00 we need the 12 hours upfront
144    # (the day before from 12 UTC to current day 00 UTC)
145    if c.basetime == '00':
146        start = start - datetime.timedelta(days=1)
[d69b677]147
[2fb99de]148    print('Prepare ' + start.strftime("%Y%m%d") +
149           "/to/" + end.strftime("%Y%m%d"))
[d69b677]150
[02c8c50]151    # create output dir if necessary
[d69b677]152    if not os.path.exists(c.outputdir):
[02c8c50]153        os.makedirs(c.outputdir)
[64cf353]154
[54a8a01]155    # get all files with flux data to be deaccumulated
156    inputfiles = UioFiles(c.inputdir, '*OG_acc_SL*.' + c.ppid + '.*')
157
[02c8c50]158    # deaccumulate the flux data
[ff99eae]159    flexpart = EcFlexpart(c, fluxes=True)
[2fb99de]160    flexpart.write_namelist(c, _config.FILE_NAMELIST)
[d69b677]161    flexpart.deacc_fluxes(inputfiles, c)
162
[02c8c50]163    # get a list of all files from the root inputdir
[54a8a01]164    inputfiles = UioFiles(c.inputdir, '????__??.*' + c.ppid + '.*')
[d69b677]165
[54a8a01]166    # produce FLEXPART-ready GRIB files and process them -
[02c8c50]167    # copy/transfer/interpolate them or make them GRIB2
[ff99eae]168    flexpart = EcFlexpart(c, fluxes=False)
[02c8c50]169    flexpart.create(inputfiles, c)
170    flexpart.process_output(c)
[27fe969]171    if c.grib2flexpart:
172        # prepare environment for a FLEXPART run
173        # to convert grib to flexpart binary format
174        flexpart.prepare_fp_files(c)
[02c8c50]175
176    # check if in debugging mode, then store all files
[efdb01a]177    # otherwise delete temporary files
[27fe969]178    if c.debug:
[2fb99de]179        print('\nTemporary files left intact')
[d69b677]180    else:
[ff99eae]181        clean_up(c)
[02c8c50]182
183    return
[d69b677]184
185if __name__ == "__main__":
[991df6a]186    main()
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG