def coulomb_repulsion(xyza,norma,lmna,alphaa, xyzb,normb,lmnb,alphab, xyzc,normc,lmnc,alphac, xyzd,normd,lmnd,alphad): """ Return the coulomb repulsion between four primitive gaussians a,b,c,d with the given origin , x,y,z, normalization constants norm, angular momena l,m,n, and exponent alpha. >>> p1 = array((0.,0.,0.),'d') >>> p2 = array((0.,0.,1.),'d') >>> lmn = (0,0,0) >>> isclose(coulomb_repulsion(p1,1.,lmn,1.,p1,1.,lmn,1.,p1,1.,lmn,1.,p1,1.,lmn,1.),4.373355) True >>> isclose(coulomb_repulsion(p1,1.,lmn,1.,p1,1.,lmn,1.,p2,1.,lmn,1.,p2,1.,lmn,1.),3.266127) True >>> isclose(coulomb_repulsion(p1,1.,lmn,1.,p2,1.,lmn,1.,p1,1.,lmn,1.,p2,1.,lmn,1.),1.6088672) True """ la,ma,na = lmna lb,mb,nb = lmnb lc,mc,nc = lmnc ld,md,nd = lmnd xa,ya,za = xyza xb,yb,zb = xyzb xc,yc,zc = xyzc xd,yd,zd = xyzd rab2 = norm2(xyza-xyzb) rcd2 = norm2(xyzc-xyzd) xyzp = gaussian_product_center(alphaa,xyza,alphab,xyzb) xp,yp,zp = xyzp xyzq = gaussian_product_center(alphac,xyzc,alphad,xyzd) xq,yq,zq = xyzq rpq2 = norm2(xyzp-xyzq) gamma1 = alphaa+alphab gamma2 = alphac+alphad delta = 0.25*(1/gamma1+1/gamma2) Bx = B_array(la,lb,lc,ld,xp,xa,xb,xq,xc,xd,gamma1,gamma2,delta) By = B_array(ma,mb,mc,md,yp,ya,yb,yq,yc,yd,gamma1,gamma2,delta) Bz = B_array(na,nb,nc,nd,zp,za,zb,zq,zc,zd,gamma1,gamma2,delta) sum = 0. for I in range(la+lb+lc+ld+1): for J in range(ma+mb+mc+md+1): for K in range(na+nb+nc+nd+1): sum = sum + Bx[I]*By[J]*Bz[K]*Fgamma(I+J+K,0.25*rpq2/delta) return 2*pow(pi,2.5)/(gamma1*gamma2*sqrt(gamma1+gamma2)) \ *exp(-alphaa*alphab*rab2/gamma1) \ *exp(-alphac*alphad*rcd2/gamma2)*sum*norma*normb*normc*normd
def coulomb_repulsion(xyza, norma, lmna, alphaa, xyzb, normb, lmnb, alphab, xyzc, normc, lmnc, alphac, xyzd, normd, lmnd, alphad): """ Return the coulomb repulsion between four primitive gaussians a,b,c,d with the given origin , x,y,z, normalization constants norm, angular momena l,m,n, and exponent alpha. >>> p1 = array((0.,0.,0.),'d') >>> p2 = array((0.,0.,1.),'d') >>> lmn = (0,0,0) >>> isclose(coulomb_repulsion(p1,1.,lmn,1.,p1,1.,lmn,1.,p1,1.,lmn,1.,p1,1.,lmn,1.),4.373355) True >>> isclose(coulomb_repulsion(p1,1.,lmn,1.,p1,1.,lmn,1.,p2,1.,lmn,1.,p2,1.,lmn,1.),3.266127) True >>> isclose(coulomb_repulsion(p1,1.,lmn,1.,p2,1.,lmn,1.,p1,1.,lmn,1.,p2,1.,lmn,1.),1.6088672) True """ la, ma, na = lmna lb, mb, nb = lmnb lc, mc, nc = lmnc ld, md, nd = lmnd xa, ya, za = xyza xb, yb, zb = xyzb xc, yc, zc = xyzc xd, yd, zd = xyzd rab2 = norm2(xyza - xyzb) rcd2 = norm2(xyzc - xyzd) xyzp = gaussian_product_center(alphaa, xyza, alphab, xyzb) xp, yp, zp = xyzp xyzq = gaussian_product_center(alphac, xyzc, alphad, xyzd) xq, yq, zq = xyzq rpq2 = norm2(xyzp - xyzq) gamma1 = alphaa + alphab gamma2 = alphac + alphad delta = 0.25 * (1 / gamma1 + 1 / gamma2) Bx = B_array(la, lb, lc, ld, xp, xa, xb, xq, xc, xd, gamma1, gamma2, delta) By = B_array(ma, mb, mc, md, yp, ya, yb, yq, yc, yd, gamma1, gamma2, delta) Bz = B_array(na, nb, nc, nd, zp, za, zb, zq, zc, zd, gamma1, gamma2, delta) sum = 0. for I in range(la + lb + lc + ld + 1): for J in range(ma + mb + mc + md + 1): for K in range(na + nb + nc + nd + 1): sum = sum + Bx[I] * By[J] * Bz[K] * Fgamma( I + J + K, 0.25 * rpq2 / delta) return 2*pow(pi,2.5)/(gamma1*gamma2*sqrt(gamma1+gamma2)) \ *exp(-alphaa*alphab*rab2/gamma1) \ *exp(-alphac*alphad*rcd2/gamma2)*sum*norma*normb*normc*normd
def term0(aexpn,xyza,bexpn,xyzb,cexpn,xyzc,dexpn,xyzd,mtot): zeta,eta = float(aexpn+bexpn),float(cexpn+dexpn) zpe = zeta+eta xyzp = gaussian_product_center(aexpn,xyza,bexpn,xyzb) xyzq = gaussian_product_center(cexpn,xyzc,dexpn,xyzd) rab2 = norm2(xyza-xyzb) Kab = sqrt(2)*pow(pi,1.25)/(aexpn+bexpn)\ *exp(-aexpn*bexpn/(aexpn+bexpn)*rab2) rcd2 = norm2(xyzc-xyzd) Kcd = sqrt(2)*pow(pi,1.25)/(cexpn+dexpn)\ *exp(-cexpn*dexpn/(cexpn+dexpn)*rcd2) rpq2 = norm2(xyzp-xyzq) T = zeta*eta/zpe*rpq2 return [Fgamma(m,T)*Kab*Kcd/sqrt(zpe) for m in xrange(mtot+1)]
def term0(aexpn, xyza, bexpn, xyzb, cexpn, xyzc, dexpn, xyzd, mtot): zeta, eta = float(aexpn + bexpn), float(cexpn + dexpn) zpe = zeta + eta xyzp = gaussian_product_center(aexpn, xyza, bexpn, xyzb) xyzq = gaussian_product_center(cexpn, xyzc, dexpn, xyzd) rab2 = norm2(xyza - xyzb) Kab = sqrt(2)*pow(pi,1.25)/(aexpn+bexpn)\ *exp(-aexpn*bexpn/(aexpn+bexpn)*rab2) rcd2 = norm2(xyzc - xyzd) Kcd = sqrt(2)*pow(pi,1.25)/(cexpn+dexpn)\ *exp(-cexpn*dexpn/(cexpn+dexpn)*rcd2) rpq2 = norm2(xyzp - xyzq) T = zeta * eta / zpe * rpq2 return [Fgamma(m, T) * Kab * Kcd / sqrt(zpe) for m in xrange(mtot + 1)]
def vrr(xyza,norma,lmna,alphaa, xyzb,normb,alphab, xyzc,normc,lmnc,alphac, xyzd,normd,alphad,M): la,ma,na = lmna lc,mc,nc = lmnc xa,ya,za = xyza xb,yb,zb = xyzb xc,yc,zc = xyzc xd,yd,zd = xyzd px,py,pz = xyzp = gaussian_product_center(alphaa,xyza,alphab,xyzb) qx,qy,qz = xyzq = gaussian_product_center(alphac,xyzc,alphad,xyzd) zeta,eta = float(alphaa+alphab),float(alphac+alphad) wx,wy,wz = xyzw = gaussian_product_center(zeta,xyzp,eta,xyzq) rab2 = pow(xa-xb,2) + pow(ya-yb,2) + pow(za-zb,2) Kab = sqrt(2)*pow(pi,1.25)/(alphaa+alphab)\ *exp(-alphaa*alphab/(alphaa+alphab)*rab2) rcd2 = pow(xc-xd,2) + pow(yc-yd,2) + pow(zc-zd,2) Kcd = sqrt(2)*pow(pi,1.25)/(alphac+alphad)\ *exp(-alphac*alphad/(alphac+alphad)*rcd2) rpq2 = pow(px-qx,2) + pow(py-qy,2) + pow(pz-qz,2) T = zeta*eta/(zeta+eta)*rpq2 mtot = la+ma+na+lc+mc+nc+M Fgterms = [0]*(mtot+1) Fgterms[mtot] = Fgamma(mtot,T) for im in range(mtot-1,-1,-1): Fgterms[im]=(2.*T*Fgterms[im+1]+exp(-T))/(2.*im+1) # Todo: setup this as a regular array # Store the vrr values as a 7 dimensional array # vrr_terms[la,ma,na,lc,mc,nc,m] vrr_terms = {} for im in range(mtot+1): vrr_terms[0,0,0,0,0,0,im] = ( norma*normb*normc*normd*Kab*Kcd/sqrt(zeta+eta)*Fgterms[im] ) # Todo: use itertools.product() for the nested for loops for i in range(la): for im in range(mtot-i): vrr_terms[i+1,0,0, 0,0,0, im] = ( (px-xa)*vrr_terms[i,0,0, 0,0,0, im] + (wx-px)*vrr_terms[i,0,0, 0,0,0, im+1] ) if i: vrr_terms[i+1,0,0, 0,0,0, im] += ( i/2./zeta*( vrr_terms[i-1,0,0, 0,0,0, im] - eta/(zeta+eta)*vrr_terms[i-1,0,0, 0,0,0, im+1] )) for j in range(ma): for i in range(la+1): for im in range(mtot-i-j): vrr_terms[i,j+1,0, 0,0,0, im] = ( (py-ya)*vrr_terms[i,j,0, 0,0,0, im] + (wy-py)*vrr_terms[i,j,0, 0,0,0, im+1] ) if j: vrr_terms[i,j+1,0, 0,0,0, im] += ( j/2./zeta*(vrr_terms[i,j-1,0, 0,0,0, im] - eta/(zeta+eta) *vrr_terms[i,j-1,0, 0,0,0, im+1] )) for k in range(na): for j in range(ma+1): for i in range(la+1): for im in range(mtot-i-j-k): vrr_terms[i,j,k+1, 0,0,0, im] = ( (pz-za)*vrr_terms[i,j,k, 0,0,0, im] + (wz-pz)*vrr_terms[i,j,k, 0,0,0, im+1] ) if k: vrr_terms[i,j,k+1, 0,0,0, im] += ( k/2./zeta*(vrr_terms[i,j,k-1, 0,0,0, im] - eta/(zeta+eta) *vrr_terms[i,j,k-1, 0,0,0, im+1] )) for q in range(lc): for k in range(na+1): for j in range(ma+1): for i in range(la+1): for im in range(mtot-i-j-k-q): vrr_terms[i,j,k, q+1,0,0, im] = ( (qx-xc)*vrr_terms[i,j,k, q,0,0, im] + (wx-qx)*vrr_terms[i,j,k, q,0,0, im+1] ) if q: vrr_terms[i,j,k, q+1,0,0, im] += ( q/2./eta*(vrr_terms[i,j,k, q-1,0,0, im] - zeta/(zeta+eta) *vrr_terms[i,j,k, q-1,0,0, im+1] )) if i: vrr_terms[i,j,k, q+1,0,0, im] += ( i/2./(zeta+eta)*vrr_terms[i-1,j,k, q,0,0, im+1] ) for r in range(mc): for q in range(lc+1): for k in range(na+1): for j in range(ma+1): for i in range(la+1): for im in range(mtot-i-j-k-q-r): vrr_terms[i,j,k, q,r+1,0, im] = ( (qy-yc)*vrr_terms[i,j,k, q,r,0, im] + (wy-qy)*vrr_terms[i,j,k, q,r,0, im+1] ) if r: vrr_terms[i,j,k, q,r+1,0, im] += ( r/2./eta*(vrr_terms[i,j,k, q,r-1,0, im] - zeta/(zeta+eta) *vrr_terms[i,j,k, q,r-1,0, im+1] )) if j: vrr_terms[i,j,k, q,r+1,0, im] += ( j/2./(zeta+eta)*vrr_terms[i,j-1,k,q,r,0,im+1] ) for s in range(nc): for r in range(mc+1): for q in range(lc+1): for k in range(na+1): for j in range(ma+1): for i in range(la+1): for im in range(mtot-i-j-k-q-r-s): vrr_terms[i,j,k,q,r,s+1,im] = ( (qz-zc)*vrr_terms[i,j,k,q,r,s,im] + (wz-qz)*vrr_terms[i,j,k,q,r,s,im+1] ) if s: vrr_terms[i,j,k,q,r,s+1,im] += ( s/2./eta*(vrr_terms[i,j,k,q,r,s-1,im] - zeta/(zeta+eta) *vrr_terms[i,j,k,q,r,s-1,im+1] )) if k: vrr_terms[i,j,k,q,r,s+1,im] += ( k/2./(zeta+eta)*vrr_terms[i,j,k-1,q,r,s,im+1] ) return vrr_terms[la,ma,na,lc,mc,nc,M]
def vrr_array(xyza,lmna,alphaa,xyzb,alphab, xyzc,lmnc,alphac,xyzd,alphad): la,ma,na = lmna lc,mc,nc = lmnc xa,ya,za = xyza xb,yb,zb = xyzb xc,yc,zc = xyzc xd,yd,zd = xyzd px,py,pz = xyzp = gaussian_product_center(alphaa,xyza,alphab,xyzb) qx,qy,qz = xyzq = gaussian_product_center(alphac,xyzc,alphad,xyzd) zeta,eta = float(alphaa+alphab),float(alphac+alphad) wx,wy,wz = xyzw = gaussian_product_center(zeta,xyzp,eta,xyzq) zpe = zeta+eta rab2 = norm2(xyza-xyzb) Kab = sqrt(2)*pow(pi,1.25)/(alphaa+alphab)\ *exp(-alphaa*alphab/(alphaa+alphab)*rab2) rcd2 = norm2(xyzc-xyzd) Kcd = sqrt(2)*pow(pi,1.25)/(alphac+alphad)\ *exp(-alphac*alphad/(alphac+alphad)*rcd2) rpq2 = norm2(xyzp-xyzq) T = zeta*eta/zpe*rpq2 mtot = sum(lmna)+sum(lmnc) vrr_terms = {}#zeros((la+1,ma+1,na+1,lc+1,mc+1,nc+1,mtot+1),'d') for m in xrange(mtot+1): vrr_terms[0,0,0,0,0,0,m] = Fgamma(m,T)*Kab*Kcd/sqrt(zpe) for i in xrange(la): for m in xrange(mtot-i): vrr_terms[i+1,0,0, 0,0,0, m] = (px-xa)*vrr_terms[i,0,0, 0,0,0, m] +\ (wx-px)*vrr_terms[i,0,0, 0,0,0, m+1] if i>0: vrr_terms[i+1,0,0, 0,0,0, m] += i/2./zeta*( vrr_terms[i-1,0,0, 0,0,0, m] - eta/zpe*vrr_terms[i-1,0,0, 0,0,0, m+1] ) for i,j in product(xrange(la+1),xrange(ma)): for m in range(mtot-i-j): vrr_terms[i,j+1,0, 0,0,0, m] = (py-ya)*vrr_terms[i,j,0, 0,0,0, m] +\ (wy-py)*vrr_terms[i,j,0, 0,0,0, m+1] if j>0: vrr_terms[i,j+1,0, 0,0,0, m] += j/2./zeta*( vrr_terms[i,j-1,0, 0,0,0, m] - eta/zpe*vrr_terms[i,j-1,0, 0,0,0, m+1] ) for i,j,k in product(xrange(la+1),xrange(ma+1),xrange(na)): for m in range(mtot-i-j-k): vrr_terms[i,j,k+1, 0,0,0, m] = (pz-za)*vrr_terms[i,j,k, 0,0,0, m] +\ (wz-pz)*vrr_terms[i,j,k, 0,0,0, m+1] if k>0: vrr_terms[i,j,k+1, 0,0,0, m] += k/2./zeta*( vrr_terms[i,j,k-1, 0,0,0, m] - eta/zpe*vrr_terms[i,j,k-1, 0,0,0, m+1]) for i,j,k, q in product(xrange(la+1),xrange(ma+1),xrange(na+1),xrange(lc)): for m in range(mtot-i-j-k-q): vrr_terms[i,j,k, q+1,0,0, m] = (qx-xc)*vrr_terms[i,j,k, q,0,0, m] +\ (wx-qx)*vrr_terms[i,j,k, q,0,0, m+1] if q>0: vrr_terms[i,j,k, q+1,0,0, m] += q/2./eta*( vrr_terms[i,j,k, q-1,0,0, m] - zeta/zpe*vrr_terms[i,j,k, q-1,0,0, m+1]) if i>0: vrr_terms[i,j,k, q+1,0,0, m] += i/2./zpe*vrr_terms[i-1,j,k, q,0,0, m+1] for i,j,k, q,r in product(xrange(la+1),xrange(ma+1),xrange(na+1), xrange(lc+1),xrange(mc)): for m in range(mtot-i-j-k-q-r): vrr_terms[i,j,k, q,r+1,0, m] = (qy-yc)*vrr_terms[i,j,k, q,r,0, m] +\ (wy-qy)*vrr_terms[i,j,k, q,r,0, m+1] if r>0: vrr_terms[i,j,k, q,r+1,0, m] += r/2./eta*( vrr_terms[i,j,k, q,r-1,0, m] - zeta/zpe*vrr_terms[i,j,k, q,r-1,0, m+1]) if j>0: vrr_terms[i,j,k, q,r+1,0, m] += j/2./zpe*vrr_terms[i,j-1,k,q,r,0,m+1] for i,j,k, q,r,s in product(xrange(la+1),xrange(ma+1),xrange(na+1), xrange(lc+1),xrange(mc+1),xrange(nc)): for m in range(mtot-i-j-k-q-r-s): vrr_terms[i,j,k,q,r,s+1,m] = (qz-zc)*vrr_terms[i,j,k,q,r,s,m] +\ (wz-qz)*vrr_terms[i,j,k,q,r,s,m+1] if s>0: vrr_terms[i,j,k,q,r,s+1,m] += s/2./eta*( vrr_terms[i,j,k,q,r,s-1,m] - zeta/zpe*vrr_terms[i,j,k,q,r,s-1,m+1]) if k>0: vrr_terms[i,j,k,q,r,s+1,m] += k/2./zpe*vrr_terms[i,j,k-1,q,r,s,m+1] return vrr_terms
def vrr_shell_2(aexpn,xyza,bexpn,xyzb,cexpn,xyzc,dexpn,xyzd,maxa,maxc): # This uses a more intelligent method of looping over the am's to # generate the powers required import copy xyzp = gaussian_product_center(aexpn,xyza,bexpn,xyzb) xyzq = gaussian_product_center(cexpn,xyzc,dexpn,xyzd) zeta,eta = float(aexpn+bexpn),float(cexpn+dexpn) xyzw = gaussian_product_center(zeta,xyzp,eta,xyzq) zpe = zeta+eta mtot = 3*maxa+3*maxc # Don't need all of these terms: #terms = zeros((maxa+1,maxa+1,maxa+1,maxc+1,maxc+1,maxc+1,mtot+1),'d') terms = {} # Do ama=amc=0 term first: ama,amc = 0,0 for m,t in enumerate(term0(aexpn,xyza,bexpn,xyzb,cexpn,xyzc,dexpn,xyzd,mtot)): terms[0,0,0, 0,0,0, m] = t #end m pqac = (xyzp[0]-xyza[0],xyzp[1]-xyza[1],xyzp[2]-xyza[2], xyzq[0]-xyzc[0],xyzq[1]-xyzc[1],xyzq[2]-xyzc[2]) wpq = (xyzw[0]-xyzp[0],xyzw[1]-xyzp[1],xyzw[2]-xyzp[2], xyzw[0]-xyzq[0],xyzw[1]-xyzq[1],xyzw[2]-xyzq[2]) ze = (eta,eta,eta,zeta,zeta,zeta) zezpe = [zei/zpe for zei in ze] #ama>0, amc=0 for ama in xrange(1,maxa+1): for aI,aJ,aK in shell_iterator(ama): l = [aI,aJ,aK, 0,0,0] ind = indmax(l) val = l[ind] r1,r2,r3,r4,r5,r6 = copy_and_decrement(l,ind) s1,s2,s3,s4,s5,s6 = copy_and_decrement(l,ind,ind) for m in xrange(mtot-aI-aJ-aK): terms[aI,aJ,aK, 0,0,0, m] = pqac[ind]*terms[r1,r2,r3, r4,r5,r6,m] +\ wpq[ind]*terms[r1,r2,r3, r4,r5,r6,m+1] if val>1: terms[aI,aJ,aK, 0,0,0, m] += 0.5*(val-1)/ze[ind]*( terms[s1,s2,s3, s4,s5,s6,m] -\ zezpe[ind]*terms[s1,s2,s3, s4,s5,s6,m+1]) #end m #end cijk #end ama # ama=0, amc>0 here: for amc in xrange(1,maxc+1): for cI,cJ,cK in shell_iterator(amc): l = [0,0,0, cI,cJ,cK] ind = indmax(l) val = l[ind] r1,r2,r3,r4,r5,r6 = copy_and_decrement(l,ind) s1,s2,s3,s4,s5,s6 = copy_and_decrement(l,ind,ind) for m in xrange(mtot-cI-cJ-cK): terms[0,0,0, cI,cJ,cK, m] = pqac[ind]*terms[r1,r2,r3, r4,r5,r6,m] +\ wpq[ind]*terms[r1,r2,r3, r4,r5,r6,m+1] if val>1: terms[0,0,0, cI,cJ,cK, m] += 0.5*(val-1)/ze[ind]*( terms[s1,s2,s3, s4,s5,s6,m] -\ zezpe[ind]*terms[s1,s2,s3, s4,s5,s6,m+1]) #end m #end cIJK #end amc # ama>0, amc>0 for ama in xrange(1,maxa+1): for amc in xrange(1,maxc+1): for aI,aJ,aK in shell_iterator(ama): for cI,cJ,cK in shell_iterator(amc): l = [aI,aJ,aK, cI,cJ,cK] ind = indmax(l) val = l[ind] cind = (ind+3)%6 cval = l[cind] r1,r2,r3,r4,r5,r6 = copy_and_decrement(l,ind) s1,s2,s3,s4,s5,s6 = copy_and_decrement(l,ind,ind) t1,t2,t3,t4,t5,t6 = copy_and_decrement(l,ind,cind) for m in xrange(mtot-aI-aJ-aK-cI-cJ-cK): terms[aI,aJ,aK, cI,cJ,cK, m] = pqac[ind]*terms[r1,r2,r3, r4,r5,r6,m] +\ wpq[ind]*terms[r1,r2,r3, r4,r5,r6,m+1] # should this be ...0.5*(val-1)/... ? if val>1: terms[aI,aJ,aK, cI,cJ,cK, m] += 0.5*(val-1)/ze[ind]*( terms[s1,s2,s3, s4,s5,s6,m] -\ zezpe[ind]*terms[s1,s2,s3, s4,s5,s6,m+1]) #print 'c',(aI,aJ,aK,cI,cJ,cK,m),terms[aI,aJ,aK,cI,cJ,cK,m] if cval>0: terms[aI,aJ,aK, cI,cJ,cK, m] += 0.5*cval/zpe*terms[t1,t2,t3,t4,t5,t6,m+1] #end m #end bijk #end aijk #end amc #end ama return pack_full(terms,maxa,maxc) # and unpack later
def vrr(xyza, norma, lmna, alphaa, xyzb, normb, alphab, xyzc, normc, lmnc, alphac, xyzd, normd, alphad, M): la, ma, na = lmna lc, mc, nc = lmnc xa, ya, za = xyza xb, yb, zb = xyzb xc, yc, zc = xyzc xd, yd, zd = xyzd px, py, pz = xyzp = gaussian_product_center(alphaa, xyza, alphab, xyzb) qx, qy, qz = xyzq = gaussian_product_center(alphac, xyzc, alphad, xyzd) zeta, eta = float(alphaa + alphab), float(alphac + alphad) wx, wy, wz = xyzw = gaussian_product_center(zeta, xyzp, eta, xyzq) rab2 = pow(xa - xb, 2) + pow(ya - yb, 2) + pow(za - zb, 2) Kab = sqrt(2)*pow(pi,1.25)/(alphaa+alphab)\ *exp(-alphaa*alphab/(alphaa+alphab)*rab2) rcd2 = pow(xc - xd, 2) + pow(yc - yd, 2) + pow(zc - zd, 2) Kcd = sqrt(2)*pow(pi,1.25)/(alphac+alphad)\ *exp(-alphac*alphad/(alphac+alphad)*rcd2) rpq2 = pow(px - qx, 2) + pow(py - qy, 2) + pow(pz - qz, 2) T = zeta * eta / (zeta + eta) * rpq2 mtot = la + ma + na + lc + mc + nc + M Fgterms = [0] * (mtot + 1) Fgterms[mtot] = Fgamma(mtot, T) for im in range(mtot - 1, -1, -1): Fgterms[im] = (2. * T * Fgterms[im + 1] + exp(-T)) / (2. * im + 1) # Todo: setup this as a regular array # Store the vrr values as a 7 dimensional array # vrr_terms[la,ma,na,lc,mc,nc,m] vrr_terms = {} for im in range(mtot + 1): vrr_terms[0, 0, 0, 0, 0, 0, im] = (norma * normb * normc * normd * Kab * Kcd / sqrt(zeta + eta) * Fgterms[im]) # Todo: use itertools.product() for the nested for loops for i in range(la): for im in range(mtot - i): vrr_terms[i + 1, 0, 0, 0, 0, 0, im] = ((px - xa) * vrr_terms[i, 0, 0, 0, 0, 0, im] + (wx - px) * vrr_terms[i, 0, 0, 0, 0, 0, im + 1]) if i: vrr_terms[i + 1, 0, 0, 0, 0, 0, im] += ( i / 2. / zeta * (vrr_terms[i - 1, 0, 0, 0, 0, 0, im] - eta / (zeta + eta) * vrr_terms[i - 1, 0, 0, 0, 0, 0, im + 1])) for j in range(ma): for i in range(la + 1): for im in range(mtot - i - j): vrr_terms[i, j + 1, 0, 0, 0, 0, im] = ( (py - ya) * vrr_terms[i, j, 0, 0, 0, 0, im] + (wy - py) * vrr_terms[i, j, 0, 0, 0, 0, im + 1]) if j: vrr_terms[i, j + 1, 0, 0, 0, 0, im] += (j / 2. / zeta * ( vrr_terms[i, j - 1, 0, 0, 0, 0, im] - eta / (zeta + eta) * vrr_terms[i, j - 1, 0, 0, 0, 0, im + 1]) ) for k in range(na): for j in range(ma + 1): for i in range(la + 1): for im in range(mtot - i - j - k): vrr_terms[i, j, k + 1, 0, 0, 0, im] = ( (pz - za) * vrr_terms[i, j, k, 0, 0, 0, im] + (wz - pz) * vrr_terms[i, j, k, 0, 0, 0, im + 1]) if k: vrr_terms[i, j, k + 1, 0, 0, 0, im] += ( k / 2. / zeta * (vrr_terms[i, j, k - 1, 0, 0, 0, im] - eta / (zeta + eta) * vrr_terms[i, j, k - 1, 0, 0, 0, im + 1])) for q in range(lc): for k in range(na + 1): for j in range(ma + 1): for i in range(la + 1): for im in range(mtot - i - j - k - q): vrr_terms[i, j, k, q + 1, 0, 0, im] = ( (qx - xc) * vrr_terms[i, j, k, q, 0, 0, im] + (wx - qx) * vrr_terms[i, j, k, q, 0, 0, im + 1]) if q: vrr_terms[i, j, k, q + 1, 0, 0, im] += ( q / 2. / eta * (vrr_terms[i, j, k, q - 1, 0, 0, im] - zeta / (zeta + eta) * vrr_terms[i, j, k, q - 1, 0, 0, im + 1])) if i: vrr_terms[i, j, k, q + 1, 0, 0, im] += ( i / 2. / (zeta + eta) * vrr_terms[i - 1, j, k, q, 0, 0, im + 1]) for r in range(mc): for q in range(lc + 1): for k in range(na + 1): for j in range(ma + 1): for i in range(la + 1): for im in range(mtot - i - j - k - q - r): vrr_terms[i, j, k, q, r + 1, 0, im] = ( (qy - yc) * vrr_terms[i, j, k, q, r, 0, im] + (wy - qy) * vrr_terms[i, j, k, q, r, 0, im + 1]) if r: vrr_terms[i, j, k, q, r + 1, 0, im] += ( r / 2. / eta * (vrr_terms[i, j, k, q, r - 1, 0, im] - zeta / (zeta + eta) * vrr_terms[i, j, k, q, r - 1, 0, im + 1])) if j: vrr_terms[i, j, k, q, r + 1, 0, im] += ( j / 2. / (zeta + eta) * vrr_terms[i, j - 1, k, q, r, 0, im + 1]) for s in range(nc): for r in range(mc + 1): for q in range(lc + 1): for k in range(na + 1): for j in range(ma + 1): for i in range(la + 1): for im in range(mtot - i - j - k - q - r - s): vrr_terms[i, j, k, q, r, s + 1, im] = ( (qz - zc) * vrr_terms[i, j, k, q, r, s, im] + (wz - qz) * vrr_terms[i, j, k, q, r, s, im + 1]) if s: vrr_terms[i, j, k, q, r, s + 1, im] += ( s / 2. / eta * (vrr_terms[i, j, k, q, r, s - 1, im] - zeta / (zeta + eta) * vrr_terms[ i, j, k, q, r, s - 1, im + 1])) if k: vrr_terms[i, j, k, q, r, s + 1, im] += (k / 2. / (zeta + eta) * vrr_terms[i, j, k - 1, q, r, s, im + 1]) return vrr_terms[la, ma, na, lc, mc, nc, M]
def vrr_array(xyza, lmna, alphaa, xyzb, alphab, xyzc, lmnc, alphac, xyzd, alphad): la, ma, na = lmna lc, mc, nc = lmnc xa, ya, za = xyza xb, yb, zb = xyzb xc, yc, zc = xyzc xd, yd, zd = xyzd px, py, pz = xyzp = gaussian_product_center(alphaa, xyza, alphab, xyzb) qx, qy, qz = xyzq = gaussian_product_center(alphac, xyzc, alphad, xyzd) zeta, eta = float(alphaa + alphab), float(alphac + alphad) wx, wy, wz = xyzw = gaussian_product_center(zeta, xyzp, eta, xyzq) zpe = zeta + eta rab2 = norm2(xyza - xyzb) Kab = sqrt(2)*pow(pi,1.25)/(alphaa+alphab)\ *exp(-alphaa*alphab/(alphaa+alphab)*rab2) rcd2 = norm2(xyzc - xyzd) Kcd = sqrt(2)*pow(pi,1.25)/(alphac+alphad)\ *exp(-alphac*alphad/(alphac+alphad)*rcd2) rpq2 = norm2(xyzp - xyzq) T = zeta * eta / zpe * rpq2 mtot = sum(lmna) + sum(lmnc) vrr_terms = {} #zeros((la+1,ma+1,na+1,lc+1,mc+1,nc+1,mtot+1),'d') for m in xrange(mtot + 1): vrr_terms[0, 0, 0, 0, 0, 0, m] = Fgamma(m, T) * Kab * Kcd / sqrt(zpe) for i in xrange(la): for m in xrange(mtot - i): vrr_terms[i+1,0,0, 0,0,0, m] = (px-xa)*vrr_terms[i,0,0, 0,0,0, m] +\ (wx-px)*vrr_terms[i,0,0, 0,0,0, m+1] if i > 0: vrr_terms[i + 1, 0, 0, 0, 0, 0, m] += i / 2. / zeta * ( vrr_terms[i - 1, 0, 0, 0, 0, 0, m] - eta / zpe * vrr_terms[i - 1, 0, 0, 0, 0, 0, m + 1]) for i, j in product(xrange(la + 1), xrange(ma)): for m in range(mtot - i - j): vrr_terms[i,j+1,0, 0,0,0, m] = (py-ya)*vrr_terms[i,j,0, 0,0,0, m] +\ (wy-py)*vrr_terms[i,j,0, 0,0,0, m+1] if j > 0: vrr_terms[i, j + 1, 0, 0, 0, 0, m] += j / 2. / zeta * ( vrr_terms[i, j - 1, 0, 0, 0, 0, m] - eta / zpe * vrr_terms[i, j - 1, 0, 0, 0, 0, m + 1]) for i, j, k in product(xrange(la + 1), xrange(ma + 1), xrange(na)): for m in range(mtot - i - j - k): vrr_terms[i,j,k+1, 0,0,0, m] = (pz-za)*vrr_terms[i,j,k, 0,0,0, m] +\ (wz-pz)*vrr_terms[i,j,k, 0,0,0, m+1] if k > 0: vrr_terms[i, j, k + 1, 0, 0, 0, m] += k / 2. / zeta * ( vrr_terms[i, j, k - 1, 0, 0, 0, m] - eta / zpe * vrr_terms[i, j, k - 1, 0, 0, 0, m + 1]) for i, j, k, q in product(xrange(la + 1), xrange(ma + 1), xrange(na + 1), xrange(lc)): for m in range(mtot - i - j - k - q): vrr_terms[i,j,k, q+1,0,0, m] = (qx-xc)*vrr_terms[i,j,k, q,0,0, m] +\ (wx-qx)*vrr_terms[i,j,k, q,0,0, m+1] if q > 0: vrr_terms[i, j, k, q + 1, 0, 0, m] += q / 2. / eta * ( vrr_terms[i, j, k, q - 1, 0, 0, m] - zeta / zpe * vrr_terms[i, j, k, q - 1, 0, 0, m + 1]) if i > 0: vrr_terms[i, j, k, q + 1, 0, 0, m] += i / 2. / zpe * vrr_terms[i - 1, j, k, q, 0, 0, m + 1] for i, j, k, q, r in product(xrange(la + 1), xrange(ma + 1), xrange(na + 1), xrange(lc + 1), xrange(mc)): for m in range(mtot - i - j - k - q - r): vrr_terms[i,j,k, q,r+1,0, m] = (qy-yc)*vrr_terms[i,j,k, q,r,0, m] +\ (wy-qy)*vrr_terms[i,j,k, q,r,0, m+1] if r > 0: vrr_terms[i, j, k, q, r + 1, 0, m] += r / 2. / eta * ( vrr_terms[i, j, k, q, r - 1, 0, m] - zeta / zpe * vrr_terms[i, j, k, q, r - 1, 0, m + 1]) if j > 0: vrr_terms[i, j, k, q, r + 1, 0, m] += j / 2. / zpe * vrr_terms[i, j - 1, k, q, r, 0, m + 1] for i, j, k, q, r, s in product(xrange(la + 1), xrange(ma + 1), xrange(na + 1), xrange(lc + 1), xrange(mc + 1), xrange(nc)): for m in range(mtot - i - j - k - q - r - s): vrr_terms[i,j,k,q,r,s+1,m] = (qz-zc)*vrr_terms[i,j,k,q,r,s,m] +\ (wz-qz)*vrr_terms[i,j,k,q,r,s,m+1] if s > 0: vrr_terms[i, j, k, q, r, s + 1, m] += s / 2. / eta * ( vrr_terms[i, j, k, q, r, s - 1, m] - zeta / zpe * vrr_terms[i, j, k, q, r, s - 1, m + 1]) if k > 0: vrr_terms[i, j, k, q, r, s + 1, m] += k / 2. / zpe * vrr_terms[i, j, k - 1, q, r, s, m + 1] return vrr_terms
def vrr_shell_2(aexpn, xyza, bexpn, xyzb, cexpn, xyzc, dexpn, xyzd, maxa, maxc): # This uses a more intelligent method of looping over the am's to # generate the powers required import copy xyzp = gaussian_product_center(aexpn, xyza, bexpn, xyzb) xyzq = gaussian_product_center(cexpn, xyzc, dexpn, xyzd) zeta, eta = float(aexpn + bexpn), float(cexpn + dexpn) xyzw = gaussian_product_center(zeta, xyzp, eta, xyzq) zpe = zeta + eta mtot = 3 * maxa + 3 * maxc # Don't need all of these terms: #terms = zeros((maxa+1,maxa+1,maxa+1,maxc+1,maxc+1,maxc+1,mtot+1),'d') terms = {} # Do ama=amc=0 term first: ama, amc = 0, 0 for m, t in enumerate( term0(aexpn, xyza, bexpn, xyzb, cexpn, xyzc, dexpn, xyzd, mtot)): terms[0, 0, 0, 0, 0, 0, m] = t #end m pqac = (xyzp[0] - xyza[0], xyzp[1] - xyza[1], xyzp[2] - xyza[2], xyzq[0] - xyzc[0], xyzq[1] - xyzc[1], xyzq[2] - xyzc[2]) wpq = (xyzw[0] - xyzp[0], xyzw[1] - xyzp[1], xyzw[2] - xyzp[2], xyzw[0] - xyzq[0], xyzw[1] - xyzq[1], xyzw[2] - xyzq[2]) ze = (eta, eta, eta, zeta, zeta, zeta) zezpe = [zei / zpe for zei in ze] #ama>0, amc=0 for ama in xrange(1, maxa + 1): for aI, aJ, aK in shell_iterator(ama): l = [aI, aJ, aK, 0, 0, 0] ind = indmax(l) val = l[ind] r1, r2, r3, r4, r5, r6 = copy_and_decrement(l, ind) s1, s2, s3, s4, s5, s6 = copy_and_decrement(l, ind, ind) for m in xrange(mtot - aI - aJ - aK): terms[aI,aJ,aK, 0,0,0, m] = pqac[ind]*terms[r1,r2,r3, r4,r5,r6,m] +\ wpq[ind]*terms[r1,r2,r3, r4,r5,r6,m+1] if val > 1: terms[aI,aJ,aK, 0,0,0, m] += 0.5*(val-1)/ze[ind]*( terms[s1,s2,s3, s4,s5,s6,m] -\ zezpe[ind]*terms[s1,s2,s3, s4,s5,s6,m+1]) #end m #end cijk #end ama # ama=0, amc>0 here: for amc in xrange(1, maxc + 1): for cI, cJ, cK in shell_iterator(amc): l = [0, 0, 0, cI, cJ, cK] ind = indmax(l) val = l[ind] r1, r2, r3, r4, r5, r6 = copy_and_decrement(l, ind) s1, s2, s3, s4, s5, s6 = copy_and_decrement(l, ind, ind) for m in xrange(mtot - cI - cJ - cK): terms[0,0,0, cI,cJ,cK, m] = pqac[ind]*terms[r1,r2,r3, r4,r5,r6,m] +\ wpq[ind]*terms[r1,r2,r3, r4,r5,r6,m+1] if val > 1: terms[0,0,0, cI,cJ,cK, m] += 0.5*(val-1)/ze[ind]*( terms[s1,s2,s3, s4,s5,s6,m] -\ zezpe[ind]*terms[s1,s2,s3, s4,s5,s6,m+1]) #end m #end cIJK #end amc # ama>0, amc>0 for ama in xrange(1, maxa + 1): for amc in xrange(1, maxc + 1): for aI, aJ, aK in shell_iterator(ama): for cI, cJ, cK in shell_iterator(amc): l = [aI, aJ, aK, cI, cJ, cK] ind = indmax(l) val = l[ind] cind = (ind + 3) % 6 cval = l[cind] r1, r2, r3, r4, r5, r6 = copy_and_decrement(l, ind) s1, s2, s3, s4, s5, s6 = copy_and_decrement(l, ind, ind) t1, t2, t3, t4, t5, t6 = copy_and_decrement(l, ind, cind) for m in xrange(mtot - aI - aJ - aK - cI - cJ - cK): terms[aI,aJ,aK, cI,cJ,cK, m] = pqac[ind]*terms[r1,r2,r3, r4,r5,r6,m] +\ wpq[ind]*terms[r1,r2,r3, r4,r5,r6,m+1] # should this be ...0.5*(val-1)/... ? if val > 1: terms[aI,aJ,aK, cI,cJ,cK, m] += 0.5*(val-1)/ze[ind]*( terms[s1,s2,s3, s4,s5,s6,m] -\ zezpe[ind]*terms[s1,s2,s3, s4,s5,s6,m+1]) #print 'c',(aI,aJ,aK,cI,cJ,cK,m),terms[aI,aJ,aK,cI,cJ,cK,m] if cval > 0: terms[aI, aJ, aK, cI, cJ, cK, m] += 0.5 * cval / zpe * terms[t1, t2, t3, t4, t5, t6, m + 1] #end m #end bijk #end aijk #end amc #end ama return pack_full(terms, maxa, maxc) # and unpack later