def bilinear_concentric_potential(r_g, dr_g, f_g, ft_g, l1, l2, alpha, rfilt=None): """Calculate corrections for concentric functions and potentials:: / _ _a _ _a ~ _ _a ~ _ _a _ v = | f (r - R ) V(r - R ) - f (r - R ) V(r - R ) dr m1,m2 / L1,L2 L1,L2 where f(r) and ft(r) are bilinear product of two localized functions which are radial splines times real spherical harmonics (l1,m1) or (l2,m2) and:: _ 1 _ -1 ~ _ erf(alpha*r) _ -1 V(r) = --------- |r| ^ V(r) = ------------ |r| 4 pi eps0 4 pi eps0 Note that alpha (and rfilt) should conform with the cutoff radius. """ work_g = erf(alpha*r_g) if rfilt is None: M = np.vdot(f_g - ft_g * work_g, r_g * dr_g) else: M = np.vdot((f_g - ft_g * work_g)[r_g>=rfilt], \ (r_g * dr_g)[r_g>=rfilt]) # Replace 1/r -> (3-r^2/rfilt^2)/(2*rfilt) for r < rfilt M += np.vdot((f_g - ft_g * work_g)[r_g<rfilt], \ (r_g**2/(2*rfilt) * (3-(r_g/rfilt)**2) * dr_g)[r_g<rfilt]) v_mm = np.empty((2*l1+1, 2*l2+1), dtype=float) for m1 in range(2*l1+1): for m2 in range(2*l2+1): v_mm[m1,m2] = M * intYY(l1, m1-l1, l2, m2-l2) return v_mm
def test_integral_orthogonality(self): lmax = 5 #XXX use meshgrid above l=5 # Test orthogonality of the spherical harmonics for l1,m1 in lmiter(lmax, comm=world): s1_L = Y(l1, m1, theta_L, phi_L) for l2,m2 in lmiter(lmax): s2_L = Y(l2, m2, theta_L, phi_L) # Note that weights times surface area make up for sin(theta) v = 4 * np.pi * np.vdot(s1_L, s2_L * weight_L) v0 = intYY(l1, m1, l2, m2) self.assertAlmostEqual(v, v0, 12, '%s != %s (l1=%2d, m1=%2d' \ ', l2=%2d, m2=%2d)' % (v,v0,l1,m1,l2,m2))
def test_integral_orthogonality(self): lmax = 5 #XXX use meshgrid above l=5 # Test orthogonality of the spherical harmonics for l1, m1 in lmiter(lmax, comm=world): s1_L = Y(l1, m1, theta_L, phi_L) for l2, m2 in lmiter(lmax): s2_L = Y(l2, m2, theta_L, phi_L) # Note that weights times surface area make up for sin(theta) v = 4 * np.pi * np.vdot(s1_L, s2_L * weight_L) v0 = intYY(l1, m1, l2, m2) self.assertAlmostEqual(v, v0, 12, '%s != %s (l1=%2d, m1=%2d' \ ', l2=%2d, m2=%2d)' % (v,v0,l1,m1,l2,m2))