From 6f1004e80489db838e72e0417f8963c069e8940b Mon Sep 17 00:00:00 2001 From: Isuru Fernando <isuruf@gmail.com> Date: Wed, 17 Oct 2018 12:42:40 -0500 Subject: [PATCH] Fix calculating distances --- test/test_m2m.py | 198 +++++++++++++++++++++++------------------------ 1 file changed, 98 insertions(+), 100 deletions(-) diff --git a/test/test_m2m.py b/test/test_m2m.py index 44799bf2..1f657206 100644 --- a/test/test_m2m.py +++ b/test/test_m2m.py @@ -58,7 +58,7 @@ else: import matplotlib.pyplot as plt -def test_m2m(ctx_getter, order=5): +def test_m2m(ctx_getter, order): logging.basicConfig(level=logging.INFO) from sympy.core.cache import clear_cache @@ -77,12 +77,10 @@ def test_m2m(ctx_getter, order=5): extra_kwargs = {} if isinstance(knl, HelmholtzKernel): - extra_kwargs["k"] = 0.05 + extra_kwargs["k"] = 0.1 # Just to make sure things also work away from the origin origin = np.array([2, 1], np.float64) - sources = (0.7*(-0.5+np.random.rand(knl.dim, nsources).astype(np.float64)) - + origin[:, np.newaxis]) strengths = np.ones(nsources, dtype=np.float64) * (1/nsources) pconv_verifier_p2m2p = PConvergenceVerifier() @@ -149,106 +147,106 @@ def test_m2m(ctx_getter, order=5): mpole_expn_classes = [HelmholtzConformingVolumeTaylorMultipoleExpansion, VolumeTaylorMultipoleExpansion] local_expn_classes = [HelmholtzConformingVolumeTaylorLocalExpansion, VolumeTaylorLocalExpansion] - h_values = 1000*2.0**np.arange(-5, 3) - for order in [6]: - h_errs = [] - for h in h_values: - m2m_vals = [] - for i, (mpole_expn_class, local_expn_class) in enumerate(zip(mpole_expn_classes, local_expn_classes)): - m_expn = mpole_expn_class(knl, order=order) - l_expn = local_expn_class(knl, order=order) - - from sumpy import P2EFromSingleBox, E2PFromSingleBox, P2P, E2EFromCSR - p2m = P2EFromSingleBox(ctx, m_expn) - m2m = E2EFromCSR(ctx, m_expn, m_expn) - m2p = E2PFromSingleBox(ctx, m_expn, out_kernels) - p2p = P2P(ctx, out_kernels, exclude_self=False) - - fp = FieldPlotter(centers[:, -1], extent=h, npoints=res) - targets = fp.points - - m1_rscale = 0.5 - m2_rscale = 0.25 - - # {{{ apply P2M - - p2m_source_boxes = np.array([0], dtype=np.int32) - - # These are indexed by global box numbers. - p2m_box_source_starts = np.array([0, 0, 0, 0], dtype=np.int32) - p2m_box_source_counts_nonchild = np.array([nsources, 0, 0, 0], - dtype=np.int32) - - evt, (mpoles,) = p2m(queue, - source_boxes=p2m_source_boxes, - box_source_starts=p2m_box_source_starts, - box_source_counts_nonchild=p2m_box_source_counts_nonchild, - centers=centers, - sources=sources, - strengths=strengths, - nboxes=nboxes, - rscale=m1_rscale, - - tgt_base_ibox=0, - - #flags="print_hl_wrapper", - out_host=True, **extra_kwargs) - - # }}} - - ntargets = targets.shape[-1] - - # {{{ apply M2M - - m2m_target_boxes = np.array([1], dtype=np.int32) - m2m_src_box_starts = np.array([0, 1], dtype=np.int32) - m2m_src_box_lists = np.array([0], dtype=np.int32) - - evt, (mpoles,) = m2m(queue, - src_expansions=mpoles, - src_base_ibox=0, - tgt_base_ibox=0, - ntgt_level_boxes=mpoles.shape[0], - - target_boxes=m2m_target_boxes, - - src_box_starts=m2m_src_box_starts, - src_box_lists=m2m_src_box_lists, - centers=centers, - - src_rscale=m1_rscale, - tgt_rscale=m2_rscale, - - #flags="print_hl_cl", - out_host=True, **extra_kwargs) - - # }}} - - pot = eval_at(m2p, 1, m2_rscale) - - evt, (pot_direct,) = p2p( - queue, - targets, sources, (strengths,), - out_host=True, **extra_kwargs) - #if (i == 0): - # m2m_vals.append(pot_direct) - #else: - # m2m_vals.append(pot) - m2m_vals.append(pot) - - err = la.norm(m2m_vals[1] - m2m_vals[0])/la.norm(m2m_vals[0]) - print(err) - h_errs.append(abs(err)) - a, b = np.polyfit(np.log(h_values), np.log(h_errs), 1) - plt.loglog(h_values, h_errs, label="order={}".format(order), marker='x') - plt.loglog(h_values, h_values**a / h_values[-3]**a * h_errs[-3], label="h**%.2f" % a) - plt.loglog(h_values, h_values**(-order-1) / h_values[-3]**(-order-1) * h_errs[-3], label="h**-%.2f" % (order+1)) - plt.xlabel("h") + h_values = 2.0**np.arange(-3, 7) + distances = [] + errs = [] + for h in h_values: + sources = (h*(-0.5+np.random.rand(knl.dim, nsources).astype(np.float64)) + + origin[:, np.newaxis]) + distances.append(np.max(np.abs(sources - centers[:, 1].reshape(2, 1)))) + m2m_vals = [] + for i, (mpole_expn_class, local_expn_class) in enumerate(zip(mpole_expn_classes, local_expn_classes)): + m_expn = mpole_expn_class(knl, order=order) + l_expn = local_expn_class(knl, order=order) + + from sumpy import P2EFromSingleBox, E2PFromSingleBox, P2P, E2EFromCSR + p2m = P2EFromSingleBox(ctx, m_expn) + m2m = E2EFromCSR(ctx, m_expn, m_expn) + m2p = E2PFromSingleBox(ctx, m_expn, out_kernels) + p2p = P2P(ctx, out_kernels, exclude_self=False) + + fp = FieldPlotter(centers[:, -1], extent=0.1, npoints=res) + targets = fp.points + + m1_rscale = 0.5 + m2_rscale = 0.25 + + # {{{ apply P2M + + p2m_source_boxes = np.array([0], dtype=np.int32) + + # These are indexed by global box numbers. + p2m_box_source_starts = np.array([0, 0, 0, 0], dtype=np.int32) + p2m_box_source_counts_nonchild = np.array([nsources, 0, 0, 0], + dtype=np.int32) + + evt, (mpoles,) = p2m(queue, + source_boxes=p2m_source_boxes, + box_source_starts=p2m_box_source_starts, + box_source_counts_nonchild=p2m_box_source_counts_nonchild, + centers=centers, + sources=sources, + strengths=strengths, + nboxes=nboxes, + rscale=m1_rscale, + + tgt_base_ibox=0, + out_host=True, **extra_kwargs) + + # }}} + + ntargets = targets.shape[-1] + + # {{{ apply M2M + + m2m_target_boxes = np.array([1], dtype=np.int32) + m2m_src_box_starts = np.array([0, 1], dtype=np.int32) + m2m_src_box_lists = np.array([0], dtype=np.int32) + + evt, (mpoles,) = m2m(queue, + src_expansions=mpoles, + src_base_ibox=0, + tgt_base_ibox=0, + ntgt_level_boxes=mpoles.shape[0], + + target_boxes=m2m_target_boxes, + + src_box_starts=m2m_src_box_starts, + src_box_lists=m2m_src_box_lists, + centers=centers, + + src_rscale=m1_rscale, + tgt_rscale=m2_rscale, + + #flags="print_hl_cl", + out_host=True, **extra_kwargs) + + # }}} + + pot = eval_at(m2p, 1, m2_rscale) + + evt, (pot_direct,) = p2p( + queue, + targets, sources, (strengths,), + out_host=True, **extra_kwargs) + m2m_vals.append(pot) + + err = la.norm(m2m_vals[1] - m2m_vals[0])/la.norm(m2m_vals[1]) + print(err) + errs.append(abs(err)) + + p1 = 5 + distances = np.array(distances) + plt.loglog(distances, errs, label="order={}".format(order), marker='x') + plt.loglog(distances, distances**(order+1) / distances[p1]**(order+1) * errs[p1], label="h**%.2f" % (order+1)) + plt.loglog(distances, distances**(order) / distances[p1]**(order) * errs[p1], label="h**%.2f" % (order)) + + plt.xlabel("Distance between furthest source and center") plt.ylabel("Error between reduced and full") plt.legend() plt.show() if __name__ == "__main__": - test_m2m(cl.create_some_context) + test_m2m(cl.create_some_context, 8) # vim: fdm=marker -- GitLab