From a5965dd87eccc1482248a99492862ab460849ee1 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Sat, 8 Jun 2013 22:55:21 -0400 Subject: [PATCH] Make easier way to get EOC, plus PEP8 pytools.convergence --- pytools/convergence.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/pytools/convergence.py b/pytools/convergence.py index ac382e7..6dd87b8 100644 --- a/pytools/convergence.py +++ b/pytools/convergence.py @@ -1,9 +1,8 @@ import numpy as np - - # {{{ eoc estimation -------------------------------------------------------------- + def estimate_order_of_convergence(abscissae, errors): """Assuming that abscissae and errors are connected by a law of the form @@ -14,14 +13,12 @@ def estimate_order_of_convergence(abscissae, errors): """ assert len(abscissae) == len(errors) if len(abscissae) <= 1: - raise RuntimeError, "Need more than one value to guess order of convergence." + raise RuntimeError("Need more than one value to guess order of convergence.") coefficients = np.polyfit(np.log10(abscissae), np.log10(errors), 1) return 10**coefficients[-1], coefficients[-2] - - class EOCRecorder(object): def __init__(self): self.history = [] @@ -29,9 +26,9 @@ class EOCRecorder(object): def add_data_point(self, abscissa, error): self.history.append((abscissa, error)) - def estimate_order_of_convergence(self, gliding_mean = None): - abscissae = np.array([a for a,e in self.history ]) - errors = np.array([e for a,e in self.history ]) + def estimate_order_of_convergence(self, gliding_mean=None): + abscissae = np.array([a for a, e in self.history]) + errors = np.array([e for a, e in self.history]) size = len(abscissae) if gliding_mean is None: @@ -40,10 +37,13 @@ class EOCRecorder(object): data_points = size - gliding_mean + 1 result = np.zeros((data_points, 2), float) for i in range(data_points): - result[i,0], result[i,1] = estimate_order_of_convergence( + result[i, 0], result[i, 1] = estimate_order_of_convergence( abscissae[i:i+gliding_mean], errors[i:i+gliding_mean]) return result + def order_estimate(self): + return self.estimate_order_of_convergence()[0, 1] + def pretty_print(self, abscissa_label="h", error_label="Error", gliding_mean=2): from pytools import Table @@ -55,20 +55,24 @@ class EOCRecorder(object): if i < gliding_mean-1: tbl.add_row((str(absc), str(err), "")) else: - tbl.add_row((str(absc), str(err), str(gm_eoc[i-gliding_mean+1,1]))) + tbl.add_row((str(absc), str(err), str(gm_eoc[i-gliding_mean+1, 1]))) if len(self.history) > 1: - return str(tbl) + "\n\nOverall EOC: %s" % self.estimate_order_of_convergence()[0,1] + return str(tbl) + "\n\nOverall EOC: %s" \ + % self.estimate_order_of_convergence()[0, 1] else: return str(tbl) + def __str__(self): + return self.pretty_print() + def write_gnuplot_file(self, filename): outfile = file(filename, "w") for absc, err in self.history: outfile.write("%f %f\n" % (absc, err)) result = self.estimate_order_of_convergence() - const = result[0,0] - order = result[0,1] + const = result[0, 0] + order = result[0, 1] outfile.write("\n") for absc, err in self.history: outfile.write("%f %f\n" % (absc, const * absc**(-order))) @@ -76,6 +80,4 @@ class EOCRecorder(object): # }}} - - # vim: foldmethod=marker -- GitLab