Esempio n. 1
0
    def test_gmp2_outcore_frozen(self):
        pt = mp.GMP2(gmf)
        pt.max_memory = 0
        pt.nmo = 24
        pt.frozen = [8, 9]
        e = pt.kernel(with_t2=False)[0]
        self.assertAlmostEqual(e, -0.098239933985213371, 9)

        pt = mp.GMP2(gmf)
        pt.nmo = 24
        pt.nocc = 8
        e = pt.kernel(with_t2=False)[0]
        self.assertAlmostEqual(e, -0.098239933985213371, 9)
Esempio n. 2
0
 def test_gmp2_with_ao2mofn(self):
     pt = mp.GMP2(gmf)
     mf_df = mf.density_fit('weigend')
     ao2mofn = mf_df.with_df.ao2mo
     pt.ao2mo = lambda *args: mp.gmp2._make_eris_incore(
         pt, *args, ao2mofn=ao2mofn)
     e1 = pt.kernel()[0]
Esempio n. 3
0
    def test_gmp2_with_df(self):
        pt = mp.GMP2(gmf).density_fit()
        emp2, t2 = pt.kernel(gmf.mo_energy, gmf.mo_coeff)
        self.assertAlmostEqual(emp2, -0.12884823204824902, 9)

        mf1 = scf.addons.convert_to_ghf(mf)
        mf1.mo_coeff = numpy.asarray(mf1.mo_coeff)  # remove tag orbspin
        pt = mp.GMP2(mf1).density_fit()
        emp2, t2 = pt.kernel()
        self.assertAlmostEqual(emp2, -0.09624851692896723, 9)

        dm = gmf.get_init_guess() + .1j
        dm = 0.5 * (dm + dm.T.conj())
        gmf.conv_tol = 1e-9
        gmf.kernel(dm0=dm)
        pt = mp.GMP2(gmf).density_fit()
        emp2, t2 = pt.kernel()
        self.assertAlmostEqual(emp2, -0.12884823204824902, 8)
Esempio n. 4
0
    def test_gmp2_contract_eri_dm(self):
        pt = mp.GMP2(mf)
        pt.frozen = 2
        emp2, t2 = pt.kernel()
        dm1 = pt.make_rdm1()
        dm2 = pt.make_rdm2()

        nao = mol.nao_nr()
        mo_a = pt._scf.mo_coeff[:nao]
        mo_b = pt._scf.mo_coeff[nao:]
        nmo = mo_a.shape[1]
        eri = ao2mo.kernel(mf._eri, mo_a + mo_b,
                           compact=False).reshape([nmo] * 4)
        orbspin = pt._scf.mo_coeff.orbspin
        sym_forbid = (orbspin[:, None] != orbspin)
        eri[sym_forbid, :, :] = 0
        eri[:, :, sym_forbid] = 0
        hcore = mf.get_hcore()
        h1 = reduce(numpy.dot, (mo_a.T.conj(), hcore, mo_a))
        h1 += reduce(numpy.dot, (mo_b.T.conj(), hcore, mo_b))

        e1 = numpy.einsum('ij,ji', h1, dm1)
        e1 += numpy.einsum('ijkl,ijkl', eri, dm2) * .5
        e1 += mol.energy_nuc()
        self.assertAlmostEqual(e1, pt.e_tot, 9)

        pt = mp.GMP2(mf)
        emp2, t2 = pt.kernel()
        dm1 = pt.make_rdm1()
        dm2 = pt.make_rdm2()
        #self.assertAlmostEqual(abs(numpy.einsum('ijkk->ji', dm2)/9 - dm1).max(), 0, 9)
        e1 = numpy.einsum('ij,ji', h1, dm1)
        e1 += numpy.einsum('ijkl,ijkl', eri, dm2) * .5
        e1 += mol.energy_nuc()
        self.assertAlmostEqual(e1, pt.e_tot, 9)

        hcore = pt._scf.get_hcore()
        mo = pt._scf.mo_coeff
        vhf = pt._scf.get_veff(mol, pt._scf.make_rdm1())
        h1 = reduce(numpy.dot, (mo.T, hcore + vhf, mo))
        dm1[numpy.diag_indices(mol.nelectron)] -= 1
        e = numpy.einsum('pq,qp', h1, dm1)
        self.assertAlmostEqual(e, -emp2, 9)
Esempio n. 5
0
    def test_gmp2(self):
        pt = mp.GMP2(gmf)
        emp2, t2 = pt.kernel(gmf.mo_energy, gmf.mo_coeff)
        self.assertAlmostEqual(emp2, -0.12886859466191491, 9)

        pt.max_memory = 1
        pt.frozen = None
        emp2, t2 = pt.kernel()
        self.assertAlmostEqual(emp2, -0.12886859466191491, 9)

        mf1 = scf.addons.convert_to_ghf(mf)
        mf1.mo_coeff = numpy.asarray(mf1.mo_coeff)  # remove tag orbspin
        pt = mp.GMP2(mf1)
        emp2, t2 = pt.kernel()
        self.assertAlmostEqual(emp2, -0.09625784206542846, 9)

        pt.max_memory = 1
        pt.frozen = None
        emp2, t2 = pt.kernel()
        self.assertAlmostEqual(emp2, -0.09625784206542846, 9)
Esempio n. 6
0
    def test_rdm_complex(self):
        mol = gto.M()
        mol.verbose = 0
        nocc = 6
        nvir = 8
        mf = scf.GHF(mol)
        nmo = nocc + nvir
        numpy.random.seed(1)
        eri = (numpy.random.random((nmo, nmo, nmo, nmo)) + numpy.random.random(
            (nmo, nmo, nmo, nmo)) * 1j - (.5 + .5j))
        eri = eri + eri.transpose(1, 0, 3, 2).conj()
        eri = eri + eri.transpose(2, 3, 0, 1)
        eri *= .1
        eri0 = eri
        erip = eri - eri.transpose(0, 3, 2, 1)

        eris = lambda: None
        eris.oovv = erip[:nocc, nocc:, :nocc, nocc:].transpose(0, 2, 1, 3)

        mo_energy = numpy.arange(nmo)
        mo_occ = numpy.zeros(nmo)
        mo_occ[:nocc] = 1
        dm = numpy.diag(mo_occ)
        vhf = numpy.einsum('ijkl,lk->ij', erip, dm)
        hcore = numpy.diag(mo_energy) - vhf
        mf.get_hcore = lambda *args: hcore
        mf.get_ovlp = lambda *args: numpy.eye(nmo)
        eris.mo_energy = mf.mo_energy = mo_energy
        mf.mo_coeff = numpy.eye(nmo)
        mf.mo_occ = mo_occ
        mf.e_tot = numpy.einsum('ij,ji', hcore,
                                dm) + numpy.einsum('ij,ji', vhf, dm) * .5
        mf.converged = True
        pt = mp.GMP2(mf)
        pt.ao2mo = lambda *args, **kwargs: eris
        pt.kernel(eris=eris)
        dm1 = pt.make_rdm1()
        dm2 = pt.make_rdm2()

        e1 = numpy.einsum('ij,ji', hcore, dm1)
        e1 += numpy.einsum('ijkl,ijkl', eri0, dm2) * .5
        self.assertAlmostEqual(e1, pt.e_tot, 12)

        #self.assertAlmostEqual(abs(numpy.einsum('ijkk->ji', dm2)/(nocc-1) - dm1).max(), 0, 9)
        self.assertAlmostEqual(
            abs(dm2 - dm2.transpose(1, 0, 3, 2).conj()).max(), 0, 9)
        self.assertAlmostEqual(
            abs(dm2 - dm2.transpose(2, 3, 0, 1)).max(), 0, 9)
        self.assertAlmostEqual(
            abs(dm2 + dm2.transpose(2, 1, 0, 3)).max(), 0, 9)
        self.assertAlmostEqual(
            abs(dm2 + dm2.transpose(0, 3, 2, 1)).max(), 0, 9)
Esempio n. 7
0
    def test_ump2_dm(self):
        pt = mp.MP2(mf)
        emp2, t2 = pt.kernel()
        dm1 = pt.make_rdm1()
        dm2 = pt.make_rdm2()
        gpt = mp.GMP2(mf).run()
        dm1ref = gpt.make_rdm1()
        dm2ref = gpt.make_rdm2()
        ia = gpt._scf.mo_coeff.orbspin == 0
        ib = gpt._scf.mo_coeff.orbspin == 1
        mo_a, mo_b = mf.mo_coeff
        nmoa = mo_a.shape[1]
        nmob = mo_b.shape[1]
        nocca, noccb = mol.nelec

        self.assertTrue(numpy.allclose(dm1[0], dm1ref[ia][:, ia]))
        self.assertTrue(numpy.allclose(dm1[1], dm1ref[ib][:, ib]))
        self.assertTrue(
            numpy.allclose(dm2[0], dm2ref[ia][:, ia][:, :, ia][:, :, :, ia]))
        self.assertTrue(
            numpy.allclose(dm2[2], dm2ref[ib][:, ib][:, :, ib][:, :, :, ib]))
        self.assertTrue(
            numpy.allclose(dm2[1], dm2ref[ia][:, ia][:, :, ib][:, :, :, ib]))

        hcore = mf.get_hcore()
        eriaa = ao2mo.kernel(mf._eri, mo_a, compact=False).reshape([nmoa] * 4)
        eribb = ao2mo.kernel(mf._eri, mo_b, compact=False).reshape([nmob] * 4)
        eriab = ao2mo.kernel(mf._eri, (mo_a, mo_a, mo_b, mo_b), compact=False)
        eriab = eriab.reshape([nmoa, nmoa, nmob, nmob])
        h1a = reduce(numpy.dot, (mo_a.T.conj(), hcore, mo_a))
        h1b = reduce(numpy.dot, (mo_b.T.conj(), hcore, mo_b))
        e1 = numpy.einsum('ij,ji', h1a, dm1[0])
        e1 += numpy.einsum('ij,ji', h1b, dm1[1])
        e1 += numpy.einsum('ijkl,ijkl', eriaa, dm2[0]) * .5
        e1 += numpy.einsum('ijkl,ijkl', eriab, dm2[1])
        e1 += numpy.einsum('ijkl,ijkl', eribb, dm2[2]) * .5
        e1 += mol.energy_nuc()
        self.assertAlmostEqual(e1, pt.e_tot, 9)

        vhf = mf.get_veff(mol, mf.make_rdm1())
        h1a = reduce(numpy.dot, (mo_a.T, hcore + vhf[0], mo_a))
        h1b = reduce(numpy.dot, (mo_b.T, hcore + vhf[1], mo_b))
        dm1[0][numpy.diag_indices(nocca)] -= 1
        dm1[1][numpy.diag_indices(noccb)] -= 1
        e = numpy.einsum('pq,qp', h1a, dm1[0])
        e += numpy.einsum('pq,qp', h1b, dm1[1])
        self.assertAlmostEqual(e, -emp2, 9)
Esempio n. 8
0
    def test_gmp2_with_ao2mofn(self):
        pt = mp.GMP2(gmf)
        mf_df = mf.density_fit('weigend')

        def ao2mofn(mo_coeffs):
            nao = mo_coeffs[0].shape[0]
            mo_a = [mo[:nao // 2] for mo in mo_coeffs]
            mo_b = [mo[nao // 2:] for mo in mo_coeffs]
            eri = mf_df.with_df.ao2mo(mo_a)
            eri += mf_df.with_df.ao2mo(mo_b)
            eri += mf_df.with_df.ao2mo([mo_a[0], mo_a[1], mo_b[2], mo_b[3]])
            eri += mf_df.with_df.ao2mo([mo_b[0], mo_b[1], mo_a[2], mo_a[3]])
            return eri

        pt.ao2mo = lambda *args: mp.gmp2._make_eris_incore(
            pt, *args, ao2mofn=ao2mofn)
        e1 = pt.kernel()[0]
        self.assertAlmostEqual(e1, -0.12879040729543023, 8)
        # Should be quite close to emp2 without DF
        self.assertAlmostEqual(e1, -0.12886859466191491, 3)
Esempio n. 9
0
if __name__ == "__main__":
    from pyscf import gto, scf, mp
    mol = gto.Mole()
    mol.atom = [['Li', (0., 0., 0.)], ['H', (1., 0., 0.)]]
    mol.basis = 'cc-pvdz'
    mol.build()

    mf = scf.GHF(mol).run()
    mymp = DFGMP2(mf)
    mymp.kernel()

    mf = scf.RHF(mol).run()
    mf = mf.to_ghf()
    mymp = DFGMP2(mf)
    mymp.kernel()

    mymp = mp.GMP2(mf).density_fit()
    mymp.kernel()

    mf = scf.RHF(mol).density_fit().run()
    mymp = mp.GMP2(mf)
    mymp.kernel()

    mf = scf.GHF(mol)
    dm = mf.get_init_guess() + 0j
    dm[0, :] += .1j
    dm[:, 0] -= .1j
    mf.kernel(dm0=dm)
    mymp = DFGMP2(mf)
    mymp.kernel()
Esempio n. 10
0
 def test_gmp2_frozen(self):
     pt = mp.GMP2(gmf)
     pt.frozen = [2, 3]
     pt.kernel(with_t2=False)
     self.assertAlmostEqual(pt.emp2, -0.087828433042835427, 9)