Exemple #1
0
 def check_frozen(frozen):
     myci = ci.UCISD(mf)
     myci.frozen = frozen
     myci.nroots = 2
     myci.kernel()
     nocc = myci.nocc
     nmo = myci.nmo
     norb = mf.mo_coeff[0].shape[1]
     nfroz = len(frozen[0])
     cibra = (myci.ci[0] + myci.ci[1]) * numpy.sqrt(.5)
     fcibra = ucisd.to_fcivec(cibra, norb, mol.nelec, myci.frozen)
     fciket = ucisd.to_fcivec(myci.ci[1], norb, mol.nelec, myci.frozen)
     fcidm1 = fci.direct_spin1.trans_rdm1s(fcibra, fciket, norb, mol.nelec)
     cidm1  = myci.trans_rdm1(cibra, myci.ci[1], nmo, nocc)
     self.assertAlmostEqual(abs(fcidm1[0]-cidm1[0]).max(), 0, 12)
     self.assertAlmostEqual(abs(fcidm1[1]-cidm1[1]).max(), 0, 12)
Exemple #2
0
    def test_contract(self):
        '''cross check with UCISD'''
        mol = gto.M()
        mol.nelectron = 6
        nocc, nvir = mol.nelectron // 2, 4
        nmo = nocc + nvir
        nmo_pair = nmo * (nmo + 1) // 2
        mf = scf.UHF(mol)
        numpy.random.seed(12)
        mf._eri = numpy.random.random(nmo_pair * (nmo_pair + 1) // 2) * .2
        mf.mo_coeff = numpy.random.random((2, nmo, nmo))
        mf.mo_energy = [numpy.arange(0., nmo)] * 2
        mf.mo_occ = numpy.zeros((2, nmo))
        mf.mo_occ[:, :nocc] = 1
        h1 = numpy.random.random((nmo, nmo)) * .1
        h1 = h1 + h1.T + numpy.diag(numpy.arange(nmo))
        mf.get_hcore = lambda *args: h1

        mf1 = scf.addons.convert_to_ghf(mf)
        mf1.get_hcore = lambda *args: scipy.linalg.block_diag(h1, h1)
        gci = ci.GCISD(mf1)
        c2 = numpy.random.random(
            (nocc * 2, nocc * 2, nvir * 2, nvir * 2)) * .1 - .1
        c2 = c2 - c2.transpose(0, 1, 3, 2)
        c2 = c2 - c2.transpose(1, 0, 2, 3)
        c1 = numpy.random.random((nocc * 2, nvir * 2)) * .1
        c0 = .5
        civec = gci.amplitudes_to_cisdvec(c0, c1, c2)
        civecref = gci.contract(civec, gci.ao2mo())
        c0ref, c1ref, c2ref = gci.cisdvec_to_amplitudes(civecref)
        c1ref = gci.spin2spatial(c1ref)
        c2ref = gci.spin2spatial(c2ref)

        c1 = gci.spin2spatial(c1)
        c2 = gci.spin2spatial(c2)
        myci = ci.UCISD(mf)
        civec = myci.amplitudes_to_cisdvec(c0, c1, c2)
        cinew = myci.contract(civec, myci.ao2mo())
        c0new, c1new, c2new = myci.cisdvec_to_amplitudes(cinew)
        self.assertAlmostEqual(abs(c0new - c0ref).max(), 0, 12)
        self.assertAlmostEqual(abs(c1new[0] - c1ref[0]).max(), 0, 12)
        self.assertAlmostEqual(abs(c1new[1] - c1ref[1]).max(), 0, 12)
        self.assertAlmostEqual(abs(c2new[0] - c2ref[0]).max(), 0, 12)
        self.assertAlmostEqual(abs(c2new[1] - c2ref[1]).max(), 0, 12)
        self.assertAlmostEqual(abs(c2new[2] - c2ref[2]).max(), 0, 12)
        self.assertAlmostEqual(lib.finger(cinew), -102.17887236599671, 9)
Exemple #3
0
    def test_trans_rdm1(self):
        numpy.random.seed(1)
        norb = 4
        nocc = 2
        nvir = norb - nocc
        c2 = numpy.random.random((nocc, nocc, nvir, nvir))
        c2 = c2 + c2.transpose(1, 0, 3, 2)
        cibra = numpy.hstack(
            (numpy.random.random(1 + nocc * nvir), c2.ravel()))
        c2 = numpy.random.random((nocc, nocc, nvir, nvir))
        c2 = c2 + c2.transpose(1, 0, 3, 2)
        ciket = numpy.hstack(
            (numpy.random.random(1 + nocc * nvir), c2.ravel()))
        cibra /= ci.cisd.dot(cibra, cibra, norb, nocc)**.5
        ciket /= ci.cisd.dot(ciket, ciket, norb, nocc)**.5
        fcibra = ci.cisd.to_fcivec(cibra, norb, nocc * 2)
        fciket = ci.cisd.to_fcivec(ciket, norb, nocc * 2)

        fcidm1 = fci.direct_spin1.trans_rdm1s(fcibra, fciket, norb, nocc * 2)
        myci1 = ci.GCISD(scf.GHF(gto.M()))
        myci1.nmo = norb = 8
        myci1.nocc = nocc = 4
        orbspin = numpy.zeros(norb, dtype=int)
        orbspin[1::2] = 1
        myci1.mo_coeff = lib.tag_array(numpy.eye(norb), orbspin=orbspin)
        myci1.mo_occ = numpy.zeros(norb)
        myci1.mo_occ[:nocc] = 1
        cibra = myci1.from_rcisdvec(cibra, (nocc // 2, nocc // 2), orbspin)
        ciket = myci1.from_rcisdvec(ciket)
        cidm1 = myci1.trans_rdm1(cibra, ciket, norb, nocc)
        self.assertAlmostEqual(abs(cidm1[0::2, 0::2] - fcidm1[0]).max(), 0, 12)
        self.assertAlmostEqual(abs(cidm1[1::2, 1::2] - fcidm1[1]).max(), 0, 12)

        cibra = myci1.to_ucisdvec(cibra, orbspin)
        ciket = myci1.to_ucisdvec(ciket)
        myci2 = ci.UCISD(scf.UHF(gto.M()))
        cidm1 = myci2.trans_rdm1(cibra, ciket, (norb // 2, norb // 2),
                                 (nocc // 2, nocc // 2))
        self.assertAlmostEqual(abs(cidm1[0] - fcidm1[0]).max(), 0, 12)
        self.assertAlmostEqual(abs(cidm1[1] - fcidm1[1]).max(), 0, 12)
Exemple #4
0
ci2 = ci.CISD(myhf2).run()
print('CISD energy of mol2', ci2.e_tot)

s12 = gto.intor_cross('cint1e_ovlp_sph', myhf1.mol, myhf2.mol)
s12 = reduce(numpy.dot, (myhf1.mo_coeff.T, s12, myhf2.mo_coeff))
nmo = myhf2.mo_energy.size
nocc = myhf2.mol.nelectron // 2
print('<CISD-mol1|CISD-mol2> = ',
      ci.cisd.overlap(ci1.ci, ci2.ci, nmo, nocc, s12))

#
# UCISD wavefunction overlap
#
myhf1 = gto.M(atom='H 0 0 0; F 0 0 1.1', basis='6-31g', spin=2,
              verbose=0).apply(scf.UHF).run()
ci1 = ci.UCISD(myhf1).run()
print('CISD energy of mol1', ci1.e_tot)

myhf2 = gto.M(atom='H 0 0 0; F 0 0 1.2', basis='6-31g', spin=2,
              verbose=0).apply(scf.UHF).run()
ci2 = ci.UCISD(myhf2).run()
print('CISD energy of mol2', ci2.e_tot)

s12 = gto.intor_cross('cint1e_ovlp_sph', myhf1.mol, myhf2.mol)
mo1a, mo1b = myhf1.mo_coeff
mo2a, mo2b = myhf2.mo_coeff
s12 = (reduce(numpy.dot,
              (mo1a.T, s12, mo2a)), reduce(numpy.dot, (mo1b.T, s12, mo2b)))
nmo = (myhf2.mo_energy[0].size, myhf2.mo_energy[1].size)
nocc = myhf2.nelec
print('<CISD-mol1|CISD-mol2> = ',
Exemple #5
0
    mol.verbose = 0
    # UHF for UNOs
    mf = scf.UHF(mol).run(max_cycle=100)
    mo_new = mf.stability()[0]
    while mo_new is not mf.mo_coeff:
        mf.kernel(dm0=mf.make_rdm1(mo_coeff=mo_new))
        mo_new = mf.stability()[0]

    no, occ = UNOs(mf)

    # UHF UMP2
    mp2 = mp.UMP2(mf).run()
    no, occ = nat_orbs_obj(mp2)

    # UHF UCISD
    mci = ci.UCISD(mf).run()
    no, occ = nat_orbs_obj(mci)

    # RHF UCCSD
    dm0 = mf.make_rdm1()
    mf = scf.RHF(mol)
    mf.kernel(dm0=dm0)
    mcc = cc.UCCSD(mf).run()
    no, occ = nat_orbs_obj(mcc)

    # Run a symmetric CASCI to test symmetric natural orbitals.
    mc = mcscf.CASCI(mf, 6, 6)
    solver1 = fci.direct_spin0_symm.FCI(mol)
    solver1.spin = final_spin
    solver1.wfnsym = 'A1g'
    solver1 = fci.addons.fix_spin(solver1,