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