예제 #1
0
    def test_rdm_complex(self):
        mol = gto.M()
        mol.verbose = 0
        nocc = 6
        nvir = 8
        mf = scf.GHF(mol)
        nmo = nocc + nvir
        numpy.random.seed(1)
        eri = (numpy.random.random((nmo, nmo, nmo, nmo)) + numpy.random.random(
            (nmo, nmo, nmo, nmo)) * 1j - (.5 + .5j))
        eri = eri + eri.transpose(1, 0, 3, 2).conj()
        eri = eri + eri.transpose(2, 3, 0, 1)
        eri *= .1

        def get_jk(mol, dm, *args, **kwargs):
            vj = numpy.einsum('ijkl,lk->ij', eri, dm)
            vk = numpy.einsum('ijkl,jk->il', eri, dm)
            return vj, vk

        def get_veff(mol, dm, *args, **kwargs):
            vj, vk = get_jk(mol, dm)
            return vj - vk

        def ao2mofn(mos):
            return eri

        mf.get_jk = get_jk
        mf.get_veff = get_veff
        hcore = numpy.random.random((nmo, nmo)) * .2 + numpy.random.random(
            (nmo, nmo)) * .2j
        hcore = hcore + hcore.T.conj() + numpy.diag(range(nmo)) * 2
        mf.get_hcore = lambda *args: hcore
        mf.get_ovlp = lambda *args: numpy.eye(nmo)
        orbspin = numpy.zeros(nmo, dtype=int)
        orbspin[1::2] = 1
        mf.mo_coeff = lib.tag_array(numpy.eye(nmo) + 0j, orbspin=orbspin)
        mf.mo_occ = numpy.zeros(nmo)
        mf.mo_occ[:nocc] = 1
        mf.e_tot = mf.energy_elec(mf.make_rdm1(), hcore)[0]

        mycc = cc.GCCSD(mf)
        eris = gccsd._make_eris_incore(mycc, mf.mo_coeff, ao2mofn)
        mycc.ao2mo = lambda *args, **kwargs: eris
        mycc.kernel(eris=eris)
        mycc.solve_lambda(eris=eris)
        dm1 = mycc.make_rdm1()
        dm2 = mycc.make_rdm2()

        e1 = numpy.einsum('ij,ji', hcore, dm1)
        e1 += numpy.einsum('ijkl,ijkl', eri, dm2) * .5
        self.assertAlmostEqual(e1, mycc.e_tot, 7)

        self.assertAlmostEqual(
            abs(dm2 - dm2.transpose(1, 0, 3, 2).conj()).max(), 0, 9)
        self.assertAlmostEqual(
            abs(dm2 - dm2.transpose(2, 3, 0, 1)).max(), 0, 9)
        self.assertAlmostEqual(
            abs(dm2 + dm2.transpose(2, 1, 0, 3)).max(), 0, 9)
        self.assertAlmostEqual(
            abs(dm2 + dm2.transpose(0, 3, 2, 1)).max(), 0, 9)
예제 #2
0
    def ao2mo(self, mo_coeff=None):
        from pyscf.pbc import tools
        with_df = self._scf.with_df
        kpt = self._scf.kpt
        def ao2mofn(mo_coeff):
            nao, nmo = mo_coeff.shape
            mo_a = mo_coeff[:nao//2]
            mo_b = mo_coeff[nao//2:]
            orbspin = getattr(mo_coeff, 'orbspin', None)
            if orbspin is None:
                eri  = with_df.ao2mo(mo_a, kpt, compact=False)
                eri += with_df.ao2mo(mo_b, kpt, compact=False)
                eri1 = with_df.ao2mo((mo_a,mo_a,mo_b,mo_b), kpt, compact=False)
                eri += eri1
                eri += eri1.T
                eri = eri.reshape([nmo]*4)
            else:
                mo = mo_a + mo_b
                eri  = with_df.ao2mo(mo, kpt, compact=False).reshape([nmo]*4)
                sym_forbid = (orbspin[:,None] != orbspin)
                eri[sym_forbid,:,:] = 0
                eri[:,:,sym_forbid] = 0
            return eri

        # _scf.exxdiv affects eris.fock. HF exchange correction should be
        # excluded from the Fock matrix.
        with lib.temporary_env(self._scf, exxdiv=None):
            eris = gccsd._make_eris_incore(self, mo_coeff, ao2mofn=ao2mofn)

        #if mo_coeff is self._scf.mo_coeff:
        #    eris.mo_energy = self._scf.mo_energy[self.get_frozen_mask()]
        #else:
        madelung = tools.madelung(self._scf.cell, self._scf.kpt)
        eris.mo_energy = _adjust_occ(eris.mo_energy, eris.nocc, -madelung)
        return eris
예제 #3
0
파일: ccsd.py 프로젝트: zwang123/pyscf
    def ao2mo(self, mo_coeff=None):
        with_df = self._scf.with_df
        kpt = self._scf.kpt

        def ao2mofn(mo_coeff):
            nao, nmo = mo_coeff.shape
            mo_a = mo_coeff[:nao // 2]
            mo_b = mo_coeff[nao // 2:]
            orbspin = getattr(mo_coeff, 'orbspin', None)
            if orbspin is None:
                eri = with_df.ao2mo(mo_a, kpt, compact=False)
                eri += with_df.ao2mo(mo_b, kpt, compact=False)
                eri1 = with_df.ao2mo((mo_a, mo_a, mo_b, mo_b),
                                     kpt,
                                     compact=False)
                eri += eri1
                eri += eri1.T
                eri = eri.reshape([nmo] * 4)
            else:
                mo = mo_a + mo_b
                eri = with_df.ao2mo(mo, kpt, compact=False).reshape([nmo] * 4)
                sym_forbid = (orbspin[:, None] != orbspin)
                eri[sym_forbid, :, :] = 0
                eri[:, :, sym_forbid] = 0
            return eri

        return gccsd._make_eris_incore(self, mo_coeff, ao2mofn=ao2mofn)
예제 #4
0
파일: ccsd.py 프로젝트: chrinide/pyscf
    def ao2mo(self, mo_coeff=None):
        from pyscf.pbc import tools
        with_df = self._scf.with_df
        kpt = self._scf.kpt
        def ao2mofn(mo_coeff):
            nao, nmo = mo_coeff.shape
            mo_a = mo_coeff[:nao//2]
            mo_b = mo_coeff[nao//2:]
            orbspin = getattr(mo_coeff, 'orbspin', None)
            if orbspin is None:
                eri  = with_df.ao2mo(mo_a, kpt, compact=False)
                eri += with_df.ao2mo(mo_b, kpt, compact=False)
                eri1 = with_df.ao2mo((mo_a,mo_a,mo_b,mo_b), kpt, compact=False)
                eri += eri1
                eri += eri1.T
                eri = eri.reshape([nmo]*4)
            else:
                mo = mo_a + mo_b
                eri  = with_df.ao2mo(mo, kpt, compact=False).reshape([nmo]*4)
                sym_forbid = (orbspin[:,None] != orbspin)
                eri[sym_forbid,:,:] = 0
                eri[:,:,sym_forbid] = 0
            return eri

        # _scf.exxdiv affects eris.fock. HF exchange correction should be
        # excluded from the Fock matrix.
        with lib.temporary_env(self._scf, exxdiv=None):
            eris = gccsd._make_eris_incore(self, mo_coeff, ao2mofn=ao2mofn)

        #if mo_coeff is self._scf.mo_coeff:
        #    eris.mo_energy = self._scf.mo_energy[self.get_frozen_mask()]
        #else:
        madelung = tools.madelung(self._scf.cell, self._scf.kpt)
        eris.mo_energy = _adjust_occ(eris.mo_energy, eris.nocc, -madelung)
        return eris
예제 #5
0
    def test_ERIS(self):
        gcc = gccsd.GCCSD(mf, frozen=4)
        numpy.random.seed(9)
        mo_coeff0 = numpy.random.random(mf.mo_coeff.shape) - .9
        nao = mo_coeff0.shape[0] // 2
        orbspin = numpy.array([
            0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1,
            0, 1, 0, 1
        ])
        mo_coeff0[nao:, orbspin == 0] = 0
        mo_coeff0[:nao, orbspin == 1] = 0
        mo_coeff1 = mo_coeff0.copy()
        mo_coeff1[-1, 0] = 1e-12

        eris = gccsd._make_eris_incore(gcc, mo_coeff0)
        self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)

        eris = gccsd._make_eris_outcore(gcc, mo_coeff0)
        self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)

        eris = gccsd._make_eris_incore(gcc, mo_coeff1)
        self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)

        gcc.max_memory = 0
        eris = gcc.ao2mo(mo_coeff1)
        self.assertAlmostEqual(lib.finger(eris.oooo), 15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov), 2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)
예제 #6
0
파일: test_gccsd.py 프로젝트: sunqm/pyscf
    def test_ERIS(self):
        gcc = gccsd.GCCSD(mf, frozen=4)
        numpy.random.seed(9)
        mo_coeff0 = numpy.random.random(mf.mo_coeff.shape) - .9
        nao = mo_coeff0.shape[0]//2
        orbspin = numpy.array([0,1,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,1])
        mo_coeff0[nao:,orbspin==0] = 0
        mo_coeff0[:nao,orbspin==1] = 0
        mo_coeff1 = mo_coeff0.copy()
        mo_coeff1[-1,0] = 1e-12

        eris = gccsd._make_eris_incore(gcc, mo_coeff0)
        self.assertAlmostEqual(lib.finger(eris.oooo),  15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov),   2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)

        eris = gccsd._make_eris_outcore(gcc, mo_coeff0)
        self.assertAlmostEqual(lib.finger(eris.oooo),  15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov),   2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)

        eris = gccsd._make_eris_incore(gcc, mo_coeff1)
        self.assertAlmostEqual(lib.finger(eris.oooo),  15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov),   2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)

        gcc.max_memory = 0
        eris = gcc.ao2mo(mo_coeff1)
        self.assertAlmostEqual(lib.finger(eris.oooo),  15.97533838570434, 9)
        self.assertAlmostEqual(lib.finger(eris.ooov), -80.97666019169982, 9)
        self.assertAlmostEqual(lib.finger(eris.oovv), 278.00028168381675, 9)
        self.assertAlmostEqual(lib.finger(eris.ovov),   2.34326750142844, 9)
        self.assertAlmostEqual(lib.finger(eris.ovvv), 908.61659731634768, 9)
        self.assertAlmostEqual(lib.finger(eris.vvvv), 756.77383112217694, 9)
예제 #7
0
 def ao2mo(self, mo_coeff=None):
     nmo = self.nmo
     mem_incore = nmo**4*2 * 8/1e6
     mem_now = lib.current_memory()[0]
     if (self._scf._eri is not None and
         (mem_incore+mem_now < self.max_memory) or self.mol.incore_anyway):
         return gccsd._make_eris_incore(self, mo_coeff)
     elif getattr(self._scf, 'with_df', None):
         raise NotImplementedError
     else:
         return gccsd._make_eris_outcore(self, mo_coeff)
예제 #8
0
파일: gcisd.py 프로젝트: chrinide/pyscf
 def ao2mo(self, mo_coeff=None):
     nmo = self.nmo
     mem_incore = nmo**4*2 * 8/1e6
     mem_now = lib.current_memory()[0]
     if (self._scf._eri is not None and
         (mem_incore+mem_now < self.max_memory) or self.mol.incore_anyway):
         return gccsd._make_eris_incore(self, mo_coeff)
     elif getattr(self._scf, 'with_df', None):
         raise NotImplementedError
     else:
         return gccsd._make_eris_outcore(self, mo_coeff)
예제 #9
0
파일: test_gccsd.py 프로젝트: sunqm/pyscf
    def test_rdm_complex(self):
        mol = gto.M()
        mol.verbose = 0
        nocc = 6
        nvir = 8
        mf = scf.GHF(mol)
        nmo = nocc + nvir
        numpy.random.seed(1)
        eri = (numpy.random.random((nmo,nmo,nmo,nmo)) +
               numpy.random.random((nmo,nmo,nmo,nmo))* 1j - (.5+.5j))
        eri = eri + eri.transpose(1,0,3,2).conj()
        eri = eri + eri.transpose(2,3,0,1)
        eri *= .1

        def get_jk(mol, dm, *args,**kwargs):
            vj = numpy.einsum('ijkl,lk->ij', eri, dm)
            vk = numpy.einsum('ijkl,jk->il', eri, dm)
            return vj, vk
        def get_veff(mol, dm, *args, **kwargs):
            vj, vk = get_jk(mol, dm)
            return vj - vk
        def ao2mofn(mos):
            return eri

        mf.get_jk = get_jk
        mf.get_veff = get_veff
        hcore = numpy.random.random((nmo,nmo)) * .2 + numpy.random.random((nmo,nmo))* .2j
        hcore = hcore + hcore.T.conj() + numpy.diag(range(nmo))*2
        mf.get_hcore = lambda *args: hcore
        mf.get_ovlp = lambda *args: numpy.eye(nmo)
        orbspin = numpy.zeros(nmo, dtype=int)
        orbspin[1::2] = 1
        mf.mo_coeff = lib.tag_array(numpy.eye(nmo) + 0j, orbspin=orbspin)
        mf.mo_occ = numpy.zeros(nmo)
        mf.mo_occ[:nocc] = 1
        mf.e_tot = mf.energy_elec(mf.make_rdm1(), hcore)[0]

        mycc = cc.GCCSD(mf)
        eris = gccsd._make_eris_incore(mycc, mf.mo_coeff, ao2mofn)
        mycc.ao2mo = lambda *args, **kwargs: eris
        mycc.kernel(eris=eris)
        mycc.solve_lambda(eris=eris)
        dm1 = mycc.make_rdm1()
        dm2 = mycc.make_rdm2()

        e1 = numpy.einsum('ij,ji', hcore, dm1)
        e1+= numpy.einsum('ijkl,ijkl', eri, dm2) * .5
        self.assertAlmostEqual(e1, mycc.e_tot, 7)

        self.assertAlmostEqual(abs(dm2-dm2.transpose(1,0,3,2).conj()).max(), 0, 9)
        self.assertAlmostEqual(abs(dm2-dm2.transpose(2,3,0,1)       ).max(), 0, 9)
        self.assertAlmostEqual(abs(dm2+dm2.transpose(2,1,0,3)       ).max(), 0, 9)
        self.assertAlmostEqual(abs(dm2+dm2.transpose(0,3,2,1)       ).max(), 0, 9)