def test_natorbs_fclist(self): for arr in self.mf.mo_coeff.T, self.mf.mo_occ, self.mf.mo_energy: arr[[0, 5]] = arr[[5, 0]] arr[[1, 3]] = arr[[3, 1]] mol = self.mf.mol with DFMP2(self.mf, frozen=[3, 5]) as pt: # also check the density matrix rdm1 = pt.make_rdm1() self.assertAlmostEqual(rdm1[3, 3], 2.0, delta=1.0e-12) self.assertAlmostEqual(rdm1[5, 5], 2.0, delta=1.0e-12) # now calculate the natural orbitals natocc, natorb = pt.make_natorbs() # number of electrons conserved self.assertAlmostEqual(numpy.sum(natocc), mol.nelectron, delta=1.0e-10) # orbitals orthogonal check_orth(self, mol, natorb) # selected values self.assertAlmostEqual(natocc[0], 2.0, delta=1.0e-12) self.assertAlmostEqual(natocc[1], 2.0, delta=1.0e-12) self.assertAlmostEqual(natocc[2], 1.9832413380, delta=1.0e-7) self.assertAlmostEqual(natocc[7], 1.9384836199, delta=1.0e-7) self.assertAlmostEqual(natocc[8], 0.0459325459, delta=1.0e-7) self.assertAlmostEqual(natocc[47], 0.0000751662, delta=1.0e-7)
def test_energy_fclist(self): for arr in self.mf.mo_coeff.T, self.mf.mo_occ, self.mf.mo_energy: arr[[0, 2]] = arr[[2, 0]] arr[[1, 6]] = arr[[6, 1]] with DFMP2(self.mf, frozen=[2, 6]) as pt: pt.kernel() self.assertAlmostEqual(pt.e_corr, -0.274767743344, delta=1.0e-8) self.assertAlmostEqual(pt.e_tot, -78.252218528769, delta=1.0e-8)
def test_natorbs(self): mol = self.mf.mol with DFMP2(self.mf) as pt: natocc, natorb = pt.make_natorbs() # number of electrons conserved self.assertAlmostEqual(numpy.sum(natocc), mol.nelectron, delta=1.0e-10) # orbitals orthogonal check_orth(self, mol, natorb) # selected values self.assertAlmostEqual(natocc[0], 1.9997941377, delta=1.0e-7) self.assertAlmostEqual(natocc[7], 1.9384231532, delta=1.0e-7) self.assertAlmostEqual(natocc[8], 0.0459829060, delta=1.0e-7) self.assertAlmostEqual(natocc[47], 0.0000761012, delta=1.0e-7)
def test_natorbs_relaxed_fc(self): mol = self.mf.mol with DFMP2(self.mf, frozen=2) as pt: pt.cphf_tol = 1e-12 natocc, natorb = pt.make_natorbs(relaxed=True) # number of electrons conserved self.assertAlmostEqual(numpy.sum(natocc), mol.nelectron, delta=1.0e-10) # orbitals orthogonal check_orth(self, mol, natorb) # selected values self.assertAlmostEqual(natocc[0], 2.0000042719, delta=1.0e-7) self.assertAlmostEqual(natocc[7], 1.9402389041, delta=1.0e-7) self.assertAlmostEqual(natocc[8], 0.0459325459, delta=1.0e-7) self.assertAlmostEqual(natocc[47], 0.0000652683, delta=1.0e-7)
def test_natorbs_relaxed(self): mol = self.mf.mol with DFMP2(self.mf) as pt: pt.cphf_tol = 1e-12 natocc, natorb = pt.make_natorbs(relaxed=True) # number of electrons conserved self.assertAlmostEqual(numpy.sum(natocc), mol.nelectron, delta=1.0e-10) # orbitals orthogonal check_orth(self, mol, natorb) # selected values self.assertAlmostEqual(natocc[0], 1.9997950023, delta=1.0e-7) self.assertAlmostEqual(natocc[7], 1.9402044334, delta=1.0e-7) self.assertAlmostEqual(natocc[8], 0.0459829060, delta=1.0e-7) self.assertAlmostEqual(natocc[47], 0.0000658464, delta=1.0e-7)
def test_natorbs_fc(self): mol = self.mf.mol with DFMP2(self.mf, frozen=2) as pt: natocc, natorb = pt.make_natorbs() # number of electrons conserved self.assertAlmostEqual(numpy.sum(natocc), mol.nelectron, delta=1.0e-10) # orbitals orthogonal check_orth(self, mol, natorb) # selected values self.assertAlmostEqual(natocc[0], 2.0, delta=1.0e-12) self.assertAlmostEqual(natocc[1], 2.0, delta=1.0e-12) self.assertAlmostEqual(natocc[2], 1.9832413380, delta=1.0e-7) self.assertAlmostEqual(natocc[7], 1.9384836199, delta=1.0e-7) self.assertAlmostEqual(natocc[8], 0.0459325459, delta=1.0e-7) self.assertAlmostEqual(natocc[47], 0.0000751662, delta=1.0e-7)
def test_natorbs_relaxed_fclist(self): for arr in self.mf.mo_coeff.T, self.mf.mo_occ, self.mf.mo_energy: arr[[0, 2]] = arr[[2, 0]] arr[[1, 6]] = arr[[6, 1]] mol = self.mf.mol with DFMP2(self.mf, frozen=[2, 6]) as pt: pt.cphf_tol = 1e-12 natocc, natorb = pt.make_natorbs(relaxed=True) # number of electrons conserved self.assertAlmostEqual(numpy.sum(natocc), mol.nelectron, delta=1.0e-10) # orbitals orthogonal check_orth(self, mol, natorb) # selected values self.assertAlmostEqual(natocc[0], 2.0000042719, delta=1.0e-7) self.assertAlmostEqual(natocc[7], 1.9402389041, delta=1.0e-7) self.assertAlmostEqual(natocc[8], 0.0459325459, delta=1.0e-7) self.assertAlmostEqual(natocc[47], 0.0000652683, delta=1.0e-7)
def test_energy_fc(self): with DFMP2(self.mf, frozen=2) as pt: pt.kernel() self.assertAlmostEqual(pt.e_corr, -0.274767743344, delta=1.0e-8) self.assertAlmostEqual(pt.e_tot, -78.252218528769, delta=1.0e-8)
def test_energy(self): with DFMP2(self.mf) as pt: pt.kernel() self.assertAlmostEqual(pt.e_corr, -0.280727901936, delta=1.0e-8) self.assertAlmostEqual(pt.e_tot, -78.258178687361, delta=1.0e-8)
from pyscf.scf import RHF from pyscf.mp.dfmp2_native import DFMP2 mol = Mole() mol.atom = ''' C 0.000000 0.000000 0.000000 Cl 0.000000 0.000000 1.785000 H 1.019297 0.000000 -0.386177 H -0.509649 0.882737 -0.386177 H -0.509649 -0.882737 -0.386177 ''' mol.basis = 'aug-cc-pVTZ' mol.build() mf = RHF(mol).run() pt = DFMP2(mf).run() # The unrelaxed density always has got natural occupation numbers between 2 and 0. # However, it is inaccurate for properties. dm_ur = pt.make_rdm1_unrelaxed(ao_repr=True) # The relaxed density is more accurate for properties when MP2 is well-behaved, # whereas the natural occupation numbers can be above 2 or below 0 for ill-behaved systems. dm_re = pt.make_rdm1_relaxed(ao_repr=True) print('') print('HF dipole moment:') dip = mf.dip_moment() # 2.10 print('Absolute value: {0:.3f} Debye'.format(norm(dip))) print('')