From df2d1a1cace8a757a8eae6701b2686a101790e79 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Sun, 21 Jul 2013 16:01:13 -0400 Subject: [PATCH] Base translation test on p- instead of h-convergence --- test/test_kernels.py | 86 +++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/test/test_kernels.py b/test/test_kernels.py index bbe62e5d..e66650f7 100644 --- a/test/test_kernels.py +++ b/test/test_kernels.py @@ -276,13 +276,43 @@ def test_p2e2p(ctx_getter, knl, expn_class, order, with_source_derivative): assert eoc_rec_grad_x.order_estimate() > tgt_order_grad - grad_slack +class PConvergenceVerifier(object): + def __init__(self): + self.orders = [] + self.errors = [] + + def add_data_point(self, order, error): + self.orders.append(order) + self.errors.append(error) + + def __str__(self): + from pytools import Table + tbl = Table() + tbl.add_row(("p", "error")) + + for p, err in zip(self.orders, self.errors): + tbl.add_row((str(p), str(err))) + + return str(tbl) + + def __call__(self): + orders = np.array(self.orders, np.float64) + log_errors = np.log10(1e-20+np.abs(np.array(self.errors, np.float64))) + + constant_ish = log_errors/orders + + c_max = np.max(constant_ish) + c_min = np.min(constant_ish) + + assert c_max < c_min + 2, constant_ish + + @pytools.test.mark_test.opencl @pytest.mark.parametrize("knl", [ LaplaceKernel(2), HelmholtzKernel(2) ]) -@pytest.mark.parametrize("order", [2, 3, 4, 5]) -def test_translations(ctx_getter, knl, order): +def test_translations(ctx_getter, knl): logging.basicConfig(level=logging.INFO) ctx = ctx_getter() @@ -290,44 +320,43 @@ def test_translations(ctx_getter, knl, order): np.random.seed(17) - res = 2 + res = 200 nsources = 500 - dim = 2 - - knl = LaplaceKernel(dim) out_kernels = [knl] - #m_expn = VolumeTaylorMultipoleExpansion(knl, order=order) - l_expn = VolumeTaylorLocalExpansion(knl, order=order) - - from sumpy import P2E, E2P, P2P, E2E - p2l = P2E(ctx, l_expn, out_kernels) - l2l = E2E(ctx, l_expn, l_expn) - l2p = E2P(ctx, l_expn, out_kernels) - p2p = P2P(ctx, out_kernels, exclude_self=False) - from pytools.convergence import EOCRecorder - eoc_rec = EOCRecorder() - - h_values = [1/5, 1/7, 1/20] + extra_kwargs = {} + if isinstance(knl, HelmholtzKernel): + extra_kwargs["k"] = 0.05 center = np.array([2, 1], np.float64) sources = (0.7*(-0.5+np.random.rand(knl.dim, nsources).astype(np.float64)) + center[:, np.newaxis]) strengths = np.ones(nsources, dtype=np.float64) * (1/nsources) + pconv_verifier = PConvergenceVerifier() + from sumpy.visualization import FieldPlotter - for h in h_values: + for order in [2, 3, 4, 5]: + #m_expn = VolumeTaylorMultipoleExpansion(knl, order=order) + l_expn = VolumeTaylorLocalExpansion(knl, order=order) + + from sumpy import P2E, E2P, P2P, E2E + p2l = P2E(ctx, l_expn, out_kernels) + l2l = E2E(ctx, l_expn, l_expn) + l2p = E2P(ctx, l_expn, out_kernels) + p2p = P2P(ctx, out_kernels, exclude_self=False) + eval_center = np.array([5.5, 0.0]) + center l_centers = np.array( [ - eval_center+np.array([-2, 1], np.float64) * h, + eval_center+np.array([-0.2, 0.1], np.float64), eval_center ], dtype=np.float64).T.copy() - fp = FieldPlotter(eval_center, extent=h, npoints=res) + fp = FieldPlotter(eval_center, extent=0.3, npoints=res) targets = fp.points # {{{ apply P2L @@ -344,7 +373,7 @@ def test_translations(ctx_getter, knl, order): sources=sources, strengths=strengths, #flags="print_hl_wrapper", - out_host=True) + out_host=True, **extra_kwargs) # }}} @@ -361,7 +390,7 @@ def test_translations(ctx_getter, knl, order): src_box_lists=l2l_src_box_lists, centers=l_centers, #flags="print_hl_wrapper", - out_host=True) + out_host=True, **extra_kwargs) # }}} @@ -382,7 +411,7 @@ def test_translations(ctx_getter, knl, order): centers=l_centers, targets=targets, #flags="trace_assignment_values", - out_host=True, + out_host=True, **extra_kwargs ) # }}} @@ -392,17 +421,16 @@ def test_translations(ctx_getter, knl, order): evt, (pot_direct,) = p2p( queue, targets, sources, (strengths,), - out_host=True) + out_host=True, **extra_kwargs) err = la.norm((pot - pot_direct)/res**2) # }}} - eoc_rec.add_data_point(h, err) + pconv_verifier.add_data_point(order, err) - print eoc_rec - tgt_order = order + 1 - assert eoc_rec.order_estimate() > tgt_order - 0.5 + print pconv_verifier + pconv_verifier() # You can test individual routines by typing -- GitLab