@@ -76,6 +76,18 @@ class _not_provided: # noqa: N801
7676 pass
7777
7878
79+ class _LevelToOrderWrapper :
80+ """
81+ Helper functor to convert a constant integer fmm order into a pickable and
82+ callable object.
83+ """
84+ def __init__ (self , fmm_order ):
85+ self .fmm_order = fmm_order
86+
87+ def __call__ (self , kernel , kernel_args , tree , level ):
88+ return self .fmm_order
89+
90+
7991class QBXLayerPotentialSource (LayerPotentialSourceBase ):
8092 """A source discretization for a QBX layer potential.
8193
@@ -131,7 +143,8 @@ def __init__(
131143 order to be used on a given *level* of *tree* with *kernel*, where
132144 *kernel* is the :class:`sumpy.kernel.Kernel` being evaluated, and
133145 *kernel_args* is a set of *(key, value)* tuples with evaluated
134- kernel arguments. May not be given if *fmm_order* is given.
146+ kernel arguments. May not be given if *fmm_order* is given. If used in
147+ the distributed setting, this argument must be pickable.
135148 :arg fmm_backend: a string denoting the desired FMM backend to use,
136149 either `"sumpy"` or `"fmmlib"`. Only used if *fmm_order* or
137150 *fmm_level_to_order* are provided.
@@ -204,9 +217,8 @@ def __init__(
204217 else :
205218 assert isinstance (fmm_order , int ) and not isinstance (fmm_order , bool )
206219
207- # pylint: disable-next=function-redefined
208- def fmm_level_to_order (kernel , kernel_args , tree , level ):
209- return fmm_order
220+ fmm_level_to_order = _LevelToOrderWrapper (fmm_order )
221+
210222 assert isinstance (fmm_level_to_order , bool ) or callable (fmm_level_to_order )
211223
212224 if _max_leaf_refine_weight is None :
0 commit comments