Beispiel #1
0
    def __init__(self, code_container, queue, geo_data, dtype,
            qbx_order, fmm_level_to_order,
            source_extra_kwargs, kernel_extra_kwargs):
        SumpyExpansionWrangler.__init__(self,
                code_container, queue, geo_data.tree(),
                dtype, fmm_level_to_order, source_extra_kwargs, kernel_extra_kwargs)

        self.qbx_order = qbx_order
        self.geo_data = geo_data
Beispiel #2
0
    def __init__(self, code_container, queue, geo_data, dtype,
            qbx_order, fmm_level_to_order,
            source_extra_kwargs, kernel_extra_kwargs,
            _use_target_specific_qbx=None):
        if _use_target_specific_qbx:
            raise ValueError("TSQBX is not implemented in sumpy")

        SumpyExpansionWrangler.__init__(self,
                code_container, queue, geo_data.tree(),
                dtype, fmm_level_to_order, source_extra_kwargs, kernel_extra_kwargs)

        self.qbx_order = qbx_order
        self.geo_data = geo_data
        self.using_tsqbx = False
Beispiel #3
0
 def refine_locals(
     self,
     level_start_target_or_target_parent_box_nrs,
     target_or_target_parent_boxes,
     local_exps,
 ):
     return SumpyExpansionWrangler.refine_locals(
         self,
         level_start_target_or_target_parent_box_nrs,
         target_or_target_parent_boxes,
         local_exps,
     )
Beispiel #4
0
 def form_locals(
     self,
     level_start_target_or_target_parent_box_nrs,
     target_or_target_parent_boxes,
     starts,
     lists,
     src_weights,
 ):
     return SumpyExpansionWrangler.form_locals(
         self,
         level_start_target_or_target_parent_box_nrs,
         target_or_target_parent_boxes,
         starts,
         lists,
         src_weights,
     )
Beispiel #5
0
 def multipole_to_local(
     self,
     level_start_target_box_nrs,
     target_boxes,
     src_box_starts,
     src_box_lists,
     mpole_exps,
 ):
     return SumpyExpansionWrangler.multipole_to_local(
         self,
         level_start_target_box_nrs,
         target_boxes,
         src_box_starts,
         src_box_lists,
         mpole_exps,
     )
Beispiel #6
0
 def full_potential_zeros(self):
     # The superclass generates a full field of zeros, for all
     # (not just non-QBX) targets.
     return SumpyExpansionWrangler.potential_zeros(self)
Beispiel #7
0
 def eval_direct_p2p(
     self, target_boxes, source_box_starts, source_box_lists, src_weights
 ):
     return SumpyExpansionWrangler.eval_direct(
         self, target_boxes, source_box_starts, source_box_lists, src_weights
     )
Beispiel #8
0
 def eval_locals(self, level_start_target_box_nrs, target_boxes, local_exps):
     return SumpyExpansionWrangler.eval_locals(
         self, level_start_target_box_nrs, target_boxes, local_exps
     )
Beispiel #9
0
 def local_expansion_zeros(self):
     return SumpyExpansionWrangler.local_expansion_zeros(self)
Beispiel #10
0
 def coarsen_multipoles(
     self, level_start_source_parent_box_nrs, source_parent_boxes, mpoles
 ):
     return SumpyExpansionWrangler.coarsen_multipoles(
         self, level_start_source_parent_box_nrs, source_parent_boxes, mpoles
     )
Beispiel #11
0
 def form_multipoles(self, level_start_source_box_nrs, source_boxes, src_weights):
     return SumpyExpansionWrangler.form_multipoles(
         self, level_start_source_box_nrs, source_boxes, src_weights
     )
Beispiel #12
0
 def finalize_potentials(self, potentials):
     # return potentials
     return SumpyExpansionWrangler.finalize_potentials(self, potentials)
Beispiel #13
0
 def reorder_potentials(self, potentials):
     return SumpyExpansionWrangler.reorder_potentials(self, potentials)
Beispiel #14
0
 def reorder_sources(self, source_array):
     return SumpyExpansionWrangler.reorder_sources(self, source_array)
Beispiel #15
0
 def output_zeros(self):
     return SumpyExpansionWrangler.output_zeros(self)
Beispiel #16
0
 def __init__(self, code_container, queue, geo_data,
         dtype, source_extra_kwargs, kernel_extra_kwargs):
     SumpyExpansionWrangler.__init__(self,
             code_container, queue, geo_data.tree(),
             dtype, source_extra_kwargs, kernel_extra_kwargs)
     self.geo_data = geo_data
Beispiel #17
0
    def exec_compute_potential_insn_fmm(self, actx: PyOpenCLArrayContext, insn,
                                        bound_expr, evaluate):
        # {{{ gather unique target discretizations used

        target_name_to_index = {}
        targets = []

        for o in insn.outputs:
            assert o.qbx_forced_limit not in (-1, 1)

            if o.target_name in target_name_to_index:
                continue

            target_name_to_index[o.target_name] = len(targets)
            targets.append(
                bound_expr.places.get_geometry(o.target_name.geometry))

        targets = tuple(targets)

        # }}}

        # {{{ get wrangler

        geo_data = self.fmm_geometry_data(targets)

        from pytential import bind, sym
        waa = bind(
            bound_expr.places,
            sym.weights_and_area_elements(self.ambient_dim,
                                          dofdesc=insn.source))(actx)
        strengths = [waa * evaluate(density) for density in insn.densities]

        flat_strengths = [flatten(strength, actx) for strength in strengths]

        fmm_kernel = self.get_fmm_kernel(insn.target_kernels)
        output_and_expansion_dtype = (self.get_fmm_output_and_expansion_dtype(
            insn.target_kernels, strengths[0]))
        kernel_extra_kwargs, source_extra_kwargs = (
            self.get_fmm_expansion_wrangler_extra_kwargs(
                actx, insn.target_kernels + insn.source_kernels,
                geo_data.tree().user_source_ids, insn.kernel_arguments,
                evaluate))

        tree_indep = self._tree_indep_data_for_wrangler(
            fmm_kernel,
            target_kernels=insn.target_kernels,
            source_kernels=insn.source_kernels)

        from sumpy.fmm import SumpyExpansionWrangler
        wrangler = SumpyExpansionWrangler(
            tree_indep,
            geo_data.traversal(),
            output_and_expansion_dtype,
            self.fmm_level_to_order,
            source_extra_kwargs=source_extra_kwargs,
            kernel_extra_kwargs=kernel_extra_kwargs)

        # }}}

        from boxtree.fmm import drive_fmm
        all_potentials_on_every_tgt = drive_fmm(wrangler,
                                                flat_strengths,
                                                timing_data=None)

        # {{{ postprocess fmm

        results = []

        for o in insn.outputs:
            target_index = target_name_to_index[o.target_name]
            target_slice = slice(*geo_data.target_info(
            ).target_discr_starts[target_index:target_index + 2])
            target_discr = targets[target_index]

            result = all_potentials_on_every_tgt[
                o.target_kernel_index][target_slice]

            from meshmode.discretization import Discretization
            if isinstance(target_discr, Discretization):
                template_ary = thaw(target_discr.nodes()[0], actx)
                result = unflatten(template_ary, result, actx, strict=False)

            results.append((o.name, result))

        # }}}

        timing_data = {}
        return results, timing_data
Beispiel #18
0
 def eval_multipoles(
     self, target_boxes_by_source_level, source_boxes_by_level, mpole_exps
 ):
     return SumpyExpansionWrangler.eval_multipoles(
         self, target_boxes_by_source_level, source_boxes_by_level, mpole_exps
     )
Beispiel #19
0
 def full_output_zeros(self):
     # The superclass generates a full field of zeros, for all
     # (not just non-QBX) targets.
     return SumpyExpansionWrangler.output_zeros(self)
Beispiel #20
0
 def multipole_expansion_zeros(self):
     return SumpyExpansionWrangler.multipole_expansion_zeros(self)