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