def test_polarizability_with_freq(self): mol = gto.M(atom='''O 0. 0. 0. H 0. -0.757 0.587 H 0. 0.757 0.587''', basis='6-31g') mf = scf.RHF(mol).run(conv_tol=1e-14) mo_coeff = mf.mo_coeff occidx = mf.mo_occ > 0 orbo = mo_coeff[:, occidx] orbv = mo_coeff[:,~occidx] nocc = orbo.shape[1] nvir = orbv.shape[1] nov = nocc*nvir charges = mol.atom_charges() coords = mol.atom_coords() charge_center = numpy.einsum('i,ix->x', charges, coords) / charges.sum() with mol.with_common_orig(charge_center): int_r = mol.intor_symmetric('int1e_r', comp=3) h1 = lib.einsum('xpq,pi,qj->xij', int_r, mo_coeff.conj(), orbo) v1 = h1[:,nocc:].transpose(2,1,0).reshape(nov,-1) v = numpy.vstack((v1,v1)) a, b = get_ab(mf) a = a.reshape(nov,nov) b = b.reshape(nov,nov) mat = numpy.bmat(((a,b),(b,a))) freq = 0.1 mat[:nov,:nov] -= numpy.eye(nov)*freq mat[nov:,nov:] += numpy.eye(nov)*freq # frequency-dependent property u1 = numpy.linalg.solve(mat, v) ref = numpy.einsum('px,py->xy', v, u1)*2 val = rhf.Polarizability(mf).polarizability_with_freq(freq) # errors mainly due to krylov solver self.assertAlmostEqual(abs(ref-val).max(), 0, 2) # static property ref = numpy.einsum('px,py->xy', v1, numpy.linalg.solve(a+b, v1))*4 val = rhf.Polarizability(mf).polarizability() self.assertAlmostEqual(abs(ref-val).max(), 0, 7) val = rhf.Polarizability(mf).polarizability_with_freq(freq=0) # errors mainly due to krylov solver self.assertAlmostEqual(abs(ref-val).max(), 0, 3)
def test_ab_lda(self): mf = mf_lda a, b = rhf.get_ab(mf) ftda = rhf.gen_tda_operation(mf, singlet=True)[0] ftdhf = rhf.gen_tdhf_operation(mf, singlet=True)[0] nocc = numpy.count_nonzero(mf.mo_occ == 2) nvir = numpy.count_nonzero(mf.mo_occ == 0) numpy.random.seed(2) x, y = xy = numpy.random.random((2,nocc,nvir)) ax = numpy.einsum('iajb,jb->ia', a, x) self.assertAlmostEqual(abs(ax - ftda([x]).reshape(nocc,nvir)).max(), 0, 9) ab1 = ax + numpy.einsum('iajb,jb->ia', b, y) ab2 =-numpy.einsum('iajb,jb->ia', b, x) ab2-= numpy.einsum('iajb,jb->ia', a, y) abxy_ref = ftdhf([xy]).reshape(2,nocc,nvir) self.assertAlmostEqual(abs(ab1 - abxy_ref[0]).max(), 0, 9) self.assertAlmostEqual(abs(ab2 - abxy_ref[1]).max(), 0, 9)