def test_ab_b3lyp(self): mf = mf_b3lyp a, b = rks.TDDFT(mf).get_ab() ftda = rhf.gen_tda_operation(mf, singlet=None)[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)
def test_ab_hf(self): mf = scf.RHF(mol).run() a, b = rhf.get_ab(mf) fock = mf.get_hcore() + mf.get_veff() ftda = rhf.gen_tda_operation(mf, fock, 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, 6) 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)
def test_ab_hf(self): mf = scf.RHF(mol).run() a, b = rhf.get_ab(mf) fock = mf.get_hcore() + mf.get_veff() ftda = rhf.gen_tda_operation(mf, fock, 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, 6) 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)