source: flex_extract.git/Documentation/html/_modules/checks.html @ eca358d

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

updated online documentation with links on index page

  • Property mode set to 100644
File size: 88.3 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<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span>
194<span class="c1"># pylint: disable=unused-import</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="c1"># pylint: enable=unused-import</span>
200
201<span class="c1"># software specific classes and modules from flex_extract</span>
202<span class="kn">import</span> <span class="nn">_config</span>
203<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>
204<span class="c1"># ------------------------------------------------------------------------------</span>
205<span class="c1"># FUNCTIONS</span>
206<span class="c1"># ------------------------------------------------------------------------------</span>
207
208<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>
209    <span class="sd">&#39;&#39;&#39;Check that the logical variables have correct type integer.</span>
210
211<span class="sd">    Parameters</span>
212<span class="sd">    ----------</span>
213<span class="sd">    c : ControlFile</span>
214<span class="sd">        Contains all the parameters of CONTROL file and</span>
215<span class="sd">        command line.</span>
216
217<span class="sd">    logicals : list of (str or int)</span>
218<span class="sd">        Names of the switches that are used to control the flow of the</span>
219<span class="sd">        program.</span>
220
221<span class="sd">    Return</span>
222<span class="sd">    ------</span>
223
224<span class="sd">    &#39;&#39;&#39;</span>
225
226    <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">logicals</span><span class="p">:</span>
227        <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>
228            <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>
229
230    <span class="k">return</span></div>
231
232<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>
233    <span class="sd">&#39;&#39;&#39;Convert grid into correct Lat/Lon format. E.g. &#39;0.5/0.5&#39;</span>
234
235<span class="sd">    Checks on format of original grid. Wether it is in the order of 1000 or 1.</span>
236<span class="sd">    Convert to correct grid format and substitute into &quot;Lat/Lon&quot; format string.</span>
237
238<span class="sd">    Parameters</span>
239<span class="sd">    ----------</span>
240<span class="sd">    grid : str</span>
241<span class="sd">        Contains grid information</span>
242
243<span class="sd">    Return</span>
244<span class="sd">    ------</span>
245<span class="sd">    grid : str</span>
246<span class="sd">        Contains grid in format Lat/lon. E.g. 0.1/0.1</span>
247<span class="sd">    &#39;&#39;&#39;</span>
248
249    <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>
250        <span class="k">return</span> <span class="n">grid</span>
251    <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>
252        <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>
253        <span class="k">if</span> <span class="n">gridx</span> <span class="o">==</span> <span class="n">gridy</span><span class="p">:</span>
254            <span class="n">grid</span> <span class="o">=</span> <span class="n">gridx</span>
255        <span class="k">else</span><span class="p">:</span>
256            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;GRID parameter contains two &#39;</span>
257                             <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>
258    <span class="c1"># # determine grid format</span>
259    <span class="c1"># if float(grid) / 100. &gt;= 0.5:</span>
260    <span class="c1">#    # grid is defined in 1/1000 degrees; old format</span>
261    <span class="c1">#    grid = &#39;{}/{}&#39;.format(float(grid) / 1000.,</span>
262    <span class="c1">#                          float(grid) / 1000.)</span>
263    <span class="c1"># elif float(grid) / 100. &lt; 0.5:</span>
264    <span class="c1">#    # grid is defined in normal degree; new format</span>
265    <span class="c1">#    grid = &#39;{}/{}&#39;.format(float(grid), float(grid))</span>
266
267
268    <span class="c1"># determine grid format</span>
269    <span class="c1"># assumes that nobody wants grid spacings of 20 deg or more</span>
270    <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>
271        <span class="c1"># grid is defined in 1/1000 degree; old 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="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>
273    <span class="k">else</span><span class="p">:</span>
274        <span class="c1"># grid is defined in degree; new format</span>
275        <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>
276
277
278    <span class="k">return</span> <span class="n">grid</span></div>
279
280<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>
281    <span class="sd">&#39;&#39;&#39;Defines the correct area string.</span>
282
283<span class="sd">    Checks on the format of the four area components. Wether it is of</span>
284<span class="sd">    the order of 1000 or 1. Also checks wether area was already set by command</span>
285<span class="sd">    line, then the four components are overwritten.</span>
286<span class="sd">    Convert to correct format of the order of magnitude &quot;1&quot; and sets the</span>
287<span class="sd">    area parameter (North/West/South/East).</span>
288<span class="sd">    E.g.: -5./20./10./10.</span>
289
290<span class="sd">    Parameters</span>
291<span class="sd">    ----------</span>
292<span class="sd">    grid : str</span>
293<span class="sd">        Contains grid information.</span>
294
295<span class="sd">    area : str</span>
296<span class="sd">        Contains area informtion.</span>
297
298<span class="sd">    upper : str</span>
299<span class="sd">        The northern most latitude.</span>
300
301<span class="sd">    lower : str</span>
302<span class="sd">        The souther most latitude.</span>
303
304<span class="sd">    left : str</span>
305<span class="sd">        The western most longitude.</span>
306
307<span class="sd">    right : str</span>
308<span class="sd">        The eastern most longiude.</span>
309
310<span class="sd">    Return</span>
311<span class="sd">    ------</span>
312<span class="sd">    grid : str</span>
313<span class="sd">        Contains grid in format Lat/lon. E.g. 0.1/0.1</span>
314<span class="sd">    &#39;&#39;&#39;</span>
315    <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>
316        <span class="n">area</span> <span class="o">=</span> <span class="s1">&#39;G&#39;</span>
317        <span class="k">return</span> <span class="n">area</span>
318
319    <span class="c1"># if area was provided decompose area into its 4 components</span>
320    <span class="k">if</span> <span class="n">area</span><span class="p">:</span>
321        <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>
322        <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>
323
324    <span class="c1"># determine area format</span>
325    <span class="k">if</span> <span class="nb">all</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>
326            <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>
327            <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>
328            <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>
329        <span class="c1"># area is defined in 1/1000 degrees; old format</span>
330        <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>
331                                    <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>
332                                    <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>
333                                    <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>
334    <span class="k">elif</span> <span class="nb">all</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="p">,</span>
335              <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="p">,</span>
336              <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="p">,</span>
337              <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>
338        <span class="c1"># area is already in new format</span>
339        <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>
340                                    <span class="nb">float</span><span class="p">(</span><span class="n">left</span><span class="p">),</span>
341                                    <span class="nb">float</span><span class="p">(</span><span class="n">lower</span><span class="p">),</span>
342                                    <span class="nb">float</span><span class="p">(</span><span class="n">right</span><span class="p">))</span>
343    <span class="k">else</span><span class="p">:</span>
344        <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>
345                         <span class="s1">&#39;formats (upper, lower, left, right): &#39;</span>
346                         <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>
347                                              <span class="nb">str</span><span class="p">(</span><span class="n">left</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">right</span><span class="p">)))</span>
348
349    <span class="k">return</span> <span class="n">area</span></div>
350
351<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>
352    <span class="sd">&#39;&#39;&#39;Defines correct level list and guarantees that the maximum level is</span>
353<span class="sd">    one of the available maximum levels.</span>
354
355<span class="sd">    Parameters</span>
356<span class="sd">    ----------</span>
357<span class="sd">    levelist : str</span>
358<span class="sd">        Specifies the level list.</span>
359<span class="sd">        Examples: model level: 1/to/137, pressure levels: 500/to/1000</span>
360
361<span class="sd">    level : str</span>
362<span class="sd">        Specifies the maximum level.</span>
363
364<span class="sd">    Return</span>
365<span class="sd">    ------</span>
366<span class="sd">    levelist : str</span>
367<span class="sd">        Specifies the required levels. It has to have a valid</span>
368<span class="sd">        correspondence to the selected levtype.</span>
369<span class="sd">        Examples: model level: 1/to/137, pressure levels: 500/to/1000</span>
370
371<span class="sd">    level : str</span>
372<span class="sd">        Specifies the maximum level. It has to be one of the</span>
373<span class="sd">        available maximum level number as contained in the variable</span>
374<span class="sd">        MAX_LEVEL_LIST in &quot;_config&quot;. E.g. [16, 19, 31, 40, 50, 60, 62, 91, 137]</span>
375
376<span class="sd">    &#39;&#39;&#39;</span>
377    <span class="c1"># assure consistency of levelist and level</span>
378    <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>
379        <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>
380                         <span class="s1">&#39;specified in CONTROL file&#39;</span><span class="p">)</span>
381    <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>
382        <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>
383    <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> \
384         <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>
385        <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>
386    <span class="k">else</span><span class="p">:</span>
387        <span class="k">pass</span>
388
389    <span class="c1"># check if max level is a valid level</span>
390    <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>
391        <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>
392                         <span class="s1">&#39;LEVEL must be the maximum level of a specified &#39;</span>
393                         <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>
394                         <span class="s1">&#39;Check parameter &quot;LEVEL&quot; or the max level of &#39;</span>
395                         <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>
396
397    <span class="k">return</span> <span class="n">levelist</span><span class="p">,</span> <span class="n">level</span></div>
398
399
400<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>
401    <span class="sd">&#39;&#39;&#39;Sets the current PPID.</span>
402
403<span class="sd">    Parameters</span>
404<span class="sd">    ----------</span>
405<span class="sd">    c : ControlFile</span>
406<span class="sd">            Contains all the parameters of CONTROL file and</span>
407<span class="sd">            command line.</span>
408
409<span class="sd">    ppid : int or None</span>
410<span class="sd">        Contains the ppid number provided by the command line parameter</span>
411<span class="sd">        of is None otherwise.</span>
412
413<span class="sd">    Return</span>
414<span class="sd">    ------</span>
415
416<span class="sd">    &#39;&#39;&#39;</span>
417
418    <span class="k">if</span> <span class="ow">not</span> <span class="n">ppid</span><span class="p">:</span>
419        <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>
420    <span class="k">else</span><span class="p">:</span>
421        <span class="n">c</span><span class="o">.</span><span class="n">ppid</span> <span class="o">=</span> <span class="n">ppid</span>
422
423    <span class="k">return</span></div>
424
425
426<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>
427    <span class="sd">&#39;&#39;&#39;Check for a pure forecast mode.</span>
428
429<span class="sd">    Parameters</span>
430<span class="sd">    ----------</span>
431<span class="sd">    ftype : list of str</span>
432<span class="sd">        List of field types.</span>
433
434<span class="sd">    Return</span>
435<span class="sd">    ------</span>
436<span class="sd">    True or False:</span>
437<span class="sd">        True if pure forecasts are to be retrieved. False if there are</span>
438<span class="sd">        analysis fields in between.</span>
439<span class="sd">    &#39;&#39;&#39;</span>
440
441    <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>
442        <span class="c1"># pure forecast</span>
443        <span class="k">return</span> <span class="mi">1</span>
444
445    <span class="k">return</span> <span class="mi">0</span></div>
446
447
448<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>
449    <span class="sd">&#39;&#39;&#39;Checks on step format and convert into a list of steps.</span>
450
451<span class="sd">    If the steps were defined with &quot;to&quot; and &quot;by&quot; they are converted into</span>
452<span class="sd">    a list of steps. If the steps were set in a string, it is</span>
453<span class="sd">    converted into a list.</span>
454
455<span class="sd">    Parameters</span>
456<span class="sd">    ----------</span>
457<span class="sd">    step : list of str or str</span>
458<span class="sd">        Specifies the forecast time step from forecast base time.</span>
459<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
460
461<span class="sd">    Return</span>
462<span class="sd">    ------</span>
463<span class="sd">    step : list of str</span>
464<span class="sd">        List of forecast steps in format e.g. [001, 002, ...]</span>
465<span class="sd">    &#39;&#39;&#39;</span>
466    <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
467
468    <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>
469        <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>
470        <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>
471            <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>
472                              <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>
473                              <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>
474            <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>
475        <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>
476            <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>
477                     <span class="s1">&#39;if &quot;to&quot; is used in steps parameter, &#39;</span>
478                     <span class="s1">&#39;please use &quot;by&quot; as well&#39;</span><span class="p">)</span>
479        <span class="k">else</span><span class="p">:</span>
480            <span class="n">step</span> <span class="o">=</span> <span class="n">steps</span>
481
482    <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>
483        <span class="n">step</span> <span class="o">=</span> <span class="p">[</span><span class="n">step</span><span class="p">]</span>
484
485    <span class="k">return</span> <span class="n">step</span></div>
486
487<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>
488    <span class="sd">&#39;&#39;&#39;Check if type variable is of type list and if analysis field has</span>
489<span class="sd">    forecast step 0.</span>
490
491<span class="sd">    Parameters</span>
492<span class="sd">    ----------</span>
493<span class="sd">    ftype : list of str or str</span>
494<span class="sd">        List of field types.</span>
495
496<span class="sd">    steps : str</span>
497<span class="sd">        Specifies the forecast time step from forecast base time.</span>
498<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
499
500<span class="sd">    Return</span>
501<span class="sd">    ------</span>
502<span class="sd">    ftype : list of str</span>
503<span class="sd">        List of field types.</span>
504<span class="sd">    &#39;&#39;&#39;</span>
505    <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>
506        <span class="n">ftype</span> <span class="o">=</span> <span class="p">[</span><span class="n">ftype</span><span class="p">]</span>
507
508    <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>
509        <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>
510            <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>
511            <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>
512
513    <span class="k">return</span> <span class="n">ftype</span></div>
514
515<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>
516    <span class="sd">&#39;&#39;&#39;Check if time variable is of type list. Otherwise convert to list.</span>
517
518<span class="sd">    Parameters</span>
519<span class="sd">    ----------</span>
520<span class="sd">    ftime : list of str or str</span>
521<span class="sd">        The time in hours of the field.</span>
522
523<span class="sd">    Return</span>
524<span class="sd">    ------</span>
525<span class="sd">    ftime : list of str</span>
526<span class="sd">        The time in hours of the field.</span>
527<span class="sd">    &#39;&#39;&#39;</span>
528    <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>
529        <span class="n">ftime</span> <span class="o">=</span> <span class="p">[</span><span class="n">ftime</span><span class="p">]</span>
530
531    <span class="k">return</span> <span class="n">ftime</span></div>
532
533<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>
534    <span class="sd">&#39;&#39;&#39;Check if</span>
535
536<span class="sd">    Parameters</span>
537<span class="sd">    ----------</span>
538<span class="sd">    ftype : list of str</span>
539<span class="sd">        List of field types.</span>
540
541<span class="sd">    ftime : list of str or str</span>
542<span class="sd">        The time in hours of the field.</span>
543
544<span class="sd">    steps : str</span>
545<span class="sd">        Specifies the forecast time step from forecast base time.</span>
546<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
547
548<span class="sd">    maxstep : int</span>
549<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
550<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
551
552<span class="sd">    purefc : int</span>
553<span class="sd">        Switch for definition of pure forecast mode or not.</span>
554
555<span class="sd">    Return</span>
556<span class="sd">    ------</span>
557<span class="sd">    ftype : list of str</span>
558<span class="sd">        List of field types.</span>
559
560<span class="sd">    ftime : list of str</span>
561<span class="sd">        The time in hours of the field.</span>
562
563<span class="sd">    steps : str</span>
564<span class="sd">        Specifies the forecast time step from forecast base time.</span>
565<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
566<span class="sd">    &#39;&#39;&#39;</span>
567    <span class="k">if</span> <span class="ow">not</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>
568        <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>
569                         <span class="s1">&#39;are not the same! Please check the setting in the &#39;</span>
570                         <span class="s1">&#39;CONTROL file!&#39;</span><span class="p">)</span>
571
572    <span class="c1"># if pure forecast is selected and only one field type/time is set</span>
573    <span class="c1"># prepare a complete list of type/time/step combination upto maxstep</span>
574    <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>
575        <span class="n">nftype</span> <span class="o">=</span> <span class="p">[]</span>
576        <span class="n">nsteps</span> <span class="o">=</span> <span class="p">[]</span>
577        <span class="n">nftime</span> <span class="o">=</span> <span class="p">[]</span>
578        <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>
579            <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>
580            <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>
581            <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>
582        <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>
583
584    <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>
585
586<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>
587    <span class="sd">&#39;&#39;&#39;Check the string of mail addresses, seperate them and convert to a list.</span>
588
589<span class="sd">    Parameters</span>
590<span class="sd">    ----------</span>
591<span class="sd">    mail : list of str or str</span>
592<span class="sd">        Contains email addresses for notifications.</span>
593<span class="sd">        It might also contain just the ecmwf user name which will trigger</span>
594<span class="sd">        mailing to the associated email address for this user.</span>
595
596<span class="sd">    Return</span>
597<span class="sd">    ------</span>
598<span class="sd">    mail : list of str</span>
599<span class="sd">        Contains email addresses for notifications.</span>
600<span class="sd">        It might also contain just the ecmwf user name which will trigger</span>
601<span class="sd">        mailing to the associated email address for this user.</span>
602
603<span class="sd">    &#39;&#39;&#39;</span>
604    <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>
605        <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>
606            <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>
607        <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>
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>
609        <span class="k">else</span><span class="p">:</span>
610            <span class="n">mail</span> <span class="o">=</span> <span class="p">[</span><span class="n">mail</span><span class="p">]</span>
611
612    <span class="k">return</span> <span class="n">mail</span></div>
613
614<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>
615    <span class="sd">&#39;&#39;&#39;Check if the necessary ECMWF parameters are set if the queue is</span>
616<span class="sd">    one of the QUEUES_LIST (in _config).</span>
617
618<span class="sd">    Parameters</span>
619<span class="sd">    ----------</span>
620<span class="sd">    queue : str</span>
621<span class="sd">        Name of the queue if submitted to the ECMWF servers.</span>
622<span class="sd">        Used to check if ecuid, ecgid, gateway and destination</span>
623<span class="sd">        are set correctly and are not empty.</span>
624
625<span class="sd">    gateway : str</span>
626<span class="sd">        The address of the gateway server.</span>
627
628<span class="sd">    destination : str</span>
629<span class="sd">        The name of the destination of the gateway server for data</span>
630<span class="sd">        transfer through ectrans. E.g. name@genericSftp</span>
631
632<span class="sd">    ecuid : str</span>
633<span class="sd">        ECMWF user id.</span>
634
635<span class="sd">    ecgid : str</span>
636<span class="sd">        ECMWF group id.</span>
637
638<span class="sd">    Return</span>
639<span class="sd">    ------</span>
640
641<span class="sd">    &#39;&#39;&#39;</span>
642    <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> \
643            <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>
644             <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>
645        <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>
646                         <span class="s1">&#39;and ECGID were not set properly! </span><span class="se">\n</span><span class="s1"> &#39;</span>
647                         <span class="s1">&#39;Please check for existence of file &quot;ECMWF_ENV&quot; &#39;</span>
648                         <span class="s1">&#39;in the run directory!&#39;</span><span class="p">)</span>
649    <span class="k">return</span></div>
650
651<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>
652    <span class="sd">&#39;&#39;&#39;Check if output and flexpart pathes are set.</span>
653
654<span class="sd">    Parameters</span>
655<span class="sd">    ----------</span>
656<span class="sd">    idir : str</span>
657<span class="sd">        Path to the temporary directory for MARS retrieval data.</span>
658
659<span class="sd">    odir : str</span>
660<span class="sd">        Path to the final output directory where the FLEXPART input files</span>
661<span class="sd">        will be stored.</span>
662
663<span class="sd">    fpdir : str</span>
664<span class="sd">        Path to FLEXPART root directory.</span>
665
666<span class="sd">    fedir : str</span>
667<span class="sd">        Path to flex_extract root directory.</span>
668
669<span class="sd">    Return</span>
670<span class="sd">    ------</span>
671<span class="sd">    odir : str</span>
672<span class="sd">        Path to the final output directory where the FLEXPART input files</span>
673<span class="sd">        will be stored.</span>
674
675<span class="sd">    fpdir : str</span>
676<span class="sd">        Path to FLEXPART root directory.</span>
677
678<span class="sd">    &#39;&#39;&#39;</span>
679    <span class="k">if</span> <span class="ow">not</span> <span class="n">fpdir</span><span class="p">:</span>
680        <span class="n">fpdir</span> <span class="o">=</span> <span class="n">fedir</span>
681
682    <span class="k">if</span> <span class="ow">not</span> <span class="n">odir</span><span class="p">:</span>
683        <span class="n">odir</span> <span class="o">=</span> <span class="n">idir</span>
684
685    <span class="k">return</span> <span class="n">odir</span><span class="p">,</span> <span class="n">fpdir</span></div>
686
687<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>
688    <span class="sd">&#39;&#39;&#39;Checks if there is at least a start date for a one day retrieval.</span>
689
690<span class="sd">    Checks if end date lies after start date and end date is set.</span>
691
692<span class="sd">    Parameters</span>
693<span class="sd">    ----------</span>
694<span class="sd">    start : str</span>
695<span class="sd">        The start date of the retrieval job.</span>
696
697<span class="sd">    end : str</span>
698<span class="sd">        The end date of the retrieval job.</span>
699
700<span class="sd">    Return</span>
701<span class="sd">    ------</span>
702<span class="sd">    start : str</span>
703<span class="sd">        The start date of the retrieval job.</span>
704
705<span class="sd">    end : str</span>
706<span class="sd">        The end date of the retrieval job.</span>
707
708<span class="sd">    &#39;&#39;&#39;</span>
709    <span class="c1"># check for having at least a starting date</span>
710    <span class="c1"># otherwise program is not allowed to run</span>
711    <span class="k">if</span> <span class="ow">not</span> <span class="n">start</span><span class="p">:</span>
712        <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>
713                         <span class="s1">&#39;in CONTROL file.</span><span class="se">\n</span><span class="s1">&#39;</span>
714                         <span class="s1">&#39;Try &quot;</span><span class="si">{}</span><span class="s1"> -h&quot; to print usage information&#39;</span>
715                         <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>
716
717    <span class="c1"># retrieve just one day if end_date isn&#39;t set</span>
718    <span class="k">if</span> <span class="ow">not</span> <span class="n">end</span><span class="p">:</span>
719        <span class="n">end</span> <span class="o">=</span> <span class="n">start</span>
720
721    <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>
722    <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>
723    <span class="k">if</span> <span class="n">dstart</span> <span class="o">&gt;</span> <span class="n">dend</span><span class="p">:</span>
724        <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>
725                         <span class="s1">&#39;Please adapt the dates in CONTROL file or &#39;</span>
726                         <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>
727
728    <span class="k">return</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span></div>
729
730<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>
731    <span class="sd">&#39;&#39;&#39;Convert maxstep into integer if it is already given. Otherwise, select</span>
732<span class="sd">    maxstep by going through the steps list.</span>
733
734<span class="sd">    Parameters</span>
735<span class="sd">    ----------</span>
736<span class="sd">    maxstep : str</span>
737<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
738<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
739
740<span class="sd">    steps : str</span>
741<span class="sd">        Specifies the forecast time step from forecast base time.</span>
742<span class="sd">        Valid values are hours (HH) from forecast base time.</span>
743
744<span class="sd">    Return</span>
745<span class="sd">    ------</span>
746<span class="sd">    maxstep : int</span>
747<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
748<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
749
750<span class="sd">    &#39;&#39;&#39;</span>
751    <span class="c1"># if maxstep wasn&#39;t provided</span>
752    <span class="c1"># search for it in the &quot;step&quot; parameter</span>
753    <span class="k">if</span> <span class="ow">not</span> <span class="n">maxstep</span><span class="p">:</span>
754        <span class="n">maxstep</span> <span class="o">=</span> <span class="mi">0</span>
755        <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">steps</span><span class="p">:</span>
756            <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>
757                <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>
758    <span class="k">else</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">maxstep</span><span class="p">)</span>
760
761    <span class="k">return</span> <span class="n">maxstep</span></div>
762
763<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>
764    <span class="sd">&#39;&#39;&#39;Check if basetime is set and contains one of the two</span>
765<span class="sd">    possible values (0, 12).</span>
766
767<span class="sd">    Parameters</span>
768<span class="sd">    ----------</span>
769<span class="sd">    basetime : int or str or None</span>
770<span class="sd">        The time for a half day retrieval. The 12 hours upfront are to be</span>
771<span class="sd">        retrieved.</span>
772
773<span class="sd">    Return</span>
774<span class="sd">    ------</span>
775<span class="sd">    basetime : int or None</span>
776<span class="sd">        The time for a half day retrieval. The 12 hours upfront are to be</span>
777<span class="sd">        retrieved.</span>
778<span class="sd">    &#39;&#39;&#39;</span>
779    <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>
780        <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>
781        <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>
782            <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>
783                             <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>
784    <span class="k">return</span> <span class="n">basetime</span></div>
785
786<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>
787    <span class="sd">&#39;&#39;&#39;Check if there is an old mars request file and remove it.</span>
788
789<span class="sd">    Parameters</span>
790<span class="sd">    ----------</span>
791<span class="sd">    request : int</span>
792<span class="sd">        Selects the mode of retrieval.</span>
793<span class="sd">        0: Retrieves the data from ECMWF.</span>
794<span class="sd">        1: Prints the mars requests to an output file.</span>
795<span class="sd">        2: Retrieves the data and prints the mars request.</span>
796
797<span class="sd">    marsfile : str</span>
798<span class="sd">        Path to the mars request file.</span>
799
800<span class="sd">    Return</span>
801<span class="sd">    ------</span>
802
803<span class="sd">    &#39;&#39;&#39;</span>
804    <span class="k">if</span> <span class="n">request</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
805        <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>
806            <span class="n">silent_remove</span><span class="p">(</span><span class="n">marsfile</span><span class="p">)</span>
807    <span class="k">return</span></div>
808
809<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>
810    <span class="sd">&#39;&#39;&#39;Check wether the dataset parameter is set for a</span>
811<span class="sd">    public data set retrieval.</span>
812
813<span class="sd">    Parameters</span>
814<span class="sd">    ----------</span>
815<span class="sd">    public : int</span>
816<span class="sd">        Specifies if public data are to be retrieved or not.</span>
817
818<span class="sd">    dataset : str</span>
819<span class="sd">        Specific name which identifies the public dataset.</span>
820
821<span class="sd">    Return</span>
822<span class="sd">    ------</span>
823
824<span class="sd">    &#39;&#39;&#39;</span>
825    <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>
826        <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>
827                         <span class="s1">&#39;the &quot;dataset&quot;-parameter has to be set too!&#39;</span><span class="p">)</span>
828    <span class="k">return</span></div>
829
830<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>
831    <span class="sd">&#39;&#39;&#39;Guarantees that the accumulation field type is set.</span>
832
833<span class="sd">    If not set, it is derivated as in the old method (TYPE[1]).</span>
834
835<span class="sd">    Parameters</span>
836<span class="sd">    ----------</span>
837<span class="sd">    acctype : str</span>
838<span class="sd">        The field type for the accumulated forecast fields.</span>
839
840<span class="sd">    ftype : list of str</span>
841<span class="sd">        List of field types.</span>
842
843<span class="sd">    Return</span>
844<span class="sd">    ------</span>
845<span class="sd">    acctype : str</span>
846<span class="sd">        The field type for the accumulated forecast fields.</span>
847<span class="sd">    &#39;&#39;&#39;</span>
848    <span class="k">if</span> <span class="ow">not</span> <span class="n">acctype</span><span class="p">:</span>
849        <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>
850        <span class="k">try</span><span class="p">:</span>
851            <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>
852                <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>
853                <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>
854            <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>
855                <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>
856                <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>
857        <span class="k">except</span><span class="p">:</span>
858            <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>
859    <span class="k">else</span><span class="p">:</span>
860        <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>
861            <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>
862                             <span class="s1">&#39;of type &quot;analysis&quot;!&#39;</span><span class="p">)</span>
863    <span class="k">return</span> <span class="n">acctype</span></div>
864
865
866<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>
867    <span class="sd">&#39;&#39;&#39;Guarantees that the accumulation forecast times were set.</span>
868
869<span class="sd">    If it is not set, it tries to set the value for some of the</span>
870<span class="sd">    most commonly used data sets. Otherwise it raises an error.</span>
871
872<span class="sd">    Parameters</span>
873<span class="sd">    ----------</span>
874<span class="sd">    acctime : str</span>
875<span class="sd">        The starting time from the accumulated forecasts.</span>
876
877<span class="sd">    marsclass : str</span>
878<span class="sd">        ECMWF data classification identifier.</span>
879
880<span class="sd">    purefc : int</span>
881<span class="sd">        Switch for definition of pure forecast mode or not.</span>
882
883<span class="sd">    Return</span>
884<span class="sd">    ------</span>
885<span class="sd">    acctime : str</span>
886<span class="sd">        The starting time from the accumulated forecasts.</span>
887<span class="sd">    &#39;&#39;&#39;</span>
888
889    <span class="k">if</span> <span class="ow">not</span> <span class="n">acctime</span><span class="p">:</span>
890        <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>
891        <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>
892              <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>
893        <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>
894            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;06/18&#39;</span>
895        <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>
896            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;00/12&#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;EP&#39;</span><span class="p">:</span> <span class="c1"># CERA</span>
898            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;18&#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;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>
900            <span class="n">acctime</span> <span class="o">=</span> <span class="s1">&#39;00/12&#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="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="n">time</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
903        <span class="k">else</span><span class="p">:</span>
904            <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>
905                             <span class="s1">&#39;automatically be derived!&#39;</span><span class="p">)</span>
906    <span class="k">return</span> <span class="n">acctime</span></div>
907
908<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>
909    <span class="sd">&#39;&#39;&#39;Guarantees that the accumulation forecast step were set.</span>
910
911<span class="sd">    Parameters</span>
912<span class="sd">    ----------</span>
913<span class="sd">    accmaxstep : str</span>
914<span class="sd">        The maximum forecast step for the accumulated forecast fields.</span>
915
916<span class="sd">    marsclass : str</span>
917<span class="sd">        ECMWF data classification identifier.</span>
918
919<span class="sd">    purefc : int</span>
920<span class="sd">        Switch for definition of pure forecast mode or not.</span>
921
922<span class="sd">    maxstep : str</span>
923<span class="sd">        The maximum forecast time step in hours from the forecast base time.</span>
924<span class="sd">        This is the maximum step for non flux (accumulated) forecast data.</span>
925
926<span class="sd">    Return</span>
927<span class="sd">    ------</span>
928<span class="sd">    accmaxstep : str</span>
929<span class="sd">        The maximum forecast step for the accumulated forecast fields.</span>
930<span class="sd">    &#39;&#39;&#39;</span>
931    <span class="k">if</span> <span class="ow">not</span> <span class="n">accmaxstep</span><span class="p">:</span>
932        <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>
933        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... Value will be set depending on field type/time: &#39;</span>
934              <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>
935        <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>
936            <span class="c1"># Era 5, Era-Interim, On-demand operational</span>
937            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="s1">&#39;12&#39;</span>
938        <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>
939            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="s1">&#39;24&#39;</span>
940        <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>
941            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="n">maxstep</span>
942            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... For pure forecast mode, the accumulated forecast must &#39;</span>
943                  <span class="s1">&#39;have the same maxstep as the normal forecast fields!</span><span class="se">\n</span><span class="s1">&#39;</span>
944                  <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>
945        <span class="k">else</span><span class="p">:</span>
946            <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>
947                             <span class="s1">&#39;automatically be derived!&#39;</span><span class="p">)</span>
948    <span class="k">else</span><span class="p">:</span>
949        <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>
950            <span class="n">accmaxstep</span> <span class="o">=</span> <span class="n">maxstep</span>
951            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;... For pure forecast mode, the accumulated forecast must &#39;</span>
952                  <span class="s1">&#39;have the same maxstep as the normal forecast fields!</span><span class="se">\n</span><span class="s1">&#39;</span>
953                  <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>
954    <span class="k">return</span> <span class="n">accmaxstep</span></div>
955
956<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>
957    <span class="sd">&#39;&#39;&#39;Check that addpar has correct format of additional parameters in</span>
958<span class="sd">    a single string, so that it can be easily appended to the hard coded</span>
959<span class="sd">    parameters that are retrieved in any case.</span>
960
961<span class="sd">    Parameters</span>
962<span class="sd">    ----------</span>
963<span class="sd">    addpar : str or list of str</span>
964<span class="sd">        List of additional parameters to be retrieved.</span>
965
966<span class="sd">    Return</span>
967<span class="sd">    ------</span>
968<span class="sd">    addpar : str</span>
969<span class="sd">        List of additional parameters to be retrieved.</span>
970<span class="sd">    &#39;&#39;&#39;</span>
971
972    <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>
973        <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>
974            <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>
975            <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>
976        <span class="k">else</span><span class="p">:</span>
977            <span class="n">parlist</span> <span class="o">=</span> <span class="p">[</span><span class="n">addpar</span><span class="p">]</span>
978
979        <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>
980
981    <span class="k">return</span> <span class="n">addpar</span></div>
982
983
984<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>
985    <span class="sd">&#39;&#39;&#39;Checks that if job chunk is set, the number is positive and non zero.</span>
986
987<span class="sd">    Parameters</span>
988<span class="sd">    ----------</span>
989<span class="sd">    job_chunk : int</span>
990<span class="sd">        The number of days for a single job script.</span>
991
992<span class="sd">    Return</span>
993<span class="sd">    ------</span>
994<span class="sd">    job_chunk : int</span>
995<span class="sd">        The number of days for a single job script.</span>
996<span class="sd">    &#39;&#39;&#39;</span>
997    <span class="k">if</span> <span class="ow">not</span> <span class="n">job_chunk</span><span class="p">:</span>
998        <span class="k">return</span> <span class="n">job_chunk</span>
999    <span class="k">else</span><span class="p">:</span>
1000        <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>
1001
1002    <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>
1003        <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>
1004                         <span class="s1">&#39;It has to be a positive number!&#39;</span><span class="p">)</span>
1005    <span class="k">elif</span> <span class="n">job_chunk</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1006        <span class="n">job_chunk</span> <span class="o">=</span> <span class="kc">None</span>
1007    <span class="k">else</span><span class="p">:</span>
1008        <span class="k">pass</span>
1009
1010    <span class="k">return</span> <span class="n">job_chunk</span></div>
1011
1012
1013<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>
1014    <span class="sd">&#39;&#39;&#39;Check for correct string format of ensemble member numbers.</span>
1015
1016<span class="sd">    Parameters</span>
1017<span class="sd">    ----------</span>
1018<span class="sd">    number : str</span>
1019<span class="sd">        List of ensemble member forecast runs.</span>
1020
1021<span class="sd">    Return</span>
1022<span class="sd">    ------</span>
1023<span class="sd">    number : str</span>
1024<span class="sd">        String with list of ensemble member forecast runs. E.g. &#39;01/02/03/04&#39;</span>
1025<span class="sd">    &#39;&#39;&#39;</span>
1026
1027    <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>
1028        <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>
1029        <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>
1030            <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> \
1031                     <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> \
1032                     <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>
1033        <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>
1034            <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> \
1035                     <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>
1036        <span class="k">else</span><span class="p">:</span>
1037            <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>
1038            <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>
1039    <span class="k">elif</span> <span class="n">number</span><span class="o">.</span><span class="n">isdigit</span><span class="p">():</span>
1040        <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>
1041    <span class="k">else</span><span class="p">:</span>
1042        <span class="k">pass</span>
1043
1044    <span class="k">return</span> <span class="n">number</span></div>
1045</pre></div>
1046
1047           </div>
1048           
1049          </div>
1050          <footer>
1051 
1052
1053  <hr/>
1054
1055  <div role="contentinfo">
1056    <p>
1057        &copy; Copyright 2019, Anne Philipp and Leopold Haimberger
1058
1059    </p>
1060  </div>
1061  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>.
1062
1063</footer>
1064
1065        </div>
1066      </div>
1067
1068    </section>
1069
1070  </div>
1071 
1072
1073
1074  <script type="text/javascript">
1075      jQuery(function () {
1076          SphinxRtdTheme.Navigation.enable(true);
1077      });
1078  </script>
1079
1080 
1081 
1082   
1083   
1084
1085</body>
1086</html>
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG