From 189d2ee0f9fc1153afa70e1d367a21cdfc8a5c1f Mon Sep 17 00:00:00 2001 From: Craig Warren Date: Tue, 12 Jan 2016 17:45:12 +0000 Subject: [PATCH] Made rounding function more generic. --- gprMax/input_cmds_singleuse.py | 5 +++-- gprMax/utilities.py | 33 +++++++++++++-------------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/gprMax/input_cmds_singleuse.py b/gprMax/input_cmds_singleuse.py index ecda5503..ab72eb73 100644 --- a/gprMax/input_cmds_singleuse.py +++ b/gprMax/input_cmds_singleuse.py @@ -17,13 +17,14 @@ # along with gprMax. If not, see . import os, sys +import decimal as d import numpy as np from psutil import virtual_memory from gprMax.constants import c, floattype from gprMax.exceptions import CmdInputError from gprMax.pml import PML, CFS -from gprMax.utilities import roundvalue, rounddownmax, human_size +from gprMax.utilities import roundvalue, human_size from gprMax.waveforms import Waveform @@ -146,7 +147,7 @@ def process_singlecmds(singlecmds, multicmds, G): G.dt = 1 / (c * np.sqrt((1 / G.dx) * (1 / G.dx) + (1 / G.dy) * (1 / G.dy) + (1 / G.dz) * (1 / G.dz))) # Round down time step to nearest float with precision one less than hardware maximum. Avoids inadvertently exceeding the CFL due to binary representation of floating point number. - G.dt = rounddownmax(G.dt) + G.dt = roundvalue(G.dt, decimalplaces=d.getcontext().prec - 1) if G.messages: print('Time step: {:.3e} secs'.format(G.dt)) diff --git a/gprMax/utilities.py b/gprMax/utilities.py index 56319856..c0031bd2 100644 --- a/gprMax/utilities.py +++ b/gprMax/utilities.py @@ -79,34 +79,27 @@ def update_progress(progress): sys.stdout.flush() -def roundvalue(value): - """Rounds to nearest integer (half values are rounded downwards). +def roundvalue(value, decimalplaces=0): + """Rounding function. Args: value (float): Number to round. + decimalplaces (int): Number of decimal places of float to represent rounded value. Returns: - Rounded value (int). + rounded (int/float): Rounded value. """ - return int(d.Decimal(value).quantize(d.Decimal('1'),rounding=d.ROUND_HALF_DOWN)) - - -def rounddownmax(value): - """Rounds down to nearest float with precision one less than hardware maximum. - - Args: - value (float): Number to round. - - Returns: - Rounded value (float). - """ + # Rounds to nearest integer (half values are rounded downwards) + if decimalplaces == 0: + rounded = int(d.Decimal(value).quantize(d.Decimal('1'),rounding=d.ROUND_HALF_DOWN)) - decimalplaces = d.getcontext().prec - decimalplaces -= 1 - precision = '1.{places}'.format(places='0' * decimalplaces) - - return float(d.Decimal(value).quantize(d.Decimal(precision),rounding=d.ROUND_FLOOR)) + # Rounds down to nearest float represented by number of decimal places + else: + precision = '1.{places}'.format(places='0' * decimalplaces) + rounded = float(d.Decimal(value).quantize(d.Decimal(precision),rounding=d.ROUND_FLOOR)) + + return rounded def human_size(size, a_kilobyte_is_1024_bytes=True):