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)
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]
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)
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)
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)
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)
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)
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)
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()
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)