Exemplo n.º 1
0
def EN2(molecule, **kwargs):  #
    "General wrapper for the simple CI method"
    nalpha, nbeta = molecule.get_alphabeta()
    bfs = getbasis(molecule)
    S, h, Ints = getints(bfs, molecule)
    energy, (orbea, orbeb), (orbsa, orbsb) = uhf(molecule,
                                                 integrals=(S, h, Ints),
                                                 bfs=bfs,
                                                 **kwargs)
    EHF = energy
    print "The Hatree-Fock energy is ", EHF
    #compute the transformed molecular orbital integrals

    aamoints, nbf = TransformInts(Ints, orbsa, orbsa, nalpha)
    bbmoints, nbf = TransformInts(Ints, orbsb, orbsb, nbeta)
    abmoints, nbf = TransformInts(Ints, orbsa, orbsb, nalpha)

    #Initialize the fractional occupations:
    Yalpha = zeros((nbf), 'd')
    Ybeta = zeros((nbf), 'd')

    #set up the occupied and virtual orbitals
    aoccs = range(nalpha)
    boccs = range(nbeta)
    avirt = range(nalpha, nbf)  #numbers of alpha virtual orbitals
    bvirt = range(nbeta, nbf)  #numbers of beta virtual orbitals

    ########  Computation of the primary energy correction  #########
    #Set initial correction terms to zero
    Ec1 = 0.
    sum = 0.
    z = 1.

    #compute correction term for two alpha electrons

    for a in aoccs:
        for b in xrange(a):
            for r in avirt:
                for s in xrange(nalpha, r):
                    arbs = aamoints[ijkl2intindex(a, r, b, s)]
                    asbr = aamoints[ijkl2intindex(a, s, b, r)]
                    rraa = aamoints[ijkl2intindex(r,r,a,a)] - \
                           aamoints[ijkl2intindex(r,a,a,r)]
                    rrbb = aamoints[ijkl2intindex(r,r,b,b)] - \
                           aamoints[ijkl2intindex(r,b,b,r)]
                    ssaa = aamoints[ijkl2intindex(s,s,a,a)] - \
                           aamoints[ijkl2intindex(s,a,a,s)]
                    ssbb = aamoints[ijkl2intindex(s,s,b,b)] - \
                           aamoints[ijkl2intindex(s,b,b,s)]
                    rrss = aamoints[ijkl2intindex(r,r,s,s)] - \
                           aamoints[ijkl2intindex(r,s,s,r)]
                    aabb = aamoints[ijkl2intindex(a,a,b,b)] - \
                           aamoints[ijkl2intindex(a,b,b,a)]

                    eigendif = (orbea[r] + orbea[s] - orbea[a] - orbea[b])
                    delcorr = (-rraa - rrbb - ssaa - ssbb + rrss + aabb)
                    delta = eigendif + delcorr * z

                    Eio = (arbs - asbr)

                    x = -Eio / delta
                    if abs(x) > 1:
                        print "Warning a large x value has been ",\
                              "discovered with x = ",x
                    x = choose(x < 1, (1, x))
                    x = choose(x > -1, (-1, x))
                    sum += x * x
                    Yalpha[a] -= x * x
                    Yalpha[b] -= x * x
                    Yalpha[r] += x * x
                    Yalpha[s] += x * x
                    Ec1 += x * Eio

    #compute correction term for two beta electrons

    for a in boccs:
        for b in xrange(a):
            for r in bvirt:
                for s in xrange(nbeta, r):
                    arbs = bbmoints[ijkl2intindex(a, r, b, s)]
                    asbr = bbmoints[ijkl2intindex(a, s, b, r)]
                    rraa = bbmoints[ijkl2intindex(r,r,a,a)] - \
                           bbmoints[ijkl2intindex(r,a,a,r)]
                    rrbb = bbmoints[ijkl2intindex(r,r,b,b)] - \
                           bbmoints[ijkl2intindex(r,b,b,r)]
                    ssaa = bbmoints[ijkl2intindex(s,s,a,a)] - \
                           bbmoints[ijkl2intindex(s,a,a,s)]
                    ssbb = bbmoints[ijkl2intindex(s,s,b,b)] - \
                           bbmoints[ijkl2intindex(s,b,b,s)]
                    rrss = bbmoints[ijkl2intindex(r,r,s,s)] - \
                           bbmoints[ijkl2intindex(r,s,s,r)]
                    aabb = bbmoints[ijkl2intindex(a,a,b,b)] - \
                           bbmoints[ijkl2intindex(a,b,b,a)]

                    eigendif = (orbeb[r] + orbeb[s] - orbeb[a] - orbeb[b])
                    delcorr = (-rraa - rrbb - ssaa - ssbb + rrss + aabb)
                    delta = eigendif + delcorr * z

                    Eio = (arbs - asbr)

                    x = -Eio / delta
                    if abs(x) > 1:                        print "Warning a large x value has ",\
            "been discovered with x = ",x
                    x = choose(x < 1, (1, x))
                    x = choose(x > -1, (-1, x))
                    sum += x * x
                    Ybeta[a] -= x * x
                    Ybeta[b] -= x * x
                    Ybeta[r] += x * x
                    Ybeta[s] += x * x
                    Ec1 += x * Eio

    #compute correction term for one alpha and one beta electron

    for a in aoccs:
        for b in boccs:
            for r in avirt:
                for s in bvirt:
                    arbs = abmoints[ijkl2intindex(a, r, b, s)]
                    rraa = aamoints[ijkl2intindex(r,r,a,a)] - \
                           aamoints[ijkl2intindex(r,a,a,r)]
                    rrbb = abmoints[ijkl2intindex(r, r, b, b)]
                    aass = abmoints[ijkl2intindex(a, a, s, s)]
                    ssbb = bbmoints[ijkl2intindex(s,s,b,b)] - \
                           bbmoints[ijkl2intindex(s,b,b,s)]
                    rrss = abmoints[ijkl2intindex(r, r, s, s)]
                    aabb = abmoints[ijkl2intindex(a, a, b, b)]

                    eigendif = (orbea[r] + orbeb[s] - orbea[a] - orbeb[b])
                    delcorr = (-rraa - rrbb - aass - ssbb + rrss + aabb)
                    delta = eigendif + delcorr * z

                    Eio = arbs

                    x = -Eio / delta
                    if abs(x) > 1:                        print "Warning a large x value has ",\
            "been discovered with x = ",x
                    x = choose(x < 1, (1, x))
                    x = choose(x > -1, (-1, x))
                    sum += x * x
                    Yalpha[a] -= x * x
                    Ybeta[b] -= x * x
                    Yalpha[r] += x * x
                    Ybeta[s] += x * x
                    Ec1 += x * Eio

    #compute the fractional occupations of the occupied orbitals
    for a in aoccs:
        Yalpha[a] = 1 + Yalpha[a]
    for b in boccs:
        Ybeta[b] = 1 + Ybeta[b]
    #for a in xrange(nbf):
    #print "For alpha = ",a,"the fractional occupation is ",Yalpha[a]
    #print "For beta  = ",a,"the fractional occupation is ",Ybeta[a]

    #print the energy and its corrections
    E = energy + Ec1
    print "The total sum of excitations is ", sum
    print "The primary correlation correction is ", Ec1
    print "The total energy is ", E
    return E
Exemplo n.º 2
0
def EN2(molecule,**opts):#
    "General wrapper for the simple CI method"
    nalpha,nbeta = molecule.get_alphabeta()
    bfs = getbasis(molecule)
    S,h,Ints = getints(bfs,molecule)
    energy,(orbea,orbeb),(orbsa,orbsb) = uhf(molecule,integrals=(S,h,Ints),
                                             bfs=bfs,**opts)
    EHF = energy
    print "The Hatree-Fock energy is ",EHF
    #compute the transformed molecular orbital integrals

    aamoints, nbf = TransformInts(Ints,orbsa,orbsa, nalpha)
    bbmoints, nbf = TransformInts(Ints,orbsb,orbsb, nbeta)
    abmoints, nbf = TransformInts(Ints,orbsa,orbsb, nalpha)
    
    #Initialize the fractional occupations:
    Yalpha = zeros((nbf),'d')
    Ybeta = zeros((nbf),'d')

    #set up the occupied and virtual orbitals
    aoccs = range(nalpha)
    boccs = range(nbeta)
    avirt = range(nalpha,nbf) #numbers of alpha virtual orbitals
    bvirt = range(nbeta,nbf) #numbers of beta virtual orbitals

    ########  Computation of the primary energy correction  ######### 
    #Set initial correction terms to zero
    Ec1 = 0.
    sum = 0.
    z = 1.
   
    #compute correction term for two alpha electrons

    for a in aoccs:
        for b in xrange(a):
            for r in avirt:
                for s in xrange(nalpha,r):
                    arbs = aamoints[ijkl2intindex(a,r,b,s)]
                    asbr = aamoints[ijkl2intindex(a,s,b,r)]
                    rraa = aamoints[ijkl2intindex(r,r,a,a)] - \
                           aamoints[ijkl2intindex(r,a,a,r)]
                    rrbb = aamoints[ijkl2intindex(r,r,b,b)] - \
                           aamoints[ijkl2intindex(r,b,b,r)]
                    ssaa = aamoints[ijkl2intindex(s,s,a,a)] - \
                           aamoints[ijkl2intindex(s,a,a,s)]
                    ssbb = aamoints[ijkl2intindex(s,s,b,b)] - \
                           aamoints[ijkl2intindex(s,b,b,s)]
                    rrss = aamoints[ijkl2intindex(r,r,s,s)] - \
                           aamoints[ijkl2intindex(r,s,s,r)]
                    aabb = aamoints[ijkl2intindex(a,a,b,b)] - \
                           aamoints[ijkl2intindex(a,b,b,a)]

                    eigendif = (orbea[r] + orbea[s] - orbea[a] - orbea[b])
                    delcorr = (-rraa - rrbb - ssaa - ssbb + rrss + aabb) 
                    delta = eigendif + delcorr*z

                    Eio = (arbs - asbr)

                    x = -Eio/delta
                    if abs(x) > 1:
                        print "Warning a large x value has been ",\
                              "discovered with x = ",x
                    x = choose(x < 1, (1,x))
                    x = choose(x > -1, (-1,x))                   
                    sum += x*x
                    Yalpha[a] -= x*x
                    Yalpha[b] -= x*x
                    Yalpha[r] += x*x
                    Yalpha[s] += x*x
                    Ec1 += x*Eio             


    #compute correction term for two beta electrons

    for a in boccs:
        for b in xrange(a):
            for r in bvirt:
                for s in xrange(nbeta,r):
                    arbs = bbmoints[ijkl2intindex(a,r,b,s)]
                    asbr = bbmoints[ijkl2intindex(a,s,b,r)]
                    rraa = bbmoints[ijkl2intindex(r,r,a,a)] - \
                           bbmoints[ijkl2intindex(r,a,a,r)]
                    rrbb = bbmoints[ijkl2intindex(r,r,b,b)] - \
                           bbmoints[ijkl2intindex(r,b,b,r)]
                    ssaa = bbmoints[ijkl2intindex(s,s,a,a)] - \
                           bbmoints[ijkl2intindex(s,a,a,s)]
                    ssbb = bbmoints[ijkl2intindex(s,s,b,b)] - \
                           bbmoints[ijkl2intindex(s,b,b,s)]
                    rrss = bbmoints[ijkl2intindex(r,r,s,s)] - \
                           bbmoints[ijkl2intindex(r,s,s,r)]
                    aabb = bbmoints[ijkl2intindex(a,a,b,b)] - \
                           bbmoints[ijkl2intindex(a,b,b,a)]


                    eigendif = (orbeb[r] + orbeb[s] - orbeb[a] - orbeb[b])
                    delcorr = (-rraa - rrbb - ssaa - ssbb + rrss + aabb) 
                    delta = eigendif + delcorr*z

                    Eio = (arbs - asbr)

                    x = -Eio/delta
                    if abs(x) > 1: print "Warning a large x value has ",\
                       "been discovered with x = ",x
                    x = choose(x < 1, (1,x))
                    x = choose(x > -1, (-1,x))                   
                    sum += x*x
                    Ybeta[a] -= x*x
                    Ybeta[b] -= x*x
                    Ybeta[r] += x*x
                    Ybeta[s] += x*x
                    Ec1 += x*Eio

    #compute correction term for one alpha and one beta electron

    for a in aoccs:
        for b in boccs:
            for r in avirt:
                for s in bvirt:
                    arbs = abmoints[ijkl2intindex(a,r,b,s)]
                    rraa = aamoints[ijkl2intindex(r,r,a,a)] - \
                           aamoints[ijkl2intindex(r,a,a,r)]
                    rrbb = abmoints[ijkl2intindex(r,r,b,b)]
                    aass = abmoints[ijkl2intindex(a,a,s,s)]
                    ssbb = bbmoints[ijkl2intindex(s,s,b,b)] - \
                           bbmoints[ijkl2intindex(s,b,b,s)]
                    rrss = abmoints[ijkl2intindex(r,r,s,s)]
                    aabb = abmoints[ijkl2intindex(a,a,b,b)]

                    eigendif = (orbea[r] + orbeb[s] - orbea[a] - orbeb[b])
                    delcorr = (-rraa - rrbb - aass - ssbb + rrss + aabb)
                    delta = eigendif + delcorr*z

                    Eio = arbs

                    x = -Eio/delta
                    if abs(x) > 1: print "Warning a large x value has ",\
                       "been discovered with x = ",x
                    x = choose(x < 1, (1,x))
                    x = choose(x > -1, (-1,x))                   
                    sum += x*x
                    Yalpha[a] -= x*x
                    Ybeta[b] -= x*x
                    Yalpha[r] += x*x
                    Ybeta[s] += x*x
                    Ec1 += x*Eio

    #compute the fractional occupations of the occupied orbitals
    for a in aoccs:
        Yalpha[a] = 1 + Yalpha[a]
    for b in boccs:
        Ybeta[b] = 1 + Ybeta[b]
    #for a in xrange(nbf):
        #print "For alpha = ",a,"the fractional occupation is ",Yalpha[a]
        #print "For beta  = ",a,"the fractional occupation is ",Ybeta[a]

    #print the energy and its corrections
    E = energy + Ec1
    print "The total sum of excitations is ",sum
    print "The primary correlation correction is ",Ec1
    print "The total energy is ", E
    return E
Exemplo n.º 3
0
def main():
    atomlist = Molecule('NO',atomlist = [(7,(0,0,0)),(8,(2.12955,0,0))],
                        multiplicity=2)
    en,orbe,orbs = uhf(atomlist)
    return en
Exemplo n.º 4
0
def main():
    atomlist = Molecule('NO',
                        atomlist=[(7, (0, 0, 0)), (8, (2.12955, 0, 0))],
                        multiplicity=2)
    en, orbe, orbs = uhf(atomlist)
    return en