def test_uagf2_2_2(self): uagf2 = agf2.UAGF2(self.uhf, nmom=(1, 1), verbose=False) uagf2.run() uagf2 = agf2.UAGF2(self.uhf, nmom=(2, 2), dm0=uagf2.rdm1, damping=True, verbose=False, etol=1e-7) uagf2.run() self.assertTrue(uagf2.converged) self.assertAlmostEqual(np.trace(uagf2.rdm1[0]), self.m.nalph, 6) self.assertAlmostEqual(np.trace(uagf2.rdm1[1]), self.m.nbeta, 6) self.assertAlmostEqual(uagf2.e_1body, -74.91982876261184 , 6) self.assertAlmostEqual(uagf2.e_2body, -0.08303716502289221, 6) self.assertAlmostEqual(uagf2.e_hf, -74.96117113786579 , 6) self.assertAlmostEqual(uagf2.e_corr, -0.0416947897689397 , 6) self.assertAlmostEqual(uagf2.e_tot, -75.00286592763473 , 6)
def test_uagf2_None_3(self): uagf2 = agf2.UAGF2(self.uhf, nmom=(None, 3), damping=True, delay_damping=5, verbose=False, etol=1e-7).run() uagf2.run() self.assertTrue(uagf2.converged) self.assertAlmostEqual(uagf2.e_mp2, self.e_mp2, 6) self.assertAlmostEqual(np.trace(uagf2.rdm1[0]), self.m.nalph, 6) self.assertAlmostEqual(np.trace(uagf2.rdm1[1]), self.m.nbeta, 6) self.assertAlmostEqual(uagf2.e_1body, -74.92061972014814 , 6) self.assertAlmostEqual(uagf2.e_2body, -0.08271701271449447, 6) self.assertAlmostEqual(uagf2.e_hf, -74.96117113786579 , 6) self.assertAlmostEqual(uagf2.e_corr, -0.04216559499684536, 6) self.assertAlmostEqual(uagf2.e_tot, -75.00333673286264 , 6)
def test_uagf2_1_1(self): uagf2 = agf2.UAGF2(self.uhf, nmom=(1, 1), verbose=False, etol=1e-7) uagf2.run() self.assertTrue(uagf2.converged) self.assertAlmostEqual(uagf2.e_mp2, self.e_mp2, 3) self.assertAlmostEqual(np.trace(uagf2.rdm1[0]), self.m.nalph, 6) self.assertAlmostEqual(np.trace(uagf2.rdm1[1]), self.m.nbeta, 6) self.assertAlmostEqual(uagf2.e_1body, -74.9230493877132 , 6) self.assertAlmostEqual(uagf2.e_2body, -0.08160143624651722, 6) self.assertAlmostEqual(uagf2.e_hf, -74.96117113786579 , 6) self.assertAlmostEqual(uagf2.e_corr, -0.04347968609393149, 6) self.assertAlmostEqual(uagf2.e_tot, -75.00465082395972 , 6)
def test_ip(self): uagf2 = agf2.UAGF2(self.uhf, nmom=(2, 2), verbose=False, etol=1e-7) uagf2.run() wa, va = uagf2.se[0].eig(uagf2.get_fock()[0]) wb, vb = uagf2.se[1].eig(uagf2.get_fock()[1]) arga = np.argmax(wa[wa < uagf2.chempot[0]]) argb = np.argmax(wb[wb < uagf2.chempot[1]]) if wa[wa < uagf2.chempot[0]][arga] < wb[wb < uagf2.chempot[1]][argb]: e1, v1 = -wa[wa < uagf2.chempot[0]][arga], va[:,wa < uagf2.chempot[0]][:,arga][:uagf2.nphys] else: e1, v1 = -wb[wb < uagf2.chempot[1]][argb], vb[:,wb < uagf2.chempot[1]][:,argb][:uagf2.nphys] e2, v2 = uagf2.ip self.assertAlmostEqual(e1, e2, 8) self.assertAlmostEqual(np.linalg.norm(v1), np.linalg.norm(v2), 8)
def test_ea(self): opt_uagf2 = agf2.OptUAGF2(self.uhf_df, verbose=False, etol=1e-7) opt_uagf2.run() wa, va = opt_uagf2.se[0].eig(opt_uagf2.get_fock()[0]) wb, vb = opt_uagf2.se[1].eig(opt_uagf2.get_fock()[1]) opt_uagf2.gf = (opt_uagf2.gf[0].new(wa, va[:opt_uagf2.nphys]), opt_uagf2.gf[1].new(wb, vb[:opt_uagf2.nphys])) uagf2 = agf2.UAGF2(self.uhf, nmom=(None, 0), verbose=False, etol=1e-7) uagf2.run() wa, va = opt_uagf2.se[0].eig(opt_uagf2.get_fock()[0]) wb, vb = opt_uagf2.se[1].eig(opt_uagf2.get_fock()[1]) arga = np.argmin(wa[wa >= opt_uagf2.chempot[0]]) argb = np.argmin(wb[wb >= opt_uagf2.chempot[1]]) e1, v1 = opt_uagf2.ea e2, v2 = uagf2.ea self.assertAlmostEqual(e1, e2, 4) self.assertAlmostEqual(np.linalg.norm(v1), np.linalg.norm(v2), 4)
def test_uagf2(self): # Dependent upon UAGF2 passing tests dm0 = self.uhf.rdm1_mo opt_uagf2 = agf2.OptUAGF2(self.uhf_df, dm0=dm0, verbose=False, etol=1e-7) opt_uagf2.run() uagf2 = agf2.UAGF2(self.uhf, nmom=(None, 0), verbose=False, etol=1e-7) uagf2.run() self.assertAlmostEqual(uagf2.e_mp2, opt_uagf2.e_mp2, 4) self.assertAlmostEqual(np.trace(uagf2.rdm1[0]), np.trace(opt_uagf2.rdm1[0]), 4) self.assertAlmostEqual(np.trace(uagf2.rdm1[1]), np.trace(opt_uagf2.rdm1[1]), 4) self.assertAlmostEqual(uagf2.e_1body, opt_uagf2.e_1body, 3) self.assertAlmostEqual(uagf2.e_2body, opt_uagf2.e_2body, 3) self.assertAlmostEqual(uagf2.e_hf, opt_uagf2.e_hf, 3) self.assertAlmostEqual(uagf2.e_corr, opt_uagf2.e_corr, 3) self.assertAlmostEqual(uagf2.e_tot, opt_uagf2.e_tot, 3) self.assertAlmostEqual(uagf2.chempot[0], opt_uagf2.chempot[0], 4) self.assertAlmostEqual(uagf2.chempot[1], opt_uagf2.chempot[1], 4)
from auxgf import mol, hf, agf2 from auxgf.util import Timer timer = Timer() # Build the Molecule object: m = mol.Molecule(atoms='H 0 0 0; Be 0 0 1', basis='cc-pvdz', spin=1) # Build the UHF object: uhf = hf.UHF(m) uhf.run() # Build the AGF2 object and run it for a few different settings: # Simple UAGF2(1,1) setup without damping: opts = dict(verbose=False, nmom=(1, 1), damping=0.0) gf2 = agf2.UAGF2(uhf, **opts) gf2.run() print('UAGF2(1,1): converged = %s iterations = %d E(corr) = %.12f' % (gf2.converged, gf2.iteration, gf2.e_corr)) # Tighten the Fock loop and increase to UAGF2(2,2): opts.update( dict(nmom=(2, 2), dtol=1e-10, diis_space=10, fock_maxiter=100, fock_maxruns=25)) gf2 = agf2.UAGF2(uhf, **opts) gf2.run() print('UAGF2(2,2): converged = %s iterations = %d E(corr) = %.12f' % (gf2.converged, gf2.iteration, gf2.e_corr))
def test_get_fock(self): uagf2 = agf2.UAGF2(self.uhf, nmom=(2,2), verbose=False) self.assertAlmostEqual(np.max(np.absolute(uagf2.get_fock() - self.uhf.fock_mo)), 0, 8) self.assertAlmostEqual(np.max(np.absolute(uagf2.get_fock(self.uhf.rdm1_mo) - self.uhf.fock_mo)), 0, 8)
def test_rmp2(self): uagf2 = agf2.UAGF2(self.uhf, nmom=(10, 10), verbose=False) self.assertAlmostEqual(uagf2.e_1body, self.uhf.e_tot, 8) self.assertAlmostEqual(uagf2.e_2body, self.e_mp2, 8) self.assertAlmostEqual(uagf2.e_tot, self.uhf.e_tot + self.e_mp2, 8) self.assertAlmostEqual(uagf2.e_mp2, self.e_mp2, 8)
import numpy as np from pyscf.lib.linalg_helper import davidson from auxgf import mol, hf, cc, aux, agf2 from auxgf.util import Timer timer = Timer() # Build the Molecule object: m = mol.Molecule(atoms='H 0 0 0; Li 0 0 1.64', basis='cc-pvdz') # Build the UHF object: uhf = hf.UHF(m) uhf.run() # Run some UAGF2 calculations: gf2_a = agf2.UAGF2(uhf, nmom=(1, 1), verbose=False).run() gf2_b = agf2.UAGF2(uhf, nmom=(2, 2), verbose=False).run() gf2_c = agf2.UAGF2(uhf, nmom=(3, 3), verbose=False).run() # Method 2: using aux.Aux more: fock = uhf.get_fock(gf2_b.rdm1, basis='mo') ea, ca = gf2_b.se[0].eig(fock[0]) eb, cb = gf2_b.se[1].eig(fock[1]) ca = ca[:uhf.nao] cb = cb[:uhf.nao] gfa = aux.Aux(ea, ca[:uhf.nao], chempot=gf2_b.chempot[0]) gfb = aux.Aux(eb, cb[:uhf.nao], chempot=gf2_b.chempot[1]) ea_hoqmo, ea_luqmo = gfa.as_occupied().e[-1], gfa.as_virtual().e[0] eb_hoqmo, eb_luqmo = gfb.as_occupied().e[-1], gfb.as_virtual().e[0] va_hoqmo, va_luqmo = gfa.as_occupied().v[:, -1], gfa.as_virtual().v[:, 0] vb_hoqmo, vb_luqmo = gfb.as_occupied().v[:, -1], gfb.as_virtual().v[:, 0]