Ejemplo n.º 1
0
def ft_rdm1s(h1e, g2e, norb, nelec, T, m=50, nsamp=40, Tmin=10e-4):
    '''rdm of spin a and b at temperature T
    '''
    if T < Tmin:
       e, c = kernel(h1e, g2e, norb, nelec)
       rdma, rdmb = direct_spin1.make_rdm1s(c, norb, nelec)
       return rdma, rdmb

    h2e = direct_spin1.absorb_h1e(h1e, g2e, norb, nelec, .5)
    if isinstance(nelec, (int, numpy.integer)):
        nelecb = nelec//2
        neleca = nelec - nelecb
    else:
        neleca, nelecb = nelec
    na = cistring.num_strings(norb, neleca)
    nb = cistring.num_strings(norb, nelecb)
    def vecgen(n1=na, n2=nb):
        ci0 = numpy.random.randn(n1, n2)
#        ci0[0, 0] = 1.
        return ci0.reshape(-1)
    def hop(c):
        hc = direct_spin1.contract_2e(h2e, c, norb, nelec)
        return hc.reshape(-1)
    def qud(v1, v2):
        dma, dmb = direct_spin1.trans_rdm1s(v1, v2, norb, nelec)
        return dma, dmb

#    rdma, rdmb = flan.ht_rdm1s(qud, hop, vecgen, T, norb, m, nsamp)
    rdma, rdmb = flan.ftlan_rdm1s(qud, hop, vecgen, T, norb, m, nsamp)
    return rdma, rdmb
Ejemplo n.º 2
0
def ft_rdm1s(h1e, g2e, norb, nelec, T, m=50, nsamp=40, Tmin=10e-4):
    '''rdm of spin a and b at temperature T
    '''
    if T < Tmin:
        e, c = kernel(h1e, g2e, norb, nelec)
        rdma, rdmb = direct_spin1.make_rdm1s(c, norb, nelec)
        return rdma, rdmb

    h2e = direct_spin1.absorb_h1e(h1e, g2e, norb, nelec, .5)
    if isinstance(nelec, (int, numpy.integer)):
        nelecb = nelec // 2
        neleca = nelec - nelecb
    else:
        neleca, nelecb = nelec
    na = cistring.num_strings(norb, neleca)
    nb = cistring.num_strings(norb, nelecb)

    def vecgen(n1=na, n2=nb):
        ci0 = numpy.random.randn(n1, n2)
        #        ci0[0, 0] = 1.
        return ci0.reshape(-1)

    def hop(c):
        hc = direct_spin1.contract_2e(h2e, c, norb, nelec)
        return hc.reshape(-1)

    def qud(v1, v2):
        dma, dmb = direct_spin1.trans_rdm1s(v1, v2, norb, nelec)
        return dma, dmb


#    rdma, rdmb = flan.ht_rdm1s(qud, hop, vecgen, T, norb, m, nsamp)

    rdma, rdmb = flan.ftlan_rdm1s(qud, hop, vecgen, T, norb, m, nsamp)
    return rdma, rdmb
Ejemplo n.º 3
0
def make_rdm1s (fci, fcivec, norb, nelec, **kwargs):
    dm1a = np.zeros ((norb,norb))
    dm1b = np.zeros ((norb,norb))
    for nelec in product (range (norb+1), repeat=2):
        ci = fockspace.fock2hilbert (fcivec, norb, nelec)
        da, db = direct_spin1.make_rdm1s (ci, norb, nelec, **kwargs)
        dm1a += da
        dm1b += db
    return dm1a, dm1b
Ejemplo n.º 4
0
def gen_rdm1s(h1e, g2e, norb, nelec, readfile=False):
    if readfile:
        ev = np.loadtxt("cards/eignV.dat")
    else:
        ew, ev = exdiagH(h1e, g2e, norb, nelec)
#   rdma, rdmb = [], []
    ndim = len(ev)
    for i in range(ndim):
        tmpa, tmpb = direct_spin1.make_rdm1s(ev[:, i].copy(), norb, nelec)
#        tmpa, tmpb = direct_spin1.trans_rdm1s(ev[:, i], ev[:, i], norb, nelec)
        np.savetxt("cards/rdma/rdma%d"%i, tmpa)
        np.savetxt("cards/rdmb/rdmb%d"%i, tmpb)
Ejemplo n.º 5
0
def rdm1s_ft_smpl(h1e, g2e, norb, nelec, T, \
        m=50, nsmpl=20000, Tmin=1e-3, symm='RHF', **kwargs):

    if symm is 'RHF':
        from pyscf.fci import direct_spin1 as fcisolver
    elif symm is 'SOC':
        from pyscf.fci import fci_slow_spinless as fcisolver
    elif symm is 'UHF':
        from pyscf.fci import direct_uhf as fcisolver
    else:
        from pyscf.fci import direct_spin1 as fcisolver

    if T < Tmin:
        e, c = fcisolver.kernel(h1e, g2e, norb, nelec)
        rdm1 = fcisolver.make_rdm1s(c, norb, nelec)
        return numpy.asarray(rdm1), e

    h2e = fcisolver.absorb_h1e(h1e, g2e, norb, nelec, .5)
    if symm is 'SOC':
        na = cistring.num_strings(norb, nelec)
        ci0 = numpy.random.randn(na)
    else:
        na = cistring.num_strings(norb, nelec // 2)
        ci0 = numpy.random.randn(na * na)

    ci0 = ci0 / numpy.linalg.norm(ci0)

    def hop(c):
        hc = fcisolver.contract_2e(h2e, c, norb, nelec)
        return hc.reshape(-1)

    def qud(v1):
        dm1 = fcisolver.make_rdm1s(v1, norb, nelec)
        return dm1

    dm1, e = ftsmpl.ft_smpl_rdm1s(qud,\
        hop, ci0, T, norb, nsamp=nsmpl,M=m)

    return dm1, e
Ejemplo n.º 6
0
def make_rdm1s(fcivec, norb, nelec, link_index=None):
    return direct_spin1.make_rdm1s(fcivec, norb, nelec, link_index)
Ejemplo n.º 7
0
def make_rdm1s(fcivec, norb, nelec, link_index=None):
    return direct_spin1.make_rdm1s(fcivec, norb, nelec, link_index)
Ejemplo n.º 8
0
    mol.build()

    m = scf.RHF(mol)
    m.kernel()
    norb = m.mo_coeff.shape[1]
    nelec = mol.nelectron - 2
    ne = mol.nelectron - 2
    nelec = (nelec // 2, nelec - nelec // 2)
    h1e = reduce(numpy.dot, (m.mo_coeff.T, m.get_hcore(), m.mo_coeff))
    eri = ao2mo.incore.general(m._eri, (m.mo_coeff, ) * 4, compact=False)
    eri = eri.reshape(norb, norb, norb, norb)
    e1, ci0 = kernel(h1e, eri, norb, ne)  #FCI kernel

    print "T = 0, E = ", e1

    rdma0, rdmb0 = direct_spin1.make_rdm1s(ci0, norb, nelec)
    print "*********************"
    print "zero rdm:\n", rdma0, "\n", rdmb0
    print "*********************"
    rdma, rdmb = ft_rdm1s(h1e, eri, norb, nelec, 10., 10, 10)
    print rdma, "\n", rdmb
    #    print numpy.sum(numpy.diag(rdma))
    #    print "T = 0, E = %10.10f"%e1

    e2 = kernel_ft(h1e, eri, norb, nelec, 0.1, 40, 20)
    print "E(T) = %10.10f" % e2
    e3 = kernel_ft_smpl(
        h1e,
        eri,
        norb,
        nelec,
Ejemplo n.º 9
0
    mol.basis = 'sto-3g'
    mol.build()

    m = scf.RHF(mol)
    m.kernel()
    norb = m.mo_coeff.shape[1]
    nelec = mol.nelectron# - 2
    ne = mol.nelectron# - 2
    nelec = (nelec//2, nelec-nelec//2)
    h1e = reduce(numpy.dot, (m.mo_coeff.T, m.get_hcore(), m.mo_coeff))
    eri = ao2mo.incore.general(m._eri, (m.mo_coeff,)*4, compact=False)
    eri = eri.reshape(norb,norb,norb,norb)
    e1, ci0 = kernel(h1e, eri, norb, ne) #FCI kernel
     
#   print "T = 0, E = ", e1
    rdma0, rdmb0 = direct_spin1.make_rdm1s(ci0, norb, nelec)
    print "*********************"
    print "zero rdm:\n", rdma0, "\n", rdmb0
    print "*********************"
    rdma, rdmb = ft_rdm1s(h1e, eri, norb, nelec, 10., 10, 10)
    print rdma, "\n", rdmb
    print numpy.sum(numpy.diag(rdma))
#    print "T = 0, E = %10.10f"%e1

#    e2 = kernel_ft(h1e, eri, norb, nelec, 0.01, 50, 20)
#    print "E(T) = %10.10f"%e2
'''
    f = open("data/E-T_3.dat", "w")
    f.write("%2.4f       %2.10f\n"%(0., e1))
    for i in range(30):
        T = 0.1+0.2*i
Ejemplo n.º 10
0
 def qud(v1):
     dm1 = fcisolver.make_rdm1s(v1, norb, nelec)
     return dm1