Exemple #1
0
    def test_sort_left_right_eigensystem(self):
        myeom = eom_rccsd.EOMIP(mycc)
        right_evecs = [numpy.ones(10)] * 4
        left_evecs = [numpy.ones(10)] * 5
        right_evecs = [x * i for i, x in enumerate(right_evecs)]
        left_evecs = [x * i for i, x in enumerate(left_evecs)]
        revals, revecs, levecs = eom_rccsd._sort_left_right_eigensystem(
            myeom, [True, False, True, True], [-1.1, 0, 1.1, 2.2], right_evecs,
            [True, True, True, False, True], [-2.2, -1.1, 0, 1.1, 2.2],
            left_evecs)
        self.assertEqual(revals[0], -1.1)
        self.assertEqual(revals[1], 2.2)
        self.assertEqual(revecs[0][0], 0)
        self.assertEqual(revecs[1][0], 3)
        self.assertEqual(levecs[0][0], 1)
        self.assertEqual(levecs[1][0], 4)

        revals, revecs, levecs = eom_rccsd._sort_left_right_eigensystem(
            myeom, [True, False, True, True], [-1.1, 0, 1.1, 2.2], right_evecs,
            [True, True, False, True, True], [-2.2, -1.1, 0, 1.1, 2.2],
            left_evecs)
        self.assertEqual(revals[0], -1.1)
        self.assertEqual(revals[1], 1.1)
        self.assertEqual(revals[2], 2.2)
        self.assertEqual(revecs[0][0], 0)
        self.assertEqual(revecs[1][0], 2)
        self.assertEqual(revecs[2][0], 3)
        self.assertEqual(levecs[0][0], 1)
        self.assertEqual(levecs[1][0], 3)
        self.assertEqual(levecs[2][0], 4)
Exemple #2
0
    def test_ipccsd3(self):
        e, v = mycc3.ipccsd(nroots=1)
        self.assertAlmostEqual(e, 0.4335604332073799, 6)

        e, v = mycc3.ipccsd(nroots=3)
        self.assertAlmostEqual(e[0], 0.4335604332073799, 6)
        self.assertAlmostEqual(e[1], 0.5187659896045407, 6)
        self.assertAlmostEqual(e[2], 0.6782876002229172, 6)

        myeom = eom_rccsd.EOMIP(mycc3)
        lv = myeom.ipccsd(nroots=3, left=True)[1]
        e = myeom.ipccsd_star(e, v, lv)
        self.assertAlmostEqual(e[0], 0.43793202122290747, 6)
        self.assertAlmostEqual(e[1], 0.52287073076243218, 6)
        self.assertAlmostEqual(e[2], 0.67994597799835099, 6)
Exemple #3
0
 def test_ip_matvec1(self):
     numpy.random.seed(12)
     r1 = numpy.random.random((no)) - .9 + numpy.random.random((no)) * .2j
     r2 = (numpy.random.random((no, no, nv)) - .9 + numpy.random.random(
         (no, no, nv)) * .2j)
     myeom = eom_rccsd.EOMIP(mycci)
     vec = myeom.amplitudes_to_vector(r1, r2)
     r1, r2 = myeom.vector_to_amplitudes(vec)
     eris1
     imds = myeom.make_imds(erisi)
     vec1 = myeom.matvec(vec, imds)
     self.assertAlmostEqual(lib.finger(vec1),
                            25176.428829164193 - 4955.5351324520125j, 9)
     self.assertAlmostEqual(lib.finger(myeom.get_diag()),
                            1106.2601542024306, 9)
Exemple #4
0
    def test_df_ipccsd(self):
        e, v = mycc.ipccsd(nroots=1)
        self.assertAlmostEqual(e, 0.42788191082629801, 6)

        e, v = mycc.ipccsd(nroots=3)
        self.assertAlmostEqual(e[0], 0.42788191082629801, 6)
        self.assertAlmostEqual(e[1], 0.50229582430658171, 6)
        self.assertAlmostEqual(e[2], 0.68557652412060088, 6)

        myeom = eom_rccsd.EOMIP(mycc)
        lv = myeom.ipccsd(nroots=3, left=True)[1]
        e = myeom.ipccsd_star_contract(e, v, lv)
        self.assertAlmostEqual(e[0], 0.43584093045349137, 6)
        self.assertAlmostEqual(e[1], 0.50959675100507518, 6)
        self.assertAlmostEqual(e[2], 0.69021193094404043, 6)
Exemple #5
0
    def test_ipccsd(self):
        eom = mycc.eomip_method()
        e, v = eom.kernel(nroots=1, left=False, koopmans=False)
        e = eom.eip
        self.assertAlmostEqual(e, 0.4335604332073799, 6)

        e, v = mycc.ipccsd(nroots=3)
        self.assertAlmostEqual(e[0], 0.4335604332073799, 6)
        self.assertAlmostEqual(e[1], 0.5187659896045407, 6)
        self.assertAlmostEqual(e[2], 0.6782876002229172, 6)

        myeom = eom_rccsd.EOMIP(mycc)
        lv = myeom.ipccsd(nroots=3, left=True)[1]
        e = myeom.ipccsd_star(e, v, lv)
        self.assertAlmostEqual(e[0], 0.43793202122290747, 6)
        self.assertAlmostEqual(e[1], 0.52287073076243218, 6)
        self.assertAlmostEqual(e[2], 0.67994597799835099, 6)
Exemple #6
0
    def test_h2o_star(self):
        mol_h2o = gto.Mole()
        mol_h2o.atom = [
            [8, [0.000000000000000, -0.000000000000000, -0.124143731294022]],
            [1, [0.000000000000000, -1.430522735894536, 0.985125550040314]],
            [1, [0.000000000000000, 1.430522735894536, 0.985125550040314]]
        ]
        mol_h2o.unit = 'B'
        mol_h2o.basis = {
            'H': [[0, [5.4471780, 0.156285], [0.8245472, 0.904691]],
                  [0, [0.1831916, 1.0]]],
            'O':
            '3-21G'
        }
        mol_h2o.verbose = 7
        mol_h2o.output = '/dev/null'
        mol_h2o.build()
        mol.conv_tol = 1e-12
        mf_h2o = scf.RHF(mol_h2o)
        mf_h2o.conv_tol_grad = 1e-12
        mf_h2o.kernel()
        mycc_h2o = cc.RCCSD(mf_h2o).run()
        mycc_h2o.conv_tol_normt = 1e-12
        mycc_h2o.conv_tol = 1e-12
        mycc_h2o.kernel()

        myeom = eom_rccsd.EOMIP(mycc_h2o)
        e = myeom.ipccsd_star(nroots=3)
        self.assertAlmostEqual(e[0], 0.410661965883, 6)

        myeom = eom_rccsd.EOMIP_Ta(mycc_h2o)
        e = myeom.ipccsd_star(nroots=3)
        self.assertAlmostEqual(e[0], 0.411695647736, 6)

        myeom = eom_rccsd.EOMEA(mycc_h2o)
        e = myeom.eaccsd_star(nroots=3)
        self.assertAlmostEqual(e[0], 0.250589854185, 6)

        myeom = eom_rccsd.EOMEA_Ta(mycc_h2o)
        e = myeom.eaccsd_star(nroots=3)
        self.assertAlmostEqual(e[0], 0.250720295150, 6)
Exemple #7
0
    def test_ip_matvec3(self):
        numpy.random.seed(12)
        r1 = numpy.random.random((no)) - .9
        r2 = numpy.random.random((no, no, nv)) - .9
        myeom = eom_rccsd.EOMIP(mycc31)
        vec = myeom.amplitudes_to_vector(r1, r2)
        r1, r2 = myeom.vector_to_amplitudes(vec)
        myeom.partition = 'mp'
        self.assertAlmostEqual(lib.finger(r1), 0.37404344676857076, 12)
        self.assertAlmostEqual(lib.finger(r2), -1.1568913404570922, 12)
        imds = myeom.make_imds(eris31)
        vec1 = myeom.matvec(vec, imds)
        self.assertAlmostEqual(lib.finger(vec1), -14894.669606811192, 9)
        self.assertAlmostEqual(lib.finger(myeom.get_diag()),
                               1182.3095479451745, 9)

        myeom.partition = 'full'
        imds = myeom.make_imds(eris31)
        diag = myeom.get_diag(imds)
        vec1 = myeom.matvec(vec, imds, diag=diag)
        self.assertAlmostEqual(lib.finger(vec1), -3795.9122245246967, 9)
        self.assertAlmostEqual(lib.finger(diag), 1106.260154202434, 9)
Exemple #8
0
def test():
    nao = 2
    U = 2.

    solver = 'cc'  # 'scf', 'cc', 'fci'
    if solver == 'fci':
        assert (fci_)

    htb = -1*_tb(nao)
    htb[0,0]=0.0

    eri = np.zeros([nao,nao,nao,nao])
    for k in range(nao):
        eri[k,k,k,k] = U
    #delta = _get_delta(htb)

    delta=0.01
    
    mol = gto.M()
    mol.build()
    mol.nelectron = 2 #nao

    mf = scf.RHF(mol)
    mf.verbose = 0
    # mf.verbose = 4
    mf.max_memory = 1000

    mf.get_hcore = lambda *args: htb
    mf.get_ovlp = lambda *args: np.eye(nao)
    mf._eri = ao2mo.restore(8, eri, nao)
    mf.init_guess = '1e'
    mf.scf()

    print 'MF energy = %20.12f' % (mf.e_tot)
    print 'MO energies :'
    print mf.mo_energy
    print '----\n'

    
    HamCheMPS2, theFCI = None, None
    if solver == 'cc':
        cc = ccsd.CCSD(mf)
        ecc = cc.ccsd()[0]
        print "CCSD corr = %20.12f" % (ecc)

        print "Solving lambda equations..."
        cc.solve_lambda()

        print "Repeating with EOM CCSD"
        #cc_eom = eom_rccsd.RCCSD(mf)
        # cc_eomip = eom_rccsd.EOMIP(cc)
        # cc_eomea = eom_rccsd.EOMEA(cc)

        #def ao2mofn_ (mol, bas, compact):
        #    return ao2mo.incore.general(mf._eri, bas, compact=compact)

        #eri_eom = eom_rccsd._ERIS(cc_eom, ao2mofn=ao2mofn_)
        #ecc_eom = cc_eom.ccsd(eris=eri_eom)[0]
        #print "EOM-CCSD corr = %20.12f" % (ecc_eom)
        #print '====\n'

        #cc_eom.t1 = cc.t1
        #cc_eom.t2 = cc.t2
        #cc_eom.l1 = cc.l1
        #cc_eom.l2 = cc.l2

        e_vector = list()
        b_vector = list()
        for q in range(nao):
            e_vector.append(greens_function.greens_e_vector_ip_rhf(cc,q))
            b_vector.append(greens_function.greens_b_vector_ip_rhf(cc,q))

        dm = np.zeros((nao,nao,), np.complex128)
        for q in range(nao):
            for p in range(nao):
                dm[p,q] = -np.dot(e_vector[q], b_vector[p])
        print dm.real
        hc = np.dot(mf.mo_coeff.T, np.dot(mf.get_hcore(), mf.mo_coeff))

        print 'CC IP evals'
        eomip = eom_rccsd.EOMIP(cc)
        evals, evecs = eomip.ipccsd(nroots=e_vector[0].shape[0])
        print evals

        # these are sums over principal poles
        A = np.dot(evecs, np.dot(np.diag(evals), inv(evecs)))

        dt = np.zeros((nao,nao,), np.complex128)
        for q in range(nao):
            for p in range(nao):
                dt[p,q] = np.dot(e_vector[q], np.dot(A, b_vector[p]))

        nn = 2*0.5*np.trace(dm).real
        ee = 2*0.5*np.trace(np.dot(dm, hc)).real \
             + 2*0.5*np.trace(dt).real
        print 'N = %16.8f' % (nn)
        print 'E = %16.8f' % (ee)

    elif solver == 'fci':
        h0   = 0.
        h1t  = np.dot(mf.mo_coeff.T, np.dot(htb, mf.mo_coeff))
        erit = ao2mo.incore.full(mf._eri, mf.mo_coeff, compact=False)
        erit = erit.reshape([nao,nao,nao,nao])

        HamCheMPS2, theFCI, GSvector, en_FCIgs = \
                fci_sol (h0, h1t, erit, mol.nelectron)
        print "FCI corr = %20.12f" % (en_FCIgs-mf.e_tot)

    evals, evecs = scipy.linalg.eigh(htb)

    mu = ( mf.mo_energy[mol.nelectron//2-1] + \
           mf.mo_energy[mol.nelectron//2] )/2.
    #mu += 0.05

    def _gf (w, delta):
        if solver == 'scf':
            return mf_gf (w, delta, mf.mo_coeff, mf.mo_energy)
        elif solver == 'cc':
            return cc_gf (w, delta, cc, mf.mo_coeff)
        elif solver == 'fci':
            return fci_gf (w, delta, mf.mo_coeff, en_FCIgs, GSvector, \
                           HamCheMPS2, theFCI)
    def _mf_gf (w, delta):
        return mf_gf (w, delta, evecs, evals)

    freqs_ = _get_linear_freqs(-6+U/2., 6+U/2., 64)[0]
    gfx = _gf (freqs_, delta)
    dos = np.zeros([freqs_.shape[0]])
    for k in range(nao):
       dos[:] += -1./np.pi * np.imag(gfx[k,k,:])

    plt.plot(freqs_, dos)
    plt.show()

    def _eval_p(w, delta):
        gf_ = _gf(np.array([w]), delta)
        return gf_[:,:,0]
    def _eval_n(w, delta):
        return np.trace(_eval_p(w, delta))

    powers = [10**i for i in range(7)]
    for LARGE in powers:
        #LARGE = 100000000
        mf_infi = _mf_gf(np.array([1j*LARGE+mu]), delta_)
        gf_infi = _gf(np.array([1j*LARGE+mu]), delta_)
        sigma_infi = get_sigma(mf_infi, gf_infi)[:,:,0]

        mf_infr = _mf_gf(np.array([LARGE]), delta_)
        gf_infr = _gf(np.array([LARGE]), delta_)
        sigma_infr = get_sigma(mf_infr, gf_infr)[:,:,0]

        print LARGE, sigma_infi[0,0]
        print LARGE, sigma_infr[0,0]

    def _eval_en0(w, delta):
        gf_ = _gf(np.array([w]), delta)
        return np.trace(np.dot(htb, gf_[:,:,0]))
    def _eval_en1(w, delta):
        gf_ = _gf(np.array([w]), delta)
        if np.iscomplex(w):
            return np.trace(np.dot(sigma_infi, gf_[:,:,0]))
        else:
            return np.trace(np.dot(sigma_infr, gf_[:,:,0]))
    def _eval_en2(w, delta):
        mf_ = _mf_gf(np.array([w]), delta)
        gf_ = _gf(np.array([w]), delta)
        sigma = get_sigma(mf_, gf_)
        if np.iscomplex(w):
            return np.trace(np.dot(sigma[:,:,0]-sigma_infi, gf_[:,:,0]))
        else:
            return np.trace(np.dot(sigma[:,:,0]-sigma_infr, gf_[:,:,0]))

    lplt = False

    if lplt:
        def real_fn(w, gf_fn):
            return -1./np.pi * np.imag(gf_fn(w, delta_))
        def imag_fn(w, gf_fn):
            return -2./np.pi * np.real(gf_fn(1j*w+mu, delta_))

        #fnr0 = np.zeros_like(freqs_)
        #fnr1 = np.zeros_like(freqs_)
        #fnr2 = np.zeros_like(freqs_)
        #fnr3 = np.zeros_like(freqs_)
        fni0 = np.zeros_like(freqs_)
        fni1 = np.zeros_like(freqs_)
        fni2 = np.zeros_like(freqs_)
        fni3 = np.zeros_like(freqs_)
        wmin = np.min(freqs_)
        wmax = np.max(freqs_)
        for iw, w in enumerate(freqs_):
            #fnr0[iw] = real_fn(w+mu, _eval_n)
            #fnr1[iw] = real_fn(w+mu, _eval_en0)
            #fnr2[iw] = real_fn(w+mu, _eval_en1)
            #fnr3[iw] = real_fn(w+mu, _eval_en2)
            fni0[iw] = imag_fn(w, _eval_n)
            fni1[iw] = imag_fn(w, _eval_en0)
            fni2[iw] = imag_fn(w, _eval_en1)
            fni3[iw] = imag_fn(w, _eval_en2)

        #plt.plot(freqs_+mu, fnr0)
        #plt.figure()
        #plt.plot(freqs_+mu, fnr1)
        #plt.figure()
        #plt.plot(freqs_+mu, fnr2)
        #plt.figure()
        #plt.plot(freqs_+mu, fnr3)
        #plt.figure()
        plt.plot(freqs_, fni0)
        plt.figure()
        plt.plot(freqs_, fni1)
        plt.figure()
        plt.plot(freqs_, fni2)
        plt.figure()
        plt.plot(freqs_, fni3)
        plt.show()

    li = True
    lr = False

    # NL = # poles to left of mu, NR = # poles to right of mu
    # nao = NL + NR
    # integration gives NR - NL (factor of 2 in imag_fn)
    INF=10000
    if li:

        print '\nnumber [imag]'
        #nint_n = numint_.int_quad_imag (_eval_n, mu, \
        #                                epsrel=1.0e-5, delta=delta_)
        nint_n = numint_.int_quad_imag (_eval_n, mu, \
                                        epsrel=1.0e-5, delta=delta_)
        nint_n = 2*0.5*(nao-nint_n)
        print 'nint_n [imag] = ', nint_n
        print '----\n'
    if lr:
        print '\nnumber [real]'
        nint_n = numint_.int_quad_real (_eval_n, mu, x0=-40., \
                                        epsrel=1.0e-5, delta=delta_)
        nint_n = numint_.int_quad_real (_eval_n, mu, x0=-40., \
                                        epsrel=1.0e-5, delta=delta_)
        print 'nint_n [real] = ', 2*nint_n
        print '----\n'

    if li:
        print 'energy [imag]'
        # trace of h with GF
        #nint_e0 = numint_.int_quad_imag (_eval_en0, mu, \
        #                                 epsrel=1.0e-5, delta=delta_)
        nint_e0 = numint_.int_quad_imag (_eval_en0, mu, \
                                         epsrel=1.0e-5, delta=delta_)
        print 'nint H_c    [imag] = ', -nint_e0

        # energy due to 1/w self-energy
        #nint_e2 = numint_.int_quad_imag (_eval_en2, mu, \
        #                                 epsrel=1.0e-5, delta=delta_)
        nint_e2 = numint_.int_quad_imag (_eval_en2, mu, \
                                         epsrel=1.0e-5, delta=delta_)
        print 'nint S[w]   [imag] = ', -nint_e2/2.

        # energy due to a constant self-energy
        #nint_e1 = numint_.int_quad_imag (_eval_en1, mu, \
        #                                 epsrel=1.0e-5, delta=delta_)
        nint_e1 = numint_.int_quad_imag (_eval_en1, mu, \
                                         epsrel=1.0e-5, delta=delta_)
        e1 = (np.real(np.trace(sigma_infi)) - nint_e1)
        print 'nint S[inf] [imag] = ', e1/2
        print 'nint_e = ', -nint_e0 + e1/2. -nint_e2/2.
        print '----\n'

    if lr:
        print 'energy [real]'
        # trace of h with GF
        nint_e0 = numint_.int_quad_real (_eval_en0, mu, x0=-40., \
                                         epsrel=1.0e-5, delta=delta_)
        print 'nint H_c    [real] = ', 2*nint_e0

        # energy due to 1/w self-energy
        nint_e2 = numint_.int_quad_real (_eval_en2, mu, x0=-40., \
                                         epsrel=1.0e-5, delta=delta_)
        print 'nint S[w]   [real] = ', nint_e2

        # energy due to a constant self-energy
        nint_e1 = numint_.int_quad_real (_eval_en1, mu, x0=-40., \
                                         epsrel=1.0e-5, delta=delta_)
        print 'nint S[inf] [real] = ', nint_e1
        print 'nint_e = ', 2*nint_e0 + nint_e1 + nint_e2
        print '----\n'