source: flex_extract.git/Documentation/html/_modules/checks.html @ 30f7911

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

reviewed installation section of online documentation; minor corrections

  • Property mode set to 100644
File size: 89.0 KB
Line 
1
2
3<!DOCTYPE html>
4<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
5<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
6<head>
7  <meta charset="utf-8">
8 
9  <meta name="viewport" content="width=device-width, initial-scale=1.0">
10 
11  <title>checks &mdash; flex_extract 7.1 alpha documentation</title>
12 
13
14 
15 
16 
17 
18
19 
20  <script type="text/javascript" src="../_static/js/modernizr.min.js"></script>
21 
22   
23      <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
24        <script type="text/javascript" src="../_static/jquery.js"></script>
25        <script type="text/javascript" src="../_static/underscore.js"></script>
26        <script type="text/javascript" src="../_static/doctools.js"></script>
27        <script type="text/javascript" src="../_static/language_data.js"></script>
28        <script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
29   
30    <script type="text/javascript" src="../_static/js/theme.js"></script>
31
32   
33
34 
35  <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
36  <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
37  <link rel="stylesheet" href="../_static/css/custom.css" type="text/css" />
38  <link rel="stylesheet" href="../_static/css/theme_overrides.css" type="text/css" />
39    <link rel="index" title="Index" href="../genindex.html" />
40    <link rel="search" title="Search" href="../search.html" /> 
41</head>
42
43<body class="wy-body-for-nav">
44
45   
46  <div class="wy-grid-for-nav">
47   
48    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
49      <div class="wy-side-scroll">
50        <div class="wy-side-nav-search" >
51         
52
53         
54            <a href="../index.html" class="icon icon-home"> flex_extract
55         
56
57         
58          </a>
59
60         
61           
62           
63              <div class="version">
64                7.1
65              </div>
66           
67         
68
69         
70<div role="search">
71  <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
72    <input type="text" name="q" placeholder="Search docs" />
73    <input type="hidden" name="check_keywords" value="yes" />
74    <input type="hidden" name="area" value="default" />
75  </form>
76</div>
77
78         
79        </div>
80
81        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
82         
83           
84           
85             
86           
87           
88              <p class="caption"><span class="caption-text">Table of Contents:</span></p>
89<ul>
90<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
91<li class="toctree-l1"><a class="reference internal" href="../quick_start.html">Quick Start</a></li>
92<li class="toctree-l1"><a class="reference internal" href="../ecmwf_data.html">ECMWF Data</a></li>
93<li class="toctree-l1"><a class="reference internal" href="../documentation.html">Documentation</a></li>
94<li class="toctree-l1"><a class="reference internal" href="../evaluation.html">Evaluation</a></li>
95<li class="toctree-l1"><a class="reference internal" href="../dev_guide.html">Developer Guide</a></li>
96<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Changelog</a></li>
97<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li>
98<li class="toctree-l1"><a class="reference internal" href="../Support/faq.html">FAQ - Frequently asked questions</a></li>
99<li class="toctree-l1"><a class="reference internal" href="../authors.html">Developer Team</a></li>
100</ul>
101
102           
103         
104        </div>
105      </div>
106    </nav>
107
108    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
109
110     
111      <nav class="wy-nav-top" aria-label="top navigation">
112       
113          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
114          <a href="../index.html">flex_extract</a>
115       
116      </nav>
117
118
119      <div class="wy-nav-content">
120       
121        <div class="rst-content">
122       
123         
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139<div role="navigation" aria-label="breadcrumbs navigation">
140
141  <ul class="wy-breadcrumbs">
142   
143      <li><a href="../index.html">Docs</a> &raquo;</li>
144       
145          <li><a href="index.html">Module code</a> &raquo;</li>
146       
147      <li>checks</li>
148   
149   
150      <li class="wy-breadcrumbs-aside">
151       
152      </li>
153   
154  </ul>
155
156 
157  <hr/>
158</div>
159          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
160           <div itemprop="articleBody">
161           
162  <h1>Source code for checks</h1><div class="highlight"><pre>
163<span></span><span class="ch">#!/usr/bin/env python3</span>
164<span class="c1"># -*- coding: utf-8 -*-</span>
165<span class="c1">#*******************************************************************************</span>
166<span class="c1"># @Author: Anne Philipp (University of Vienna)</span>
167<span class="c1">#</span>
168<span class="c1"># @Date: November 2018</span>
169<span class="c1">#</span>
170<span class="c1"># @Change History:</span>
171<span class="c1">#</span>
172<span class="c1"># @License:</span>
173<span class="c1">#    (C) Copyright 2014-2019.</span>
174<span class="c1">#    Anne Philipp, Leopold Haimberger</span>
175<span class="c1">#</span>
176<span class="c1">#    SPDX-License-Identifier: CC-BY-4.0</span>
177<span class="c1">#</span>
178<span class="c1">#    This work is licensed under the Creative Commons Attribution 4.0</span>
179<span class="c1">#    International License. To view a copy of this license, visit</span>
180<span class="c1">#    http://creativecommons.org/licenses/by/4.0/ or send a letter to</span>
181<span class="c1">#    Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.</span>
182<span class="c1">#*******************************************************************************</span>
183<span class="sd">&#39;&#39;&#39;This module contains check methods for the CONTROL paramaters.</span>
184<span class="sd">&#39;&#39;&#39;</span>
185
186<span class="c1"># ------------------------------------------------------------------------------</span>
187<span class="c1"># MODULES</span>
188<span class="c1"># ------------------------------------------------------------------------------</span>
189
190<span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">print_function</span>
191<span class="kn">import</span> <span class="nn">os</span>
192<span class="kn">import</span> <span class="nn">sys</span>
193
194<span class="kn">import</span> <span class="nn">_config</span>
195<span class="k">try</span><span class="p">:</span>
196    <span class="kn">import</span> <span class="nn">exceptions</span>
197<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
198    <span class="kn">import</span> <span class="nn">builtins</span> <span class="k">as</span> <span class="nn">exceptions</span>
199<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span>
200<span class="kn">from</span> <span class="nn">Mods.tools</span> <span class="k">import</span> <span class="n">my_error</span><span class="p">,</span> <span class="n">silent_remove</span>
201<span class="c1"># ------------------------------------------------------------------------------</span>
202<span class="c1"># FUNCTIONS</span>
203<span class="c1"># ------------------------------------------------------------------------------</span>
204
205<div class="viewcode-block" id="check_logicals_type"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_logicals_type">[docs]</a><span class="k">def</span> <span class="nf">check_logicals_type</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">logicals</span><span class="p">):</span>
206    <span class="sd">&#39;&#39;&#39;Check that the logical variables have correct type integer.</span>
207
208<span class="sd">    Parameters</span>
209<span class="sd">    ----------</span>
210<span class="sd">    c : ControlFile</span>
211<span class="sd">        Contains all the parameters of CONTROL file and</span>
212<span class="sd">        command line.</span>
213
214<span class="sd">    logicals : list of (str or int)</span>
215<span class="sd">        Names of the switches that are used to control the flow of the</span>
216<span class="sd">        program.</span>
217
218<span class="sd">    Return</span>
219<span class="sd">    ------</span>
220
221<span class="sd">    &#39;&#39;&#39;</span>
222
223    <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">logicals</span><span class="p">:</span>
224        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">var</span><span class="p">),</span> <span class="nb">int</span><span class="p">):</span>
225            <span class="nb">setattr</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">var</span><span class="p">)))</span>
226
227    <span class="k">return</span></div>
228
229<div class="viewcode-block" id="check_grid"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_grid">[docs]</a><span class="k">def</span> <span class="nf">check_grid</span><span class="p">(</span><span class="n">grid</span><span class="p">):</span>
230    <span class="sd">&#39;&#39;&#39;Convert grid into correct Lat/Lon format. E.g. &#39;0.5/0.5&#39;</span>
231
232<span class="sd">    Checks on format of original grid. Wether it is in the order of 1000 or 1.</span>
233<span class="sd">    Convert to correct grid format and substitute into &quot;Lat/Lon&quot; format string.</span>
234
235<span class="sd">    Parameters</span>
236<span class="sd">    ----------</span>
237<span class="sd">    grid : str</span>
238<span class="sd">        Contains grid information</span>
239
240<span class="sd">    Return</span>
241<span class="sd">    ------</span>
242<span class="sd">    grid : str</span>
243<span class="sd">        Contains grid in format Lat/lon. E.g. 0.1/0.1</span>
244<span class="sd">    &#39;&#39;&#39;</span>
245
246    <span class="k">if</span> <span class="s1">&#39;N&#39;</span> <span class="ow">in</span> <span class="n">grid</span><span class="p">:</span>
247        <span class="k">return</span> <span class="n">grid</span>
248    <span class="k">if</span> <span class="s1">&#39;/&#39;</span> <span class="ow">in</span> <span class="n">grid</span><span class="p">:</span>
249        <span class="n">gridx</span><span class="p">,</span> <span class="n">gridy</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
250        <span class="k">if</span> <span class="n">gridx</span> <span class="o">==</span> <span class="n">gridy</span><span class="p">:</span>
251            <span class="n">grid</span> <span class="o">=</span> <span class="n">gridx</span>
252        <span class="k">else</span><span class="p">:</span>
253            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;GRID parameter contains two &#39;</span>
254                             <span class="s1">&#39;different values: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="p">(</span><span class="n">grid</span><span class="p">))</span>
255    <span class="c1"># # determine grid format</span>
256    <span class="c1"># if float(grid) / 100. &gt;= 0.5:</span>
257    <span class="c1">#    # grid is defined in 1/1000 degrees; old format</span>
258    <span class="c1">#    grid = &#39;{}/{}&#39;.format(float(grid) / 1000.,</span>
259    <span class="c1">#                          float(grid) / 1000.)</span>
260    <span class="c1"># elif float(grid) / 100. &lt; 0.5:</span>
261    <span class="c1">#    # grid is defined in normal degree; new format</span>
262    <span class="c1">#    grid = &#39;{}/{}&#39;.format(float(grid), float(grid))</span>
263
264
265    <span class="c1"># determine grid format</span>
266    <span class="c1"># assumes that nobody wants grid spacings of 20 deg or more</span>
267    <span class="k">if</span> <span class="nb">float</span><span class="p">(</span><span class="n">grid</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mf">20.</span><span class="p">:</span>
268        <span class="c1"># grid is defined in 1/1000 degree; old format</span>
269        <span class="n">grid</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">grid</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span> <span class="nb">float</span><span class="p">(</span><span class="n">grid</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span>
270    <span class="k">else</span><span class="p">:</span>
271        <span class="c1"># grid is defined in degree; new format</span>
272        <span class="n">grid</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">grid</span><span class="p">),</span> <span class="nb">float</span><span class="p">(</span><span class="n">grid</span><span class="p">))</span>
273
274
275    <span class="k">return</span> <span class="n">grid</span></div>
276
277<div class="viewcode-block" id="check_area"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_area">[docs]</a><span class="k">def</span> <span class="nf">check_area</span><span class="p">(</span><span class="n">grid</span><span class="p">,</span> <span class="n">area</span><span class="p">,</span> <span class="n">upper</span><span class="p">,</span> <span class="n">lower</span><span class="p">,</span> <span class="n">left</span> <span class="p">,</span> <span class="n">right</span><span class="p">):</span>
278    <span class="sd">&#39;&#39;&#39;Defines the correct area string.</span>
279
280<span class="sd">    Checks on the format of the four area components. Wether it is of</span>
281<span class="sd">    the order of 1000 or 1. Also checks wether area was already set by command</span>
282<span class="sd">    line, then the four components are overwritten.</span>
283<span class="sd">    Convert to correct format of the order of magnitude &quot;1&quot; and sets the</span>
284<span class="sd">    area parameter (North/West/South/East).</span>
285<span class="sd">    E.g.: -5./20./10./10.</span>
286
287<span class="sd">    Parameters</span>
288<span class="sd">    ----------</span>
289<span class="sd">    grid : str</span>
290<span class="sd">        Contains grid information.</span>
291
292<span class="sd">    area : str</span>
293<span class="sd">        Contains area informtion.</span>
294
295<span class="sd">    upper : str</span>
296<span class="sd">        The northern most latitude.</span>
297
298<span class="sd">    lower : str</span>
299<span class="sd">        The souther most latitude.</span>
300
301<span class="sd">    left : str</span>
302<span class="sd">        The western most longitude.</span>
303
304<span class="sd">    right : str</span>
305<span class="sd">        The eastern most longiude.</span>
306
307<span class="sd">    Return</span>
308<span class="sd">    ------</span>
309<span class="sd">    grid : str</span>
310<span class="sd">        Contains grid in format Lat/lon. E.g. 0.1/0.1</span>
311<span class="sd">    &#39;&#39;&#39;</span>
312    <span class="k">if</span> <span class="s1">&#39;N&#39;</span> <span class="ow">in</span> <span class="n">grid</span><span class="p">:</span>  <span class="c1"># Gaussian output grid</span>
313        <span class="n">area</span> <span class="o">=</span> <span class="s1">&#39;G&#39;</span>
314        <span class="k">return</span> <span class="n">area</span>
315
316    <span class="c1"># if area was provided decompose area into its 4 components</span>
317    <span class="k">if</span> <span class="n">area</span><span class="p">:</span>
318        <span class="n">components</span> <span class="o">=</span> <span class="n">area</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
319        <span class="n">upper</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">lower</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">components</span>
320
321    <span class="c1"># determine area format</span>
322    <span class="k">if</span> <span class="p">((</span><span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">upper</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mf">0.01</span> <span class="ow">or</span> <span class="nb">float</span><span class="p">(</span><span class="n">upper</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span> <span class="o">==</span> <span class="mf">0.</span> <span class="p">)</span> <span class="ow">and</span>
323        <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">lower</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mf">0.01</span> <span class="ow">or</span> <span class="nb">float</span><span class="p">(</span><span class="n">lower</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span> <span class="o">==</span> <span class="mf">0.</span> <span class="p">)</span> <span class="ow">and</span>
324        <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mf">0.01</span> <span class="ow">or</span> <span class="nb">float</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span> <span class="o">==</span> <span class="mf">0.</span> <span class="p">)</span> <span class="ow">and</span>
325        <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">right</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mf">0.01</span> <span class="ow">or</span> <span class="nb">float</span><span class="p">(</span><span class="n">right</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span> <span class="o">==</span> <span class="mf">0.</span><span class="p">)):</span>
326        <span class="c1"># area is defined in 1/1000 degrees; old format</span>
327        <span class="n">area</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">upper</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span>
328                                    <span class="nb">float</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span>
329                                    <span class="nb">float</span><span class="p">(</span><span class="n">lower</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span>
330                                    <span class="nb">float</span><span class="p">(</span><span class="n">right</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span>
331    <span class="k">elif</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">upper</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.05</span> <span class="ow">and</span>
332          <span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">lower</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.05</span> <span class="ow">and</span>
333          <span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.05</span> <span class="ow">and</span>
334          <span class="nb">abs</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">right</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10000.</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.05</span><span class="p">):</span>
335        <span class="c1"># area is already in new format</span>
336        <span class="n">area</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">upper</span><span class="p">),</span>
337                                    <span class="nb">float</span><span class="p">(</span><span class="n">left</span><span class="p">),</span>
338                                    <span class="nb">float</span><span class="p">(</span><span class="n">lower</span><span class="p">),</span>
339                                    <span class="nb">float</span><span class="p">(</span><span class="n">right</span><span class="p">))</span>
340    <span class="k">else</span><span class="p">:</span>
341        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;The area components have different &#39;</span>
342                         <span class="s1">&#39;formats (upper, lower, left, right): &#39;</span>
343                         <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">upper</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">lower</span><span class="p">),</span>
344                                              <span class="nb">str</span><span class="p">(</span><span class="n">left</span><span class="p">)</span> <span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">right</span><span class="p">)))</span>
345
346    <span class="k">return</span> <span class="n">area</span></div>
347
348<div class="viewcode-block" id="check_levels"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_levels">[docs]</a><span class="k">def</span> <span class="nf">check_levels</span><span class="p">(</span><span class="n">levelist</span><span class="p">,</span> <span class="n">level</span><span class="p">):</span>
349    <span class="sd">&#39;&#39;&#39;Defines correct level list and guarantees that the maximum level is</span>
350<span class="sd">    one of the available maximum levels.</span>
351
352<span class="sd">    Parameters</span>
353<span class="sd">    ----------</span>
354<span class="sd">    levelist : str</span>
355<span class="sd">        Specifies the level list.</span>
356<span class="sd">        Examples: model level: 1/to/137, pressure levels: 500/to/1000</span>
357
358<span class="sd">    level : str</span>
359<span class="sd">        Specifies the maximum level.</span>
360
361<span class="sd">    Return</span>
362<span class="sd">    ------</span>
363<span class="sd">    levelist : str</span>
364<span class="sd">        Specifies the required levels. It has to have a valid</span>
365<span class="sd">        correspondence to the selected levtype.</span>
366<span class="sd">        Examples: model level: 1/to/137, pressure levels: 500/to/1000</span>
367
368<span class="sd">    level : str</span>
369<span class="sd">        Specifies the maximum level. It has to be one of the</span>
370<span class="sd">        available maximum level number as contained in the variable</span>
371<span class="sd">        MAX_LEVEL_LIST in &quot;_config&quot;. E.g. [16, 19, 31, 40, 50, 60, 62, 91, 137]</span>
372
373<span class="sd">    &#39;&#39;&#39;</span>
374    <span class="c1"># assure consistency of levelist and level</span>
375    <span class="k">if</span> <span class="ow">not</span> <span class="n">levelist</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">level</span><span class="p">:</span>
376        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: neither levelist nor level &#39;</span>
377                         <span class="s1">&#39;specified in CONTROL file&#39;</span><span class="p">)</span>
378    <span class="k">elif</span> <span class="ow">not</span> <span class="n">levelist</span> <span class="ow">and</span> <span class="n">level</span><span class="p">:</span>
379        <span class="n">levelist</span> <span class="o">=</span> <span class="s1">&#39;1/to/&#39;</span> <span class="o">+</span> <span class="n">level</span>
380    <span class="k">elif</span> <span class="p">(</span><span class="n">levelist</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">level</span><span class="p">)</span> <span class="ow">or</span> \
381         <span class="p">(</span><span class="n">levelist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="n">level</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]):</span>
382        <span class="n">level</span> <span class="o">=</span> <span class="n">levelist</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
383    <span class="k">else</span><span class="p">:</span>
384        <span class="k">pass</span>
385
386    <span class="c1"># check if max level is a valid level</span>
387    <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_config</span><span class="o">.</span><span class="n">MAX_LEVEL_LIST</span><span class="p">:</span>
388        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: </span><span class="se">\n</span><span class="s1">&#39;</span>
389                         <span class="s1">&#39;LEVEL must be the maximum level of a specified &#39;</span>
390                         <span class="s1">&#39;level list from ECMWF, e.g. </span><span class="si">{}</span><span class="s1"> </span><span class="se">\n</span><span class="s1">&#39;</span>
391                         <span class="s1">&#39;Check parameter &quot;LEVEL&quot; or the max level of &#39;</span>
392                         <span class="s1">&#39;&quot;LEVELIST&quot;!&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">MAX_LEVEL_LIST</span><span class="p">)))</span>
393
394    <span class="k">return</span> <span class="n">levelist</span><span class="p">,</span> <span class="n">level</span></div>
395
396
397<div class="viewcode-block" id="check_ppid"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_ppid">[docs]</a><span class="k">def</span> <span class="nf">check_ppid</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">ppid</span><span class="p">):</span>
398    <span class="sd">&#39;&#39;&#39;Sets the current PPID.</span>
399
400<span class="sd">    Parameters</span>
401<span class="sd">    ----------</span>
402<span class="sd">    c : ControlFile</span>
403<span class="sd">            Contains all the parameters of CONTROL file and</span>
404<span class="sd">            command line.</span>
405
406<span class="sd">    ppid : int or None</span>
407<span class="sd">        Contains the ppid number provided by the command line parameter</span>
408<span class="sd">        of is None otherwise.</span>
409
410<span class="sd">    Return</span>
411<span class="sd">    ------</span>
412
413<span class="sd">    &#39;&#39;&#39;</span>
414
415    <span class="k">if</span> <span class="ow">not</span> <span class="n">ppid</span><span class="p">:</span>
416        <span class="n">c</span><span class="o">.</span><span class="n">ppid</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getppid</span><span class="p">())</span>
417    <span class="k">else</span><span class="p">:</span>
418        <span class="n">c</span><span class="o">.</span><span class="n">ppid</span> <span class="o">=</span> <span class="n">ppid</span>
419
420    <span class="k">return</span></div>
421
422
423<div class="viewcode-block" id="check_purefc"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_purefc">[docs]</a><span class="k">def</span> <span class="nf">check_purefc</span><span class="p">(</span><span class="n">ftype</span><span class="p">):</span>
424    <span class="sd">&#39;&#39;&#39;Check for a pure forecast mode.</span>
425
426<span class="sd">    Parameters</span>
427<span class="sd">    ----------</span>
428<span class="sd">    ftype : list of str</span>
429<span class="sd">        List of field types.</span>
430
431<span class="sd">    Return</span>
432<span class="sd">    ------</span>
433<span class="sd">    True or False:</span>
434<span class="sd">        True if pure forecasts are to be retrieved. False if there are</span>
435<span class="sd">        analysis fields in between.</span>
436<span class="sd">    &#39;&#39;&#39;</span>
437
438    <span class="k">if</span> <span class="s1">&#39;AN&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ftype</span> <span class="ow">and</span> <span class="s1">&#39;4V&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ftype</span><span class="p">:</span>
439        <span class="c1"># pure forecast</span>
440        <span class="k">return</span> <span class="mi">1</span>
441
442    <span class="k">return</span> <span class="mi">0</span></div>
443
444
445<div class="viewcode-block" id="check_step"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_step">[docs]</a><span class="k">def</span> <span class="nf">check_step</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">mailfail</span><span class="p">):</span>
446    <span class="sd">&#39;&#39;&#39;Checks on step format and convert into a list of steps.</span>
447
448<span class="sd">    If the steps were defined with &quot;to&quot; and &quot;by&quot; they are converted into</span>
449<span class="sd">    a list of steps. If the steps were set in a string, it is</span>
450<span class="sd">    converted into a list.</span>
451
452<span class="sd">    Parameters</span>
453<span class="sd">    ----------</span>
454<span class="sd">    step : list of str or str</span>
455<span class="sd">        Specifies the forecast time step from forecast base time.</span>
456<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
457
458<span class="sd">    mailfail : list of str</span>
459<span class="sd">        Contains all email addresses which should be notified.</span>
460<span class="sd">        It might also contain just the ecmwf user name which will trigger</span>
461<span class="sd">        mailing to the associated email address for this user.</span>
462
463<span class="sd">    Return</span>
464<span class="sd">    ------</span>
465<span class="sd">    step : list of str</span>
466<span class="sd">        List of forecast steps in format e.g. [001, 002, ...]</span>
467<span class="sd">    &#39;&#39;&#39;</span>
468    <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
469
470    <span class="k">if</span> <span class="s1">&#39;/&#39;</span> <span class="ow">in</span> <span class="n">step</span><span class="p">:</span>
471        <span class="n">steps</span> <span class="o">=</span> <span class="n">step</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
472        <span class="k">if</span> <span class="s1">&#39;to&#39;</span> <span class="ow">in</span> <span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="s1">&#39;by&#39;</span> <span class="ow">in</span> <span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
473            <span class="n">ilist</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span>
474                              <span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
475                              <span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="mi">4</span><span class="p">]))</span>
476            <span class="n">step</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">ilist</span><span class="p">]</span>
477        <span class="k">elif</span> <span class="s1">&#39;to&#39;</span> <span class="ow">in</span> <span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="s1">&#39;by&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
478            <span class="n">my_error</span><span class="p">(</span><span class="n">step</span> <span class="o">+</span> <span class="s1">&#39;:</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
479                     <span class="s1">&#39;if &quot;to&quot; is used in steps parameter, &#39;</span>
480                     <span class="s1">&#39;please use &quot;by&quot; as well&#39;</span><span class="p">)</span>
481        <span class="k">else</span><span class="p">:</span>
482            <span class="n">step</span> <span class="o">=</span> <span class="n">steps</span>
483
484    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
485        <span class="n">step</span> <span class="o">=</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span>
486
487    <span class="k">return</span> <span class="n">step</span></div>
488
489<div class="viewcode-block" id="check_type"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_type">[docs]</a><span class="k">def</span> <span class="nf">check_type</span><span class="p">(</span><span class="n">ftype</span><span class="p">,</span> <span class="n">steps</span><span class="p">):</span>
490    <span class="sd">&#39;&#39;&#39;Check if type variable is of type list and if analysis field has</span>
491<span class="sd">    forecast step 0.</span>
492
493<span class="sd">    Parameters</span>
494<span class="sd">    ----------</span>
495<span class="sd">    ftype : list of str or str</span>
496<span class="sd">        List of field types.</span>
497
498<span class="sd">    steps : str</span>
499<span class="sd">        Specifies the forecast time step from forecast base time.</span>
500<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
501
502<span class="sd">    Return</span>
503<span class="sd">    ------</span>
504<span class="sd">    ftype : list of str</span>
505<span class="sd">        List of field types.</span>
506<span class="sd">    &#39;&#39;&#39;</span>
507    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ftype</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
508        <span class="n">ftype</span> <span class="o">=</span> <span class="p">[</span><span class="n">ftype</span><span class="p">]</span>
509
510    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ftype</span><span class="p">):</span>
511        <span class="k">if</span> <span class="n">ftype</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;AN&#39;</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
512            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Analysis retrievals must have STEP = 0 (now set to 0)&#39;</span><span class="p">)</span>
513            <span class="n">ftype</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
514
515    <span class="k">return</span> <span class="n">ftype</span></div>
516
517<div class="viewcode-block" id="check_time"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_time">[docs]</a><span class="k">def</span> <span class="nf">check_time</span><span class="p">(</span><span class="n">ftime</span><span class="p">):</span>
518    <span class="sd">&#39;&#39;&#39;Check if time variable is of type list. Otherwise convert to list.</span>
519
520<span class="sd">    Parameters</span>
521<span class="sd">    ----------</span>
522<span class="sd">    ftime : list of str or str</span>
523<span class="sd">        The time in hours of the field.</span>
524
525<span class="sd">    Return</span>
526<span class="sd">    ------</span>
527<span class="sd">    ftime : list of str</span>
528<span class="sd">        The time in hours of the field.</span>
529<span class="sd">    &#39;&#39;&#39;</span>
530    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ftime</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
531        <span class="n">ftime</span> <span class="o">=</span> <span class="p">[</span><span class="n">ftime</span><span class="p">]</span>
532
533    <span class="k">return</span> <span class="n">ftime</span></div>
534
535<div class="viewcode-block" id="check_len_type_time_step"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_len_type_time_step">[docs]</a><span class="k">def</span> <span class="nf">check_len_type_time_step</span><span class="p">(</span><span class="n">ftype</span><span class="p">,</span> <span class="n">ftime</span><span class="p">,</span> <span class="n">steps</span><span class="p">,</span> <span class="n">maxstep</span><span class="p">,</span> <span class="n">purefc</span><span class="p">):</span>
536    <span class="sd">&#39;&#39;&#39;Check if</span>
537
538<span class="sd">    Parameters</span>
539<span class="sd">    ----------</span>
540<span class="sd">    ftype : list of str</span>
541<span class="sd">        List of field types.</span>
542
543<span class="sd">    ftime : list of str or str</span>
544<span class="sd">        The time in hours of the field.</span>
545
546<span class="sd">    steps : str</span>
547<span class="sd">        Specifies the forecast time step from forecast base time.</span>
548<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
549
550<span class="sd">    maxstep : int</span>
551<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
552<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
553
554<span class="sd">    purefc : int</span>
555<span class="sd">        Switch for definition of pure forecast mode or not.</span>
556
557<span class="sd">    Return</span>
558<span class="sd">    ------</span>
559<span class="sd">    ftype : list of str</span>
560<span class="sd">        List of field types.</span>
561
562<span class="sd">    ftime : list of str</span>
563<span class="sd">        The time in hours of the field.</span>
564
565<span class="sd">    steps : str</span>
566<span class="sd">        Specifies the forecast time step from forecast base time.</span>
567<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
568<span class="sd">    &#39;&#39;&#39;</span>
569    <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">ftype</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">ftime</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">steps</span><span class="p">)):</span>
570        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: The number of field types, times and steps &#39;</span>
571                         <span class="s1">&#39;are not the same! Please check the setting in the &#39;</span>
572                         <span class="s1">&#39;CONTROL file!&#39;</span><span class="p">)</span>
573
574    <span class="c1"># if pure forecast is selected and only one field type/time is set</span>
575    <span class="c1"># prepare a complete list of type/time/step combination upto maxstep</span>
576    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">ftype</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">purefc</span><span class="p">:</span>
577        <span class="n">nftype</span> <span class="o">=</span> <span class="p">[]</span>
578        <span class="n">nsteps</span> <span class="o">=</span> <span class="p">[]</span>
579        <span class="n">nftime</span> <span class="o">=</span> <span class="p">[]</span>
580        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">maxstep</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
581            <span class="n">nftype</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ftype</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
582            <span class="n">nsteps</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
583            <span class="n">nftime</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ftime</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
584        <span class="k">return</span> <span class="n">nftype</span><span class="p">,</span> <span class="n">nftime</span><span class="p">,</span> <span class="n">nsteps</span>
585
586    <span class="k">return</span> <span class="n">ftype</span><span class="p">,</span> <span class="n">ftime</span><span class="p">,</span> <span class="n">steps</span></div>
587
588<div class="viewcode-block" id="check_mail"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_mail">[docs]</a><span class="k">def</span> <span class="nf">check_mail</span><span class="p">(</span><span class="n">mail</span><span class="p">):</span>
589    <span class="sd">&#39;&#39;&#39;Check the string of mail addresses, seperate them and convert to a list.</span>
590
591<span class="sd">    Parameters</span>
592<span class="sd">    ----------</span>
593<span class="sd">    mail : list of str or str</span>
594<span class="sd">        Contains email addresses for notifications.</span>
595<span class="sd">        It might also contain just the ecmwf user name which will trigger</span>
596<span class="sd">        mailing to the associated email address for this user.</span>
597
598<span class="sd">    Return</span>
599<span class="sd">    ------</span>
600<span class="sd">    mail : list of str</span>
601<span class="sd">        Contains email addresses for notifications.</span>
602<span class="sd">        It might also contain just the ecmwf user name which will trigger</span>
603<span class="sd">        mailing to the associated email address for this user.</span>
604
605<span class="sd">    &#39;&#39;&#39;</span>
606    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mail</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
607        <span class="k">if</span> <span class="s1">&#39;,&#39;</span> <span class="ow">in</span> <span class="n">mail</span><span class="p">:</span>
608            <span class="n">mail</span> <span class="o">=</span> <span class="n">mail</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
609        <span class="k">elif</span> <span class="s1">&#39; &#39;</span> <span class="ow">in</span> <span class="n">mail</span><span class="p">:</span>
610            <span class="n">mail</span> <span class="o">=</span> <span class="n">mail</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
611        <span class="k">else</span><span class="p">:</span>
612            <span class="n">mail</span> <span class="o">=</span> <span class="p">[</span><span class="n">mail</span><span class="p">]</span>
613
614    <span class="k">return</span> <span class="n">mail</span></div>
615
616<div class="viewcode-block" id="check_queue"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_queue">[docs]</a><span class="k">def</span> <span class="nf">check_queue</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="n">gateway</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">ecuid</span><span class="p">,</span> <span class="n">ecgid</span><span class="p">):</span>
617    <span class="sd">&#39;&#39;&#39;Check if the necessary ECMWF parameters are set if the queue is</span>
618<span class="sd">    one of the QUEUES_LIST (in _config).</span>
619
620<span class="sd">    Parameters</span>
621<span class="sd">    ----------</span>
622<span class="sd">    queue : str</span>
623<span class="sd">        Name of the queue if submitted to the ECMWF servers.</span>
624<span class="sd">        Used to check if ecuid, ecgid, gateway and destination</span>
625<span class="sd">        are set correctly and are not empty.</span>
626
627<span class="sd">    gateway : str</span>
628<span class="sd">        The address of the gateway server.</span>
629
630<span class="sd">    destination : str</span>
631<span class="sd">        The name of the destination of the gateway server for data</span>
632<span class="sd">        transfer through ectrans. E.g. name@genericSftp</span>
633
634<span class="sd">    ecuid : str</span>
635<span class="sd">        ECMWF user id.</span>
636
637<span class="sd">    ecgid : str</span>
638<span class="sd">        ECMWF group id.</span>
639
640<span class="sd">    Return</span>
641<span class="sd">    ------</span>
642
643<span class="sd">    &#39;&#39;&#39;</span>
644    <span class="k">if</span> <span class="n">queue</span> <span class="ow">in</span> <span class="n">_config</span><span class="o">.</span><span class="n">QUEUES_LIST</span> <span class="ow">and</span> \
645            <span class="p">(</span><span class="ow">not</span> <span class="n">gateway</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">destination</span> <span class="ow">or</span>
646             <span class="ow">not</span> <span class="n">ecuid</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">ecgid</span><span class="p">):</span>
647        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">Environment variables GATEWAY, DESTINATION, ECUID &#39;</span>
648                         <span class="s1">&#39;and ECGID were not set properly! </span><span class="se">\n</span><span class="s1"> &#39;</span>
649                         <span class="s1">&#39;Please check for existence of file &quot;ECMWF_ENV&quot; &#39;</span>
650                         <span class="s1">&#39;in the run directory!&#39;</span><span class="p">)</span>
651    <span class="k">return</span></div>
652
653<div class="viewcode-block" id="check_pathes"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_pathes">[docs]</a><span class="k">def</span> <span class="nf">check_pathes</span><span class="p">(</span><span class="n">idir</span><span class="p">,</span> <span class="n">odir</span><span class="p">,</span> <span class="n">fpdir</span><span class="p">,</span> <span class="n">fedir</span><span class="p">):</span>
654    <span class="sd">&#39;&#39;&#39;Check if output and flexpart pathes are set.</span>
655
656<span class="sd">    Parameters</span>
657<span class="sd">    ----------</span>
658<span class="sd">    idir : str</span>
659<span class="sd">        Path to the temporary directory for MARS retrieval data.</span>
660
661<span class="sd">    odir : str</span>
662<span class="sd">        Path to the final output directory where the FLEXPART input files</span>
663<span class="sd">        will be stored.</span>
664
665<span class="sd">    fpdir : str</span>
666<span class="sd">        Path to FLEXPART root directory.</span>
667
668<span class="sd">    fedir : str</span>
669<span class="sd">        Path to flex_extract root directory.</span>
670
671<span class="sd">    Return</span>
672<span class="sd">    ------</span>
673<span class="sd">    odir : str</span>
674<span class="sd">        Path to the final output directory where the FLEXPART input files</span>
675<span class="sd">        will be stored.</span>
676
677<span class="sd">    fpdir : str</span>
678<span class="sd">        Path to FLEXPART root directory.</span>
679
680<span class="sd">    &#39;&#39;&#39;</span>
681    <span class="k">if</span> <span class="ow">not</span> <span class="n">fpdir</span><span class="p">:</span>
682        <span class="n">fpdir</span> <span class="o">=</span> <span class="n">fedir</span>
683
684    <span class="k">if</span> <span class="ow">not</span> <span class="n">odir</span><span class="p">:</span>
685        <span class="n">odir</span> <span class="o">=</span> <span class="n">idir</span>
686
687    <span class="k">return</span> <span class="n">odir</span><span class="p">,</span> <span class="n">fpdir</span></div>
688
689<div class="viewcode-block" id="check_dates"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_dates">[docs]</a><span class="k">def</span> <span class="nf">check_dates</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
690    <span class="sd">&#39;&#39;&#39;Checks if there is at least a start date for a one day retrieval.</span>
691
692<span class="sd">    Checks if end date lies after start date and end date is set.</span>
693
694<span class="sd">    Parameters</span>
695<span class="sd">    ----------</span>
696<span class="sd">    start : str</span>
697<span class="sd">        The start date of the retrieval job.</span>
698
699<span class="sd">    end : str</span>
700<span class="sd">        The end date of the retrieval job.</span>
701
702<span class="sd">    Return</span>
703<span class="sd">    ------</span>
704<span class="sd">    start : str</span>
705<span class="sd">        The start date of the retrieval job.</span>
706
707<span class="sd">    end : str</span>
708<span class="sd">        The end date of the retrieval job.</span>
709
710<span class="sd">    &#39;&#39;&#39;</span>
711    <span class="c1"># check for having at least a starting date</span>
712    <span class="c1"># otherwise program is not allowed to run</span>
713    <span class="k">if</span> <span class="ow">not</span> <span class="n">start</span><span class="p">:</span>
714        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;start_date was neither specified in command line nor &#39;</span>
715                         <span class="s1">&#39;in CONTROL file.</span><span class="se">\n</span><span class="s1">&#39;</span>
716                         <span class="s1">&#39;Try &quot;</span><span class="si">{}</span><span class="s1"> -h&quot; to print usage information&#39;</span>
717                         <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="p">)</span>
718
719    <span class="c1"># retrieve just one day if end_date isn&#39;t set</span>
720    <span class="k">if</span> <span class="ow">not</span> <span class="n">end</span><span class="p">:</span>
721        <span class="n">end</span> <span class="o">=</span> <span class="n">start</span>
722
723    <span class="n">dstart</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="s1">&#39;%Y%m</span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">)</span>
724    <span class="n">dend</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">end</span><span class="p">,</span> <span class="s1">&#39;%Y%m</span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">)</span>
725    <span class="k">if</span> <span class="n">dstart</span> <span class="o">&gt;</span> <span class="n">dend</span><span class="p">:</span>
726        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: Start date is after end date! </span><span class="se">\n</span><span class="s1">&#39;</span>
727                         <span class="s1">&#39;Please adapt the dates in CONTROL file or &#39;</span>
728                         <span class="s1">&#39;command line! (start=</span><span class="si">{}</span><span class="s1">; end=</span><span class="si">{}</span><span class="s1">)&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">))</span>
729
730    <span class="k">return</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span></div>
731
732<div class="viewcode-block" id="check_maxstep"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_maxstep">[docs]</a><span class="k">def</span> <span class="nf">check_maxstep</span><span class="p">(</span><span class="n">maxstep</span><span class="p">,</span> <span class="n">steps</span><span class="p">):</span>
733    <span class="sd">&#39;&#39;&#39;Convert maxstep into integer if it is already given. Otherwise, select</span>
734<span class="sd">    maxstep by going through the steps list.</span>
735
736<span class="sd">    Parameters</span>
737<span class="sd">    ----------</span>
738<span class="sd">    maxstep : str</span>
739<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
740<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
741
742<span class="sd">    steps : str</span>
743<span class="sd">        Specifies the forecast time step from forecast base time.</span>
744<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
745
746<span class="sd">    Return</span>
747<span class="sd">    ------</span>
748<span class="sd">    maxstep : int</span>
749<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
750<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
751
752<span class="sd">    &#39;&#39;&#39;</span>
753    <span class="c1"># if maxstep wasn&#39;t provided</span>
754    <span class="c1"># search for it in the &quot;step&quot; parameter</span>
755    <span class="k">if</span> <span class="ow">not</span> <span class="n">maxstep</span><span class="p">:</span>
756        <span class="n">maxstep</span> <span class="o">=</span> <span class="mi">0</span>
757        <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">steps</span><span class="p">:</span>
758            <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">maxstep</span><span class="p">:</span>
759                <span class="n">maxstep</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
760    <span class="k">else</span><span class="p">:</span>
761        <span class="n">maxstep</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">maxstep</span><span class="p">)</span>
762
763    <span class="k">return</span> <span class="n">maxstep</span></div>
764
765<div class="viewcode-block" id="check_basetime"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_basetime">[docs]</a><span class="k">def</span> <span class="nf">check_basetime</span><span class="p">(</span><span class="n">basetime</span><span class="p">):</span>
766    <span class="sd">&#39;&#39;&#39;Check if basetime is set and contains one of the two</span>
767<span class="sd">    possible values (0, 12).</span>
768
769<span class="sd">    Parameters</span>
770<span class="sd">    ----------</span>
771<span class="sd">    basetime : int or str or None</span>
772<span class="sd">        The time for a half day retrieval. The 12 hours upfront are to be</span>
773<span class="sd">        retrieved.</span>
774
775<span class="sd">    Return</span>
776<span class="sd">    ------</span>
777<span class="sd">    basetime : int or None</span>
778<span class="sd">        The time for a half day retrieval. The 12 hours upfront are to be</span>
779<span class="sd">        retrieved.</span>
780<span class="sd">    &#39;&#39;&#39;</span>
781    <span class="k">if</span> <span class="n">basetime</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
782        <span class="n">basetime</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">basetime</span><span class="p">)</span>
783        <span class="k">if</span> <span class="n">basetime</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">basetime</span> <span class="o">!=</span> <span class="mi">12</span><span class="p">:</span>
784            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: Basetime has an invalid value &#39;</span>
785                             <span class="s1">&#39;-&gt; </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">basetime</span><span class="p">)))</span>
786    <span class="k">return</span> <span class="n">basetime</span></div>
787
788<div class="viewcode-block" id="check_request"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_request">[docs]</a><span class="k">def</span> <span class="nf">check_request</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">marsfile</span><span class="p">):</span>
789    <span class="sd">&#39;&#39;&#39;Check if there is an old mars request file and remove it.</span>
790
791<span class="sd">    Parameters</span>
792<span class="sd">    ----------</span>
793<span class="sd">    request : int</span>
794<span class="sd">        Selects the mode of retrieval.</span>
795<span class="sd">        0: Retrieves the data from ECMWF.</span>
796<span class="sd">        1: Prints the mars requests to an output file.</span>
797<span class="sd">        2: Retrieves the data and prints the mars request.</span>
798
799<span class="sd">    marsfile : str</span>
800<span class="sd">        Path to the mars request file.</span>
801
802<span class="sd">    Return</span>
803<span class="sd">    ------</span>
804
805<span class="sd">    &#39;&#39;&#39;</span>
806    <span class="k">if</span> <span class="n">request</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
807        <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">marsfile</span><span class="p">):</span>
808            <span class="n">silent_remove</span><span class="p">(</span><span class="n">marsfile</span><span class="p">)</span>
809    <span class="k">return</span></div>
810
811<div class="viewcode-block" id="check_public"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_public">[docs]</a><span class="k">def</span> <span class="nf">check_public</span><span class="p">(</span><span class="n">public</span><span class="p">,</span> <span class="n">dataset</span><span class="p">):</span>
812    <span class="sd">&#39;&#39;&#39;Check wether the dataset parameter is set for a</span>
813<span class="sd">    public data set retrieval.</span>
814
815<span class="sd">    Parameters</span>
816<span class="sd">    ----------</span>
817<span class="sd">    public : int</span>
818<span class="sd">        Specifies if public data are to be retrieved or not.</span>
819
820<span class="sd">    dataset : str</span>
821<span class="sd">        Specific name which identifies the public dataset.</span>
822
823<span class="sd">    Return</span>
824<span class="sd">    ------</span>
825
826<span class="sd">    &#39;&#39;&#39;</span>
827    <span class="k">if</span> <span class="n">public</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">dataset</span><span class="p">:</span>
828        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: If public mars data wants to be retrieved, &#39;</span>
829                         <span class="s1">&#39;the &quot;dataset&quot;-parameter has to be set too!&#39;</span><span class="p">)</span>
830    <span class="k">return</span></div>
831
832<div class="viewcode-block" id="check_acctype"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_acctype">[docs]</a><span class="k">def</span> <span class="nf">check_acctype</span><span class="p">(</span><span class="n">acctype</span><span class="p">,</span> <span class="n">ftype</span><span class="p">):</span>
833    <span class="sd">&#39;&#39;&#39;Guarantees that the accumulation field type is set.</span>
834
835<span class="sd">    If not set, it is derivated as in the old method (TYPE[1]).</span>
836
837<span class="sd">    Parameters</span>
838<span class="sd">    ----------</span>
839<span class="sd">    acctype : str</span>
840<span class="sd">        The field type for the accumulated forecast fields.</span>
841
842<span class="sd">    ftype : list of str</span>
843<span class="sd">        List of field types.</span>
844
845<span class="sd">    Return</span>
846<span class="sd">    ------</span>
847<span class="sd">    acctype : str</span>
848<span class="sd">        The field type for the accumulated forecast fields.</span>
849<span class="sd">    &#39;&#39;&#39;</span>
850    <span class="k">if</span> <span class="ow">not</span> <span class="n">acctype</span><span class="p">:</span>
851        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Control parameter ACCTYPE was not defined.&#39;</span><span class="p">)</span>
852        <span class="k">try</span><span class="p">:</span>
853            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">ftype</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">ftype</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;AN&#39;</span><span class="p">:</span>
854                <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Use same field type as for the non-flux fields.&#39;</span><span class="p">)</span>
855                <span class="n">acctype</span> <span class="o">=</span> <span class="n">ftype</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
856            <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">ftype</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">ftype</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;AN&#39;</span><span class="p">:</span>
857                <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Use old setting by using TYPE[1] for flux forecast!&#39;</span><span class="p">)</span>
858                <span class="n">acctype</span> <span class="o">=</span> <span class="n">ftype</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
859        <span class="k">except</span><span class="p">:</span>
860            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: Accumulation field type could not be set!&#39;</span><span class="p">)</span>
861    <span class="k">else</span><span class="p">:</span>
862        <span class="k">if</span> <span class="n">acctype</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;AN&#39;</span><span class="p">:</span>
863            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: Accumulation forecast fields can not be &#39;</span>
864                             <span class="s1">&#39;of type &quot;analysis&quot;!&#39;</span><span class="p">)</span>
865    <span class="k">return</span> <span class="n">acctype</span></div>
866
867
868<div class="viewcode-block" id="check_acctime"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_acctime">[docs]</a><span class="k">def</span> <span class="nf">check_acctime</span><span class="p">(</span><span class="n">acctime</span><span class="p">,</span> <span class="n">marsclass</span><span class="p">,</span> <span class="n">purefc</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
869    <span class="sd">&#39;&#39;&#39;Guarantees that the accumulation forecast times were set.</span>
870
871<span class="sd">    If it is not set, it tries to set the value for some of the</span>
872<span class="sd">    most commonly used data sets. Otherwise it raises an error.</span>
873
874<span class="sd">    Parameters</span>
875<span class="sd">    ----------</span>
876<span class="sd">    acctime : str</span>
877<span class="sd">        The starting time from the accumulated forecasts.</span>
878
879<span class="sd">    marsclass : str</span>
880<span class="sd">        ECMWF data classification identifier.</span>
881
882<span class="sd">    purefc : int</span>
883<span class="sd">        Switch for definition of pure forecast mode or not.</span>
884
885<span class="sd">    Return</span>
886<span class="sd">    ------</span>
887<span class="sd">    acctime : str</span>
888<span class="sd">        The starting time from the accumulated forecasts.</span>
889<span class="sd">    &#39;&#39;&#39;</span>
890
891    <span class="k">if</span> <span class="ow">not</span> <span class="n">acctime</span><span class="p">:</span>
892        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Control parameter ACCTIME was not defined.&#39;</span><span class="p">)</span>
893        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Value will be set depending on field type:</span><span class="se">\n</span><span class="s1"> &#39;</span>
894              <span class="s1">&#39;</span><span class="se">\t\t</span><span class="s1"> EA=06/18</span><span class="se">\n\t\t</span><span class="s1"> EI/OD=00/12</span><span class="se">\n\t\t</span><span class="s1"> EP=18&#39;</span><span class="p">)</span>
895        <span class="k">if</span> <span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;EA&#39;</span><span class="p">:</span> <span class="c1"># Era 5</span>
896            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;06/18&#39;</span>
897        <span class="k">elif</span> <span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;EI&#39;</span><span class="p">:</span> <span class="c1"># Era-Interim</span>
898            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;00/12&#39;</span>
899        <span class="k">elif</span> <span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;EP&#39;</span><span class="p">:</span> <span class="c1"># CERA</span>
900            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;18&#39;</span>
901        <span class="k">elif</span> <span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;OD&#39;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">purefc</span><span class="p">:</span> <span class="c1"># On-demand</span>
902            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;00/12&#39;</span>
903        <span class="k">elif</span> <span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;OD&#39;</span> <span class="ow">and</span> <span class="n">purefc</span><span class="p">:</span> <span class="c1"># On-demand</span>
904            <span class="n">acctime</span> <span class="o">=</span> <span class="n">time</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
905        <span class="k">else</span><span class="p">:</span>
906            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: Accumulation forecast time can not &#39;</span>
907                             <span class="s1">&#39;automatically be derived!&#39;</span><span class="p">)</span>
908    <span class="k">return</span> <span class="n">acctime</span></div>
909
910<div class="viewcode-block" id="check_accmaxstep"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_accmaxstep">[docs]</a><span class="k">def</span> <span class="nf">check_accmaxstep</span><span class="p">(</span><span class="n">accmaxstep</span><span class="p">,</span> <span class="n">marsclass</span><span class="p">,</span> <span class="n">purefc</span><span class="p">,</span> <span class="n">maxstep</span><span class="p">):</span>
911    <span class="sd">&#39;&#39;&#39;Guarantees that the accumulation forecast step were set.</span>
912
913<span class="sd">    Parameters</span>
914<span class="sd">    ----------</span>
915<span class="sd">    accmaxstep : str</span>
916<span class="sd">        The maximum forecast step for the accumulated forecast fields.</span>
917
918<span class="sd">    marsclass : str</span>
919<span class="sd">        ECMWF data classification identifier.</span>
920
921<span class="sd">    purefc : int</span>
922<span class="sd">        Switch for definition of pure forecast mode or not.</span>
923
924<span class="sd">    maxstep : str</span>
925<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
926<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
927
928<span class="sd">    Return</span>
929<span class="sd">    ------</span>
930<span class="sd">    accmaxstep : str</span>
931<span class="sd">        The maximum forecast step for the accumulated forecast fields.</span>
932<span class="sd">    &#39;&#39;&#39;</span>
933    <span class="k">if</span> <span class="ow">not</span> <span class="n">accmaxstep</span><span class="p">:</span>
934        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Control parameter ACCMAXSTEP was not defined.&#39;</span><span class="p">)</span>
935        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Value will be set depending on field type/time: &#39;</span>
936              <span class="s1">&#39;</span><span class="se">\n\t\t</span><span class="s1"> EA/EI/OD=12</span><span class="se">\n\t\t</span><span class="s1"> EP=24&#39;</span><span class="p">)</span>
937        <span class="k">if</span> <span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;EA&#39;</span><span class="p">,</span> <span class="s1">&#39;EI&#39;</span><span class="p">,</span> <span class="s1">&#39;OD&#39;</span><span class="p">]</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">purefc</span><span class="p">:</span>
938            <span class="c1"># Era 5, Era-Interim, On-demand operational</span>
939            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="s1">&#39;12&#39;</span>
940        <span class="k">elif</span> <span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;EP&#39;</span><span class="p">:</span> <span class="c1"># CERA</span>
941            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="s1">&#39;24&#39;</span>
942        <span class="k">elif</span> <span class="n">purefc</span> <span class="ow">and</span> <span class="n">accmaxstep</span> <span class="o">!=</span> <span class="n">maxstep</span><span class="p">:</span>
943            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="n">maxstep</span>
944            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... For pure forecast mode, the accumulated forecast must &#39;</span>
945                  <span class="s1">&#39;have the same maxstep as the normal forecast fields!</span><span class="se">\n</span><span class="s1">&#39;</span>
946                  <span class="s1">&#39;</span><span class="se">\t\t</span><span class="s1"> Accmaxstep was set to maxstep!&#39;</span><span class="p">)</span>
947        <span class="k">else</span><span class="p">:</span>
948            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: Accumulation forecast step can not &#39;</span>
949                             <span class="s1">&#39;automatically be derived!&#39;</span><span class="p">)</span>
950    <span class="k">else</span><span class="p">:</span>
951        <span class="k">if</span> <span class="n">purefc</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="n">accmaxstep</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">int</span><span class="p">(</span><span class="n">maxstep</span><span class="p">):</span>
952            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="n">maxstep</span>
953            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... For pure forecast mode, the accumulated forecast must &#39;</span>
954                          <span class="s1">&#39;have the same maxstep as the normal forecast fields!</span><span class="se">\n</span><span class="s1">&#39;</span>
955                          <span class="s1">&#39;</span><span class="se">\t\t</span><span class="s1"> Accmaxstep was set to maxstep!&#39;</span><span class="p">)</span>
956    <span class="k">return</span> <span class="n">accmaxstep</span></div>
957
958<div class="viewcode-block" id="check_addpar"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_addpar">[docs]</a><span class="k">def</span> <span class="nf">check_addpar</span><span class="p">(</span><span class="n">addpar</span><span class="p">):</span>
959    <span class="sd">&#39;&#39;&#39;Check that addpar has correct format of additional parameters in</span>
960<span class="sd">    a single string, so that it can be easily appended to the hard coded</span>
961<span class="sd">    parameters that are retrieved in any case.</span>
962
963<span class="sd">    Parameters</span>
964<span class="sd">    ----------</span>
965<span class="sd">    addpar : str or list of str</span>
966<span class="sd">        List of additional parameters to be retrieved.</span>
967
968<span class="sd">    Return</span>
969<span class="sd">    ------</span>
970<span class="sd">    addpar : str</span>
971<span class="sd">        List of additional parameters to be retrieved.</span>
972<span class="sd">    &#39;&#39;&#39;</span>
973
974    <span class="k">if</span> <span class="n">addpar</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">addpar</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
975        <span class="k">if</span> <span class="s1">&#39;/&#39;</span> <span class="ow">in</span> <span class="n">addpar</span><span class="p">:</span>
976            <span class="n">parlist</span> <span class="o">=</span> <span class="n">addpar</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
977            <span class="n">parlist</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">parlist</span> <span class="k">if</span> <span class="n">p</span> <span class="ow">is</span> <span class="ow">not</span> <span class="s1">&#39;&#39;</span><span class="p">]</span>
978        <span class="k">else</span><span class="p">:</span>
979            <span class="n">parlist</span> <span class="o">=</span> <span class="p">[</span><span class="n">addpar</span><span class="p">]</span>
980
981        <span class="n">addpar</span> <span class="o">=</span> <span class="s1">&#39;/&#39;</span> <span class="o">+</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parlist</span><span class="p">)</span>
982
983    <span class="k">return</span> <span class="n">addpar</span></div>
984
985
986<div class="viewcode-block" id="check_job_chunk"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_job_chunk">[docs]</a><span class="k">def</span> <span class="nf">check_job_chunk</span><span class="p">(</span><span class="n">job_chunk</span><span class="p">):</span>
987    <span class="sd">&#39;&#39;&#39;Checks that if job chunk is set, the number is positive and non zero.</span>
988
989<span class="sd">    Parameters</span>
990<span class="sd">    ----------</span>
991<span class="sd">    job_chunk : int</span>
992<span class="sd">        The number of days for a single job script.</span>
993
994<span class="sd">    Return</span>
995<span class="sd">    ------</span>
996<span class="sd">    job_chunk : int</span>
997<span class="sd">        The number of days for a single job script.</span>
998<span class="sd">    &#39;&#39;&#39;</span>
999    <span class="k">if</span> <span class="ow">not</span> <span class="n">job_chunk</span><span class="p">:</span>
1000        <span class="k">return</span> <span class="n">job_chunk</span>
1001    <span class="k">else</span><span class="p">:</span>
1002        <span class="n">job_chunk</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">job_chunk</span><span class="p">)</span>
1003
1004    <span class="k">if</span> <span class="n">job_chunk</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
1005        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;ERROR: The number of job chunk is negative!</span><span class="se">\n</span><span class="s1">&#39;</span>
1006                         <span class="s1">&#39;It has to be a positive number!&#39;</span><span class="p">)</span>
1007    <span class="k">elif</span> <span class="n">job_chunk</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1008        <span class="n">job_chunk</span> <span class="o">=</span> <span class="kc">None</span>
1009    <span class="k">else</span><span class="p">:</span>
1010        <span class="k">pass</span>
1011
1012    <span class="k">return</span> <span class="n">job_chunk</span></div>
1013
1014
1015<div class="viewcode-block" id="check_number"><a class="viewcode-back" href="../Documentation/Api/api_python.html#checks.check_number">[docs]</a><span class="k">def</span> <span class="nf">check_number</span><span class="p">(</span><span class="n">number</span><span class="p">,</span> <span class="n">mailfail</span><span class="p">):</span>
1016    <span class="sd">&#39;&#39;&#39;Check for correct string format of ensemble member numbers.</span>
1017
1018<span class="sd">    Parameters</span>
1019<span class="sd">    ----------</span>
1020<span class="sd">    number : str</span>
1021<span class="sd">        List of ensemble member forecast runs.</span>
1022
1023<span class="sd">    mailfail : list of str</span>
1024<span class="sd">        Contains all email addresses which should be notified.</span>
1025<span class="sd">        It might also contain just the ecmwf user name which will trigger</span>
1026<span class="sd">        mailing to the associated email address for this user.</span>
1027
1028<span class="sd">    Return</span>
1029<span class="sd">    ------</span>
1030<span class="sd">    number : str</span>
1031<span class="sd">        String with list of ensemble member forecast runs. E.g. &#39;01/02/03/04&#39;</span>
1032<span class="sd">    &#39;&#39;&#39;</span>
1033
1034    <span class="k">if</span> <span class="s1">&#39;/&#39;</span> <span class="ow">in</span> <span class="n">number</span><span class="p">:</span>
1035        <span class="n">numbers</span> <span class="o">=</span> <span class="n">number</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
1036        <span class="k">if</span> <span class="s1">&#39;to&#39;</span> <span class="ow">in</span> <span class="n">number</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="s1">&#39;by&#39;</span> <span class="ow">in</span> <span class="n">number</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
1037            <span class="n">number</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">numbers</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> <span class="o">+</span> <span class="s1">&#39;/TO/&#39;</span> <span class="o">+</span> \
1038                     <span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">numbers</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span> <span class="o">+</span> <span class="s1">&#39;/BY/&#39;</span> <span class="o">+</span> \
1039                     <span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">numbers</span><span class="p">[</span><span class="mi">4</span><span class="p">]))</span>
1040        <span class="k">elif</span> <span class="s1">&#39;to&#39;</span> <span class="ow">in</span> <span class="n">number</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="s1">&#39;by&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">number</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
1041            <span class="n">number</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">numbers</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> <span class="o">+</span> <span class="s1">&#39;/TO/&#39;</span> <span class="o">+</span> \
1042                     <span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">numbers</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span>
1043        <span class="k">else</span><span class="p">:</span>
1044            <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">numbers</span><span class="p">]</span>
1045            <span class="n">number</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">numbers</span><span class="p">)</span>
1046    <span class="k">elif</span> <span class="n">number</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
1047        <span class="n">number</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{:0&gt;3}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">number</span><span class="p">))</span>
1048    <span class="k">else</span><span class="p">:</span>
1049        <span class="k">pass</span>
1050
1051    <span class="k">return</span> <span class="n">number</span></div>
1052</pre></div>
1053
1054           </div>
1055           
1056          </div>
1057          <footer>
1058 
1059
1060  <hr/>
1061
1062  <div role="contentinfo">
1063    <p>
1064        &copy; Copyright 2019, Anne Philipp and Leopold Haimberger
1065
1066    </p>
1067  </div>
1068  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
1069
1070</footer>
1071
1072        </div>
1073      </div>
1074
1075    </section>
1076
1077  </div>
1078 
1079
1080
1081  <script type="text/javascript">
1082      jQuery(function () {
1083          SphinxRtdTheme.Navigation.enable(true);
1084      });
1085  </script>
1086
1087 
1088 
1089   
1090   
1091
1092</body>
1093</html>
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG