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
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
def main(): atomlist = Molecule('NO',atomlist = [(7,(0,0,0)),(8,(2.12955,0,0))], multiplicity=2) en,orbe,orbs = uhf(atomlist) return en
def main(): atomlist = Molecule('NO', atomlist=[(7, (0, 0, 0)), (8, (2.12955, 0, 0))], multiplicity=2) en, orbe, orbs = uhf(atomlist) return en