예제 #1
0
파일: test_dm.py 프로젝트: pyscf/pyscf
    def test_kmp2_contract_eri_dm(self):
        kmp2 = mp.KMP2(kmf)
        kmp2.kernel()
        e_tot = kmp2.e_tot

        mo_coeff = kmf.mo_coeff
        hcore = kmf.get_hcore()
        for k in range(nkpts):
            hcore[k] = reduce(np.dot, (mo_coeff[k].T.conj(), hcore[k], mo_coeff[k]))

        dm1 = kmp2.make_rdm1()
        dm2 = kmp2.make_rdm2()
        e = 0
        for k in range(nkpts):
            e += np.einsum('pq,qp', dm1[k], hcore[k]).real / nkpts
        ao2mo = kmp2._scf.with_df.ao2mo
        idx = 0
        for kp in range(nkpts):
            for kq in range(nkpts):
                for kr in range(nkpts):
                    ks = kmp2.khelper.kconserv[kp,kq,kr]
                    mop = mo_coeff[kp]
                    moq = mo_coeff[kq]
                    mor = mo_coeff[kr]
                    mos = mo_coeff[ks]
                    eri = ao2mo((mop,moq,mor,mos), 
                          (kpts[kp], kpts[kq], kpts[kr], kpts[ks]),
                          compact=False).reshape(mop.shape[-1],moq.shape[-1],
                          mor.shape[-1],mos.shape[-1]) / nkpts
                    e += np.einsum('pqrs,pqrs',dm2[idx], eri).real * 0.5 / nkpts
                    idx += 1
        e += cell.energy_nuc()
        self.assertAlmostEqual(e, e_tot, 9)
예제 #2
0
scf.kghf.KGHF.MP2 = None
scf.krohf.KROHF.MP2 = None


if __name__ == '__main__':
    from pyscf.pbc import gto, scf, mp

    cell = gto.Cell()
    cell.atom='''
    C 0.000000000000   0.000000000000   0.000000000000
    C 1.685068664391   1.685068664391   1.685068664391
    '''
    cell.basis = 'gth-szv'
    cell.pseudo = 'gth-pade'
    cell.a = '''
    0.000000000, 3.370137329, 3.370137329
    3.370137329, 0.000000000, 3.370137329
    3.370137329, 3.370137329, 0.000000000'''
    cell.unit = 'B'
    cell.verbose = 5
    cell.build()

    # Running HF and MP2 with 1x1x2 Monkhorst-Pack k-point mesh
    kmf = scf.KRHF(cell, kpts=cell.make_kpts([1,1,2]), exxdiv=None)
    ehf = kmf.kernel()

    mymp = mp.KMP2(kmf)
    emp2, t2 = mymp.kernel()
    print(emp2 - -0.204721432828996)

예제 #3
0
0.000000000, 3.370137329, 3.370137329
3.370137329, 0.000000000, 3.370137329
3.370137329, 3.370137329, 0.000000000'''
cell.unit = 'B'
cell.verbose = 5
cell.build()

#
# KHF and KMP2 with 2x2x2 k-points
#
kpts = cell.make_kpts([2, 2, 2])
kmf = scf.KRHF(cell)
kmf.kpts = kpts
ehf = kmf.kernel()

mypt = mp.KMP2(kmf)
mypt.kernel()
print("KMP2 energy (per unit cell) =", mypt.e_tot)

#
# The KHF and KMP2 for single k-point calculation.
#
kpts = cell.get_abs_kpts([0.25, 0.25, 0.25])
kmf = scf.KRHF(cell)
kmf.kpts = kpts
ehf = kmf.kernel()

mypt = mp.KMP2(kmf)
mypt.kernel()
print("KMP2 energy (per unit cell) =", mypt.e_tot)
# suitable for most cases. The user can nonetheless tests the effect of using
# different values of 'omega'. The few lines below do this and verify that the
# results (in terms of both the HF and the MP2 energies) are not affected.
# In the output file, you can also
#     grep -a "CPU time for j3c" [output_file]
# to see how the DF initialization time is affected by using different omega.
#
omegas = np.array([0.3, 0.5, 0.7, 0.9])
escfs = np.zeros_like(omegas)
emp2s = np.zeros_like(omegas)
for i, omega in enumerate(omegas):
    mf = scf.KRHF(cell, kpts).rs_density_fit()
    mf.with_df.omega = omega
    mf.kernel()
    escfs[i] = mf.e_tot
    mmp = mp.KMP2(mf)
    mmp.with_t2 = False
    mmp.kernel()
    emp2s[i] = mmp.e_corr
for omega, escf, emp2 in zip(omegas, escfs, emp2s):
    print("%.2f  %.10f  %.10f" % (omega, escf, emp2))
maxdiffescf = escfs.max() - escfs.min()
maxdiffemp2 = emp2s.max() - emp2s.min()
print("Maximum difference in SCF energy: %.10f" % (maxdiffescf))
print("Maximum difference in MP2 energy: %.10f" % (maxdiffemp2))
''' example output:
0.30  -75.3226526450  -0.2242441141
0.50  -75.3226526440  -0.2242441145
0.70  -75.3226526451  -0.2242441148
0.90  -75.3226526455  -0.2242441143
Maximum difference in SCF energy: 0.0000000015