def eval_multipoles(self, level_start_target_box_nrs, target_boxes, sep_smaller_nonsiblings_by_level, mpole_exps): pot = self.potential_zeros() rscale = 1 from pyfmmlib import h2dmpeval_vec for ssn in sep_smaller_nonsiblings_by_level: for itgt_box, tgt_ibox in enumerate(target_boxes): tgt_pslice = self._get_target_slice(tgt_ibox) if tgt_pslice.stop - tgt_pslice.start == 0: continue tgt_pot = 0 start, end = ssn.starts[itgt_box:itgt_box+2] for src_ibox in ssn.lists[start:end]: tmp_pot, _, _ = h2dmpeval_vec(self.helmholtz_k, rscale, self. tree.box_centers[:, src_ibox], mpole_exps[src_ibox], self._get_targets(tgt_pslice), ifgrad=False, ifhess=False) tgt_pot = tgt_pot + tmp_pot pot[tgt_pslice] += tgt_pot return pot
def eval_multipoles(self, target_boxes, sep_smaller_nonsiblings_starts, sep_smaller_nonsiblings_lists, mpole_exps): pot = self.potential_zeros() rscale = 1 from pyfmmlib import h2dmpeval_vec for itgt_box, tgt_ibox in enumerate(target_boxes): tgt_pslice = self._get_target_slice(tgt_ibox) if tgt_pslice.stop - tgt_pslice.start == 0: continue tgt_pot = 0 start, end = sep_smaller_nonsiblings_starts[itgt_box:itgt_box + 2] for src_ibox in sep_smaller_nonsiblings_lists[start:end]: tmp_pot, _, _ = h2dmpeval_vec(self.helmholtz_k, rscale, self.tree.box_centers[:, src_ibox], mpole_exps[src_ibox], self._get_targets(tgt_pslice), ifgrad=False, ifhess=False) tgt_pot = tgt_pot + tmp_pot pot[tgt_pslice] += tgt_pot return pot
def test_translations(): nterms = 15 zk = 3 rscale = 1 n = 40 # centered at the origin, extent [-.5,.5] sources = np.random.uniform(size=(n, 2)) - 0.5 charges = np.random.uniform(size=n) targets_center = np.array([10, 0]) targets = np.random.uniform(size=(n, 2)) - 0.5 + targets_center from pyfmmlib import (h2dformmp, h2dmpmp_vec, h2dmploc_vec, h2dlocloc_vec, h2dtaeval_vec, hpotgrad2dall_vec, h2dmpeval_vec) ref_value, _, _ = hpotgrad2dall_vec(ifgrad=False, ifhess=False, sources=sources.T, charge=charges, targets=targets.T, zk=zk) # {{{ multipole 1 mp1_center = np.array([0, 0]) ier, mp1 = h2dformmp(zk, rscale, sources.T, charges, mp1_center, nterms) assert ier == 0 mp1_value, _, _ = h2dmpeval_vec(zk, rscale, mp1_center, mp1, ztarg=targets.T, ifgrad=False, ifhess=False) assert la.norm(mp1_value - ref_value) / la.norm(ref_value) < 1e-12 # }}} # {{{ multipole 2 mp2_center = np.array([2, 0]) mp2 = h2dmpmp_vec(zk, rscale, mp1_center, mp1, rscale, mp2_center, nterms) mp2_value, _, _ = h2dmpeval_vec(zk, rscale, mp2_center, mp2, ztarg=targets.T, ifgrad=False, ifhess=False) assert la.norm(mp2_value - ref_value) / la.norm(ref_value) < 3e-5 # }}} # {{{ local 1 loc1_center = targets_center - np.array([1, 0]) loc1 = h2dmploc_vec(zk, rscale, mp2_center, mp2, rscale, loc1_center, nterms) loc1_value, _, _ = h2dtaeval_vec(zk, rscale, loc1_center, loc1, ztarg=targets.T, ifgrad=False, ifhess=False) assert la.norm(loc1_value - ref_value) / la.norm(ref_value) < 3e-5 # }}} # {{{ local 2 loc2_center = targets_center loc2 = h2dlocloc_vec(zk, rscale, loc1_center, loc1, rscale, loc2_center, nterms) loc2_value, _, _ = h2dtaeval_vec(zk, rscale, loc2_center, loc2, ztarg=targets.T, ifgrad=False, ifhess=False) assert la.norm(loc2_value - ref_value) / la.norm(ref_value) < 1e-4