From d0beef00b83767a286be5ee3481e1215b7ed955d Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 11:28:51 -0500 Subject: [PATCH 01/22] Switch QBX_CENTER_FINDER to relative distance --- pytential/qbx/target_assoc.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 06fe1472..92412691 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -272,7 +272,11 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( coord_vec_t center_coords; ${load_particle( "INDEX_FOR_CENTER_PARTICLE(center)", "center_coords")} - coord_t my_dist_to_center = distance(tgt_coords, center_coords); + + // Distance is weighted by disk radius, or, equivalently, by + // the expanded radius (constant times disk radius). + coord_t my_dist_to_center = distance(tgt_coords, center_coords) / ( + expansion_radii_by_center_with_tolerance[center]); if (my_dist_to_center <= expansion_radii_by_center_with_tolerance[center] @@ -561,7 +565,7 @@ class TargetAssociationWrangler(TreeWranglerBase): # # (1) Tag leaf boxes around centers with max distance to usable center. # (2) Area query from targets with those radii to find closest eligible - # center. + # center in terms of relative distance. box_to_search_dist, evt = self.code_container.space_invader_query()( self.queue, -- GitLab From 35c51a63f3f0232bf13451574209b97238f0a01c Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 11:53:21 -0500 Subject: [PATCH 02/22] Keep original output unchanged --- pytential/qbx/target_assoc.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 92412691..e4a36950 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -283,7 +283,8 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( && my_dist_to_center < min_dist_to_center[i]) { target_status[i] = MARKED_QBX_CENTER_FOUND; - min_dist_to_center[i] = my_dist_to_center; + min_dist_to_center[i] = my_dist_to_center * ( + expansion_radii_by_center_with_tolerance[center]); target_to_center[i] = center; } } -- GitLab From fc9434cfebf81fd42fa8648353f66981016dc3ef Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 11:54:11 -0500 Subject: [PATCH 03/22] Fix assoc condition --- pytential/qbx/target_assoc.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index e4a36950..0c07873d 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -278,8 +278,7 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( coord_t my_dist_to_center = distance(tgt_coords, center_coords) / ( expansion_radii_by_center_with_tolerance[center]); - if (my_dist_to_center - <= expansion_radii_by_center_with_tolerance[center] + if (my_dist_to_center <= 1 && my_dist_to_center < min_dist_to_center[i]) { target_status[i] = MARKED_QBX_CENTER_FOUND; -- GitLab From 827c504826da8807213f73d7968b83ac18e8f073 Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 15:28:49 -0500 Subject: [PATCH 04/22] Add an experimental script --- experiments/layerpot-coverage.py | 117 +++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 experiments/layerpot-coverage.py diff --git a/experiments/layerpot-coverage.py b/experiments/layerpot-coverage.py new file mode 100644 index 00000000..8f738a48 --- /dev/null +++ b/experiments/layerpot-coverage.py @@ -0,0 +1,117 @@ +from sumpy import set_caching_enabled +set_caching_enabled(False) + +import logging +logging.basicConfig(level='INFO') + +import pyopencl as cl + +from functools import partial +import numpy as np +from meshmode.mesh.generation import make_curve_mesh + +def get_ellipse_mesh(resolution, aspect_ratio, mesh_order): + from meshmode.mesh.generation import ellipse + curve_func = partial(ellipse, aspect_ratio) + return make_curve_mesh(curve_func, + np.linspace(0, 1, resolution+1), + mesh_order) + +def run_test(cl_ctx, queue): + + q_order = 5 + qbx_order = q_order + fmm_backend = "sumpy" + mesh = get_ellipse_mesh(10, 40, mesh_order=5) + a = 1 + b = 1 / 40 + + if 0: + from meshmode.mesh.visualization import draw_curve + import matplotlib.pyplot as plt + draw_curve(mesh) + plt.axes().set_aspect('equal') + plt.show() + + from pytential.qbx import QBXLayerPotentialSource + from meshmode.discretization import Discretization + from meshmode.discretization.poly_element import \ + InterpolatoryQuadratureSimplexGroupFactory + + pre_density_discr = Discretization( + cl_ctx, mesh, + InterpolatoryQuadratureSimplexGroupFactory(q_order)) + + refiner_extra_kwargs = { + "_expansion_disturbance_tolerance": 0.15, + # "_scaled_max_curvature_threshold": 1, + "maxiter": 10, + } + + qbx, _ = QBXLayerPotentialSource( + pre_density_discr, + fine_order=4 * q_order, + qbx_order=qbx_order, + fmm_backend=fmm_backend, + fmm_order=qbx_order + 5, + ).with_refinement(**refiner_extra_kwargs) + + if 1: + print("%d stage-1 elements after refinement" + % qbx.density_discr.mesh.nelements) + print("%d stage-2 elements after refinement" + % qbx.stage2_density_discr.mesh.nelements) + print("quad stage-2 elements have %d nodes" + % qbx.quad_stage2_density_discr.groups[0].nunit_nodes) + + def reference_solu(rvec): + # a harmonic function + x, y = rvec + return 2.1 * x * y + (x**2 - y**2) * 0.5 + x + + bvals = reference_solu(qbx.density_discr.nodes().with_queue(queue)) + + from pytential.symbolic.pde.scalar import DirichletOperator + from sumpy.kernel import LaplaceKernel + from pytential import sym, bind + op = DirichletOperator(LaplaceKernel(2), -1) + + bound_op = bind(qbx, op.operator(sym.var('sigma'))) + rhs = bind(qbx.density_discr, op.prepare_rhs(sym.var("bc")))(queue, bc=bvals) + + from pytential.solve import gmres + gmres_result = gmres( + bound_op.scipy_op(queue, "sigma", dtype=np.float64), + rhs, + tol=1e-12, + progress=True, + hard_failure=True, + stall_iterations=50, no_progress_factor=1.05) + + + from sumpy.visualization import FieldPlotter + from pytential.target import PointsTarget + pltsize = b * 1.5 + fplot = FieldPlotter(np.array([-1 + pltsize * 0.5, 0]), extent=pltsize * 1.05, npoints=500) + plt_targets = cl.array.to_device(queue, fplot.points) + + exact_vals = reference_solu(fplot.points) + out_errs = [] + + for assotol in [0.05, 0.1, 0.15, 0.2]: + + qbx_stick_out = qbx.copy(target_association_tolerance=0.05) + + vol_solution = bind((qbx_stick_out, PointsTarget(plt_targets)), + op.representation(sym.var('sigma')))( + queue, sigma=gmres_result.solution).get() + out_errs.append(("error-%f" % assotol, np.abs(vol_solution - exact_vals))) + + fplot.write_vtk_file("results.vts", out_errs) + + +if __name__ == '__main__': + cl_ctx = cl.create_some_context() + queue = cl.CommandQueue(cl_ctx) + run_test(cl_ctx, queue) + -- GitLab From 32311aa34e62bba26cc98f8e1a141e7b2d836a06 Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 15:55:23 -0500 Subject: [PATCH 05/22] Compute errors --- experiments/layerpot-coverage.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/experiments/layerpot-coverage.py b/experiments/layerpot-coverage.py index 8f738a48..62999a30 100644 --- a/experiments/layerpot-coverage.py +++ b/experiments/layerpot-coverage.py @@ -2,7 +2,8 @@ from sumpy import set_caching_enabled set_caching_enabled(False) import logging -logging.basicConfig(level='INFO') +if 0: + logging.basicConfig(level='INFO') import pyopencl as cl @@ -95,6 +96,8 @@ def run_test(cl_ctx, queue): fplot = FieldPlotter(np.array([-1 + pltsize * 0.5, 0]), extent=pltsize * 1.05, npoints=500) plt_targets = cl.array.to_device(queue, fplot.points) + interior_pts = (fplot.points[0]**2 / a**2 + fplot.points[1]**2 / b**2) < 1 + exact_vals = reference_solu(fplot.points) out_errs = [] @@ -105,9 +108,30 @@ def run_test(cl_ctx, queue): vol_solution = bind((qbx_stick_out, PointsTarget(plt_targets)), op.representation(sym.var('sigma')))( queue, sigma=gmres_result.solution).get() + + + interior_error_linf = ( + np.linalg.norm( + np.abs(vol_solution - exact_vals)[interior_pts], ord=np.inf) + / + np.linalg.norm(exact_vals[interior_pts], ord=np.inf) + ) + + interior_error_l2 = ( + np.linalg.norm( + np.abs(vol_solution - exact_vals)[interior_pts], ord=2) + / + np.linalg.norm(exact_vals[interior_pts], ord=2) + ) + + print("\nassotol = %f" % assotol) + print("L_inf Error = %e " % interior_error_linf) + print("L_2 Error = %e " % interior_error_l2) + out_errs.append(("error-%f" % assotol, np.abs(vol_solution - exact_vals))) - fplot.write_vtk_file("results.vts", out_errs) + if 0: + fplot.write_vtk_file("results.vts", out_errs) if __name__ == '__main__': -- GitLab From 3dbcd92dc4bbce0727824b80e87bde5d347231a2 Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 16:16:48 -0500 Subject: [PATCH 06/22] Check errors --- experiments/layerpot-coverage.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/experiments/layerpot-coverage.py b/experiments/layerpot-coverage.py index 62999a30..6b759624 100644 --- a/experiments/layerpot-coverage.py +++ b/experiments/layerpot-coverage.py @@ -23,7 +23,7 @@ def run_test(cl_ctx, queue): q_order = 5 qbx_order = q_order fmm_backend = "sumpy" - mesh = get_ellipse_mesh(10, 40, mesh_order=5) + mesh = get_ellipse_mesh(20, 40, mesh_order=5) a = 1 b = 1 / 40 @@ -44,8 +44,8 @@ def run_test(cl_ctx, queue): InterpolatoryQuadratureSimplexGroupFactory(q_order)) refiner_extra_kwargs = { - "_expansion_disturbance_tolerance": 0.15, - # "_scaled_max_curvature_threshold": 1, + # "_expansion_disturbance_tolerance": 0.05, + "_scaled_max_curvature_threshold": 1, "maxiter": 10, } @@ -77,7 +77,9 @@ def run_test(cl_ctx, queue): from pytential import sym, bind op = DirichletOperator(LaplaceKernel(2), -1) - bound_op = bind(qbx, op.operator(sym.var('sigma'))) + bound_op = bind( + qbx.copy(target_association_tolerance=0.5), + op.operator(sym.var('sigma'))) rhs = bind(qbx.density_discr, op.prepare_rhs(sym.var("bc")))(queue, bc=bvals) from pytential.solve import gmres @@ -96,12 +98,12 @@ def run_test(cl_ctx, queue): fplot = FieldPlotter(np.array([-1 + pltsize * 0.5, 0]), extent=pltsize * 1.05, npoints=500) plt_targets = cl.array.to_device(queue, fplot.points) - interior_pts = (fplot.points[0]**2 / a**2 + fplot.points[1]**2 / b**2) < 1 + interior_pts = (fplot.points[0]**2 / a**2 + fplot.points[1]**2 / b**2) < 0.99 exact_vals = reference_solu(fplot.points) out_errs = [] - for assotol in [0.05, 0.1, 0.15, 0.2]: + for assotol in [0.05]: qbx_stick_out = qbx.copy(target_association_tolerance=0.05) @@ -130,7 +132,7 @@ def run_test(cl_ctx, queue): out_errs.append(("error-%f" % assotol, np.abs(vol_solution - exact_vals))) - if 0: + if 1: fplot.write_vtk_file("results.vts", out_errs) -- GitLab From 465d804b8b2219dd8c1f0e172001ea0767ad755a Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 18:39:44 -0500 Subject: [PATCH 07/22] Fix side determination --- pytential/qbx/target_assoc.py | 96 ++++++++++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 13 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 0c07873d..78213b54 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -235,6 +235,14 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( int *target_to_center, coord_t *min_dist_to_center, + int *target_to_center_plus, + int *target_to_center_minus, + + coord_t *min_dist_to_center_plus, + coord_t *min_dist_to_center_minus, + coord_t *min_rel_dist_to_center_plus, + coord_t *min_rel_dist_to_center_minus, + /* input, dim-dependent size */ %for ax in AXIS_NAMES[:dimensions]: coord_t *particles_${ax}, @@ -273,20 +281,66 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( ${load_particle( "INDEX_FOR_CENTER_PARTICLE(center)", "center_coords")} - // Distance is weighted by disk radius, or, equivalently, by - // the expanded radius (constant times disk radius). - coord_t my_dist_to_center = distance(tgt_coords, center_coords) / ( + coord_t my_dist_to_center = distance(tgt_coords, center_coords); + + // Relative distance is weighted by disk radius, or, + // equivalently, by the expanded radius (constant times disk radius). + coord_t my_rel_dist_to_center = my_dist_to_center / ( expansion_radii_by_center_with_tolerance[center]); - if (my_dist_to_center <= 1 - && my_dist_to_center < min_dist_to_center[i]) + // 1. Find the side with minimal Euclidean distance + // 2. Find the center with minimal relative distance on this side + // + // Refer to: + // - https://gitlab.tiker.net/inducer/pytential/issues/132 + // - https://gitlab.tiker.net/inducer/pytential/merge_requests/181 + if (center_side > 0) { - target_status[i] = MARKED_QBX_CENTER_FOUND; - min_dist_to_center[i] = my_dist_to_center * ( - expansion_radii_by_center_with_tolerance[center]); - target_to_center[i] = center; + if (my_rel_dist_to_center <= 1) + { + if (my_rel_dist_to_center < min_rel_dist_to_center_plus[i]) + { + target_status[i] = MARKED_QBX_CENTER_FOUND; + min_rel_dist_to_center_plus[i] = my_rel_dist_to_center; + target_to_center_plus[i] = center; + } + if (my_dist_to_center < min_dist_to_center_plus[i]) + { + min_dist_to_center_plus[i] = my_dist_to_center; + } + } + } + else + { + if (my_rel_dist_to_center <= 1) + { + if (my_rel_dist_to_center < min_rel_dist_to_center_minus[i]) + { + target_status[i] = MARKED_QBX_CENTER_FOUND; + min_rel_dist_to_center_minus[i] = my_rel_dist_to_center; + target_to_center_minus[i] = center; + } + if (my_dist_to_center < min_dist_to_center_minus[i]) + { + min_dist_to_center_minus[i] = my_dist_to_center; + } + } } } + + // If found at lease one center, pick the closer side. + if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i] + && min_dist_to_center_plus[i] != INFINITY) + { + target_to_center[i] = target_to_center_plus[i]; + min_dist_to_center[i] = min_dist_to_center_plus[i]; + } + else if (min_dist_to_center_minus[i] < min_dist_to_center_plus[i] + && min_dist_to_center_minus[i] != INFINITY) + { + target_to_center[i] = target_to_center_minus[i]; + min_dist_to_center[i] = min_dist_to_center_minus[i]; + } } """, name="find_centers", @@ -576,11 +630,21 @@ class TargetAssociationWrangler(TreeWranglerBase): wait_for=wait_for) wait_for = [evt] - min_dist_to_center = cl.array.empty( - self.queue, tree.nqbxtargets, tree.coord_dtype) - min_dist_to_center.fill(np.inf) + def make_target_field(fill_val, dtype=tree.coord_dtype): + arr = cl.array.empty( + self.queue, tree.nqbxtargets, dtype) + arr.fill(fill_val) + wait_for.extend(arr.events) + return arr + + target_to_center_plus = make_target_field(-1, np.int32) + target_to_center_minus = make_target_field(-1, np.int32) - wait_for.extend(min_dist_to_center.events) + min_dist_to_center = make_target_field(np.inf) + min_dist_to_center_plus = make_target_field(np.inf) + min_dist_to_center_minus = make_target_field(np.inf) + min_rel_dist_to_center_plus = make_target_field(np.inf) + min_rel_dist_to_center_minus = make_target_field(np.inf) evt = knl( *unwrap_args( @@ -596,6 +660,12 @@ class TargetAssociationWrangler(TreeWranglerBase): target_status, target_assoc.target_to_center, min_dist_to_center, + target_to_center_plus, + target_to_center_minus, + min_dist_to_center_plus, + min_dist_to_center_minus, + min_rel_dist_to_center_plus, + min_rel_dist_to_center_minus, *tree.sources), range=slice(tree.nqbxtargets), queue=self.queue, -- GitLab From 0d5a3b2623429d7f087ee770583441c4d694a2d5 Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 19:59:41 -0500 Subject: [PATCH 08/22] Remarks on target assoc policy --- pytential/qbx/target_assoc.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 78213b54..0df7d05e 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -288,6 +288,10 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( coord_t my_rel_dist_to_center = my_dist_to_center / ( expansion_radii_by_center_with_tolerance[center]); + // The idea is to use absolute distance to determine the side of + // targets, and use relative distance to determine which disk to + // bind to. Specifically, the following code does two things: + // // 1. Find the side with minimal Euclidean distance // 2. Find the center with minimal relative distance on this side // @@ -328,7 +332,7 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( } } - // If found at lease one center, pick the closer side. + // If found at least one center, pick the closer side. if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i] && min_dist_to_center_plus[i] != INFINITY) { -- GitLab From f7cd9988160f4d8ae09de6f057378c5236571595 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wei Date: Thu, 19 Sep 2019 06:33:58 +0200 Subject: [PATCH 09/22] Apply suggestion to pytential/qbx/target_assoc.py --- pytential/qbx/target_assoc.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 0df7d05e..e2d03622 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -288,6 +288,10 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( coord_t my_rel_dist_to_center = my_dist_to_center / ( expansion_radii_by_center_with_tolerance[center]); + if (my_rel_dist_to_center > 1) { + continue; + } + // The idea is to use absolute distance to determine the side of // targets, and use relative distance to determine which disk to // bind to. Specifically, the following code does two things: -- GitLab From cc99075e87f092bf71783e144b0f0454e5966895 Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 23:34:26 -0500 Subject: [PATCH 10/22] Break ties --- pytential/qbx/target_assoc.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 0df7d05e..41d90972 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -333,18 +333,22 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( } // If found at least one center, pick the closer side. - if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i] - && min_dist_to_center_plus[i] != INFINITY) + if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i]) { target_to_center[i] = target_to_center_plus[i]; min_dist_to_center[i] = min_dist_to_center_plus[i]; } - else if (min_dist_to_center_minus[i] < min_dist_to_center_plus[i] - && min_dist_to_center_minus[i] != INFINITY) + else if (min_dist_to_center_minus[i] < min_dist_to_center_plus[i]) { target_to_center[i] = target_to_center_minus[i]; min_dist_to_center[i] = min_dist_to_center_minus[i]; } + else if (min_dist_to_center_minus[i] != INFINITY) + { + // the two distances are equal, and a center was picked + target_to_center[i] = target_to_center_plus[i]; + min_dist_to_center[i] = min_dist_to_center_plus[i]; + } } """, name="find_centers", -- GitLab From 21cd35fe892bb2a8b39d5f42dabab5c6af81d107 Mon Sep 17 00:00:00 2001 From: xywei Date: Wed, 18 Sep 2019 23:36:24 -0500 Subject: [PATCH 11/22] Simplify conditionals --- pytential/qbx/target_assoc.py | 41 +++++++++++++++-------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index e64c5f72..b1f30ac5 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -288,7 +288,8 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( coord_t my_rel_dist_to_center = my_dist_to_center / ( expansion_radii_by_center_with_tolerance[center]); - if (my_rel_dist_to_center > 1) { + if (my_rel_dist_to_center > 1) + { continue; } @@ -304,34 +305,28 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( // - https://gitlab.tiker.net/inducer/pytential/merge_requests/181 if (center_side > 0) { - if (my_rel_dist_to_center <= 1) + if (my_rel_dist_to_center < min_rel_dist_to_center_plus[i]) + { + target_status[i] = MARKED_QBX_CENTER_FOUND; + min_rel_dist_to_center_plus[i] = my_rel_dist_to_center; + target_to_center_plus[i] = center; + } + if (my_dist_to_center < min_dist_to_center_plus[i]) { - if (my_rel_dist_to_center < min_rel_dist_to_center_plus[i]) - { - target_status[i] = MARKED_QBX_CENTER_FOUND; - min_rel_dist_to_center_plus[i] = my_rel_dist_to_center; - target_to_center_plus[i] = center; - } - if (my_dist_to_center < min_dist_to_center_plus[i]) - { - min_dist_to_center_plus[i] = my_dist_to_center; - } + min_dist_to_center_plus[i] = my_dist_to_center; } } else { - if (my_rel_dist_to_center <= 1) + if (my_rel_dist_to_center < min_rel_dist_to_center_minus[i]) + { + target_status[i] = MARKED_QBX_CENTER_FOUND; + min_rel_dist_to_center_minus[i] = my_rel_dist_to_center; + target_to_center_minus[i] = center; + } + if (my_dist_to_center < min_dist_to_center_minus[i]) { - if (my_rel_dist_to_center < min_rel_dist_to_center_minus[i]) - { - target_status[i] = MARKED_QBX_CENTER_FOUND; - min_rel_dist_to_center_minus[i] = my_rel_dist_to_center; - target_to_center_minus[i] = center; - } - if (my_dist_to_center < min_dist_to_center_minus[i]) - { - min_dist_to_center_minus[i] = my_dist_to_center; - } + min_dist_to_center_minus[i] = my_dist_to_center; } } } -- GitLab From 1fd37d27e4cddd94b898047bfd59bd404a365d10 Mon Sep 17 00:00:00 2001 From: xywei Date: Thu, 19 Sep 2019 07:48:35 -0500 Subject: [PATCH 12/22] Pick sides last --- pytential/qbx/target_assoc.py | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index b1f30ac5..a0b01e66 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -238,8 +238,6 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( int *target_to_center_plus, int *target_to_center_minus, - coord_t *min_dist_to_center_plus, - coord_t *min_dist_to_center_minus, coord_t *min_rel_dist_to_center_plus, coord_t *min_rel_dist_to_center_minus, @@ -311,10 +309,6 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( min_rel_dist_to_center_plus[i] = my_rel_dist_to_center; target_to_center_plus[i] = center; } - if (my_dist_to_center < min_dist_to_center_plus[i]) - { - min_dist_to_center_plus[i] = my_dist_to_center; - } } else { @@ -324,29 +318,33 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( min_rel_dist_to_center_minus[i] = my_rel_dist_to_center; target_to_center_minus[i] = center; } - if (my_dist_to_center < min_dist_to_center_minus[i]) - { - min_dist_to_center_minus[i] = my_dist_to_center; - } } } + coord_t winner_dist_to_center_plus = min_rel_dist_to_center_plus[i] + * expansion_radii_by_center_with_tolerance[ + target_to_center_plus[i]]; + + coord_t winner_dist_to_center_minus = min_rel_dist_to_center_minus[i] + * expansion_radii_by_center_with_tolerance[ + target_to_center_minus[i]]; + // If found at least one center, pick the closer side. - if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i]) + if (winner_dist_to_center_plus < winner_dist_to_center_minus) { target_to_center[i] = target_to_center_plus[i]; - min_dist_to_center[i] = min_dist_to_center_plus[i]; + min_dist_to_center[i] = winner_dist_to_center_plus; } - else if (min_dist_to_center_minus[i] < min_dist_to_center_plus[i]) + else if (winner_dist_to_center_minus < winner_dist_to_center_plus) { target_to_center[i] = target_to_center_minus[i]; - min_dist_to_center[i] = min_dist_to_center_minus[i]; + min_dist_to_center[i] = winner_dist_to_center_minus; } - else if (min_dist_to_center_minus[i] != INFINITY) + else if (min_rel_dist_to_center_minus[i] != INFINITY) { // the two distances are equal, and a center was picked target_to_center[i] = target_to_center_plus[i]; - min_dist_to_center[i] = min_dist_to_center_plus[i]; + min_dist_to_center[i] = winner_dist_to_center_plus; } } """, @@ -648,8 +646,6 @@ class TargetAssociationWrangler(TreeWranglerBase): target_to_center_minus = make_target_field(-1, np.int32) min_dist_to_center = make_target_field(np.inf) - min_dist_to_center_plus = make_target_field(np.inf) - min_dist_to_center_minus = make_target_field(np.inf) min_rel_dist_to_center_plus = make_target_field(np.inf) min_rel_dist_to_center_minus = make_target_field(np.inf) @@ -669,8 +665,6 @@ class TargetAssociationWrangler(TreeWranglerBase): min_dist_to_center, target_to_center_plus, target_to_center_minus, - min_dist_to_center_plus, - min_dist_to_center_minus, min_rel_dist_to_center_plus, min_rel_dist_to_center_minus, *tree.sources), -- GitLab From f6dbe700db9dc6962969f59c74698a03b5d3efe5 Mon Sep 17 00:00:00 2001 From: xywei Date: Thu, 19 Sep 2019 07:59:59 -0500 Subject: [PATCH 13/22] Update comments --- pytential/qbx/target_assoc.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index a0b01e66..a87ca8d4 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -291,12 +291,15 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( continue; } - // The idea is to use absolute distance to determine the side of - // targets, and use relative distance to determine which disk to - // bind to. Specifically, the following code does two things: + // The idea is to use relative distance to determine the closes + // disk center on each side, and then pick the one with smaller + // absolute distance. // - // 1. Find the side with minimal Euclidean distance - // 2. Find the center with minimal relative distance on this side + // Specifically, the following code does two things: + // + // 1. Find the center with minimal relative distance on either side + // 2. Find the side with minimal Euclidean distance from one of the + // choosen centers in step 1. // // Refer to: // - https://gitlab.tiker.net/inducer/pytential/issues/132 -- GitLab From 86f0fedd37224ebab810bc4bfb7a959509cb21b8 Mon Sep 17 00:00:00 2001 From: xywei Date: Thu, 19 Sep 2019 10:25:43 -0500 Subject: [PATCH 14/22] Fix illegal memory access --- pytential/qbx/target_assoc.py | 38 ++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index a87ca8d4..b553f7be 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -301,6 +301,10 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( // 2. Find the side with minimal Euclidean distance from one of the // choosen centers in step 1. // + // As such, min_dist_to_center is not the minimum over all centers, + // but the minimum over all winning centers under the relative + // distance measure. + // // Refer to: // - https://gitlab.tiker.net/inducer/pytential/issues/132 // - https://gitlab.tiker.net/inducer/pytential/merge_requests/181 @@ -324,26 +328,40 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( } } - coord_t winner_dist_to_center_plus = min_rel_dist_to_center_plus[i] - * expansion_radii_by_center_with_tolerance[ - target_to_center_plus[i]]; + coord_t winner_dist_to_center_plus = INFINITY; + coord_t winner_dist_to_center_minus = INFINITY; + + if (target_to_center_plus >= 0) + { + winner_dist_to_center_plus = min_rel_dist_to_center_plus[i] + * expansion_radii_by_center_with_tolerance[ + target_to_center_plus[i]]; + } - coord_t winner_dist_to_center_minus = min_rel_dist_to_center_minus[i] - * expansion_radii_by_center_with_tolerance[ - target_to_center_minus[i]]; + if (target_to_center_minus >= 0) + { + coord_t winner_dist_to_center_minus = min_rel_dist_to_center_minus[i] + * expansion_radii_by_center_with_tolerance[ + target_to_center_minus[i]]; + } - // If found at least one center, pick the closer side. - if (winner_dist_to_center_plus < winner_dist_to_center_minus) + // If found at least one center, pick the closer side, + // and bind to the chosen center if it is closer than the + // currently found one (if MARKED_QBX_CENTER_FOUND before + // searching) + if (winner_dist_to_center_plus < winner_dist_to_center_minus + && winner_dist_to_center_plus < min_dist_to_center[i]) { target_to_center[i] = target_to_center_plus[i]; min_dist_to_center[i] = winner_dist_to_center_plus; } - else if (winner_dist_to_center_minus < winner_dist_to_center_plus) + else if (winner_dist_to_center_minus < winner_dist_to_center_plus + && winner_dist_to_center_minus < min_dist_to_center[i]) { target_to_center[i] = target_to_center_minus[i]; min_dist_to_center[i] = winner_dist_to_center_minus; } - else if (min_rel_dist_to_center_minus[i] != INFINITY) + else if (winner_dist_to_center_plus < min_dist_to_center[i]) { // the two distances are equal, and a center was picked target_to_center[i] = target_to_center_plus[i]; -- GitLab From ab4f0454aa95daabe473cfb8582e8ae7e6f97875 Mon Sep 17 00:00:00 2001 From: xywei Date: Thu, 19 Sep 2019 10:56:41 -0500 Subject: [PATCH 15/22] More fixes --- pytential/qbx/target_assoc.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index b553f7be..d1a8226d 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -328,40 +328,38 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( } } + // Current winners on both sides coord_t winner_dist_to_center_plus = INFINITY; coord_t winner_dist_to_center_minus = INFINITY; - if (target_to_center_plus >= 0) + if (target_to_center_plus[i] >= 0) { winner_dist_to_center_plus = min_rel_dist_to_center_plus[i] * expansion_radii_by_center_with_tolerance[ target_to_center_plus[i]]; } - if (target_to_center_minus >= 0) + if (target_to_center_minus[i] >= 0) { coord_t winner_dist_to_center_minus = min_rel_dist_to_center_minus[i] * expansion_radii_by_center_with_tolerance[ target_to_center_minus[i]]; } - // If found at least one center, pick the closer side, - // and bind to the chosen center if it is closer than the - // currently found one (if MARKED_QBX_CENTER_FOUND before - // searching) - if (winner_dist_to_center_plus < winner_dist_to_center_minus - && winner_dist_to_center_plus < min_dist_to_center[i]) + // If winner on either side is updated, + // bind to the newly found center if it is closer than the + // currently found one. + if (winner_dist_to_center_plus < winner_dist_to_center_minus) { target_to_center[i] = target_to_center_plus[i]; min_dist_to_center[i] = winner_dist_to_center_plus; } - else if (winner_dist_to_center_minus < winner_dist_to_center_plus - && winner_dist_to_center_minus < min_dist_to_center[i]) + else if (winner_dist_to_center_minus < winner_dist_to_center_plus) { target_to_center[i] = target_to_center_minus[i]; min_dist_to_center[i] = winner_dist_to_center_minus; } - else if (winner_dist_to_center_plus < min_dist_to_center[i]) + else if (winner_dist_to_center_plus < INFINITY) { // the two distances are equal, and a center was picked target_to_center[i] = target_to_center_plus[i]; -- GitLab From fb4f9be413da1ff547d37063b9bf826ee6f7050c Mon Sep 17 00:00:00 2001 From: xywei Date: Thu, 19 Sep 2019 15:23:45 -0500 Subject: [PATCH 16/22] Use global memory for winners --- pytential/qbx/target_assoc.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index d1a8226d..6df530e1 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -238,6 +238,9 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( int *target_to_center_plus, int *target_to_center_minus, + coord_t *min_dist_to_center_plus, + coord_t *min_dist_to_center_minus, + coord_t *min_rel_dist_to_center_plus, coord_t *min_rel_dist_to_center_minus, @@ -303,7 +306,9 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( // // As such, min_dist_to_center is not the minimum over all centers, // but the minimum over all winning centers under the relative - // distance measure. + // distance measure. Similarly, min_dist_to_center_plus and + // min_dist_to_center_minus hold the absolute distances from minimum + // relative distance centers. // // Refer to: // - https://gitlab.tiker.net/inducer/pytential/issues/132 @@ -328,20 +333,16 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( } } - // Current winners on both sides - coord_t winner_dist_to_center_plus = INFINITY; - coord_t winner_dist_to_center_minus = INFINITY; - if (target_to_center_plus[i] >= 0) { - winner_dist_to_center_plus = min_rel_dist_to_center_plus[i] + min_dist_to_center_plus[i] = min_rel_dist_to_center_plus[i] * expansion_radii_by_center_with_tolerance[ target_to_center_plus[i]]; } if (target_to_center_minus[i] >= 0) { - coord_t winner_dist_to_center_minus = min_rel_dist_to_center_minus[i] + min_dist_to_center_minus[i] = min_rel_dist_to_center_minus[i] * expansion_radii_by_center_with_tolerance[ target_to_center_minus[i]]; } @@ -349,21 +350,21 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( // If winner on either side is updated, // bind to the newly found center if it is closer than the // currently found one. - if (winner_dist_to_center_plus < winner_dist_to_center_minus) + if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i]) { target_to_center[i] = target_to_center_plus[i]; - min_dist_to_center[i] = winner_dist_to_center_plus; + min_dist_to_center[i] = min_dist_to_center_plus[i]; } - else if (winner_dist_to_center_minus < winner_dist_to_center_plus) + else if (min_dist_to_center_minus[i] < min_dist_to_center_plus[i]) { target_to_center[i] = target_to_center_minus[i]; - min_dist_to_center[i] = winner_dist_to_center_minus; + min_dist_to_center[i] = min_dist_to_center_minus[i]; } - else if (winner_dist_to_center_plus < INFINITY) + else if (min_dist_to_center_plus[i] < INFINITY) { // the two distances are equal, and a center was picked target_to_center[i] = target_to_center_plus[i]; - min_dist_to_center[i] = winner_dist_to_center_plus; + min_dist_to_center[i] = min_dist_to_center_plus[i]; } } """, @@ -665,6 +666,9 @@ class TargetAssociationWrangler(TreeWranglerBase): target_to_center_minus = make_target_field(-1, np.int32) min_dist_to_center = make_target_field(np.inf) + min_dist_to_center_plus = make_target_field(np.inf) + min_dist_to_center_minus = make_target_field(np.inf) + min_rel_dist_to_center_plus = make_target_field(np.inf) min_rel_dist_to_center_minus = make_target_field(np.inf) @@ -684,6 +688,8 @@ class TargetAssociationWrangler(TreeWranglerBase): min_dist_to_center, target_to_center_plus, target_to_center_minus, + min_dist_to_center_plus, + min_dist_to_center_minus, min_rel_dist_to_center_plus, min_rel_dist_to_center_minus, *tree.sources), -- GitLab From 492fabdced5bafe2a4d0fd8ddd500ada930bca75 Mon Sep 17 00:00:00 2001 From: xywei Date: Thu, 19 Sep 2019 17:00:00 -0500 Subject: [PATCH 17/22] Remove min_dist_to_center --- pytential/qbx/target_assoc.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 6df530e1..ff02cb71 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -233,14 +233,10 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( /* output */ int *target_to_center, - coord_t *min_dist_to_center, - int *target_to_center_plus, int *target_to_center_minus, - coord_t *min_dist_to_center_plus, coord_t *min_dist_to_center_minus, - coord_t *min_rel_dist_to_center_plus, coord_t *min_rel_dist_to_center_minus, @@ -353,18 +349,15 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i]) { target_to_center[i] = target_to_center_plus[i]; - min_dist_to_center[i] = min_dist_to_center_plus[i]; } else if (min_dist_to_center_minus[i] < min_dist_to_center_plus[i]) { target_to_center[i] = target_to_center_minus[i]; - min_dist_to_center[i] = min_dist_to_center_minus[i]; } else if (min_dist_to_center_plus[i] < INFINITY) { // the two distances are equal, and a center was picked target_to_center[i] = target_to_center_plus[i]; - min_dist_to_center[i] = min_dist_to_center_plus[i]; } } """, @@ -665,7 +658,6 @@ class TargetAssociationWrangler(TreeWranglerBase): target_to_center_plus = make_target_field(-1, np.int32) target_to_center_minus = make_target_field(-1, np.int32) - min_dist_to_center = make_target_field(np.inf) min_dist_to_center_plus = make_target_field(np.inf) min_dist_to_center_minus = make_target_field(np.inf) @@ -685,7 +677,6 @@ class TargetAssociationWrangler(TreeWranglerBase): target_flags, target_status, target_assoc.target_to_center, - min_dist_to_center, target_to_center_plus, target_to_center_minus, min_dist_to_center_plus, -- GitLab From a3a0c5bfc8c22c2f9d8891f9a97f8213ab0a0abe Mon Sep 17 00:00:00 2001 From: xywei Date: Fri, 20 Sep 2019 07:43:23 -0500 Subject: [PATCH 18/22] Simplify min_dist_to_center_* updates --- pytential/qbx/target_assoc.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index ff02cb71..a17c416d 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -315,6 +315,7 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( { target_status[i] = MARKED_QBX_CENTER_FOUND; min_rel_dist_to_center_plus[i] = my_rel_dist_to_center; + min_dist_to_center_plus[i] = my_dist_to_center; target_to_center_plus[i] = center; } } @@ -324,25 +325,12 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( { target_status[i] = MARKED_QBX_CENTER_FOUND; min_rel_dist_to_center_minus[i] = my_rel_dist_to_center; + min_dist_to_center_minus[i] = my_dist_to_center; target_to_center_minus[i] = center; } } } - if (target_to_center_plus[i] >= 0) - { - min_dist_to_center_plus[i] = min_rel_dist_to_center_plus[i] - * expansion_radii_by_center_with_tolerance[ - target_to_center_plus[i]]; - } - - if (target_to_center_minus[i] >= 0) - { - min_dist_to_center_minus[i] = min_rel_dist_to_center_minus[i] - * expansion_radii_by_center_with_tolerance[ - target_to_center_minus[i]]; - } - // If winner on either side is updated, // bind to the newly found center if it is closer than the // currently found one. -- GitLab From 4a38f92aab9787cf8f79d18af460f67a13db9da5 Mon Sep 17 00:00:00 2001 From: xywei Date: Fri, 20 Sep 2019 07:54:00 -0500 Subject: [PATCH 19/22] Clearer code for target_to_center resolution --- pytential/qbx/target_assoc.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index a17c416d..bbb1778d 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -334,19 +334,19 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( // If winner on either side is updated, // bind to the newly found center if it is closer than the // currently found one. + if (min_dist_to_center_plus[i] < min_dist_to_center_minus[i]) { target_to_center[i] = target_to_center_plus[i]; } - else if (min_dist_to_center_minus[i] < min_dist_to_center_plus[i]) + else { + // This also includes the case where both dists are INFINITY, + // thus target_to_center_plus and target_to_center_minus are + // required to be initialized with the same default center + // -1 as make_default_target_association target_to_center[i] = target_to_center_minus[i]; } - else if (min_dist_to_center_plus[i] < INFINITY) - { - // the two distances are equal, and a center was picked - target_to_center[i] = target_to_center_plus[i]; - } } """, name="find_centers", -- GitLab From 67aac9149bcd03cf4c45db8d54a790cc22d636a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kl=C3=B6ckner?= Date: Mon, 23 Sep 2019 07:38:25 +0200 Subject: [PATCH 20/22] Apply suggestion to pytential/qbx/target_assoc.py --- pytential/qbx/target_assoc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index bbb1778d..e7d97ab7 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -290,7 +290,7 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( continue; } - // The idea is to use relative distance to determine the closes + // The idea is to use relative distance to determine the closest // disk center on each side, and then pick the one with smaller // absolute distance. // -- GitLab From 105696e1d5fd7bc8ffd4171d97c69c763f85379e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kl=C3=B6ckner?= Date: Mon, 23 Sep 2019 07:47:55 +0200 Subject: [PATCH 21/22] Doc/comment tweaks for relative-dist-based target association --- pytential/qbx/target_assoc.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index e7d97ab7..0dfa7052 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -300,10 +300,8 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( // 2. Find the side with minimal Euclidean distance from one of the // choosen centers in step 1. // - // As such, min_dist_to_center is not the minimum over all centers, - // but the minimum over all winning centers under the relative - // distance measure. Similarly, min_dist_to_center_plus and - // min_dist_to_center_minus hold the absolute distances from minimum + // min_dist_to_center_plus and min_dist_to_center_minus + // hold the absolute distances from minimum // relative distance centers. // // Refer to: @@ -331,7 +329,7 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( } } - // If winner on either side is updated, + // If the "winner" on either side is updated, // bind to the newly found center if it is closer than the // currently found one. @@ -341,7 +339,7 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( } else { - // This also includes the case where both dists are INFINITY, + // This also includes the case where both distances are INFINITY, // thus target_to_center_plus and target_to_center_minus are // required to be initialized with the same default center // -1 as make_default_target_association -- GitLab From 187aba648bf26f0d0522f41a1e64165a67a47ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kl=C3=B6ckner?= Date: Mon, 23 Sep 2019 07:52:02 +0200 Subject: [PATCH 22/22] Remove trailing whitespace --- pytential/qbx/target_assoc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytential/qbx/target_assoc.py b/pytential/qbx/target_assoc.py index 0dfa7052..d8f32f54 100644 --- a/pytential/qbx/target_assoc.py +++ b/pytential/qbx/target_assoc.py @@ -300,7 +300,7 @@ QBX_CENTER_FINDER = AreaQueryElementwiseTemplate( // 2. Find the side with minimal Euclidean distance from one of the // choosen centers in step 1. // - // min_dist_to_center_plus and min_dist_to_center_minus + // min_dist_to_center_plus and min_dist_to_center_minus // hold the absolute distances from minimum // relative distance centers. // -- GitLab