Made rounding function more generic.

这个提交包含在:
Craig Warren
2016-01-12 17:45:12 +00:00
父节点 a3d2e1894f
当前提交 189d2ee0f9
共有 2 个文件被更改,包括 16 次插入22 次删除

查看文件

@@ -17,13 +17,14 @@
# along with gprMax. If not, see <http://www.gnu.org/licenses/>.
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))

查看文件

@@ -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))
# 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))
# 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))
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).
"""
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))
return rounded
def human_size(size, a_kilobyte_is_1024_bytes=True):