From 7a736774131545e29047ee856600dba66969436b Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Sat, 26 Aug 2017 21:32:36 -0500 Subject: [PATCH] Fix levels misconception in m2m loop in FMM --- boxtree/pyfmmlib_integration.py | 15 +++++++++------ test/test_fmm.py | 14 +++++++++----- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/boxtree/pyfmmlib_integration.py b/boxtree/pyfmmlib_integration.py index e69b225..833918f 100644 --- a/boxtree/pyfmmlib_integration.py +++ b/boxtree/pyfmmlib_integration.py @@ -396,13 +396,16 @@ class FMMLibExpansionWrangler(object): mpmp = self.get_translation_routine("%ddmpmp") - # 2 is the last relevant source_level. - # 1 is the last relevant target_level. - # (Nobody needs a multipole on level 0, i.e. for the root box.) - for source_level in range(tree.nlevels-1, 1, -1): - start, stop = level_start_source_parent_box_nrs[ - source_level:source_level+2] + # nlevels-1 is the last valid level index + # nlevels-2 is the last valid level that could have children + # + # 3 is the last relevant source_level. + # 2 is the last relevant target_level. + # (because no level 1 box will be well-separated from another) + for source_level in range(tree.nlevels-1, 2, -1): target_level = source_level - 1 + start, stop = level_start_source_parent_box_nrs[ + target_level:target_level+2] for ibox in source_parent_boxes[start:stop]: parent_center = tree.box_centers[:, ibox] diff --git a/test/test_fmm.py b/test/test_fmm.py index 92ab690..c179dbc 100644 --- a/test/test_fmm.py +++ b/test/test_fmm.py @@ -89,12 +89,16 @@ class ConstantOneExpansionWrangler(object): source_parent_boxes, mpoles): tree = self.tree - # 2 is the last relevant source_level. - # 1 is the last relevant target_level. - # (Nobody needs a multipole on level 0, i.e. for the root box.) - for source_level in range(tree.nlevels-1, 1, -1): + # nlevels-1 is the last valid level index + # nlevels-2 is the last valid level that could have children + # + # 3 is the last relevant source_level. + # 2 is the last relevant target_level. + # (because no level 1 box will be well-separated from another) + for source_level in range(tree.nlevels-1, 2, -1): + target_level = source_level - 1 start, stop = level_start_source_parent_box_nrs[ - source_level:source_level+2] + target_level:target_level+2] for ibox in source_parent_boxes[start:stop]: for child in tree.box_child_ids[:, ibox]: if child: -- GitLab