source: flex_extract.git/source/python/mods/checks.py @ 4d3b052

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

introduced a new parameter which defines pure forcast mode

  • Property mode set to 100644
File size: 5.0 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3##*******************************************************************************
4# @Author: Anne Philipp (University of Vienna)
5#
6# @Date: November 2018
7#
8# @Change History:
9#
10# @License:
11#    (C) Copyright 2014-2018.
12#
13#    This software is licensed under the terms of the Apache Licence Version 2.0
14#    which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
15#
16# @Modul Description:
17#
18#
19# @Module Content:
20
21#
22#*******************************************************************************
23
24# ------------------------------------------------------------------------------
25# MODULES
26# ------------------------------------------------------------------------------
27
28import _config
29# ------------------------------------------------------------------------------
30# FUNCTIONS
31# ------------------------------------------------------------------------------
32
33
34def check_grid(grid):
35
36    if 'N' in grid:
37        return grid
38    if '/' in grid:
39        gridx, gridy = grid.split('/')
40        if gridx == gridy:
41            grid = gridx
42        else:
43            raise ValueError('GRID parameter contains two values '
44                             'which are unequal %s' (grid))
45    # determine grid format
46    if float(grid) / 100. >= 0.5:
47        # grid is defined in 1/1000 degrees; old format
48        grid = '{}/{}'.format(float(grid) / 1000.,
49                              float(grid) / 1000.)
50    elif float(grid) / 100. < 0.5:
51        # grid is defined in normal degree; new format
52        grid = '{}/{}'.format(float(grid), float(grid))
53
54    return grid
55
56def check_area(grid, area, upper, lower, left , right):
57    '''
58
59
60    '''
61    if 'N' in grid:  # Gaussian output grid
62        area = 'G'
63        return area
64
65    # if area was provided decompose area into its 4 components
66    if area:
67        components = area.split('/')
68        upper, left, lower, right = components
69
70    # determine area format
71    if (abs(float(upper) / 1000.) >= 0.05 and
72        abs(float(lower) / 1000.) >= 0.05 and
73        abs(float(left) / 1000.) >= 0.05 and
74        abs(float(right) / 1000.) >= 0.05):
75        # area is defined in 1/1000 degrees; old format
76        area = '{}/{}/{}/{}'.format(float(upper) / 1000.,
77                                    float(left) / 1000.,
78                                    float(lower) / 1000.,
79                                    float(right) / 1000.)
80    elif (abs(float(upper) / 1000.) < 0.05 and
81          abs(float(lower) / 1000.) < 0.05 and
82          abs(float(left) / 1000.) < 0.05 and
83          abs(float(right) / 1000.) < 0.05):
84        # area is already in new format
85        area = '{}/{}/{}/{}'.format(float(upper),
86                                    float(left),
87                                    float(lower),
88                                    float(right))
89    else:
90        raise ValueError('The area components have different '
91                         'formats (upper, lower, left, right): '
92                         '{}/{}/{}/{}'.format(str(upper), str(lower),
93                                              str(left) , str(right)))
94
95    return area
96
97def check_levels(levelist, level):
98    '''
99
100    Parameters
101    ----------
102    par : :obj:``
103        ...
104
105    Return
106    ------
107
108    '''
109    # assure consistency of levelist and level
110    if not levelist and not level:
111        raise ValueError('ERROR: neither levelist nor level '
112                         'specified in CONTROL file')
113    elif not levelist and level:
114        levelist = '1/to/' + level
115    elif (levelist and not level) or \
116         (levelist[-1] != level[-1]):
117        level = levelist.split('/')[-1]
118    else:
119        pass
120
121    # check if max level is a valid level
122    if int(level) not in _config.MAX_LEVEL_LIST:
123        raise ValueError('ERROR: \n'
124                         'LEVEL must be the maximum level of a specified '
125                         'level list from ECMWF, e.g. {} \n'
126                         'Check parameter "LEVEL" or the max level of '
127                         '"LEVELIST"!'.format(str(_config.MAX_LEVEL_LIST)))
128
129    return levelist, level
130
131
132def check_ppid(c, ppid):
133    '''Sets the current PPID.
134
135    Parameters
136    ----------
137    c : :obj:`ControlFile`
138            Contains all the parameters of CONTROL file and
139            command line.
140
141    ppid : :obj:`int` or :obj:`None`
142        Contains the ppid number provided by the command line parameter
143        of is None otherwise.
144
145    Return
146    ------
147
148    '''
149
150    if not ppid:
151        c.ppid = str(os.getppid())
152    else:
153        c.ppid = ppid
154
155    return
156
157
158def check_purefc(type):
159    '''Check for a pure forecast mode.
160
161    Parameters
162    ----------
163    type : :obj:`list` of :obj:`string`
164        List of field types.
165
166    Return
167    ------
168    True or False:
169        True if pure forecasts are to be retrieved. False if there are
170        analysis fields in between.
171    '''
172
173    if 'AN' not in type and '4V' not in type:
174        # pure forecast
175        return True
176
177    return False
178
179
180def check_():
181    '''
182
183    Parameters
184    ----------
185    par : :obj:``
186        ...
187
188    Return
189    ------
190
191    '''
192    return
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG