def test_uccsd_rdm2_mo2ao(self): mol = gto.Mole() mol.verbose = 0 mol.atom = [[8, (0., 0., 0.)], [1, (0., -0.757, 0.587)], [1, (0., 0.757, 0.587)]] mol.spin = 2 mol.basis = '631g' mol.build(0, 0) mf = scf.UHF(mol) mf.conv_tol_grad = 1e-8 mf.kernel() mycc = cc.UCCSD(mf) mycc.diis_start_cycle = 1 mycc.conv_tol = 1e-10 eris = mycc.ao2mo() ecc, t1, t2 = mycc.kernel(eris=eris) l1, l2 = mycc.solve_lambda(eris=eris) fdm2 = lib.H5TmpFile() d2 = cc.uccsd_rdm._gamma2_outcore(mycc, t1, t2, l1, l2, fdm2, True) nao = mycc.mo_coeff[0].shape[0] ref = cc.uccsd_rdm._make_rdm2(mycc, None, d2, with_dm1=False) aa = lib.einsum('ijkl,pi,qj,rk,sl->pqrs', ref[0], mycc.mo_coeff[0], mycc.mo_coeff[0], mycc.mo_coeff[0], mycc.mo_coeff[0]) ab = lib.einsum('ijkl,pi,qj,rk,sl->pqrs', ref[1], mycc.mo_coeff[0], mycc.mo_coeff[0], mycc.mo_coeff[1], mycc.mo_coeff[1]) bb = lib.einsum('ijkl,pi,qj,rk,sl->pqrs', ref[2], mycc.mo_coeff[1], mycc.mo_coeff[1], mycc.mo_coeff[1], mycc.mo_coeff[1]) aa = aa + aa.transpose(0, 1, 3, 2) aa = aa + aa.transpose(1, 0, 2, 3) aa = ao2mo.restore(4, aa, nao) * .5 bb = bb + bb.transpose(0, 1, 3, 2) bb = bb + bb.transpose(1, 0, 2, 3) bb = ao2mo.restore(4, bb, nao) * .5 ab = ab + ab.transpose(0, 1, 3, 2) ab = ab + ab.transpose(1, 0, 2, 3) ab = ao2mo.restore(4, ab, nao) * .5 ref = (aa + ab, bb + ab.T) rdm2 = uccsd_grad._rdm2_mo2ao(mycc, d2, mycc.mo_coeff) self.assertAlmostEqual(abs(ref[0] - rdm2[0]).max(), 0, 10) self.assertAlmostEqual(abs(ref[1] - rdm2[1]).max(), 0, 10) uccsd_grad._rdm2_mo2ao(mycc, d2, mycc.mo_coeff, fdm2) self.assertAlmostEqual( abs(ref[0] - fdm2['dm2aa+ab'].value).max(), 0, 10) self.assertAlmostEqual( abs(ref[1] - fdm2['dm2bb+ab'].value).max(), 0, 10) self.assertAlmostEqual(lib.finger(rdm2[0]), -1.6247203743431637, 7) self.assertAlmostEqual(lib.finger(rdm2[1]), -0.44062825991527471, 7)
def test_uccsd_rdm2_mo2ao(self): mol = gto.Mole() mol.verbose = 0 mol.atom = [ [8 , (0. , 0. , 0.)], [1 , (0. , -0.757 , 0.587)], [1 , (0. , 0.757 , 0.587)]] mol.spin = 2 mol.basis = '631g' mol.build(0, 0) mf = scf.UHF(mol) mf.conv_tol_grad = 1e-8 mf.kernel() mycc = cc.UCCSD(mf) mycc.diis_start_cycle = 1 mycc.conv_tol = 1e-10 eris = mycc.ao2mo() ecc, t1, t2 = mycc.kernel(eris=eris) l1, l2 = mycc.solve_lambda(eris=eris) fdm2 = lib.H5TmpFile() d2 = cc.uccsd_rdm._gamma2_outcore(mycc, t1, t2, l1, l2, fdm2, True) nao = mycc.mo_coeff[0].shape[0] ref = cc.uccsd_rdm._make_rdm2(mycc, None, d2, with_dm1=False) aa = lib.einsum('ijkl,pi,qj,rk,sl->pqrs', ref[0], mycc.mo_coeff[0], mycc.mo_coeff[0], mycc.mo_coeff[0], mycc.mo_coeff[0]) ab = lib.einsum('ijkl,pi,qj,rk,sl->pqrs', ref[1], mycc.mo_coeff[0], mycc.mo_coeff[0], mycc.mo_coeff[1], mycc.mo_coeff[1]) bb = lib.einsum('ijkl,pi,qj,rk,sl->pqrs', ref[2], mycc.mo_coeff[1], mycc.mo_coeff[1], mycc.mo_coeff[1], mycc.mo_coeff[1]) aa = aa + aa.transpose(0,1,3,2) aa = aa + aa.transpose(1,0,2,3) aa = ao2mo.restore(4, aa, nao) * .5 bb = bb + bb.transpose(0,1,3,2) bb = bb + bb.transpose(1,0,2,3) bb = ao2mo.restore(4, bb, nao) * .5 ab = ab + ab.transpose(0,1,3,2) ab = ab + ab.transpose(1,0,2,3) ab = ao2mo.restore(4, ab, nao) * .5 ref = (aa+ab, bb+ab.T) rdm2 = uccsd_grad._rdm2_mo2ao(mycc, d2, mycc.mo_coeff) self.assertAlmostEqual(abs(ref[0]-rdm2[0]).max(), 0, 10) self.assertAlmostEqual(abs(ref[1]-rdm2[1]).max(), 0, 10) uccsd_grad._rdm2_mo2ao(mycc, d2, mycc.mo_coeff, fdm2) self.assertAlmostEqual(abs(ref[0]-fdm2['dm2aa+ab'].value).max(), 0, 10) self.assertAlmostEqual(abs(ref[1]-fdm2['dm2bb+ab'].value).max(), 0, 10) self.assertAlmostEqual(lib.finger(rdm2[0]), -1.6247203743431637, 7) self.assertAlmostEqual(lib.finger(rdm2[1]), -0.44062825991527471, 7)