Ejemplo n.º 1
0
    def test_ao2mo_7d(self):
        L = 3.
        n = 6
        cell = pgto.Cell()
        cell.a = numpy.diag([L, L, L])
        cell.mesh = [n, n, n]
        cell.atom = '''He    2.    2.2      2.
                       He    1.2   1.       1.'''
        cell.basis = {'He': [[0, (1.2, 1)], [1, (0.6, 1)]]}
        cell.verbose = 0
        cell.build(0, 0)

        kpts = cell.make_kpts([1, 3, 1])
        nkpts = len(kpts)
        nao = cell.nao_nr()
        numpy.random.seed(1)
        mo = (numpy.random.random((nkpts, nao, nao)) + numpy.random.random(
            (nkpts, nao, nao)) * 1j)

        with_df = rsdf.RSDF(cell, kpts)
        out = with_df.ao2mo_7d(mo, kpts)
        ref = numpy.empty_like(out)

        kconserv = kpts_helper.get_kconserv(cell, kpts)
        for ki, kj, kk in kpts_helper.loop_kkk(nkpts):
            kl = kconserv[ki, kj, kk]
            tmp = with_df.ao2mo((mo[ki], mo[kj], mo[kk], mo[kl]),
                                kpts[[ki, kj, kk, kl]])
            ref[ki, kj, kk] = tmp.reshape([nao] * 4)

        self.assertAlmostEqual(abs(out - ref).max(), 0, 12)
Ejemplo n.º 2
0
def setUpModule():
    global cell, mf0, kmdf, kpts
    L = 5.
    n = 11
    cell = pgto.Cell()
    cell.a = numpy.diag([L, L, L])
    cell.mesh = numpy.array([n, n, n])

    cell.atom = '''He    3.    2.       3.
                   He    1.    1.       1.'''
    cell.basis = 'ccpvdz'
    cell.verbose = 0
    cell.max_memory = 1000
    cell.build(0, 0)

    mf0 = pscf.RHF(cell)
    mf0.exxdiv = 'vcut_sph'

    numpy.random.seed(1)
    kpts = numpy.random.random((5, 3))
    kpts[0] = 0
    kpts[3] = kpts[0] - kpts[1] + kpts[2]
    kpts[4] *= 1e-5

    kmdf = rsdf.RSDF(cell)
    kmdf.linear_dep_threshold = 1e-7
    kmdf.auxbasis = 'weigend'
    kmdf.kpts = kpts
Ejemplo n.º 3
0
    def test_get_eri_gamma(self):
        odf = rsdf.RSDF(cell)
        odf.linear_dep_threshold = 1e-7
        odf.auxbasis = 'weigend'
        eri0000 = odf.get_eri()
        self.assertTrue(eri0000.dtype == numpy.double)
        self.assertAlmostEqual(eri0000.real.sum(), 41.6128153879698, 7)
        self.assertAlmostEqual(lib.fp(eri0000), 1.998147596746171, 7)

        eri1111 = kmdf.get_eri((kpts[0], kpts[0], kpts[0], kpts[0]))
        self.assertTrue(eri1111.dtype == numpy.double)
        self.assertAlmostEqual(eri1111.real.sum(), 41.61281538796979, 7)
        self.assertAlmostEqual(eri1111.imag.sum(), 0, 7)
        self.assertAlmostEqual(lib.fp(eri1111), 1.9981475967461677, 7)
        self.assertAlmostEqual(abs(eri1111 - eri0000).max(), 0, 7)

        eri4444 = kmdf.get_eri((kpts[4], kpts[4], kpts[4], kpts[4]))
        self.assertTrue(eri4444.dtype == numpy.complex128)
        self.assertAlmostEqual(eri4444.real.sum(), 62.55123862990809, 7)
        self.assertAlmostEqual(
            abs(eri4444.imag).sum(), 1.8446941199052448e-07, 7)
        self.assertAlmostEqual(lib.fp(eri4444),
                               0.6205986625996083 - 6.3855069621608306e-09j, 8)
        eri0000 = ao2mo.restore(1, eri0000,
                                cell.nao_nr()).reshape(eri4444.shape)
        self.assertAlmostEqual(abs(eri0000 - eri4444).max(), 0, 4)
Ejemplo n.º 4
0
 def test_k_kpts_2(self):
     cell = pgto.Cell()
     cell.atom = 'He 1. .5 .5; He .1 1.3 2.1'
     cell.basis = {'He': [(0, (2.5, 1)), (0, (1., 1))]}
     cell.a = numpy.eye(3) * 2.5
     cell.mesh = [11] * 3
     cell.build()
     kpts = cell.get_abs_kpts([[-.25,-.25,-.25],
                               [-.25,-.25, .25],
                               [-.25, .25,-.25],
                               [-.25, .25, .25],
                               [ .25,-.25,-.25],
                               [ .25,-.25, .25],
                               [ .25, .25,-.25],
                               [ .25, .25, .25]])
     mydf = rsdf.RSDF(cell).set(auxbasis='weigend')
     mydf.linear_dep_threshold = 1e-7
     mydf.kpts = kpts
     mydf.auxbasis = {'He': [(0, (4.096, 1)), (0, (2.56, 1)), (0, (1.6, 1)), (0, (1., 1))]}
     mydf.exxdiv = None
     mydf.omega = 0.3
     mydf.exp_to_discard = 0.3
     nao = cell.nao_nr()
     numpy.random.seed(1)
     dm = numpy.random.random((8,nao,nao))
     dm = dm + dm.transpose(0,2,1)
     vk = df_jk.get_k_kpts(mydf, dm, 1, mydf.kpts)
     self.assertAlmostEqual(lib.fp(vk[0]), (1.0940331326660724 -0.01474246983191657j ), 7)
     self.assertAlmostEqual(lib.fp(vk[1]), (0.72106828546205248+0.008683360062569572j), 7)
     self.assertAlmostEqual(lib.fp(vk[2]), (0.89868267009698988-0.011091489111877838j), 7)
     self.assertAlmostEqual(lib.fp(vk[3]), (1.2604941401190835 +0.015979544115384041j), 7)
     self.assertAlmostEqual(lib.fp(vk[4]), (1.0492129520812594 -0.012424653667344821j), 7)
     self.assertAlmostEqual(lib.fp(vk[5]), (0.99271107721956797+0.012696925711370165j), 7)
     self.assertAlmostEqual(lib.fp(vk[6]), (0.92184754518871648-0.012035727588110348j), 7)
     self.assertAlmostEqual(lib.fp(vk[7]), (0.8518483148628242 +0.010084767506077213j), 7)
Ejemplo n.º 5
0
def density_fit(mf, auxbasis=None, mesh=None, with_df=None):
    '''Generate density-fitting SCF object

    Args:
        auxbasis : str or basis dict
            Same format to the input attribute mol.basis.  If auxbasis is
            None, auxiliary basis based on AO basis (if possible) or
            even-tempered Gaussian basis will be used.
        mesh : tuple
            number of grids in each direction
        with_df : DF object
    '''
    from pyscf.pbc.df import rsdf
    if with_df is None:
        if getattr(mf, 'kpts', None) is not None:
            kpts = mf.kpts
        else:
            kpts = numpy.reshape(mf.kpt, (1,3))

        with_df = rsdf.RSDF(mf.cell, kpts)
        with_df.max_memory = mf.max_memory
        with_df.stdout = mf.stdout
        with_df.verbose = mf.verbose
        with_df.auxbasis = auxbasis
        if mesh is not None:
            with_df.mesh = mesh

    mf = copy.copy(mf)
    mf.with_df = with_df
    mf._eri = None
    return mf
Ejemplo n.º 6
0
    def test_k_kpts_1(self):
        cell = pgto.Cell()
        cell.atom = 'He 1. .5 .5; He .1 1.3 2.1'
        cell.basis = {'He': [(0, (2.5, 1)), (0, (1., 1))]}
        cell.a = numpy.eye(3) * 2.5
        cell.mesh = [11] * 3
        cell.build()
        kpts = cell.get_abs_kpts([[-.25,-.25,-.25],
                                  [-.25,-.25, .25],
                                  [-.25, .25,-.25],
                                  [-.25, .25, .25],
                                  [ .25,-.25,-.25],
                                  [ .25,-.25, .25],
                                  [ .25, .25,-.25],
                                  [ .25, .25, .25]])

        numpy.random.seed(1)
        nao = cell.nao_nr()
        dm = numpy.random.random((8,nao,nao))
        mydf = rsdf.RSDF(cell).set(auxbasis='weigend')
        mydf.linear_dep_threshold = 1e-7
        mydf.kpts = kpts
        mydf.auxbasis = {'He': [(0, (4.096, 1)), (0, (2.56, 1)), (0, (1.6, 1)), (0, (1., 1))]}
        mydf.exxdiv = None
        mydf.omega = 0.3
        mydf.exp_to_discard = 0.3
        vk = df_jk.get_k_kpts(mydf, dm, 0, mydf.kpts)
        self.assertAlmostEqual(lib.fp(vk[0]), (0.54220010040518218-0.00787204295681934j  ), 7)
        self.assertAlmostEqual(lib.fp(vk[1]), (0.35987105007103914+0.0036047438452865574j), 7)
        self.assertAlmostEqual(lib.fp(vk[2]), (0.46287057223452965-0.0065045318150024475j), 7)
        self.assertAlmostEqual(lib.fp(vk[3]), (0.63677390788341914+0.0075132081533213447j), 7)
        self.assertAlmostEqual(lib.fp(vk[4]), (0.53680188658523353-0.0076414750780774933j), 7)
        self.assertAlmostEqual(lib.fp(vk[5]), (0.49613855046499666+0.0060603767383680838j), 7)
        self.assertAlmostEqual(lib.fp(vk[6]), (0.45430752211150049-0.0068611602260866128j), 7)
        self.assertAlmostEqual(lib.fp(vk[7]), (0.41856931218763038+0.0051073315205987522j), 7)
Ejemplo n.º 7
0
 def test_jk_hermi0_high_cost(self):
     numpy.random.seed(12)
     nao = cell.nao_nr()
     dm = numpy.random.random((nao,nao))
     dm = dm + dm.T
     dm[:2,-3:] *= .5
     jkdf = rsdf.RSDF(cell).set(auxbasis='weigend')
     jkdf.linear_dep_threshold = 1e-7
     jkdf.omega = 0.3
     jkdf.exp_to_discard = 0.3
     vj0, vk0 = jkdf.get_jk(dm, hermi=0, exxdiv=None)
     ej0 = numpy.einsum('ij,ji->', vj0, dm)
     ek0 = numpy.einsum('ij,ji->', vk0, dm)
     self.assertAlmostEqual(ej0, 242.0415113546338546, 7)
     self.assertAlmostEqual(ek0, 280.5844313219625974, 7)
Ejemplo n.º 8
0
 def test_jk_hermi0(self):
     numpy.random.seed(12)
     nao = cell0.nao_nr()
     dm = numpy.random.random((nao,nao))
     dm = dm + dm.T
     dm[:2,-3:] *= .5
     jkdf = rsdf.RSDF(cell0).set(auxbasis='weigend')
     jkdf.linear_dep_threshold = 1e-7
     jkdf.omega = 0.3
     jkdf.exp_to_discard = 0.3
     vj0, vk0 = jkdf.get_jk(dm, hermi=0, exxdiv=None)
     ej0 = numpy.einsum('ij,ji->', vj0, dm)
     ek0 = numpy.einsum('ij,ji->', vk0, dm)
     self.assertAlmostEqual(ej0, 25.7750081387043, 7)
     self.assertAlmostEqual(ek0, 30.8140235220774, 7)
Ejemplo n.º 9
0
 def test_eri1111(self):
     kpts = numpy.random.random((4, 3)) * .25
     kpts[3] = -numpy.einsum('ij->j', kpts[:3])
     with_df = rsdf.RSDF(cell).set(auxbasis='weigend')
     with_df.linear_dep_threshold = 1e-7
     with_df.kpts = kpts
     mo = (numpy.random.random((nao, nao)) + numpy.random.random(
         (nao, nao)) * 1j)
     eri = with_df.get_eri(kpts).reshape((nao, ) * 4)
     eri0 = numpy.einsum('pjkl,pi->ijkl', eri, mo.conj())
     eri0 = numpy.einsum('ipkl,pj->ijkl', eri0, mo)
     eri0 = numpy.einsum('ijpl,pk->ijkl', eri0, mo.conj())
     eri0 = numpy.einsum('ijkp,pl->ijkl', eri0, mo)
     eri1 = with_df.ao2mo(mo, kpts)
     self.assertAlmostEqual(
         abs(eri1.reshape(eri0.shape) - eri0).sum(), 0, 9)
Ejemplo n.º 10
0
 def test_j_kpts_high_cost(self):
     numpy.random.seed(1)
     nao = cell.nao_nr()
     dm = numpy.random.random((4,nao,nao))
     dm = dm + dm.transpose(0,2,1)
     mydf = rsdf.RSDF(cell).set(auxbasis='weigend')
     mydf.linear_dep_threshold = 1e-7
     mydf.kpts = numpy.random.random((4,3))
     mydf.auxbasis = 'weigend'
     mydf.omega = 0.3
     mydf.exp_to_discard = 0.3
     vj = df_jk.get_j_kpts(mydf, dm, 1, mydf.kpts)
     self.assertAlmostEqual(lib.fp(vj[0]), (0.4917612920404451 + -0.1189108415838486j), 7)
     self.assertAlmostEqual(lib.fp(vj[1]), (0.5490079977477804 + -0.0460035459549861j), 7)
     self.assertAlmostEqual(lib.fp(vj[2]), (0.5364805888399165 + -0.0835075280950256j), 7)
     self.assertAlmostEqual(lib.fp(vj[3]), (0.5489645342271054 + 0.0076957400601779j), 7)
Ejemplo n.º 11
0
 def test_j_kpts(self):
     numpy.random.seed(1)
     nao = cell0.nao_nr()
     dm = numpy.random.random((4,nao,nao))
     dm = dm + dm.transpose(0,2,1)
     mydf = rsdf.RSDF(cell0).set(auxbasis='weigend')
     mydf.linear_dep_threshold = 1e-7
     mydf.kpts = numpy.random.random((4,3))
     mydf.auxbasis = 'weigend'
     mydf.omega = 0.3
     mydf.exp_to_discard = 0.3
     vj = df_jk.get_j_kpts(mydf, dm, 1, mydf.kpts)
     self.assertAlmostEqual(lib.fp(vj[0]), (7.240207870630442-0.001010622364950332j) , 7)
     self.assertAlmostEqual(lib.fp(vj[1]), (7.248745538469966-0.001562604522803734j) , 7)
     self.assertAlmostEqual(lib.fp(vj[2]), (7.241193241602369-0.002518439407055759j) , 7)
     self.assertAlmostEqual(lib.fp(vj[3]), (7.2403591406956185+0.001475803952777666j), 7)
Ejemplo n.º 12
0
 def test_k_kpts_high_cost(self):
     numpy.random.seed(1)
     nao = cell.nao_nr()
     dm = numpy.random.random((4,nao,nao))
     dm = dm + dm.transpose(0,2,1)
     mydf = rsdf.RSDF(cell).set(auxbasis='weigend')
     mydf.linear_dep_threshold = 1e-7
     mydf.kpts = numpy.random.random((4,3))
     mydf.exxdiv = None
     mydf.omega = 0.3
     mydf.exp_to_discard = 0.3
     mydf.auxbasis = 'weigend'
     vk = df_jk.get_k_kpts(mydf, dm, 0, mydf.kpts)
     self.assertAlmostEqual(lib.fp(vk[0]), (-2.8332378458006682 + -1.0578692394119324j), 7)
     self.assertAlmostEqual(lib.fp(vk[1]), (-7.4404313581193380 + 0.1023364493364826j), 7)
     self.assertAlmostEqual(lib.fp(vk[2]), (-2.5718854219888430 + -1.4487422365382123j), 7)
     self.assertAlmostEqual(lib.fp(vk[3]), (-0.7922307287610381 + 0.0116940681352038j), 7)
Ejemplo n.º 13
0
 def test_k_kpts(self):
     numpy.random.seed(1)
     nao = cell0.nao_nr()
     dm = numpy.random.random((4,nao,nao))
     dm = dm + dm.transpose(0,2,1)
     mydf = rsdf.RSDF(cell0).set(auxbasis='weigend')
     mydf.linear_dep_threshold = 1e-7
     mydf.kpts = numpy.random.random((4,3))
     mydf.exxdiv = None
     mydf.omega = 0.3
     mydf.exp_to_discard = 0.3
     mydf.auxbasis = 'weigend'
     vk = df_jk.get_k_kpts(mydf, dm, 0, mydf.kpts)
     self.assertAlmostEqual(lib.fp(vk[0]), (4.831027586092549-0.12376435978940196j) , 7)
     self.assertAlmostEqual(lib.fp(vk[1]), (4.783208264204395-0.00585421470169705j) , 7)
     self.assertAlmostEqual(lib.fp(vk[2]), (4.823839360632854+0.002511545727704362j), 7)
     self.assertAlmostEqual(lib.fp(vk[3]), (4.833891390413435+0.0208696082684768j)  , 7)
Ejemplo n.º 14
0
    def test_jk_single_kpt_high_cost(self):
        mf0 = pscf.RHF(cell)
        mf0.exxdiv = None
        mf = rsdf_jk.density_fit(mf0, auxbasis='weigend', mesh=(11,)*3)
        mf.with_df.mesh = cell.mesh
        mf.with_df.omega = 0.3
        mf.with_df.exp_to_discard = 0.3
        dm = mf.get_init_guess()
        vj, vk = mf.get_jk(cell, dm)
        ej1 = numpy.einsum('ij,ji->', vj, dm)
        ek1 = numpy.einsum('ij,ji->', vk, dm)
        j_ref = 48.283789539266174  # rsjk result
        k_ref = 32.30441176447805   # rsjk result
        self.assertAlmostEqual(ej1, j_ref, 4)
        self.assertAlmostEqual(ek1, k_ref, 2)
        self.assertAlmostEqual(ej1, 48.2837455394308037, 7)
        self.assertAlmostEqual(ek1, 32.3026087105977950, 7)

        numpy.random.seed(12)
        nao = cell.nao_nr()
        dm = numpy.random.random((nao,nao))
        dm = dm + dm.T
        vj1, vk1 = mf.get_jk(cell, dm, hermi=0)
        ej1 = numpy.einsum('ij,ji->', vj1, dm)
        ek1 = numpy.einsum('ij,ji->', vk1, dm)
        self.assertAlmostEqual(ej1, 242.0467816643269714, 7)
        self.assertAlmostEqual(ek1, 280.1593488661793572, 7)

        numpy.random.seed(1)
        kpt = numpy.random.random(3)
        mydf = rsdf.RSDF(cell, [kpt]).set(auxbasis='weigend')
        mydf.linear_dep_threshold = 1e-7
        mydf.omega = 0.3
        mydf.exp_to_discard = 0.3
        vj, vk = mydf.get_jk(dm, 1, kpt, exxdiv=None)
        ej1 = numpy.einsum('ij,ji->', vj, dm)
        ek1 = numpy.einsum('ij,ji->', vk, dm)
        self.assertAlmostEqual(ej1, 241.1512182675005249+0j, 7)
        self.assertAlmostEqual(ek1, 279.6464915858919085+0j, 7)
        vj, vk = mydf.get_jk(dm, 1, kpt, with_j=False, exxdiv='ewald')
        ek1 = numpy.einsum('ij,ji->', vk, dm)
        self.assertAlmostEqual(ek1, 691.6462442086188958+0j, 6)
Ejemplo n.º 15
0
    def test_eri0000(self):
        with_df = rsdf.RSDF(cell).set(auxbasis='weigend')
        with_df.linear_dep_threshold = 1e-7
        with_df.kpts = numpy.zeros((4, 3))
        mo = (numpy.random.random((nao, nao)) + numpy.random.random(
            (nao, nao)) * 1j)
        eri = ao2mo.restore(1, with_df.get_eri(with_df.kpts), nao)
        eri0 = numpy.einsum('pjkl,pi->ijkl', eri, mo.conj())
        eri0 = numpy.einsum('ipkl,pj->ijkl', eri0, mo)
        eri0 = numpy.einsum('ijpl,pk->ijkl', eri0, mo.conj())
        eri0 = numpy.einsum('ijkp,pl->ijkl', eri0, mo)
        eri1 = with_df.ao2mo(mo, with_df.kpts)
        self.assertAlmostEqual(
            abs(eri1.reshape(eri0.shape) - eri0).sum(), 0, 9)

        mo = mo.real
        eri0 = numpy.einsum('pjkl,pi->ijkl', eri, mo.conj())
        eri0 = numpy.einsum('ipkl,pj->ijkl', eri0, mo)
        eri0 = numpy.einsum('ijpl,pk->ijkl', eri0, mo.conj())
        eri0 = numpy.einsum('ijkp,pl->ijkl', eri0, mo)
        eri1 = with_df.ao2mo(mo, with_df.kpts, compact=False)
        self.assertAlmostEqual(
            abs(eri1.reshape(eri0.shape) - eri0).sum(), 0, 9)
Ejemplo n.º 16
0
cell.basis = 'ccpvdz'
cell.verbose = 0
cell.max_memory = 1000
cell.build(0,0)

mf0 = pscf.RHF(cell)
mf0.exxdiv = 'vcut_sph'


numpy.random.seed(1)
kpts = numpy.random.random((5,3))
kpts[0] = 0
kpts[3] = kpts[0]-kpts[1]+kpts[2]
kpts[4] *= 1e-5

kmdf = rsdf.RSDF(cell)
kmdf.linear_dep_threshold = 1e-7
kmdf.auxbasis = 'weigend'
kmdf.kpts = kpts

def tearDownModule():
    global cell, mf0, kmdf
    del cell, mf0, kmdf


class KnownValues(unittest.TestCase):
    def test_get_eri_gamma(self):
        odf = rsdf.RSDF(cell)
        odf.linear_dep_threshold = 1e-7
        odf.auxbasis = 'weigend'
        eri0000 = odf.get_eri()