示例#1
0
 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)
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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)
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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)
示例#9
0
 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)
示例#10
0
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('')