From 97f4f4c5a73cb9dc0b6c44b3e3a1134051a3b74e Mon Sep 17 00:00:00 2001
From: Anne Philipp <anne.philipp@univie.ac.at>
Date: Fri, 30 Nov 2018 19:26:24 +0100
Subject: [PATCH] better check on grid and arae parameter formats

---
 source/python/classes/ControlFile.py | 56 ++++++++++--------
 source/python/mods/checks.py         | 88 ++++++++++++++++++++++++++++
 source/python/mods/tools.py          |  1 -
 3 files changed, 120 insertions(+), 25 deletions(-)
 create mode 100644 source/python/mods/checks.py

diff --git a/source/python/classes/ControlFile.py b/source/python/classes/ControlFile.py
index f8541d7..6f2db6b 100644
--- a/source/python/classes/ControlFile.py
+++ b/source/python/classes/ControlFile.py
@@ -60,6 +60,7 @@ import inspect
 sys.path.append('../')
 import _config
 from mods.tools import my_error, silent_remove
+from mods.checks import check_grid_area
 
 # ------------------------------------------------------------------------------
 # CLASS
@@ -474,32 +475,39 @@ class ControlFile(object):
             print('Use default value "12" for flux forecast!')
             self.accmaxstep='12'
 
-        # if area was provided (only from commandline)
-        # decompose area into its 4 components
-        if self.area:
-            components = self.area.split('/')
-            self.upper, self.left, self.lower, self.right = components
+
+        self.grid, self.area = check_grid_area(self.grid, self.area,
+                                               self.upper, self.lower,
+                                               self.left, self.right)
+
+
 
         # convert grid and area components to correct format and input
-        if 'N' in self.grid:  # Gaussian output grid
-            self.area = 'G'
-        else:
-            # check on grid format
-            if float(self.grid) / 100. >= 0.5:
-                # grid is defined in 1/1000 degrees; old method
-                self.grid = '{}/{}'.format(float(self.grid) / 1000.,
-                                           float(self.grid) / 1000.)
-                self.area = '{}/{}/{}/{}'.format(float(self.upper) / 1000.,
-                                                 float(self.left) / 1000.,
-                                                 float(self.lower) / 1000.,
-                                                 float(self.right) / 1000.)
-            elif float(self.grid) / 100. < 0.5:
-                # grid is defined in normal degree; new method
-                self.grid = '{}/{}'.format(float(self.grid), float(self.grid))
-                self.area = '{}/{}/{}/{}'.format(float(self.upper),
-                                                 float(self.left),
-                                                 float(self.lower),
-                                                 float(self.right))
+        #if 'N' in self.grid:  # Gaussian output grid
+        #    self.area = 'G'
+        # else:
+            # if '/' in self.grid:
+                # gridx, gridy = self.grid.split('/')
+                # if gridx == gridy:
+                    # self.grid = gridx
+
+
+            # # check on grid format
+            # if float(self.grid) / 100. >= 0.5:
+                # # grid is defined in 1/1000 degrees; old format
+                # self.grid = '{}/{}'.format(float(self.grid) / 1000.,
+                                           # float(self.grid) / 1000.)
+                # self.area = '{}/{}/{}/{}'.format(float(self.upper) / 1000.,
+                                                 # float(self.left) / 1000.,
+                                                 # float(self.lower) / 1000.,
+                                                 # float(self.right) / 1000.)
+            # elif float(self.grid) / 100. < 0.5:
+                # # grid is defined in normal degree; new format
+                # self.grid = '{}/{}'.format(float(self.grid), float(self.grid))
+                # self.area = '{}/{}/{}/{}'.format(float(self.upper),
+                                                 # float(self.left),
+                                                 # float(self.lower),
+                                                 # float(self.right))
 
         return
 
diff --git a/source/python/mods/checks.py b/source/python/mods/checks.py
new file mode 100644
index 0000000..0abe1e8
--- /dev/null
+++ b/source/python/mods/checks.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+##*******************************************************************************
+# @Author: Anne Philipp (University of Vienna)
+#
+# @Date: November 2018
+#
+# @Change History:
+#
+# @License:
+#    (C) Copyright 2014-2018.
+#
+#    This software is licensed under the terms of the Apache Licence Version 2.0
+#    which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+#
+# @Modul Description:
+#
+#
+# @Module Content:
+
+#
+#*******************************************************************************
+
+# ------------------------------------------------------------------------------
+# MODULES
+# ------------------------------------------------------------------------------
+
+
+# ------------------------------------------------------------------------------
+# FUNCTIONS
+# ------------------------------------------------------------------------------
+
+
+def check_grid_area(grid, area, upper, lower, left , right):
+    '''
+
+
+    '''
+    # if area was provided
+    # decompose area into its 4 components
+    if area:
+        components = area.split('/')
+        upper, left, lower, right = components
+
+    if 'N' in grid:  # Gaussian output grid
+        area = 'G'
+        return grid, area
+
+    if '/' in grid:
+        gridx, gridy = grid.split('/')
+        if gridx == gridy:
+            grid = gridx
+        else:
+            raise ValueError('GRID parameter contains two values '
+                             'which are unequal %s' (grid))
+    # determine grid format
+    if float(grid) / 100. >= 0.5:
+        # grid is defined in 1/1000 degrees; old format
+        grid = '{}/{}'.format(float(grid) / 1000.,
+                              float(grid) / 1000.)
+    elif float(grid) / 100. < 0.5:
+        # grid is defined in normal degree; new format
+        grid = '{}/{}'.format(float(grid), float(grid))
+
+    # determine area format
+    if (float(upper) / 1000. >= 0.05 and
+        float(lower) / 1000. >= 0.05 and
+        float(left) / 1000. >= 0.05 and
+        float(right) / 1000. >= 0.05):
+        # area is defined in 1/1000 degrees; old format
+        area = '{}/{}/{}/{}'.format(float(upper) / 1000.,
+                                    float(left) / 1000.,
+                                    float(lower) / 1000.,
+                                    float(right) / 1000.)
+    elif (float(upper) / 1000. < 0.05 and
+          float(lower) / 1000. < 0.05 and
+          float(left) / 1000. < 0.05 and
+          float(right) / 1000. < 0.05):
+        # area is already in new format
+        area = '{}/{}/{}/{}'.format(float(upper),
+                                    float(left),
+                                    float(lower),
+                                    float(right))
+    else:
+        raise ValueError('The area components have different '
+                         'formats: %s ' (area))
+
+    return grid, area
\ No newline at end of file
diff --git a/source/python/mods/tools.py b/source/python/mods/tools.py
index a64ddde..1aaff9f 100644
--- a/source/python/mods/tools.py
+++ b/source/python/mods/tools.py
@@ -99,7 +99,6 @@ def none_or_int(value):
         return None
     return int(value)
 
-
 def get_cmdline_arguments():
     '''Decomposes the command line arguments and assigns them to variables.
     Apply default values for non mentioned arguments.
-- 
GitLab