Columbus
|
00README,
Columbus.22-jun-92.tar.Z,
Columbus.new.06-oct-94.tar.Z,
README.ccl,
aogrd.tar.Z,
autbas.tar.Z,
batra.tar.Z,
ciden.doc,
ciden.tar.Z,
cidrt.tar.Z,
cigrd.tar.Z,
ciudg.tar.Z,
ciuft.tar.Z,
columbus.new.17-mar-95.tar.Z,
gdiis.doc,
gdiis.f,
global1.3.1.tar.Z,
global2.0.tar.Z,
hermit.tar.Z,
makefile,
mcdrt.tar.Z,
mcscf.tar.Z,
mcuft.tar.Z,
newbas.tar.Z,
property.doc,
property.f,
tcgmsg.4.03.tar.Z
|
|
|
c
c pa60 - polyatom properties program for s,p,d and f-orbitals
c
c 250 basis functions allowed
c
c input modified according to the karlsruhe version of pitzer's
c scf-program by c.m.ehrhardt
c for this purpose the subroutines inpsym,getran,scfinp and comtrn
c are taken from h.f. scfaefer's gradient-program
c
c the subroutines rhftce,propa and prod were made faster (4.3.1984)
c
c the program was modified to handle f-functions by p.maier and
c c.m.ehrhardt ( 1.3.1984 )
c
c mulliken and roby population analysis included ( 12.7.1984 )
c
c modified to calculate the kinetic energy and its relativistic
c correction by s. brode in april,1984 : a subroutine opap4 was
c added and the main program and the subroutines dintfm, pint,
c propa and prnt were slightly modified
c
c boys localization included by r.ahlrichs and h.schiffer
c (1.3.1985)
c
c ft02,ft04,ft07,ft09 scratch files
c ft22 localized mos for plopr
c ft21 electrostatic potential
c ft23 file for plot
c
c input description:
c
c input files:
c ft24 integral information from the karlsruhe integral input
c program
c ft08 eigenvectors and occupation as written out by subroutine
c outgrd of scf-program
c ft05 input unit
c ft28 optional file for atomic coordinates (compatible to ints)
c
c input on unit ft05:
c
c 1. title (format 12a6)
c
c 2. isl1 , isl2 , isl4 , nsupp (format 4i5)
c isl1 = 1 full property calculation (default)
c isl1 = 2 property only in ao-basis
c isl2 = 1 no output of property matrix in ao-basis(default)
c isl2 = 2 output of these integrals
c isl2 = 3 output, and integrals are written on unit 3
c isl4 = 1 renormalisation of wavefunctions and output
c isl4 = 2 no renormalisation
c isl4 = all other values renormalisation but no output
c (default)
c nsupp= 1 output of diagonalelements of property matrix
c in mo-basis
c nsupp= 2 controll-output of integral and scf input data
c nsupp= 3 output of mo vectors in ao basis
c nsupp= 4 output of overlap population per mo
c nsupp= 0 no output (default=0)
c
c 3. m, ilnmc, icntr, (c(k),k=1,3) (format i5,6x,a4,i5,3f10.5)
c step 3 can be repeated several times
c population analysis or localization must always be the
c last option
c m specifies the property :
c potential(1), electric field(2), field gradient(3),
c dipole moment(4), quadrupole moment(5), third moment(6),
c planar density(7), linear density(8), charge density(9),
c overlap(10), second moment(11), diamagnetic shielding(12),
c relativistic correction(13), mulliken and roby population
c analysis(14), boys localization(15), plot(16)
c
c ilnmc name of the point at which property shall be
c calculated
c icntr number of atom at which property shall be
c calculated, if icntr.ne.0 you need not read in
c coordinates
c c(k) cartesian coordiantes of the point
c
c 4. special input for population analysis (m=14)
c
c nmao, (mor(im),im=1,nmao) (format i10, 20 i3)
c nmao number of maos for atom 1,2...,n
c mor numbers of selected maos
c mor(1)= 0 automatic selection
c nm, (iatnr(i),i=1,nm) (format 20i3)
c nm.ne.0 special multicenter term of order nm
c iatnr(i) atoms that form the multicenter term
c (a blank line is required if nm=0)
c
c 5. special input for localization (m=15)
c nmo (format 5x,i5)
c nmo = -1 all occupied mo's shall be localized
c nmo = 0 now the program wants to read a threshold
c for the selection of mo's, wich shall be
c localized
c nmo = nmo number of mo's, wich shall be localized
c now the program wants to read the corresponding
c mo numbers in ascending order
c either thr (5x,f10.4) for nmo = 0
c or mon(i),i=1,nmo (5x,(5i5)) for nmo > 0
c nop (5x,i5)
c nop = 0 no further input needed for localization
c nop = nop number of operators ( 1,2 or 3 )
c now the program wants to read the corresponding
c operator numbers ( x=1, y=2, z=3 ) in canonical
c order
c opn(i),i=1,nop (5x,3i5) for nop > 0
c
c
c important dimensions
c
c number of atoms: nocmx = 50
c number of primitive basis functions : nbmx = 720
c number of contracted basis functions
c and number of mos : nomx = 250
c dimension of buff : lbuff = nomx*(nomx+1)/2
c dimensions in common /big/ : maxuv = nomx**2
c max number of orbitals to be local. : mloc = 250
c (in common eig and scfinf)
c dimension of rnabcd : n*(n-3)/2+m
c with: n=nocmx*(nocmx-3)/2+nocmx-1
c m=(nocmx-2)*(nocmx-5)/2+nocmx-3
c max number of grids for 'x' direction: nmaxx = 50
c max number of grids for 'y' direction: nmaxy = 50
c max number of orbitals to be ploted : norbmx = 10
c
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375,nrabcd=748379)
parameter(nmaxx=50,nmaxy=50,norbmx=10,icomx=12)
real*8 icod(12),ilab(12),ilbl(12)
dimension eta(nbmx,25),fcntr(nbmx),
1 ftype(nbmx),frocc(nomx),c(3),dint(3,10),
2 type(20),val(10),tot(10),nstart(nomx),nstop(nomx),
3 ncontc(nomx),buff(lbuff),a(39),title(150),
4 cint(nomx,10),izahl(nbmx),itrnao(nbmx),idxxt(nbmx),
5 rnabcd(nrabcd),contrc(nomx,icomx)
dimension nocc(norbmx),cc(nmaxx*nmaxy,3),
1 dd(nmaxx*nmaxy,3),dinx(nmaxx*nmaxy),
2 cin(nmaxx*nmaxy,norbmx+1),
3 v(nmaxx*nmaxy),ddsq(nmaxx*nmaxy)
equivalence (buff(nocmx+1),rnabcd(1))
external opaa0,opaa1,opaa2,opab1,opab2,opab3,opac1,opac2, opac3,
1opad1,opab4,opaa3,opap4
external potnuc,fldnuc,grdnuc,dipnuc,qudnuc,octnuc,nonuc,magnuc,
1sldnuc
integer centr,fcntr,ftype,type
common/ioind/isl1, isl2
common/muli/vlist(nocmx,4),ianr(nomx),centr(nocmx),itnr(nomx)
common/holl/blabel(19),alabel(19),fmt(4),jl,lomao,iopen,nsym
common/supp/nsupp
common/ncnt/ilnmcm
common/prptyp/m
common /contrc/ chomo,ncont
common /big/ y(nomx*nomx),su(nomx*nomx),p(nomx,nomx)
c
data nromx/3/,nfcol/25/,ntcol/20/,iwarn/0/,ir/8/
data icod/6h1pa60 ,6h ,6h ,6hnyu pr,6hoperti,6hes pac,
1 6hkage ,6h ,6h ,6h ,6h12/66 ,6hspdf /
data title/6h 1/r,6h ex,6h fxx,6h x,6h qxx,6h oxxx,
1 6h dx,6h dxy,6h den,6h ovl,6h xx,6h fx*x*,6h qx*x*,
2 6h x*x*,6h, 6h ,6h ey,6h fyy,
3 6h y,6h qyy,6h oyyy,6h dy,6h dxz,6h ,6h ,
4 6h yy,6h fy*y*,6h qy*y*,6h y*y*,6h ,
5 6h ,6h ez,6h fzz,6h z,6h qzz,6h ozzz,6h dz,
6 6h dyz,6h ,6h ,6h zz,6h fz*z*,6h qz*z*,6h z*z*,
7 6h sum , 6h ,6h ,6h fxy,6h ,
8 6h qxy,6h oxxy,6h ,6h ,6h ,6h ,6h xy,
9 6h fx*y*,6h qx*y*,6h x*y*,6h , 6h ,
1 6h ,6h fxz,6h ,6h qxz,6h oxxz,6h ,6h ,
2 6h ,6h ,6h xz,6h fx*z*,6h qx*z*,6h x*z*,6h ,
3 6h ,6h ,6h fyz,6h ,6h qyz,
4 6h oxyy,6h ,6h ,6h ,6h ,6h yz,6h fy*z*,
5 6h qy*z*,6h y*z*,6h ,
6 4*6h ,6h rsq,6h oyyz,9*6h ,
7 5*6h ,6h oxzz,9*6h ,
8 5*6h ,6h oyzz,9*6h ,
9 5*6h ,6h oxyz,9*6h /
data a/6hpotent,6helectr,6hfield ,6hdipole,6hquadru,6hthird ,
1 6hplanar,6hline d,6hcharge,6hoverla,6hsecond,6hdiamag,
& 6hrelati,
2 6hial ,6hic fie,6hgradie,6h momen,6hpole m,6hmoment,
3 6h densi,6hensity,6h densi,6hp ,6h momen,6hnetic ,
& 6hvistic,
4 6h ,6hld ,6hnt ,6ht ,6homent ,6h ,
5 6hty ,6h ,6hty ,6h ,6ht ,6hshldg ,
& 6h corr./
data type/4hs ,4hx ,4hy ,4hz ,4hxx ,4hyy ,4hzz ,
1 4hxy ,4hxz ,4hyz ,4hxxx ,4hyyy ,4hzzz ,4hxxy ,4hxxz ,
2 4hyyx ,4hyyz ,4hzzx ,4hzzy ,4hxyz /
c
c** call xuflow(0)
c file shout short output
open(unit=5,file='propin')
open(6,file='propls')
nshout=13
open(unit=nshout,file='shout',status='unknown'
&,access='sequential',form='formatted')
rewind nshout
c file vectgrd scf vectors
c ir=8
open(unit=ir,file='vectgrd',status='old',
1access='sequential',form='formatted')
c file plot: plot output
iplot=23
open(unit=iplot,file='plot',status='unknown',form='formatted')
rewind iplot
c
maxuv=nomx*nomx
lomao=22
76 do 20 i=1,12
20 ilab(i) = icod(i)
do 22 i=1,nomx
22 frocc(i) = 0.0d0
read(5,101,end=999) (ilbl(i), i=1,12)
write(6,101) (ilab(i), i=1,12)
write(6,103)
write(6,104) (ilbl(i), i=1,12)
read(5,100) isl1,isl2,isl4,nsupp
if(isl1.eq.0) isl1=1
if(isl2.eq.0) isl2=1
if(isl4.eq.0) isl4=3
if(isl2.eq.3) rewind 3
call input(eta,nfcol,fcntr,ftype,n,nbmx,vlist,centr,non,nocmx,
1 ntcol,type,ilab,ilbl,nomx,nstart,
2 nstop,contrc,ncontc,buff,izahl,nbfao,icomx,ianr,itnr)
call nrml(eta,nbmx,nfcol,nomx,contrc,nstart,nstop,fcntr,ftype,
1isl4,c,opad1)
c
c ivmax.ne.0 : transformation of mo-vectors in ao basis has already
c been done
rewind ir
read (ir,940)(alabel(i1),i1=1,19)
read(ir,940)(blabel(i1),i1=1,19)
read(ir,950)iopen,nsym,ivmax
read(ir,940)(fmt(i1),i1=1,4)
if(ivmax.eq.0) goto 170
if(ivmax.gt.maxuv) goto 1500
read(ir,fmt) (y(i),i=1,ivmax)
norb=iopen
do 180 nn=1,norb
frocc(nn)=2.0d0
180 chomo=chomo-2.0d0
write(6,970) chomo
goto 25
c
170 call getran(nbfao,frocc,norb,itrnao,idxxt)
25 read(5,102,end=999)m,ilnmcm,icntr,(c(k),k=1,3)
if(iwarn.eq.1) goto 998
if(m.eq.14.or.m.eq.15) iwarn=1
if(icntr.eq.0) go to 800
do 801 i=1,3
801 c(i)=vlist(icntr,i)
800 if(m.eq.0) go to 76
go to (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16),m
1 call dintfm(opaa0, potnuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
2 call dintfm(opaa1, fldnuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
3 call dintfm(opaa2, grdnuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
4 call dintfm(opab1, dipnuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
5 call dintfm(opab2, qudnuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
6 call dintfm(opab3, octnuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
7 call dintfm(opac1, nonuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
8 call dintfm(opac2, nonuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
9 call dintfm(opac3, nonuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
10 call dintfm(opad1, nonuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
11 call dintfm(opab4, magnuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
12 call dintfm(opaa3,sldnuc, dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
13 call dintfm(opap4, nonuc, dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
14 call dintfm(opad1, nonuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
15 call dintfm(opab1, nonuc,dint, vlist,c,n,eta,val,nt
1,norb,frocc,tot,non,nromx,ilbl,a,title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
go to 25
16 call plotin(nmaxx,nmaxy,kpmax,cc,norbpl,mdens,nocc,norbmx,iplot,
1 iat)
if(iat.gt.0) call molcor(iplot)
call orbval(eta,nbmx,norbmx,nomx,nstart,nstop,contrc,ftype,
1frocc,cc,dd,dinx,cin,v,ddsq,kpmax,norbpl,mdens,nocc,y,iplot)
go to 25
999 stop
1500 write(6,960) ivmax,maxuv
stop
100 format(6i5)
101 format(12a6)
102 format(i5,6x,a4,i5,3f10.0)
103 format(/)
104 format(1x,12a6)
105 format(2x,10a4)
940 format(19a4)
950 format(20i4)
960 format(//' dimension of y in main program too small ! ivmax= ',
&i6,' maxuv= ',i6//)
970 format(/' charge of the molecule ',f10.5/)
c
998 write(6,106)
106 format(1x,'option 14 (population analysis) or option 15 (localizat
1ion) must be the last one'/,' ***** calculation stopped *****')
stop
end
c
c
subroutine input( eta, nfcol, fcntr, ftype, n, nbmx, vlist, centr,
1 non,nocmx,ntcol,type,ilab,ilbl,nomx,
2 nstart,nstop,contrc,ncontc,buff,izahl,nbfao,icomx,ianr,
3 itnr)
implicit real*8(a-h,o-z)
c
c parameter statement as in integral program
parameter(laords=18,lconsu=60,lgcsu=18,lru=20,lcsu=24,
& lctu=30,lsfu=200,lgu=9,lsfru=250,lnsfu=6000,
& lpru=18000,lsu=50,lstu=8,lconu=12,
& lcu=8,lccu=182)
c
c this subroutine prepares the integral input from the karlsruhe
c input program for polyatom.
c one part is taken from routine convrt of schaefer's gradient
c program
c
real*8 ilab(12), ilbl(12)
integer fcntr, ftype, centr, type
dimension eta(nbmx,nfcol), vlist(nocmx,4),ianr(1),itnr(1)
dimension fcntr(1), ftype(1), centr(1), type(1),contrc(nomx,8)
dimension nstart(1),nstop(1),ncontc(1),buff(1),frocc(1),izahl(1)
common /contrc/ chomo,ncont
common /ioind/isl1,isl2
common/infoa/natoms,mul,nbf,nij,nelec,nalpha,nbeta
common /ntgr/ kaords, mconsu, mstu, msfu, mgu, msfru, mnsfu, mpru,
1mcxu,ngcs,mdum(45),mccu,mblu,ns,ng,nsf,nst,ncons
common/bl/nf(lsu),nc(lsu),ncon(lconsu),lmnp1(lconsu),
1 ntl(lsfu),ntu(lsfu),nnt(lsfu),mcons(lsfu),ica(lcu,lsu,lgu),
2 ccoef(lsu,lconsu),zet(lconu,lconsu),x(lcu,lsu),yy(lcu,lsu),
3 z(lcu,lsu),nir(laords),nso(lstu),nd(lstu),nblpr(lstu),
4 la(lru,laords),nct(lsfu),maords(lgcsu),mgcs(lsfu),
5 mtype(lsu),c(lctu,lcsu,lgcsu),chg(lsu),ityp(lstu)
c
msu=lsu
mconsu=lconsu
mconu=lconu
mcu=lcu
msfu=lsfu
mgu=lgu
mnsfu=lnsfu
mpru=lpru
mccu=lccu
kaords=laords
mgcsu=lgcsu
mstu=lstu
mru=lru
mcsu=lcsu
mctu=lctu
msfru=lsfru
call inpsym(mcu,msu,mru,mctu,mcsu,icomx,mgcsu)
n=0
nbf=0
ispf=0
natoms=0
nr=0
do 500 is=1,ns
icu=nc(is)
ifu=nf(is)
do 400 ic=1,icu
isf=ispf
natoms=natoms+1
if(natoms.le.nocmx) goto 504
write(6,1200)
1200 format(1x,'too many atoms in subroutine input')
stop
504 centr(natoms)=mtype(is)
vlist(natoms,1)=x(ic,is)
vlist(natoms,2)=yy(ic,is)
vlist(natoms,3)=z(ic,is)
vlist(natoms,4)=chg(is)
chomo=chomo+chg(is)
nr=nr+1
do 400 if=1,ifu
isf=isf+1
icons=mcons(isf)
ncns=ncon(icons)
jtyp=lmnp1(icons)
if(jtyp.le.4) goto 11
write(6,1000) jtyp
1000 format(1x,' jtyp = ',i3,4x,' only s,p,d and f orbitals are allowed
1 ',/,'****** calculation stopped ******')
stop
11 continue
jtypm=jtyp*(jtyp+1)/2
jtyp = (jtypm*(jtyp-1))/3 +1
do 400 i=1,jtypm
nbf=nbf+1
if(nbf.lt.nomx) goto 503
write(6,1100) nbf,nomx
1100 format(1x,' dimension too small in input, nbf =',i5,3x,
1' nomx =',i5)
stop
503 ncontc(nbf)=ncns
itnr(nbf)=jtyp-1+i
ianr(nbf)=nr
do 400 icon=1,ncns
n=n+1
if(n.le.nbmx) goto 505
write(6,1300)
1300 format(1x,'too many primitive functions in subroutine input')
stop
505 izahl(n)=nr
fcntr(n)=mtype(is)
ftype(n)=type(jtyp-1+i)
eta(n,4)=zet(icon,icons)
contrc(nbf,icon)=ccoef(icon,icons)
400 continue
ispf=ispf+ifu
500 continue
non=natoms
ncont=nbf
nbfao=nbf
call rdetac(eta,nfcol,fcntr,ftype,n,nbmx,vlist,centr,non,
1 nocmx,ntcol,type,nstart,nstop,contrc,ncontc,nomx,
2 izahl)
return
end
c
c
subroutine rdetac(eta,nfcol,cntr,typ,n,nfmx,vlist,centre,non,
1ncmx,ntcol,type,nstart,nstop,contrc,ncontc,nomx,izahl)
c
c polyatom inputroutine for basis functions
c
implicit real*8(a-h,o-z)
common /contrc/ chomo,ncont
dimension ncontc(1),nstart(1),nstop(1),contrc(nomx,8)
dimension eta(nfmx,nfcol),vlist(ncmx,4)
dimension cntr(1),typ(1),centre(1),type(1),izahl(1)
integer cntr,typ,centre,blank,type
write(6,105)
c.....center specifications
write(6,104)
write(6,106)
do 1 i=1,non
write(6,107) centre(i), (vlist(i,j), j=1,4)
1 continue
if(ncont.ne.n) go to 202
do 201 i=1,n
201 ncontc(i) = 1
202 nstart(1)=1
nstop(1)=ncontc(1)
do 31 i=2,ncont
nstart(i)=nstart(i-1)+ncontc(i-1)
31 nstop(i)=nstop(i-1)+ncontc(i)
c.....set up coordinates of function in eta
icon=1
jcon=0
do 3 i=1,n
if(i-nstop(icon)) 60,60,61
60 jcon=jcon+1
go to 62
61 icon=icon+1
jcon=1
62 j=izahl(i)
do 6 m=1,3
6 eta(i,m)=vlist(j,m)
c.....set up unnormalized hybridization coeffs of function in eta
do 7 j=1,ntcol
if(noteqv(type(j),typ(i))) 7, 8, 7
7 continue
write(6,2000) type(j),typ(i)
2000 format('0***** types not equal ',2a4)
stop
8 continue
do 9 m=1,ntcol
9 eta(i,m+5)=0.0d0
do 2 m=1,ntcol
if(typ(i).ne.type(m)) goto 2
eta(i,5)=m
eta(i,m+5)=1.0
goto 3
2 continue
3 continue
return
101 format(2i3)
1020 format(a4,6x,4f12.0)
1030 format(36i2)
103 format(a4,6x,a4,i3,3x,2f12.0)
104 format(/ ,1x,15hnuclear centres)
105 format(///,1x,32hgaussian function specifications)
106 format(/ ,1x,6hcentre,18x,12hco-ordinates,17x,6hcharge,//)
107 format(1x,a6,6x,3f12.8,6x,f4.1)
110 format(///,1x,8hfunction,3x,11hcontraction,3x,6hcentre,3x,4htype,
111x,8hexponent,3x,11hcoefficient)
111 format(1x,i5,8x,i5,8x,i3,a3,3x,a6,3x,2f13.7)
114 format(//,1x,18hadditional centres,//)
115 format(//,1x,6hcentre,18x,12hco-ordinates//)
end
c
c
subroutine nrml(eta,nfmx,nfcol,nomx,c,nstart,nstop,nc,nt,isl4,d,
1ovl)
implicit real*8 (a-h,o-z)
dimension a(20),eta(nfmx,nfcol),c(nomx,8),nstart(1),nstop(1),
1nc(1),nt(1),d(3)
data cons/15.7496099d0/,c1/1.0d0/,zero/0.d0/,c3/3.0d0/,c4/4.0d0/,
1 delt/1.0d-6/,c15/15.0d0/
common /contrc/chomo,ncont
c normalize primitive functions.
do 5 i=1,ncont
is=nstart(i)
if=nstop(i)
do 4 ii=is,if
z=eta(ii,4)*c4
do 1 m=1,20
1 a(m)=eta(ii,m+5)
s=cons*(a(1)+(a(2)+a(3)+a(4)+(a(8)+a(9)+a(10)+c3*(a(5)+a(6)+a(7))+
1 (a(20)+c3*(a(14)+a(15)+a(16)+a(17)+a(18)+a(19))+c15*(a(11)+a(12)
2 +a(13))) /z)/z)/z)/(z*sqrt(z))
s=c1/sqrt(s)
do 3 m=6,nfcol
3 eta(ii,m)=eta(ii,m)*s
4 continue
5 continue
if(isl4.eq.2) return
c renormalize contraction coefficients
d(1)=zero
d(2)=zero
d(3)=zero
if(isl4.ne.1) go to 2
write(6,101)
write(6,110)
2 do 9 i=1,ncont
is=nstart(i)
if=nstop(i)
ip=0
s=zero
do 7 ii=is,if
ip=ip+1
jp=0
do 7 jj=is,if
call propa(ovl,ii,jj,eta,a,d,1,nfmx)
jp=jp+1
s=s+c(i,ip)*c(i,jp)*a(1)
7 continue
s=c1/sqrt(s)
ip=0
do 8 ii=is,if
ip=ip+1
c(i,ip)=c(i,ip)*s
if(abs(c(i,ip)+c1).le.delt) c(i,ip)=c1
if(isl4.ne.1) go to 8
write(6,111)ii,i,nc(ii),nt(ii),eta(ii,4),c(i,ip)
8 continue
9 continue
110 format(//,1x,8hfunction,3x,11hcontraction,3x,6hcentre,3x,4htype,
111x,8hexponent,3x,11hcoefficient)
111 format(1x,i5,8x,i5,8x,a6,3x,a6,3x,2f13.7)
101 format(///,10x,15hrenormalization)
return
end
c
c
subroutine dintfm(opa, nuc, dint, vlist, c, n, eta,
1 val, nt, norb, frocc, tot, noc, nro, ilbl, a, title,
2 nstart,nstop,contrc,cint,buff,rnabcd)
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
common /contrc/ chomo,ncont
common /prptyp/ m
common /big/ y(nomx*nomx),su(nomx*nomx),p(nomx,nomx)
dimension dint(nro,*), vlist(nocmx,4), c(3), eta(nbmx,16), val(1),
1 frocc(1), tot(1)
dimension nstart(1),nstop(1),contrc(nomx,8),cint(nomx,1),
1 buff(lbuff),rnabcd(1)
real*8 ilbl
common /ioind/isl1,isl2
dimension ilbl(1), a(1), title(1), dinx(310)
dimension lin(84),min(84),nin(84)
data pi/3.14159265359d0/, cl/137.03604d0/
data lin/0,1,0,0,2,0,0,1,1,0,3,0,0,2,2,1,0,1,0,1,4,0,0,3,3,1,0,1,0
1 ,2,2,0,2,1,1,5,0,0,3,3,2,2,0,0,4,4,1,0,0,1,1,3,1,2,2,1,6,0,0,3,
2 3,0,5,5,1,0,0,1,4,4,2,0,2,0,3,3,1,2,2,1,4,1,1,2/,min/0,0,1,0,0,
3 2,0,1,0,1,0,3,0,1,0,2,2,0,1,1,0,4,0,1,0,3,3,0,1,2,0,2,1,2,1,0,5,
4 0,2,0,3,0,3,2,1,0,4,4,1,0,1,1,3,2,1,2,0,6,0,3,0,3,1,0,0,1,5,5,2,0
5,0,2,4,4,2,1,3,1,3,2,1,4,1,2/,nin/0,0,0,1,0,0,2,0,1,1,0,0,3,0,1,0,
6 1,2,2,1,0,0,4,0,1,0,1,3,3,0,2,2,1,1,2,0,0,5,0,2,0,3,2,3,0,1,0,1,
7 4,4,3,1,1,1,2,2,0,0,6,0,3,3,0,1,5,5,1,0,0,2,4,4,0,2,1,2,2,3,1,3,
8 1,1,4,2/
c
c
call dumdum(nuc,noc,vlist,c,dint,nro,nocmx,nt)
if(m.eq.15) nt=3
if(m.eq.13) nt=3
call pint(opa, n, eta, c, val, nt, nro, nbmx, a, title,
1 ilbl,nstart,nstop,contrc,nomx,buff,lbuff)
if (m.ne.13) go to 7
c
c calculation of the darwin-term
c
valval=0.0d0
c + loop over the centers
do 80 ic=1,noc
c(1)=vlist(ic,1)
c(2)=vlist(ic,2)
c(3)=vlist(ic,3)
ipp=0
c + + loop over the c-gto's
do 40 iz=1,ncont
dinx(iz)=0.d0
istart=nstart(iz)
istop=nstop(iz)
iprim=0
c + + + loop over the gto's
do 40 ii=istart,istop
ipp=ipp+1
iprim=iprim+1
ieta=eta(ii,5)+0.00001
li=lin(ieta)
mi=min(ieta)
ni=nin(ieta)
xc=c(1)-eta(ii,1)
yc=c(2)-eta(ii,2)
zc=c(3)-eta(ii,3)
expo=-eta(ii,4)*(xc*xc+yc*yc+zc*zc)
din=1.d0
if(li.ne.0) din=xc**li
if(mi.ne.0) din=din*yc**mi
if(ni.ne.0) din=din*zc**ni
din=din*exp(expo)
ieta=ieta+5
dinx(iz)=dinx(iz)+din*contrc(iz,iprim)*eta(ipp,ieta)
40 continue
vval=0.d0
ii=0
c + + loop over the orbitals
do 70 mi=1,norb
dens=0.d0
c + + + loop over the c-gtos
do 75 mj=1,ncont
ii=ii+1
dens=dens+dinx(mj)*y(ii)
75 continue
vval=vval+frocc(mi)*dens*dens
70 continue
valval=valval+vlist(ic,4)*vval
80 continue
dint(1,3)=valval*0.5d0*pi/cl**2
c
c
7 if (m.ne.14) go to 6
c
c mulliken and roby population analysis
c
call cntrcm(cint,norb,noc,buff,frocc,rnabcd)
return
c
6 go to (4,5), isl1
4 call output(dint,norb,n,nt,nro,frocc,tot,c,ilbl,a,title,
1 cint,buff)
5 return
end
c
c
subroutine pint(opa,n,eta,c,val,nt,nro,nbmx,a,title,
1 ilbl,nstart,nstop,contrc,nomx,buff,lbuff)
c
c calculation of integrals in ao-basis. data are written on
c file ft002
c
implicit real*8(a-h,o-z)
common /contrc/ chomo,ncont
dimension nstart(1),nstop(1),contrc(nomx,8)
dimension a(13,3), title(14,10)
dimension c(1),eta(nbmx,16),val(1),dinx(10),buff(lbuff)
real*8 ilbl(1)
common/ioind/isl1,isl2
common/prptyp/mm
ipr=ncont*(ncont+1)/2
if(ipr.gt.lbuff.and.mm.eq.14) goto 99
nu = 3
rewind 2
ix=0
do 50 i=1,ncont
do 50 j=1,i
nu = nu + 1
istart = nstart(i)
istop = nstop(i)
jstart = nstart(j)
jstop = nstop(j)
iprim = 0
do 2 m=1,nt
2 dinx(m)=0.0d0
do 40 ii=istart,istop
iprim = iprim + 1
jprim = 0
do 40 jj=jstart,jstop
jprim = jprim + 1
call propa(opa,ii,jj,eta,val,c,nt,nbmx)
do 30 m=1,nt
30 dinx(m) = contrc(i,iprim)*contrc(j,jprim)*val(m) + dinx(m)
40 continue
if(mm.ne.14) goto 55
ix=ix+1
buff(ix)=dinx(1)
goto 50
55 do 60 m=1,nt
ix=ix+1
buff(ix)=dinx(m)
if(ix.lt.lbuff)go to 60
ix=0
write(2)buff
60 continue
50 continue
if(mm.eq.14) return
write(2)buff
if(isl2.eq.1)return
if(isl2.eq.3) go to 1
write(6,19) (ilbl(i), i=1,12)
write(6,20) (a(mm,i), i=1,3)
write(6,21)
rewind 2
ix=lbuff
do 6 i=1,ncont
do 7 j=1,i
write(6,21)
do 70 m=1,nt
ix=ix+1
if(ix.le.lbuff)go to 70
ix=1
read(2)buff
70 write(6,10)i,j,buff(ix)
7 continue
6 continue
return
1 rewind 2
ix=lbuff
do 66 i=1,ncont
do 77 j=1,i
do 770 m=1,nt
ix=ix+1
if(ix.le.lbuff) go to 770
ix=1
read(2) buff
write(3) buff
770 continue
77 continue
66 continue
return
c
99 write(6,7000) ipr,lbuff
7000 format(1x,'dimension too small in subroutine pint ipr =',i8,
1 ' lbuff = ',i8,/,' population analysis is not possible')
stop
c
19 format(1h0,/ ,1x,12a6)
20 format( //,1x,34hintegrals over basis functions for,5x,3a6//)
21 format(/)
10 format(1x,2i5,d20.5)
end
c
c
subroutine cntrac(cint,norb,n,nt,nro,buff)
c
c transformation of integrals in mo-basis. only diagonalelements
c are calculated
c
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
common /contrc/ chomo,ncont
common/ioind/isl1, isl2
common /big/ y(nomx*nomx),su(nomx*nomx),p(nomx,nomx)
dimension cint(nomx,1),buff(lbuff)
rewind 2
do 10 m=1,nt
do 10 i=1,norb
10 cint(i,m)=0.0d0
nend=ncont*norb
ix=lbuff
do 50 k=1,ncont
do 50 l=1,k
do 40 m=1,nt
ix=ix+1
if(ix.le.lbuff)go to 20
ix=1
read(2)buff
20 do 30 i=1,norb
kk=ncont*(i-1)+k
ll=ncont*(i-1)+l
tmp=y(kk)*y(ll)
if(k.ne.l) tmp=tmp+tmp
30 cint(i,m)=buff(ix)*tmp+cint(i,m)
40 continue
50 continue
return
end
c
c
subroutine cntrcm(cint,norb,non,buff,frocc,rnabcd)
c
c mulliken and roby population analysis
c
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
integer centr
common/scfinf/dmh(nomx),roc(nomx)
common /big/ y(nomx*nomx),su(nomx*nomx),uv(nomx*nomx)
common/holl/blabel(19),alabel(19),fmt(4),jl,lomao,iopen,nsym
common/muli/vlist(nocmx,4),ianr(nomx),centr(nocmx),itnr(nomx)
common /contrc/ chomo,ncont
common/ioind/isl1, isl2
common/supp/nsupp
data ifile/4/,jfile/7/,kfile/9/,tol/0.d0/
dimension cint(2),buff(lbuff),rnmy(20),frocc(2),mor(20)
c number of aos : 250
c number of atoms : 16
c dimension of ovpop : 16*(16+1)/2
c dimension of nat and jatnr : 16+1
dimension ovpop(136),mos(250),iatnr(16),nat(17),rmopo(250,250)
dimension rnab(15,16),jatnr(17),rnabc(14,15,16),rnamo(250,16)
dimension rnabcd(1),katnr(16)
c rnabcd(1) equivalenced to buff(16+1) in main program
equivalence (uv(1),rmopo(1,1)), (rnabc(1,1,1),rnamo(1,1))
tri=1.d0/3.d0
four=1.d0/4.d0
ipr=ncont*(ncont+1)/2
ncmax=ncont*ncont
maxuv=nomx*nomx
idmax=maxuv/2
nocm1=nocmx-1
nocm2=nocmx-2
nocp1=nocmx+1
c
c mulliken population analysis
c
c overlap * mos, written on kfile (for roby analysis)
call hm(buff,y,su,norb,ncont)
momax=norb*ncont
rewind kfile
write(kfile) (su(ir),ir=1,momax)
rewind kfile
c
c calculation of density , written on jfile
do 205 i=1,ipr
205 su(i)=0.d0
do 210 k=1,norb
ij=0
ist=(k-1)*ncont
do 220 i=1,ncont
iy=ist+i
do 220 j=1,i
ij=ij+1
jy=ist+j
220 su(ij)=su(ij)+y(iy)*y(jy)*frocc(k)
210 continue
rewind jfile
write(jfile) (su(ir),ir=1,ipr)
rewind jfile
c
c
do 10 i=1,ncont
10 cint(i)=0.0d0
ix=0
iend=non*(non+1)/2
ij=0
do 15 i=1,iend
ovpop(i)=0.d0
do 15 j=1,norb
15 rmopo(i,j)=0.d0
c calculation of overlap charges
do 50 k=1,ncont
do 50 l=1,k
ij=ij+1
ix=ix+1
tmp=0.d0
do 30 i=1,norb
kk=ncont*(i-1)+k
ll=ncont*(i-1)+l
ka=ianr(k)
la=ianr(l)
kla=(ka*(ka-1))/2+la
tmpb=y(kk)*y(ll)*frocc(i)*buff(ix)
if(ka.ne.la) tmpb=tmpb*2.0d0
rmopo(kla,i)=rmopo(kla,i)+tmpb
if(k.eq.l) goto 30
if(ka.eq.la) rmopo(kla,i)=rmopo(kla,i)+tmpb
30 continue
tmpb=su(ij)*buff(ix)
cint(k)=cint(k)+tmpb
if(k.ne.l) cint(l)=cint(l)+tmpb
50 continue
ren=0.d0
do 150 ii=1,ncont
150 ren=ren+cint(ii)
write(6,1000)
c calculation of occupation numbers
do 70 j=1,non
do 71 k=1,20
71 rnmy(k)=0.d0
rnmy2=0.d0
rnmy3=0.d0
rnmy4=0.d0
rnm=0.d0
do 60 i=1,ncont
if(ianr(i).ne.j) goto 60
itp=itnr(i)
rnmy(itp)=rnmy(itp)+cint(i)
60 continue
rnmy2=rnmy2+rnmy(2)+rnmy(3)+rnmy(4)
do 80 k=5,10
80 rnmy3=rnmy3+rnmy(k)
do 90 k=11,20
90 rnmy4=rnmy4+rnmy(k)
rnm=rnmy(1)+rnmy2+rnmy3+rnmy4
chg=vlist(j,4)-rnm
write(6,2000)
write(6,3000) j,centr(j),rnmy(1),rnmy2,rnmy3,rnmy4,rnm,chg
if(rnmy2.ne.0.d0) write(6,4000) (rnmy(ii),ii=2,4)
if(rnmy3.ne.0.d0) write(6,4001) (rnmy(ii),ii=5,10)
if(rnmy4.ne.0.d0) write(6,4002) (rnmy(ii),ii=11,20)
70 continue
write(6,5000) ren
write(6,6000)
fakt=1.0d0
do 115 i=1,iend
do 115 j=1,norb
115 ovpop(i)=ovpop(i)+rmopo(i,j)
call outpak(ovpop,non,1,1)
if(nsupp.ne.5) goto 218
ii=0
write(6,6400)
do 110 i=1,non
do 110 j=1,i
write(6,6500) i,centr(i),j,centr(j)
ii=ii+1
write(6,1001) (rmopo(ii,k),k=1,norb)
110 continue
c
c roby population analysis
c
218 continue
write(6,8000)
nnc=ncont
c
c calculate blocks of atoms
itmp=1
ij=0
do 400 i=2,ncont
if(ianr(i).ne.ianr(i-1)) goto 405
itmp=itmp+1
goto 400
405 ij=ij+1
iatnr(ij)=itmp
itmp=1
400 continue
iatnr(ij+1)=itmp
c
ndim=0
do 733 i=1,non
ia=iatnr(i)
733 ndim=ndim+(ia*ia+ia)/2
c
c atom blocked overlap matrix on su
call sort(buff,su,iatnr,non,0,ncmax)
c
c calculation of s**1/2 and s**-1/2 (diagonal)
ist=1
jst=1
ij=0
ll=0
do 530 i=1,non
ia=iatnr(i)
do 540 j=1,ia
do 540 k=1,ia
ij=ij+1
uv(ij)=0.d0
if(j.eq.k) uv(ij)=1.d0
540 continue
call erduw(su(jst),uv(ist),ia,1.d-12)
ii=jst-1
do 560 l=1,ia
ii=ii+l
ll=ll+1
cint(ll)=sqrt(su(ii))
560 dmh(ll)=1.d0/cint(ll)
ist=ist+ia*ia
jst=jst+(ia*ia+ia)/2
530 continue
itest=ist-1
if(itest.le.idmax) goto 94
write(6,7100) itest,idmax
7100 format(1x,'itest = ',i8,' greater than idmax = ',i8,
1 ' in subroutine cntrcm',/,' enlarge nomx in main program')
stop
94 continue
c
c calculation of s**1/2 (atom blocked)
call uduk(uv,cint,su,iatnr,non,ndim)
rewind jfile
read(jfile) (y(ii),ii=1,ipr)
rewind jfile
c
c atom blocked density matrix on uv
call sort(y,uv(idmax+1),iatnr,non,0,ncmax)
c s**1/2 * density * s**1/2
call h1h2h1(su,uv(idmax+1),cint,y,iatnr,non,ipr)
c
c calculation of s**-1/2 (atom blocked)
call uduk(uv,dmh,su,iatnr,non,ndim)
c
c calculation of maos (written on uv)
ij=0
ist=1
jst=1
do 570 i=1,non
ia=iatnr(i)
do 580 j=1,ia
iuv1=jst-1+(j-1)*ia
iuv2=jst-1+j
do 580 k=1,j
ij=ij+1
iuv=iuv1+k
uv(iuv)=su(ij)
iuv=iuv2+(k-1)*ia
580 uv(iuv)=su(ij)
call erduw(y(ist),uv(jst),ia,1.d-12)
ist=ist+(ia*ia+ia)/2
jst=jst+ia*ia
570 continue
c full mao matrix on y
call sort(uv,y,iatnr,non,1,ncmax)
c calculation of s * mao
call hm(buff,y,uv,ncont,ncont)
c read in density and calculate (mao*s)# * d * (mao*s)
rewind jfile
read(jfile) (buff(ii),ii=1,ipr)
rewind jfile
call ukhu(uv,buff,cint,su,ncont,ncont)
rewind ifile
write(ifile) (su(ir),ir=1,ncmax)
rewind ifile
c
ii=ncont+1
ij=1
do 585 i=1,ncont
roc(i)=su(ij)
585 ij=ij+ii
c mao * (s*mao), written on jfile
call mkm(y,uv,su,ncont,ncont,ncont)
rewind jfile
write(jfile) (su(ir),ir=1,ncmax)
rewind jfile
c
do 649 i=1,ncont
649 mos(i)=0
c
c roby occupation numbers
nnc=0
ii=0
ist=0
do 600 i=1,non
jatnr(i)=iatnr(i)
ia=iatnr(i)
rat=0.d0
do 610 j=1,ia
ii=ii+1
610 rat=rat+roc(ii)
write(6,6700) i,centr(i),rat
write(6,6800) (roc(ir),ir=ist+1,ii)
c
c selection of maos by user
rat=0.d0
read(5,1500) nmao,(mor(im),im=1,nmao)
if(mor(1).eq.0) goto 851
do 854 im=1,nmao
kk=mor(im)
mos(kk)=kk
cint(im)=roc(kk)
854 rat=rat+roc(kk)
iatnr(i)=nmao
nnc=nnc+nmao
goto 855
851 iatnr(i)=nmao
c automatic selection of maos according to occupation numbers
if(nmao.eq.0) write(6,6900) nmao,i
if(nmao.eq.0) goto 600
nnc=nnc+nmao
iij=0
do 850 k=1,nmao
rpr=0.d0
do 860 l=1,ia
if(roc(ist+l).le.rpr) goto 860
kk=ist+l
rpr=roc(kk)
860 continue
iij=iij+1
mos(kk)=kk
rat=rat+rpr
cint(iij)=rpr
roc(kk)=-rpr
850 continue
855 rnmy(i)=rat
write(6,6900) nmao,i,rat
write(6,7500) (cint(ir),ir=1,nmao)
600 ist=ist+ia
c
do 871 i=1,non
871 ianr(i)=jatnr(i)-iatnr(i)
min=1000
do 872 i=1,non
if(ianr(i).lt.min) min=ianr(i)
872 continue
c hypervalence contributions
call hypval(jatnr,mos,tol,ipr,ifile,non,ncmax,ren,
1 jfile,rtot)
c
c
nnc2=nnc*nnc
mm=0
do 870 m=1,ncont
if(mos(m).eq.0) goto 870
mm=mm+1
mos(mm)=mos(m)
roc(mm)=abs(roc(m))
870 continue
c
c calculate trace (mao*b*mao * s**-1)
c calculation of unassigned charge
rewind ifile
read(ifile) (uv(iw),iw=1,ncmax)
rewind ifile
rewind jfile
read(jfile) (su(iw),iw=1,ncmax)
rewind jfile
c order according to selected maos
call order(uv,su,mos,nnc,ncont)
c ordered overlap(mao basis) written on jfile
rewind jfile
write(jfile) (su(iw),iw=1,nnc2)
rewind jfile
c
if(nsupp.ne.4) goto 655
write(6,9100)
call prtblk(su,nnc,nnc,'mao ','mao ',mos)
write(6,9200)
655 call osinv1(su,nnc,d,tol,itnr,ianr)
c
rna=0.d0
do 910 i=1,nnc
a=0.d0
i1=i
i20=(i-1)*nnc
do 920 j=1,nnc
a=a+su(i1)*uv(i20+j)
920 i1=i1+nnc
rna=rna+a
910 continue
uach=ren-rna
write(6,7700) uach
rtot=(uach-rtot)/non
do 500 i=1,non
500 dmh(i)=dmh(i)+rtot
write(6,7800) rtot
c
c selection and reordering of mao vector y
imo=0
ie=0
ij=0
nnc=0
nst=1
nat(1)=1
do 650 l=1,non
nmao=iatnr(l)
nat(l+1)=nat(l)+nmao
if(nmao.eq.0) goto 650
do 660 i=1,nmao
imo=imo+1
imos=mos(imo)-1
ist=imos*ncont+1
ie=ist+ncont-1
do 680 k=ist,ie
ij=ij+1
680 y(ij)=y(k)
660 continue
write(6,7600) l,centr(l)
call prtblk(y(nst),ncont,nmao,' ao ','mao ',mos(nnc+1))
nst=nst+nmao*ncont
nnc=nnc+nmao
650 continue
c write out maos for plot
ndimw=nnc*ncont
write(lomao,8900) (alabel(i1),i1=1,19)
write(lomao,8900) (blabel(i1),i1=1,19)
write(lomao,9000) nnc,ncont,ndimw
write(lomao,8900) (fmt(i1),i1=1,4)
write(lomao,fmt) (y(i),i=1,ndimw)
c
c calculation of occupation numbers (mo-contributions)
rewind kfile
read(kfile) (uv(ir),ir=1,momax)
rewind kfile
c (maos)# * (sc) = su
call mkm(y,uv,su,nnc,ncont,norb)
if(nsupp.eq.5) write(6,8650)
do 960 m=1,non
rat=0.d0
mm=0
do 970 j=1,norb
ind=(j-1)*nnc
do 980 k=nat(m),nat(m+1)-1
mm=mm+1
980 uv(mm)=su(ind+k)
970 continue
ndim=iatnr(m)
i0=-ndim
do 950 i=1,norb
v=0.d0
i0=i0+ndim
do 955 j=1,ndim
955 v=v+uv(i0+j)*uv(i0+j)
rnamo(i,m)=v*frocc(i)
rat=rat+rnamo(i,m)
950 continue
if(nsupp.eq.5) write(6,8655) m,centr(m),(rnamo(ir,m),ir=1,norb)
960 continue
c
c two center shared electron numbers
write(6,8350)
ncen=1
ishare=2
rewind jfile
read(jfile) (uv(ir),ir=1,nnc2)
rewind jfile
do 715 i=1,non
715 buff(i)=0.d0
nat(non+1)=nnc+1
c
do 700 i=1,non-1
ij=0
if(iatnr(i).eq.0) goto 700
do 710 ii=nat(i),nat(i+1)-1
ij=ij+1
710 mos(ij)=ii
do 720 j=i+1,non
if(iatnr(j).eq.0) goto 720
ik=ij
do 730 jj=nat(j),nat(j+1)-1
ik=ik+1
730 mos(ik)=jj
itest=ik*ik
if(itest.gt.idmax) goto 95
c
call sen(su,uv,y(1),y(idmax),mos,cint,rna,ik,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc)
rnab(i,j)=rna
write(6,7900) i,centr(i),j,centr(j)
rna=0.d0
do 810 im=1,norb
roc(im)=rnamo(im,i)+rnamo(im,j)-roc(im)
810 rna=rna+roc(im)
write(6,8100) (roc(ir),ir=1,norb)
buff(i)=buff(i)+rna*0.5d0
buff(j)=buff(j)+rna*0.5d0
write(6,8200) rna
720 continue
700 continue
c
c three center shared electron numbers
c
if(non.le.3) goto 515
ncen=-1
ishare=3
write(6,8400)
do 740 i=1,non-2
ij=0
if(iatnr(i).eq.0) goto 740
do 745 ii=nat(i),nat(i+1)-1
ij=ij+1
745 mos(ij)=ii
do 750 j=i+1,non-1
if(iatnr(j).eq.0) goto 750
ik=ij
do 755 jj=nat(j),nat(j+1)-1
ik=ik+1
755 mos(ik)=jj
do 760 k=j+1,non
if(iatnr(k).eq.0) goto 760
il=ik
do 765 kk=nat(k),nat(k+1)-1
il=il+1
765 mos(il)=kk
itest=il*il
if(itest.gt.idmax) goto 95
c
call sen(su,uv,y(1),y(idmax),mos,cint,rna,il,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc)
rnabc(i,j,k)=rna
rna=rnmy(i)+rnmy(j)+rnmy(k)-rnab(i,j)-rnab(i,k)-rnab(j,k)+rna
buff(i)=buff(i)-tri*rna
buff(j)=buff(j)-tri*rna
buff(k)=buff(k)-tri*rna
if(abs(rna).ge.0.01d0) write(6,8500) i,j,k,rna
760 continue
750 continue
740 continue
c
c four center shared electron numbers
c
if(non.le.4) goto 515
ncen=1
ishare=4
write(6,8450)
do 770 i=1,non-3
ij=0
if(iatnr(i).eq.0) goto 770
do 775 ii=nat(i),nat(i+1)-1
ij=ij+1
775 mos(ij)=ii
do 780 j=i+1,non-2
if(iatnr(j).eq.0) goto 780
ik=ij
do 785 jj=nat(j),nat(j+1)-1
ik=ik+1
785 mos(ik)=jj
do 790 k=j+1,non-1
if(iatnr(k).eq.0) goto 790
il=ik
do 795 kk=nat(k),nat(k+1)-1
il=il+1
795 mos(il)=kk
do 800 l=k+1,non
if(iatnr(l).eq.0) goto 800
im=il
do 805 ll=nat(l),nat(l+1)-1
im=im+1
805 mos(im)=ll
itest=im*im
if(itest.gt.idmax) goto 95
c
call sen(su,uv,y(1),y(idmax),mos,cint,rna,im,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc)
index1=j*(j-3)/2+i
index2=l*(l-3)/2+k
index=index2*(index2-3)/2+index1
rnabcd(index)=rna
rna=rnmy(i)+rnmy(j)+rnmy(k)+rnmy(l)-rnab(i,j)-rnab(i,k)-rnab(i,l)
1 -rnab(j,k)-rnab(j,l)-rnab(k,l)+rnabc(i,j,k)+rnabc(i,j,l)
2 +rnabc(i,k,l)+rnabc(j,k,l)-rna
buff(i)=buff(i)+four*rna
buff(j)=buff(j)+four*rna
buff(k)=buff(k)+four*rna
buff(l)=buff(l)+four*rna
if(abs(rna).ge.0.002d0) write(6,8550) i,j,k,l,rna
800 continue
790 continue
780 continue
770 continue
515 read(5,6100) nm,(iatnr(i),i=1,nm)
if(nm.eq.0) goto 933
call spemu(su,uv,y(1),y(idmax),mos,cint,rna,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc,iatnr,rnmy,rnab,rnabc,rnabcd,nm,nat,idmax,
2 jatnr,katnr,nocm1,nocm2,nocp1)
c
933 continue
c
c calculation of atomic charges
c chomo: charge of molecule, cmult: multicenter contribution
sum=0.d0
do 786 i=1,non
rnmy(i)=vlist(i,4)-rnmy(i)+buff(i)-dmh(i)
sum=sum+rnmy(i)
786 continue
sum=sum-chomo
cmult=sum*ncen
if(non.eq.3) write(6,8840) cmult
if(non.eq.4) write(6,8850) cmult
if(non.ge.5) write(6,8800) cmult
write(6,8600)
sum=sum/non
do 787 i=1,non
q=rnmy(i)-sum
write(6,8700) i,centr(i),q
787 continue
c
c
1000 format(///,' mulliken population analysis',//)
1001 format(1x,12f10.6)
1500 format(i10,20i3)
2000 format(//,' atom nr. symbol s-occupation p-occupation ',
1 'd-occupation f-occupation total charge ')
3000 format(1x,i5,4x,a4,2x,6(f12.5,2x))
4000 format(/,1x,'n(px) =',f9.5,2x,'n(py) =',f9.5,2x,'n(pz) =',f9.5)
4001 format(1x,'n(dxx) =',f9.5,2x,'n(dyy) =',f9.5,2x,'n(dzz) =',f9.5,
1 2x,'n(dxy) =',f9.5,2x,'n(dxz) =',f9.5,2x,'n(dyz) =',f9.5)
4002 format(1x,'n(fxxx)=',f9.5,2x,'n(fyyy)=',f9.5,2x,'n(fzzz)=',f9.5,
1 2x,'n(fxxy)=',f9.5,2x,'n(fxxz)=',f9.5,2x,'n(fyyx)=',f9.5,/,
2 1x,'n(fyyz)=',f9.5,2x,'n(fzzx)=',f9.5,2x,'n(fzzy)=',f9.5,
3 2x,'n(fxyz)=',f9.5)
5000 format(//,' total number of electrons = ',f15.8)
6000 format(///,' mulliken overlap population ',/)
6100 format(20i3)
6400 format(//,' overlap population per mo',/)
6500 format(/,' atom ',i5,a4,' / ','atom ',i5,a4)
6700 format(//,' atom nr ',i5,2x,a4,' occupation',f10.6)
6800 format(1x,'occupation of maos',/,(10f10.6))
6900 format(1x,i5,' maos selected for atom ',i4,' occupation ',f10.6)
7500 format(1x,'occupation of maos ',/,(10f10.6))
7600 format(///,' selected maos for atom ',i3,a4)
7700 format(/,10x,'unassigned charge = ',f10.4,/)
7800 format(1x,'rest charge per atom = ',f10.6)
7900 format(//,' atom ',i3,a4,' / atom ',i3,a4)
8000 format(///,' roby population analysis with modified atomic',
1 ' orbitals ')
8100 format(1x,'contributions of mos to shared electron number',
1 /,(10f10.5))
8200 format(1x,' shared electron number = ',f10.4)
8300 format(1x,'n( 1 2 3 ) = ',f10.5)
8350 format(///,' two center shared electron numbers '/)
8400 format(///,' three center shared electron numbers ge 0.01'/)
8450 format(///,' four center shared electron numbers ge 0.002'/)
8500 format(1x,'n(',3i3,') = ',f10.4,f10.6)
8550 format(1x,'n(',4i3,') = ',f10.4)
8600 format(//,' atomic charges with multicenter corrections',
1 /,' atom charge')
8650 format(//,' contributions of mos to occupation numbers')
8655 format(/,' atom nr ',i5,2x,a4,/,(12f10.6))
8700 format(1x,i5,a4,f10.4)
8800 format(//,' multicenter rest contribution = ',f10.6,
1 ' (correct sign for five center terms)')
8840 format(//,' three center shared electron number = ',f10.6)
8850 format(//,' four center shared electron number = ',f10.6)
8900 format(19a4)
9000 format(20i4)
9100 format(///' s matrix in mao basis'/)
9200 format(//)
9500 format(a1,i4,14i5)
9550 format(1x,2i5)
return
c
95 write(6,7200) itest,idmax,ishare
7200 format(1x,'itest = ',i8,' greater than idmax = ',i8,
1 ' in subroutine cntrcm for',i3,'-center sens',/,
2 ' enlarge all arrays of dimension nomx')
stop
end
c
c
subroutine spemu(su,uv,ssu,suv,mos,cint,rna,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc,iatnr,rnmy,rnab,rnabc,rnabcd,nm,nat,idmax,
2 jatnr,katnr,nocm1,nocm2,nocp1)
implicit real*8(a-h,o-z)
dimension su(1),uv(1),ssu(1),suv(1),mos(1),cint(1),itnr(1),ianr(1)
dimension roc(1),frocc(1),iatnr(1),rnmy(1),rnab(nocm1,1),nat(1)
dimension rnabc(nocm2,nocm1,1),rnabcd(1),jatnr(nocp1),katnr(1)
c
iend=nm
do 310 j=1,nm-1
max=iatnr(1)
ind=1
do 320 i=2,iend
if(iatnr(i).lt.max) goto 320
max=iatnr(i)
ind=i
320 continue
jj=nm-j+1
iend=jj-1
iatnr(ind)=iatnr(jj)
310 iatnr(jj)=max
write(6,2000) (iatnr(i),i=1,nm)
c
ij=0
do 50 i=1,nm
i1=iatnr(i)
do 60 ii=nat(i1),nat(i1+1)-1
ij=ij+1
60 mos(ij)=ii
50 continue
itest=ij*ij
if(itest.gt.idmax) goto 99
call sen(su,uv,ssu,suv,mos,cint,rna,ij,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc)
tmult=0.d0
do 100 i=1,nm
i1=iatnr(i)
tmult=tmult+rnmy(i1)
100 continue
tmult=tmult-rna
write(6,3500) tmult
if(nm.le.4) return
ipha=(-1)**(nm-1)
sum=ipha*rna
c
lmax=int(4.e+09)
do 10 i=1,nm
i1=iatnr(i)
sum=sum+rnmy(i1)
if(i.eq.1) goto 10
do 20 j=1,i-1
j1=iatnr(j)
sum=sum-rnab(j1,i1)
if(j.eq.1) goto 20
do 30 k=1,j-1
k1=iatnr(k)
sum=sum+rnabc(k1,j1,i1)
if(k.eq.1) goto 30
do 40 l=1,k-1
l1=iatnr(l)
index1=k1*(k1-3)/2+l1
index2=i1*(i1-3)/2+j1
index=index2*(index2-3)/2+index1
40 sum=sum-rnabcd(index)
30 continue
20 continue
10 continue
if(nm.eq.5) goto 410
c
do 110 i=5,nm-1
do 115 ii=1,i
katnr(ii)=ii
115 jatnr(ii)=iatnr(ii)
ij=0
do 81 k=1,i
i1=jatnr(k)
do 91 ii=nat(i1),nat(i1+1)-1
ij=ij+1
91 mos(ij)=ii
81 continue
itest=ij*ij
if(itest.gt.idmax) goto 99
call sen(su,uv,ssu,suv,mos,cint,rna,ij,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc)
ipha=(-1)**(i-1)
sum=sum+ipha*rna
c
jatnr(i+1)=1000
jst=i
do 140 l=1,lmax
do 120 j=jst,i
do 130 k=jst+1,nm
if(iatnr(k).le.jatnr(j)) goto 130
if(iatnr(k).ge.jatnr(j+1)) goto 130
jatnr(j)=iatnr(k)
katnr(j)=k
ij=0
do 80 ll=1,i
i1=jatnr(ll)
do 90 ii=nat(i1),nat(i1+1)-1
ij=ij+1
90 mos(ij)=ii
80 continue
itest=ij*ij
if(itest.gt.idmax) goto 99
call sen(su,uv,ssu,suv,mos,cint,rna,ij,d,tol,itnr,ianr,
1 norb,nnc,roc,frocc)
ipha=(-1)**(i-1)
sum=sum+ipha*rna
130 continue
120 continue
ki=0
do 145 kk=1,i
if(jatnr(kk).ne.iatnr(nm-i+kk)) goto 145
ki=ki+1
if(ki.eq.i) goto 110
if(ki.eq.1) jst=kk-1
kkk=katnr(kk-1)+1
if(ki.eq.1) kkk=katnr(kk-1)+2
jatnr(kk)=iatnr(kkk)
katnr(kk)=kkk
145 continue
140 continue
110 continue
c
410 write(6,3000) sum
return
c
1000 format(a1,i2,20i3)
2000 format(///,' special multi center contribution for the atoms',/,
1 (20i5))
3000 format(1x,'multi center shared electron number =',f15.6,/)
3500 format(1x,'total contribution =',f15.6)
c
99 write(6,4000) itest,idmax
4000 format(1x,'itest = ',i8,' greater than idmax = ',i8,
1 ' in subroutine spemu for special multi center contributions',/,
2 ' enlarge all arrays of dimension nomx')
return
end
c
c
subroutine sen(su,uv,ssu,suv,mos,cint,rna,idim,d,tol,itnr,
1 ianr,norb,nnc,roc,frocc)
c
c calculation of shared electron numbers
c
implicit real*8 (a-h,o-z)
dimension su(1),uv(1),ssu(1),suv(1),mos(1),cint(1),itnr(1)
dimension ianr(1),roc(1),frocc(1)
c
c sort (mao)#*s*c on ssu
ij=0
do 10 i=1,norb
ind0=(i-1)*nnc
do 20 j=1,idim
ij=ij+1
ind=ind0+mos(j)
20 ssu(ij)=su(ind)
10 continue
c
c sort s(mao basis) on suv
ij=0
do 30 j=1,idim
ind0=(mos(j)-1)*nnc
do 40 i=1,idim
ind=ind0+mos(i)
ij=ij+1
40 suv(ij)=uv(ind)
30 continue
c
call osinv1(suv,idim,d,tol,itnr,ianr)
ij=0
do 60 i=1,idim
ind=(i-1)*idim
do 60 j=1,i
ij=ij+1
suv(ij)=suv(ind+j)
60 continue
call ukhud(ssu,suv,cint,roc,idim,norb)
c
rna=0.d0
do 50 i=1,norb
roc(i)=roc(i)*frocc(i)
50 rna=rna+roc(i)
return
end
c
c
subroutine ukhud(a,b,c,d,idim1,idim2)
c
c u# * triangle matrix * u , diagonalelements only
implicit real*8(a-h,o-z)
dimension a(1),b(1),c(1),d(1)
kl=0
ij=0
i10=-idim1
do 40 j=1,idim2
i10=i10+idim1
ij=0
do 50 k=1,idim1
cc=0.d0
ij=ij+1
i20=(k*k-k)/2
do 60 l=1,k
60 cc=cc+a(i10+l)*b(i20+l)
if(k.eq.idim1) goto 55
i20=k*(k+3)/2
do 70 l=k+1,idim1
cc=cc+a(i10+l)*b(i20)
70 i20=i20+l
55 c(ij)=cc
50 continue
m1=0
m2=(j-1)*idim1
kl=kl+1
dd=0.0d0
do 90 n=1,idim1
90 dd=dd+c(m1+n)*a(m2+n)
d(kl)=dd
40 continue
return
end
c
subroutine hypval(jatnr,mos,tol,ipr,ifile,non,
1 ncmax,ren,jfile,rtot)
c
c calculation of hypervalence populations
c
implicit real*8 (a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
integer centr
dimension jatnr(1),mos(1)
common/scfinf/dmh(nomx),roc(nomx)
common /big/ y(nomx*nomx),su(nomx*nomx),uv(nomx*nomx)
common/muli/vlist(nocmx,4),ianr(nomx),centr(nocmx),itnr(nomx)
common /contrc/ chomo,ncont
iend=0
rtot=0.d0
write(6,1000)
do 100 ia=1,non
ist=iend+1
iend=iend+jatnr(ia)
nnc=ist-1
if(nnc.eq.0) goto 111
do 50 i=1,nnc
50 itnr(i)=i
111 continue
do 110 ii=ist,iend
if(mos(ii).eq.0) goto 110
nnc=nnc+1
itnr(nnc)=ii
110 continue
if(ia.eq.non) goto 121
do 120 ii=iend+1,ncont
nnc=nnc+1
itnr(nnc)=ii
120 continue
c
121 rewind ifile
read(ifile) (uv(iw),iw=1,ncmax)
rewind ifile
rewind jfile
read(jfile) (su(iw),iw=1,ncmax)
rewind jfile
call order(uv,su,itnr,nnc,ncont)
call osinv1(su,nnc,d,tol,itnr,ianr)
c
c calculate trace(mao*s*d*s*mao * s**-1)
rna=0.d0
do 910 i=1,nnc
a=0.d0
i1=i
i20=(i-1)*nnc
do 920 j=1,nnc
a=a+su(i1)*uv(i20+j)
920 i1=i1+nnc
rna=rna+a
910 continue
rna=ren-rna
dmh(ia)=rna
rtot=rtot+rna
write(6,2000) ia,centr(ia),rna
100 continue
c
1000 format(/' hypervalence contributions'//' unshared atomic',
1 ' populations')
2000 format(1x,'atom nr.',i3,1x,a4,5x,f10.6)
return
end
c
subroutine order(a,b,iord,idims,idimb)
implicit real*8(a-h,o-z)
dimension a(1),b(1),iord(1)
c sort matrix a an b according to vector iord
ij=0
do 10 j=1,idims
ind2=(iord(j)-1)*idimb
do 20 i=1,idims
ind=ind2+iord(i)
ij=ij+1
a(ij)=a(ind)
20 b(ij)=b(ind)
10 continue
return
end
c
c
subroutine hm(a,b,c,norb,ncont)
c triangle matrix(a) * full matrix(b)
implicit real*8(a-h,o-z)
dimension a(1),b(1),c(1)
ij=0
do 20 i=1,norb
ibst=(i-1)*ncont
do 30 j=1,ncont
ct=0.d0
ij=ij+1
iast=j*(j-1)/2
do 40 k=1,j
40 ct=ct+a(iast+k)*b(ibst+k)
if(j.eq.ncont) goto 29
iast=j*(j+3)/2
do 50 k=j+1,ncont
ct=ct+a(iast)*b(ibst+k)
50 iast=iast+k
29 c(ij)=ct
30 continue
20 continue
return
end
c
subroutine mkm(a,b,c,idima,idimab,idimb)
implicit real*8(a-h,o-z)
dimension a(1),b(1),c(1)
c (full matrix)# * full matrix
ij=0
do 10 i=1,idimb
iast=0
ibst=(i-1)*idimab
do 20 j=1,idima
ij=ij+1
v=0.d0
do 30 k=1,idimab
30 v=v+a(iast+k)*b(ibst+k)
c(ij)=v
20 iast=iast+idimab
10 continue
return
end
c
c
c
c
subroutine sort(a,b,nr,non,iswi,ncmax)
c sorting of matrices in atom blocked matrices
implicit real*8(a-h,o-z)
dimension a(1),b(1),nr(1)
c iswi=0: full matrix in atom blocked matrix
ij=0
if(iswi.eq.1) goto 30
jend=0
do 10 i=1,non
jst=jend+1
jend=jend+nr(i)
do 10 j=jst,jend
kkst=(j*j-j)/2
do 10 k=jst,j
ij=ij+1
kl=kkst+k
b(ij)=a(kl)
10 continue
return
c iswi=1: atom blocked matrix in full matrix
30 iofs=0
ndim=0
do 35 i=1,non
35 ndim=ndim+nr(i)
do 38 i=1,ncmax
38 b(i)=0.d0
iaa=0
kl=0
do 40 i=1,non
ia=nr(i)
iaa=iaa+ia
do 50 j=1,ia
do 60 k=1,ia
ij=ij+1
kl=kl+1
60 b(kl)=a(ij)
kl=kl+ndim-iaa+iofs
50 continue
kl=kl+ia
iofs=iofs+ia
40 continue
return
end
c
c
c
c
c
c
subroutine uduk(a,b,c,nr,non,ndim)
c u# * vector * u
implicit real*8(a-h,o-z)
dimension a(1),b(1),c(1),nr(1)
do 10 i=1,ndim
10 c(i)=0.d0
ii=0
ijst=0
iist=0
do 20 l=1,non
ia=nr(l)
do 30 i=1,ia
ii=ii+1
ij=ijst
ist=iist+(i-1)*ia
do 40 j=1,ia
iu=ist+j
do 40 k=1,j
ij=ij+1
ju=ist+k
40 c(ij)=c(ij)+a(iu)*b(ii)*a(ju)
30 continue
ijst=ij
iist=iu
20 continue
return
end
c
c
subroutine ukhu(a,b,c,d,ncont,nc)
c u# * triangle matrix * u
implicit real*8(a-h,o-z)
dimension a(1),b(1),c(1),d(1)
i10=-ncont
do 40 j=1,nc
i10=i10+ncont
ij=0
i11=i10+1
do 50 k=1,ncont
ij=ij+1
i20=(k*k-k)/2
i21=i20+1
cij = 0.0d0
eij = 0.0d0
if (k. eq. 1) go to 110
do 60 l = 1, k-1, 2
cij = cij + a(i10+l) * b(i20+l)
60 eij = eij + a(i11+l) * b(i21+l)
if (mod(k,2) .eq. 0) go to 120
110 continue
cij = cij + a(i10+k) * b(i20+k)
120 continue
if(k.eq.ncont) goto 49
loff = (k+3) * k / 2
if (k+1 .eq .ncont) go to 130
do 70 l=k+1,ncont-1,2
cij=cij+a(i10+l) * b(loff)
eij=eij+a(i11+l) * b(loff+l)
70 loff = loff + l + l + 1
if (mod(ncont-k,2) .eq. 0) go to 49
130 cij=cij+a(i10+ncont) * b(loff)
49 c(ij) = cij+eij
50 continue
m2=0
do 80 m=1,nc
kl=(m-1)*nc+j
dkl=0.d0
fkl=0.0d0
m21 = m2 + 1
if (ncont .eq. 1) go to 140
do 90 n=1,ncont-1,2
dkl=dkl+c(n)*a(m2+n)
90 fkl=fkl+c(n+1)*a(m21+n)
if(mod(ncont,2) .eq. 0) go to 150
140 dkl = dkl + c(ncont) * a(m2+ncont)
150 continue
d(kl)=dkl+fkl
m2=m2+ncont
80 continue
40 continue
return
end
c
c
subroutine osinv1(a,n,d,tol,l,m)
c inversion of a full matrix
implicit real*8 (a-h,o-z)
dimension a(1),m(1),l(1)
if(n.ne.1) goto 5
a(1)=1.0/a(1)
return
5 d=1.d0
nk=-n
do 180 k=1,n
nk=nk+n
l(k)=k
m(k)=k
kk=nk+k
biga=a(kk)
do 20 j=k,n
iz=n*(j-1)
do 20 i=k,n
ij=iz+i
if(abs(biga)-abs(a(ij))) 10,20,20
10 biga=a(ij)
l(k)=i
m(k)=j
20 continue
j=l(k)
if(j-k) 50,50,30
30 ki=k-n
do 40 i=1,n
ki=ki+n
holo=-a(ki)
ji=ki-k+j
a(ki)=a(ji)
40 a(ji)=holo
50 i=m(k)
if(i-k) 80,80,60
60 jp=n*(i-1)
do 70 j=1,n
jk=nk+j
ji=jp+j
holo=-a(jk)
a(jk)=a(ji)
70 a(ji)=holo
80 if(abs(biga)-tol) 90,100,100
90 d=0.d0
return
100 continue
biginv = -1.0d0 / biga
do 120 i=1,n
a(nk+i)=a(nk+i)*biginv
120 continue
a(nk+k) = a(nk+k) * (-biga)
joff = 0
do 155 j=1,n
if(j. eq. k) go to 154
ajk = a(joff+k)
if (k .eq. 1) go to 152
do 151 i=1,k-1
151 a(joff+i) = a(joff+i) + a(nk+i) * ajk
152 continue
if (k .eq. n) go to 154
do 153 i=k+1,n
153 a(joff+i) = a(joff+i) + a(nk+i) * ajk
154 continue
joff = joff + n
155 continue
kj=k-n
biginv=-biginv
do 170 j=1,n
kj=kj+n
a(kj)=a(kj)*biginv
170 continue
kadd = (k-1)*n + k
a(kadd) = a(kadd) * biga
d=d*biga
a(kk)=biginv
180 continue
k=n
190 k=k-1
if(k) 260,260,200
200 i=l(k)
if(i-k) 230,230,210
210 jq=n*(k-1)
jr=n*(i-1)
do 220 j=1,n
jk=jq+j
holo=a(jk)
ji=jr+j
a(jk)=-a(ji)
220 a(ji)=holo
230 j=m(k)
if(j-k) 190,190,240
240 ki=k-n
do 250 i=1,n
ki=ki+n
holo=a(ki)
ji=ki+j-k
a(ki)=-a(ji)
250 a(ji)=holo
goto 190
260 return
end
c
c
subroutine h1h2h1(a,b,c,d,nr,non,max)
c matrix * matrix * matrix (three triangle matrices)
implicit real*8(a-h,o-z)
dimension a(1),b(1),c(1),d(1),nr(1)
do 10 i=1,max
10 d(i)=0.d0
iofs=0
kl=0
do 20 i=1,non
ia=nr(i)
do 30 j=1,ia
ij=0
i10=iofs+j*(j-1)/2
jj=iofs+j
do 40 k=1,ia
i2=iofs+k*(k-1)/2
ij=ij+1
c(ij)=0.d0
do 50 l=1,k
i1=i10+l
if(l.gt.j) i1=l*(l-1)/2+jj
i2=i2+1
50 c(ij)=c(ij)+a(i1)*b(i2)
if(k.eq.ia) goto 40
i20=iofs+k
do 55 l=k+1,ia
i1=i10+l
if(l.gt.j) i1=l*(l-1)/2+jj
i2=i20+l*(l-1)/2
55 c(ij)=c(ij)+a(i1)*b(i2)
40 continue
do 60 m=1,j
mm=iofs+m
kl=kl+1
m20=m*(m-1)/2+iofs
do 70 n=1,ia
m2=m20+n
if(n.gt.m) m2=n*(n-1)/2+mm
70 d(kl)=d(kl)+c(n)*a(m2)
60 continue
30 continue
iofs=iofs+ia*(ia+1)/2
20 continue
return
end
c
c
function noteqv(i,j)
implicit real*8(a-h,o-z)
noteqv = i-j
return
end
c
c
real*8 function ggntde(i,j,eta,nfmx,nfcol)
implicit real*8(a-h,o-z)
dimension eta(nfmx,nfcol)
dimension aa(3),bb(3),a(10),b(10),e(3)
data c2/2.0d0/,c3/3.0d0/,const/15.7496099d0/
do 1 m=1,3
aa(m) = eta(i,m)
1 bb(m) = eta(j,m)
iff1=eta(i,5)+0.0001
iff2=eta(j,5)+0.0001
do 2 m=1,10
a(m) = eta(i,m+5)
2 b(m) = eta(j,m+5)
call divpt(aa,eta(i,4),bb,eta(j,4),e,eexp,efact)
call rhftce(a,aa,e,iff1)
call rhftce(b,bb,e,iff2)
fexp=c2*eexp
ggntde = efact*const*(a(1)*b(1)+(a(2)*b(2
1)+a(3)*b(3)+a(4)*b(4)+a(1)*(b(5)+b(6)+b(7))+b(1)*(a(5)+a(6)+a(7))+
2 (c3*(a(5)*b(5)+a(6)*b(6)+a(7)*b(7))+a(8)*b(8)+a(9)*b(9)+a(10)*b(1
30)+a(5)*(b(6)+b(7))+a(6)*(b(5)+b(7))+a(7)*(b(5)+b(6)))/fexp)/fexp)
4/(fexp*sqrt(fexp))
return
end
c
c
subroutine rhftce(cfs,a,e,iff)
implicit real*8(a-h,o-z)
dimension cfs(20) ,a(3),e(3)
data c2/2.0d0/,c3/3.0d0/
aex = e(1)-a(1)
aey = e(2)-a(2)
aez = e(3)-a(3)
goto (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),iff
1 return
2 cfs(1)=aex*cfs(2)
return
3 cfs(1)=aey*cfs(3)
return
4 cfs(1)=aez*cfs(4)
return
5 cfs(1)=aex*aex*cfs(5)
cfs(2)=c2*aex*cfs(5)
return
6 cfs(1)=aey*aey*cfs(6)
cfs(3)=c2*aey*cfs(6)
return
7 cfs(1)=aez*aez*cfs(7)
cfs(4)=c2*aez*cfs(7)
return
8 cfs(1)=aex*aey*cfs(8)
cfs(2)=aey*cfs(8)
cfs(3)=aex*cfs(8)
return
9 cfs(1)=aex*aez*cfs(9)
cfs(2)=aez*cfs(9)
cfs(4)=aex*cfs(9)
return
10 cfs(1)=aey*aez*cfs(10)
cfs(3)=aez*cfs(10)
cfs(4)=aey*cfs(10)
return
11 cfs(1)=aex*aex*aex*cfs(11)
cfs(2)=c3*aex*aex*cfs(11)
cfs(5)=c3*aex*cfs(11)
return
12 cfs(1)=aey*aey*aey*cfs(12)
cfs(3)=c3*aey*aey*cfs(12)
cfs(6)=c3*aey*cfs(12)
return
13 cfs(1)=aez*aez*aez*cfs(13)
cfs(4)=c3*aez*aez*cfs(13)
cfs(7)=c3*aez*cfs(13)
return
14 cfs(1)=aex*aex*aey*cfs(14)
cfs(2)=c2*aex*aey*cfs(14)
cfs(3)=aex*aex*cfs(14)
cfs(5)=aey*cfs(14)
cfs(8)=c2*aex*cfs(14)
return
15 cfs(1)=aex*aex*aez*cfs(15)
cfs(2)=c2*aex*aez*cfs(15)
cfs(4)=aex*aex*cfs(15)
cfs(5)=aez*cfs(15)
cfs(9)=c2*aex*cfs(15)
return
16 cfs(1)=aey*aey*aex*cfs(16)
cfs(2)=aey*aey*cfs(16)
cfs(3)=c2*aey*aex*cfs(16)
cfs(6)=aex*cfs(16)
cfs(8)=c2*aey*cfs(16)
return
17 cfs(1)=aey*aey*aez*cfs(17)
cfs(3)=c2*aey*aez*cfs(17)
cfs(4)=aey*aey*cfs(17)
cfs(6)=aez*cfs(17)
cfs(10)=c2*aey*cfs(17)
return
18 cfs(1)=aez*aez*aex*cfs(18)
cfs(2)=aez*aez*cfs(18)
cfs(4)=c2*aez*aex*cfs(18)
cfs(7)=aex*cfs(18)
cfs(9)=c2*aez*cfs(18)
return
19 cfs(1)=aez*aez*aey*cfs(19)
cfs(3)=aez*aez*cfs(19)
cfs(4)=c2*aez*aey*cfs(19)
cfs(7)=aey*cfs(19)
cfs(10)=c2*aez*cfs(19)
return
20 cfs(1)=aex*aey*aez*cfs(20)
cfs(2)=aez*aey*cfs(20)
cfs(3)=aex*aez*cfs(20)
cfs(4)=aex*aey*cfs(20)
cfs(8)=aez*cfs(20)
cfs(9)=aey*cfs(20)
cfs(10)=aex*cfs(20)
return
end
c
c
subroutine dumdum(nuc,noc,vlist,c,dint,nro,nocmx,nt)
implicit real*8(a-h,o-z)
dimension vlist(nocmx,4), c(1), dint(nro,1)
call nuc(noc,vlist,c,dint,nro,nocmx,nt)
return
end
c
c
subroutine nonuc(noc,vlist,c,dint,nro,nocmx,nt)
c for properties without nuclear part
implicit real*8(a-h,o-z)
dimension dint(nro,1)
dint(1,1)=0.0d0
nt = 1
return
end
c
c
subroutine fldnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of electric field
implicit real*8(a-h,o-z)
dimension dint(nro,1),vlist(nocmx ,4),c(3) ,fnuc(3)
do20 i=1,3
20 fnuc(i)=0.0d0
do21 i=1,noc
dst=(vlist(i,1)-c(1))**2+(vlist(i,2)-c(2))**2+(vlist(i,3)-c(3))**2
if(dst.eq.0.0d0) go to 21
do 23 j=1,3
fnuc(j)=fnuc(j)+vlist(i,4)*(vlist(i,j)-c(j))/(sqrt(dst))**3
23 continue
21 continue
do22 l=1,3
22 dint(1,l) = -fnuc(l)
nt = 3
return
end
c
c
subroutine potnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of potential
implicit real*8(a-h,o-z)
dimension dint(nro,1),vlist(nocmx ,4),c(3)
pnuc=0.0d0
do 12 i=1,noc
dst=(vlist(i,1)-c(1))**2+(vlist(i,2)-c(2))**2+(vlist(i,3)-c(3))**2
if(dst.eq.0.0d0)go to 12
pnuc=pnuc+vlist(i,4)/sqrt(dst)
12 continue
dint(1,1)=pnuc
nt = 1
return
end
c
c
subroutine grdnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of field gradient
implicit real*8(a-h,o-z)
dimension dint(nro,*),vlist(nocmx ,4),c(3) ,gnuc(6)
do 30 i=1,6
30 gnuc(i)=0.0d0
do 31 i=1,noc
dst=(vlist(i,1)-c(1))**2+(vlist(i,2)-c(2))**2+(vlist(i,3)-c(3))**2
if(dst.eq.0.0d0) go to 31
mu=0
do 32 j=1,3
do 33 k=1,j
mu=mu+1
gnuc(mu)=gnuc(mu)+vlist(i,4)*(vlist(i,j)-c(j))*(vlist(i,k)-c(k))
1/(sqrt(dst))**5
33 continue
32 continue
31 continue
dst=gnuc(1)+gnuc(3)+gnuc(6)
dint(1,1)=3.0d0*gnuc(1)-dst
dint(1,2)=3.0d0*gnuc(3)-dst
dint(1,3)=3.0d0*gnuc(6)-dst
dint(1,4)=gnuc(2)*3.0d0
dint(1,5)=gnuc(4)*3.0d0
dint(1,6)=gnuc(5)*3.0d0
do 40 i=1,6
40 dint(1,i) = - dint(1,i)
nt = 6
return
end
c
c
subroutine magnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of second moment
implicit real*8(a-h,o-z)
dimension dint(nro,*),vlist(nocmx ,4),c(3) ,qnuc(6)
do50 i=1,6
50 qnuc(i)=0.0d0
do 51 i=1,noc
mu=0
do52 j=1,3
do53 k=1,j
mu=mu+1
qnuc(mu)=qnuc(mu)+vlist(i,4)*(vlist(i,j)-c(j))*(vlist(i,k)-c(k))
53 continue
52 continue
51 continue
dint(1,1)=qnuc(1)
dint(1,2)=qnuc(3)
dint(1,3)=qnuc(6)
dint(1,4)=qnuc(2)
dint(1,5)=qnuc(4)
dint(1,6)=qnuc(5)
nt = 6
return
end
c
c
subroutine qudnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of quadropole moment
implicit real*8(a-h,o-z)
dimension dint(nro,*),vlist(nocmx ,*),c(3) ,qnuc(6)
data c3/3.0d0/
do50 i=1,6
50 qnuc(i)=0.0d0
do 51 i=1,noc
mu=0
do52 j=1,3
do53 k=1,j
mu=mu+1
qnuc(mu)=qnuc(mu)+vlist(i,4)*(vlist(i,j)-c(j))*(vlist(i,k)-c(k))
53 continue
52 continue
51 continue
dint(1,1)=qnuc(1)
dint(1,2)=qnuc(3)
dint(1,3)=qnuc(6)
dint(1,4)=qnuc(2)*1.5d0
dint(1,5)=qnuc(4)*1.5d0
dint(1,6)=qnuc(5)*1.5d0
dint(1,7)=dint(1,1)+dint(1,2)+dint(1,3)
dint(1,1)=(c3*dint(1,1)-dint(1,7))/2.d0
dint(1,2)=(c3*dint(1,2)-dint(1,7))/2.d0
dint(1,3) =(c3*dint(1,3)-dint(1,7))/2.d0
nt=7
return
end
c
c
subroutine dipnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of dipole moment
implicit real*8(a-h,o-z)
dimension dint(nro,*),vlist(nocmx ,4),c(3) ,dnuc(3)
do40 i=1,3
40 dnuc(i)=0.0d0
do41 i=1,noc
do41 j=1,3
41 dnuc(j)=dnuc(j)+vlist(i,4)*(vlist(i,j)-c(j))
do42 k=1,3
42 dint(1,k)=dnuc(k)
nt = 3
return
end
c
c
subroutine octnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of third moment
implicit real*8(a-h,o-z)
dimension dint(nro,*),vlist(nocmx,4),c(*),onuc(10)
do60 i=1,10
60 onuc(i)=0.0d0
do61 i=1,noc
mu=0
do62 j=1,3
do63 k=1,j
do64 m=1,k
mu=mu+1
onuc(mu)=onuc(mu)+vlist(i,4)*(vlist(i,j)-c(j))*(vlist(i,k)-c(k))*(
1vlist(i,m)-c(m))
64 continue
63 continue
62 continue
61 continue
dint(1,1)=onuc(1)
dint(1,2)=onuc(4)
dint(1,3)=onuc(10)
dint(1,4)=onuc(2)
dint(1,5)=onuc(5)
dint(1,6)=onuc(3)
dint(1,7)=onuc(7)
dint(1,8)=onuc(8)
dint(1,9)=onuc(9)
dint(1,10)=onuc(6)
nt = 10
return
end
c
c
subroutine sldnuc(noc,vlist,c,dint,nro,nocmx,nt)
c nuclear part of diamagnetic shielding
implicit real*8(a-h,o-z)
dimension dint(nro,*),vlist(nocmx,4),c(3),pnuc(6)
do 30 i=1,6
30 pnuc(i)=0.d0
do 31 i=1,noc
dst=(vlist(i,1)-c(1))**2+(vlist(i,2)-c(2))**2+(vlist(i,3)-c(3))**2
if(dst.lt.1.d-10) go to 31
mu=0
do 32 j=1,3
do 33 k=1,j
mu=mu+1
pnuc(mu)=pnuc(mu)+vlist(i,4)*(vlist(i,j)-c(j))*(vlist(i,k)-c(k))
1/(sqrt(dst))**3
33 continue
32 continue
31 continue
dint(1,1)=pnuc(1)
dint(1,2)=pnuc(3)
dint(1,3)=pnuc(6)
dint(1,4)=pnuc(2)
dint(1,5)=pnuc(4)
dint(1,6)=pnuc(5)
dint(1,7)=dint(1,1)+dint(1,2)+dint(1,3)
nt=7
return
end
c
c
subroutine propa(name,ij,kl,eta,va,c,nt,nbmx)
implicit real*8(a-h,o-z)
common /abfunc/ ra(3),rb(3),ga,gb,ia,ib
c this common-block is used in subroutine opap4 only
dimension eta(nbmx,15)
dimension va(1),c(1)
dimension a(3),b(3),e(3),d(3),aa(20),bb(20),dd(84),v(10),val(10)
dimension lin(84),min(84),nin(84)
data lin/0,1,0,0,2,0,0,1,1,0,3,0,0,2,2,1,0,1,0,1,4,0,0,3,3,1,0,1,0
1 ,2,2,0,2,1,1,5,0,0,3,3,2,2,0,0,4,4,1,0,0,1,1,3,1,2,2,1,6,0,0,3,
2 3,0,5,5,1,0,0,1,4,4,2,0,2,0,3,3,1,2,2,1,4,1,1,2/,min/0,0,1,0,0,
3 2,0,1,0,1,0,3,0,1,0,2,2,0,1,1,0,4,0,1,0,3,3,0,1,2,0,2,1,2,1,0,5,
4 0,2,0,3,0,3,2,1,0,4,4,1,0,1,1,3,2,1,2,0,6,0,3,0,3,1,0,0,1,5,5,2,0
5,0,2,4,4,2,1,3,1,3,2,1,4,1,2/,nin/0,0,0,1,0,0,2,0,1,1,0,0,3,0,1,0,
6 1,2,2,1,0,0,4,0,1,0,1,3,3,0,2,2,1,1,2,0,0,5,0,2,0,3,2,3,0,1,0,1,
7 4,4,3,1,1,1,2,2,0,0,6,0,3,3,0,1,5,5,1,0,0,2,4,4,0,2,1,2,2,3,1,3,
8 1,1,4,2/
do 10 i=1,3
a(i)=eta(ij,i)
b(i)=eta(kl,i)
ra(i)=a(i)
rb(i)=b(i)
10 continue
ga=eta(ij,4)
gb=eta(kl,4)
do 20 i=1,20
aa(i)=eta(ij,i+5)
bb(i)=eta(kl,i+5)
20 continue
iff1=eta(ij,5)+0.0001
iff2=eta(kl,5)+0.0001
ia=iff1
ib=iff2
call divpt(a,eta(ij,4),b,eta(kl,4),e,gama,efact)
call rhftce(aa,a,e,iff1)
call rhftce(bb,b,e,iff2)
call prod(aa,bb,dd,iff1,iff2)
do 30 i=1,nt
val(i)=0.d0
30 continue
do 25 i=1,3
d(i)=e(i)-c(i)
25 continue
c name represents an external function
if(iff1.gt.10.or.iff2.gt.10) goto 110
if(iff1.gt.4.or.iff2.gt.4) goto 120
if(iff1.gt.1.or.iff2.gt.1) goto 130
c s - s
call name(lin(1),min(1),nin(1),gama,v,d)
do 50 j=1,nt
val(j)=dd(1)*v(j)+val(j)
50 continue
do 70 i=1,nt
va(i)=efact*val(i)
70 continue
return
130 continue
if(iff1.ne.1.and.iff2.ne.1) goto 131
c s - p
do 61 i=1,4
if(abs(dd(i))-1.d-8) 61,61,41
41 call name(lin(i),min(i),nin(i),gama,v,d)
do 51 j=1,nt
val(j)=dd(i)*v(j)+val(j)
51 continue
61 continue
do 71 i=1,nt
va(i)=efact*val(i)
71 continue
return
131 continue
c p - p
do 62 i=1,10
if(abs(dd(i))-1.d-8) 62,62,42
42 call name(lin(i),min(i),nin(i),gama,v,d)
do 52 j=1,nt
val(j)=dd(i)*v(j)+val(j)
52 continue
62 continue
do 72 i=1,nt
va(i)=efact*val(i)
72 continue
return
120 continue
if(iff1.ne.1.and.iff2.ne.1) goto 121
c s - d
do 63 i=1,10
if(abs(dd(i))-1.d-8) 63,63,43
43 call name(lin(i),min(i),nin(i),gama,v,d)
do 53 j=1,nt
val(j)=dd(i)*v(j)+val(j)
53 continue
63 continue
do 73 i=1,nt
va(i)=efact*val(i)
73 continue
return
121 continue
if(iff1.gt.4.and.iff2.gt.4) goto 122
c p - d
do 64 i=1,20
if(abs(dd(i))-1.d-8) 64,64,44
44 call name(lin(i),min(i),nin(i),gama,v,d)
do 54 j=1,nt
val(j)=dd(i)*v(j)+val(j)
54 continue
64 continue
do 74 i=1,nt
va(i)=efact*val(i)
74 continue
return
122 continue
c d - d
do 65 i=1,35
if(abs(dd(i))-1.d-8) 65,65,45
45 call name(lin(i),min(i),nin(i),gama,v,d)
do 55 j=1,nt
val(j)=dd(i)*v(j)+val(j)
55 continue
65 continue
do 75 i=1,nt
va(i)=efact*val(i)
75 continue
return
110 continue
if(iff1.ne.1.and.iff2.ne.1) goto 111
c s - f
do 66 i=1,20
if(abs(dd(i))-1.d-8) 66,66,46
46 call name(lin(i),min(i),nin(i),gama,v,d)
do 56 j=1,nt
val(j)=dd(i)*v(j)+val(j)
56 continue
66 continue
do 76 i=1,nt
va(i)=efact*val(i)
76 continue
return
111 continue
if(iff1.gt.4.and.iff2.gt.4) goto 112
c p - f
do 67 i=1,35
if(abs(dd(i))-1.d-8) 67,67,47
47 call name(lin(i),min(i),nin(i),gama,v,d)
do 57 j=1,nt
val(j)=dd(i)*v(j)+val(j)
57 continue
67 continue
do 77 i=1,nt
va(i)=efact*val(i)
77 continue
return
112 continue
if(iff1.gt.10.and.iff2.gt.10) goto 113
c d - f
do 68 i=1,56
if(abs(dd(i))-1.d-8) 68,68,48
48 call name(lin(i),min(i),nin(i),gama,v,d)
do 58 j=1,nt
val(j)=dd(i)*v(j)+val(j)
58 continue
68 continue
do 78 i=1,nt
va(i)=efact*val(i)
78 continue
return
113 continue
c f - f
do 69 i=1,84
if(abs(dd(i))-1.d-8) 69,69,49
49 call name(lin(i),min(i),nin(i),gama,v,d)
do 59 j=1,nt
val(j)=dd(i)*v(j)+val(j)
59 continue
69 continue
do 79 i=1,nt
va(i)=efact*val(i)
79 continue
return
end
c
c
real*8 function olap(l,m,n,gama)
implicit real*8(a-h,o-z)
dimension dftr(7)
data pi /3.14159265359d0/
data dftr /1.d0,1.d0,3.d0,15.d0,105.d0,945.d0,10395.d0/
lh=l/2
mh=m/2
nh=n/2
if(2*lh-l) 50,1,50
1 if(2*mh-m) 50,2,50
2 if(2*nh-n) 50,3,50
3 hf=.5d0
olap=(sqrt(pi/gama))**3*(hf/gama)**(lh+mh+nh)*dftr(lh+1)*dftr(mh+
11)*dftr(nh+1)
return
50 olap=0.d0
return
end
c
c
subroutine prod(c,d,s,iff1,iff2)
implicit real*8(a-h,o-z)
dimension c(20),d(20),s(84)
do 10 i=1,84
10 s(i)=0.d0
if(iff1.gt.10.or.iff2.gt.10) goto 30
if(iff1.gt.4.or.iff2.gt.4) goto 20
s( 1)=c( 1)*d( 1)
c end of s - s
if(iff1.eq.1.and.iff2.eq.1) return
s( 2)=c( 1)*d( 2)+c( 2)*d( 1)
s( 3)=c( 1)*d( 3)+c( 3)*d( 1)
s( 4)=c( 1)*d( 4)+c( 4)*d( 1)
c end of s - p
if(iff1.eq.1.or.iff2.eq.1) return
s( 5)=c( 2)*d( 2)
s( 6)=c( 3)*d( 3)
s( 7)=c( 4)*d( 4)
s( 8)=c( 2)*d( 3)+c( 3)*d( 2)
s( 9)=c( 2)*d( 4)+c( 4)*d( 2)
s(10)=c( 3)*d( 4)+c( 4)*d( 3)
c end of p - p
return
20 continue
s( 1)=c( 1)*d( 1)
s( 2)=c( 1)*d( 2)+c( 2)*d( 1)
s( 3)=c( 1)*d( 3)+c( 3)*d( 1)
s( 4)=c( 1)*d( 4)+c( 4)*d( 1)
s( 5)=c( 1)*d( 5)+c( 5)*d( 1)+c( 2)*d( 2)
s( 6)=c( 1)*d( 6)+c( 6)*d( 1)+c( 3)*d( 3)
s( 7)=c( 1)*d( 7)+c( 7)*d( 1)+c( 4)*d( 4)
s( 8)=c( 1)*d( 8)+c( 8)*d( 1)+c( 2)*d( 3)+c( 3)*d( 2)
s( 9)=c( 1)*d( 9)+c( 9)*d( 1)+c( 2)*d( 4)+c( 4)*d( 2)
s(10)=c( 1)*d(10)+c(10)*d( 1)+c( 3)*d( 4)+c( 4)*d( 3)
c end of s - d
if(iff1.eq.1.or.iff2.eq.1) return
s(11)=c( 2)*d( 5)+c( 5)*d( 2)
s(12)=c( 3)*d( 6)+c( 6)*d( 3)
s(13)=c( 4)*d( 7)+c( 7)*d( 4)
s(14)=c( 2)*d( 8)+c( 8)*d( 2)+c( 3)*d( 5)+c( 5)*d( 3)
s(15)=c( 2)*d( 9)+c( 9)*d( 2)+c( 4)*d( 5)+c( 5)*d( 4)
s(16)=c( 2)*d( 6)+c( 6)*d( 2)+c( 3)*d( 8)+c( 8)*d( 3)
s(17)=c( 3)*d(10)+c(10)*d( 3)+c( 4)*d( 6)+c( 6)*d( 4)
s(18)=c( 2)*d( 7)+c( 7)*d( 2)+c( 4)*d( 9)+c( 9)*d( 4)
s(19)=c( 3)*d( 7)+c( 7)*d( 3)+c( 4)*d(10)+c(10)*d( 4)
s(20)=c( 2)*d(10)+c(10)*d( 2)+c( 3)*d( 9)
1 +c( 9)*d( 3)+c( 4)*d( 8)+c( 8)*d( 4)
c end of p - d
if(iff1.lt.5.or.iff2.lt.5) return
s(21)=c( 5)*d( 5)
s(22)=c( 6)*d( 6)
s(23)=c( 7)*d( 7)
s(24)=c( 5)*d( 8)+c( 8)*d( 5)
s(25)=c( 5)*d( 9)+c( 9)*d( 5)
s(26)=c( 6)*d( 8)+c( 8)*d( 6)
s(27)=c( 6)*d(10)+c(10)*d( 6)
s(28)=c( 7)*d( 9)+c( 9)*d( 7)
s(29)=c( 7)*d(10)+c(10)*d( 7)
s(30)=c( 5)*d( 6)+c( 6)*d( 5)+c( 8)*d( 8)
s(31)=c( 5)*d( 7)+c( 7)*d( 5)+c( 9)*d( 9)
s(32)=c( 6)*d( 7)+c( 7)*d( 6)+c(10)*d(10)
s(33)=c( 5)*d(10)+c(10)*d( 5)+c( 8)*d( 9)+c( 9)*d( 8)
s(34)=c( 6)*d( 9)+c( 9)*d( 6)+c( 8)*d(10)+c(10)*d( 8)
s(35)=c( 7)*d( 8)+c( 8)*d( 7)+c( 9)*d(10)+c(10)*d( 9)
c end of d - d
return
30 continue
s( 1)=c( 1)*d( 1)
s( 2)=c( 1)*d( 2)+c( 2)*d( 1)
s( 3)=c( 1)*d( 3)+c( 3)*d( 1)
s( 4)=c( 1)*d( 4)+c( 4)*d( 1)
s( 5)=c( 1)*d( 5)+c( 5)*d( 1)+c( 2)*d( 2)
s( 6)=c( 1)*d( 6)+c( 6)*d( 1)+c( 3)*d( 3)
s( 7)=c( 1)*d( 7)+c( 7)*d( 1)+c( 4)*d( 4)
s( 8)=c( 1)*d( 8)+c( 8)*d( 1)+c( 2)*d( 3)+c( 3)*d( 2)
s( 9)=c( 1)*d( 9)+c( 9)*d( 1)+c( 2)*d( 4)+c( 4)*d( 2)
s(10)=c( 1)*d(10)+c(10)*d( 1)+c( 3)*d( 4)+c( 4)*d( 3)
s(11)=c( 2)*d( 5)+c( 5)*d( 2)+c(1)*d(11)+c(11)*d(1)
s(12)=c( 3)*d( 6)+c( 6)*d( 3)+c(1)*d(12)+c(12)*d(1)
s(13)=c( 4)*d( 7)+c( 7)*d( 4)+c(1)*d(13)+c(13)*d(1)
s(14)=c( 2)*d( 8)+c( 8)*d( 2)+c( 3)*d( 5)+c( 5)*d( 3)+c(1)*d(14)+
1 c(14)*d(1)
s(15)=c( 2)*d( 9)+c( 9)*d( 2)+c( 4)*d( 5)+c( 5)*d( 4)+c(1)*d(15)+
1 c(15)*d(1)
s(16)=c( 2)*d( 6)+c( 6)*d( 2)+c( 3)*d( 8)+c( 8)*d( 3)+c(1)*d(16)+
1 c(16)*d(1)
s(17)=c( 3)*d(10)+c(10)*d( 3)+c( 4)*d( 6)+c( 6)*d( 4)+c(1)*d(17)+
1 c(17)*d(1)
s(18)=c( 2)*d( 7)+c( 7)*d( 2)+c( 4)*d( 9)+c( 9)*d( 4)+c(1)*d(18)+
1 c(18)*d(1)
s(19)=c( 3)*d( 7)+c( 7)*d( 3)+c( 4)*d(10)+c(10)*d( 4)+c(1)*d(19)+
1 c(19)*d(1)
s(20)=c( 2)*d(10)+c(10)*d( 2)+c( 3)*d( 9)+c(9)*d(3)+c(4)*d(8)+
1 c(8)*d(4)+c(1)*d(20)+c(20)*d(1)
c end of s - f
if(iff1.eq.1.or.iff2.eq.1) return
s(21)=c( 5)*d( 5)+c(2)*d(11)+c(11)*d(2)
s(22)=c( 6)*d( 6)+c(3)*d(12)+c(12)*d(3)
s(23)=c( 7)*d( 7)+c(4)*d(13)+c(13)*d(4)
s(24)=c( 5)*d( 8)+c( 8)*d( 5)+c(3)*d(11)+c(11)*d(3)+c(2)*d(14)+
1 c(14)*d(2)
s(25)=c( 5)*d( 9)+c( 9)*d( 5)+c(2)*d(15)+c(15)*d(2)+c(4)*d(11)+
1 c(11)*d(4)
s(26)=c( 6)*d( 8)+c( 8)*d( 6)+c(2)*d(12)+c(12)*d(2)+c(3)*d(16)+
1 c(16)*d(3)
s(27)=c( 6)*d(10)+c(10)*d( 6)+c(3)*d(17)+c(17)*d(3)+c(4)*d(12)+
1 c(12)*d(4)
s(28)=c( 7)*d( 9)+c( 9)*d( 7)+c(2)*d(13)+c(13)*d(2)+c(4)*d(18)+
1 c(18)*d(4)
s(29)=c( 7)*d(10)+c(10)*d( 7)+c(3)*d(13)+c(13)*d(3)+c(4)*d(19)+
1 c(19)*d(4)
s(30)=c( 5)*d( 6)+c( 6)*d( 5)+c( 8)*d( 8)+c(2)*d(16)+c(16)*d(2)+
1 c(3)*d(14)+c(14)*d(3)
s(31)=c( 5)*d( 7)+c( 7)*d( 5)+c( 9)*d( 9)+c(2)*d(18)+c(18)*d(2)+
1 c(4)*d(15)+c(15)*d(4)
s(32)=c( 6)*d( 7)+c( 7)*d( 6)+c(10)*d(10)+c(3)*d(19)+c(19)*d(3)+
1 c(4)*d(17)+c(17)*d(4)
s(33)=c( 5)*d(10)+c(10)*d( 5)+c( 8)*d( 9)+c( 9)*d( 8)+c(3)*d(15)+
1 c(15)*d(3)+c(4)*d(14)+c(14)*d(4)+c(2)*d(20)+c(20)*d(2)
s(34)=c( 6)*d( 9)+c( 9)*d( 6)+c( 8)*d(10)+c(10)*d( 8)+c(2)*d(17)+
1 d(2)*c(17)+c(3)*d(20)+c(20)*d(3)+c(4)*d(16)+c(16)*d(4)
s(35)=c( 7)*d( 8)+c( 8)*d( 7)+c( 9)*d(10)+c(10)*d( 9)+c(2)*d(19)+
1 c(19)*d(2)+c(3)*d(18)+c(18)*d(3)+c(4)*d(20)+c(20)*d(4)
c end of p - f
if(iff1.eq.2.or.iff2.eq.2) return
s(36)=c(5)*d(11)+c(11)*d(5)
s(37)=c(6)*d(12)+c(12)*d(6)
s(38)=c(7)*d(13)+c(13)*d(7)
s(39)=c(6)*d(11)+c(11)*d(6)+c(5)*d(16)+c(16)*d(5)+c(8)*d(14)+
1 c(14)*d(8)
s(40)=c(7)*d(11)+c(11)*d(7)+c(5)*d(18)+c(18)*d(5)+c(9)*d(15)+
1 c(15)*d(9)
s(41)=c(5)*d(12)+c(12)*d(5)+c(6)*d(14)+c(14)*d(6)+c(8)*d(16)+
1 c(16)*d(8)
s(42)=c(5)*d(13)+c(13)*d(5)+c(7)*d(15)+c(15)*d(7)+c(9)*d(18)+
1 c(18)*d(9)
s(43)=c(7)*d(12)+c(12)*d(7)+c(6)*d(19)+c(19)*d(6)+c(10)*d(17)+
1 c(17)*d(10)
s(44)=c(6)*d(13)+c(13)*d(6)+c(7)*d(17)+c(17)*d(7)+c(10)*d(19)+
1 c(19)*d(10)
s(45)=c(8)*d(11)+c(11)*d(8)+c(5)*d(14)+c(14)*d(5)
s(46)=c(9)*d(11)+c(11)*d(9)+c(5)*d(15)+c(15)*d(5)
s(47)=c(8)*d(12)+c(12)*d(8)+c(6)*d(16)+c(16)*d(6)
s(48)=c(10)*d(12)+c(12)*d(10)+c(6)*d(17)+c(17)*d(6)
s(49)=c(10)*d(13)+c(13)*d(10)+c(7)*d(19)+c(19)*d(7)
s(50)=c(9)*d(13)+c(13)*d(9)+c(7)*d(18)+c(18)*d(7)
s(51)=c(8)*d(13)+c(13)*d(8)+c(7)*d(20)+c(20)*d(7)+c(9)*d(19)+
1 c(19)*d(9)+c(10)*d(18)+c(18)*d(10)
s(52)=c(10)*d(11)+c(11)*d(10)+c(5)*d(20)+c(20)*d(5)+c(9)*d(14)+
1 c(14)*d(9)+c(8)*d(15)+c(15)*d(8)
s(53)=c(9)*d(12)+c(12)*d(9)+c(6)*d(20)+c(20)*d(6)+c(10)*d(16)+
1 c(16)*d(10)+c(8)*d(17)+c(17)*d(8)
s(54)=c(5)*d(17)+c(17)*d(5)+c(6)*d(15)+c(15)*d(6)+c(14)*d(10)+
1 d(14)*c(10)+c(9)*d(16)+c(16)*d(9)+c(8)*d(20)+c(20)*d(8)
s(55)=c(5)*d(19)+c(19)*d(5)+c(7)*d(14)+c(14)*d(7)+c(10)*d(15)+
1 c(15)*d(10)+c(9)*d(20)+c(20)*d(9)+c(8)*d(18)+c(18)*d(8)
s(56)=c(6)*d(18)+c(18)*d(6)+c(7)*d(16)+c(16)*d(7)+c(10)*d(20)+
1 c(20)*d(10)+c(9)*d(17)+c(17)*d(9)+c(8)*d(19)+c(19)*d(8)
c end of d - f
if(iff1.eq.3.or.iff2.eq.3) return
s(57)=c(11)*d(11)
s(58)=c(12)*d(12)
s(59)=c(13)*d(13)
s(60)=c(11)*d(12)+c(12)*d(11)+c(14)*d(16)+c(16)*d(14)
s(61)=c(11)*d(13)+c(13)*d(11)+c(15)*d(18)+c(18)*d(15)
s(62)=c(12)*d(13)+c(13)*d(12)+c(17)*d(19)+c(19)*d(17)
s(63)=c(11)*d(14)+c(14)*d(11)
s(64)=c(11)*d(15)+c(15)*d(11)
s(65)=c(13)*d(18)+c(18)*d(13)
s(66)=c(13)*d(19)+c(19)*d(13)
s(67)=c(12)*d(17)+d(12)*c(17)
s(68)=c(12)*d(16)+c(16)*d(12)
s(69)=c(11)*d(16)+c(16)*d(11)+c(14)*d(14)
s(70)=c(11)*d(18)+c(18)*d(11)+c(15)*d(15)
s(71)=c(13)*d(15)+c(15)*d(13)+c(18)*d(18)
s(72)=c(13)*d(17)+c(17)*d(13)+c(19)*d(19)
s(73)=c(12)*d(14)+c(14)*d(12)+c(16)*d(16)
s(74)=c(12)*d(19)+c(19)*d(12)+c(17)*d(17)
s(75)=c(11)*d(17)+c(17)*d(11)+c(14)*d(20)+c(20)*d(14)+
1 c(15)*d(16)+c(16)*d(15)
s(76)=c(11)*d(19)+c(19)*d(11)+c(20)*d(15)+c(15)*d(20)+
1 c(14)*d(18)+c(18)*d(14)
s(77)=c(12)*d(18)+c(18)*d(12)+c(16)*d(19)+c(19)*d(16)+
1 c(17)*d(20)+c(20)*d(17)
s(78)=c(13)*d(14)+c(14)*d(13)+c(15)*d(19)+c(19)*d(15)+
1 c(18)*d(20)+c(20)*d(18)
s(79)=c(12)*d(15)+c(15)*d(12)+c(14)*d(17)+c(17)*d(14)+
1 c(16)*d(20)+c(20)*d(16)
s(80)=c(13)*d(16)+c(16)*d(13)+c(17)*d(18)+c(18)*d(17)+
1 c(19)*d(20)+c(20)*d(19)
s(81)=c(11)*d(20)+c(20)*d(11)+c(14)*d(15)+c(15)*d(14)
s(82)=c(12)*d(20)+c(20)*d(12)+c(16)*d(17)+c(17)*d(16)
s(83)=c(13)*d(20)+c(20)*d(13)+c(18)*d(19)+c(19)*d(18)
s(84)=c(14)*d(19)+c(19)*d(14)+c(15)*d(17)+c(17)*d(15)+
1 c(16)*d(18)+c(18)*d(16)+c(20)*d(20)
c end of f - f
return
end
c
c
subroutine fmc(mvar,xvar,expmx,fmch)
implicit real*8(a-h,o-z)
m=mvar
x=xvar
expmx=exp(-x)
if(x -20.d0) 10,10,20
c x less than or equal to 20.0.
10 a=m
a=a+0.5d0
term=1.d0/a
ptlsum=term
do 11 i=2,60
a=a+1.d0
term=term*x/a
ptlsum=ptlsum+term
if (term/ptlsum- 1.d-8 ) 12, 11, 11
11 continue
print 999,m,x
12 fmch=.5d0*ptlsum*expmx
return
c x greater than 20.0.
20 a=m
xd=1.d0/x
b=a+0.5d0
a=a-0.5d0
approx=.886226925428d0*(sqrt(xd)*xd**m)
if (m) 21, 23, 21
21 do 22 i=1,m
b=b-1.d0
22 approx=approx*b
23 fimult=.5d0*expmx*xd
fiprop=fimult/approx
term=1.d0
ptlsum=term
notrms=x
notrms=notrms+m
do 24 i=2,notrms
term=term*a*xd
ptlsum=ptlsum+term
if (abs(term*fiprop/ptlsum) - 1.d-8 ) 25,25,24
24 a=a-1.d0
print 999,m,x
25 fmch=approx-fimult*ptlsum
return
999 format (24h no convergence for fmch, i6, d16.9)
end
c
c
subroutine opaa0(l,m,n,ga,v,d)
c electronic part of potential
implicit real*8(a-h,o-z)
dimension v(1),d(3),fnu(7),fn(7),fd(7),dp(4)
data pi /3.14159265359d0/, fn /1.d0,1.d0,2.d0,6.d0,24.d0,120.d0,
1 720.d0/
data fd/1.d0,1.d0,0.5d0,0.1666666666667d0,0.416666666667d-1,
1 .833333333333d-2,.1388888888889d-2/
itot=l+m+n
itoth=itot/2
pre=(2.d0*pi/ga)*fn(l+1)*fn(m+1)*fn(n+1)
if(2*itoth-itot) 1,2,1
1 pre=-pre
2 del=.25d0/ga
x=ga*(d(1)**2+d(2)**2+d(3)**2)
xx=2.d0*x
call fmc(6,x,expmx,fmch)
fnu(7)=fmch
fnu(6)=(expmx+xx*fnu(7))/11.d0
fnu(5)=(expmx+xx*fnu(6))/9.d0
fnu(4)=(expmx+xx*fnu(5))/7.d0
fnu(3)=(expmx+xx*fnu(4))/5.d0
fnu(2)=(expmx+xx*fnu(3))/3.d0
fnu(1)=expmx+xx*fnu(2)
dp(1)=1.d0
dp(2)=del
dp(3)=del**2
v(1)=pre*aainer(0,0,0,l,m,n,d,dp,fnu,fn,fd)*(-1.0d0)
return
end
c
c
subroutine opaa1(l,m,n,ga,v,d)
c electronic part of electric field
implicit real*8(a-h,o-z)
dimension v(3),d(3),fnu(9),fd(9),fn(9),dp(4)
data pi /3.14159265359d0/, fn /1.d0,1.d0,2.d0,6.d0,24.d0,120.d0,
1 720.d0,5040.d0,40320.d0/
data fd /1.d0,1.d0,.5d0,.1666666666667d0,.416666666667d-1,
1 .833333333333d-2,.1388888888889d-2,.1984126984d-3,0.248015873d-4/
itot=l+m+n
itoth=itot/2
pre=4.d0*pi*fn(l+1)*fn(m+1)*fn(n+1)
if(2*itoth-itot) 1,2,1
1 pre=-pre
2 del=.25d0/ga
x=ga*(d(1)**2+d(2)**2+d(3)**2)
xx=2.d0*x
call fmc(8,x,expmx,fmch)
fnu(9)=fmch
fnu(8)=(expmx+xx*fnu(9))/15.d0
fnu(7)=(expmx+xx*fnu(8))/13.d0
fnu(6)=(expmx+xx*fnu(7))/11.d0
fnu(5)=(expmx+xx*fnu(6))/9.d0
fnu(4)=(expmx+xx*fnu(5))/7.d0
fnu(3)=(expmx+xx*fnu(4))/5.d0
fnu(2)=(expmx+xx*fnu(3))/3.d0
fnu(1)=expmx+xx*fnu(2)
dp(1)=1.d0
dp(2)=del
dp(3)=del**2
dp(4)=del*dp(3)
v(1)=pre*aainer(1,0,0,l,m,n,d,dp,fnu,fn,fd)
v(2)=pre*aainer(0,1,0,l,m,n,d,dp,fnu,fn,fd)
v(3)=pre*aainer(0,0,1,l,m,n,d,dp,fnu,fn,fd)
return
end
c
c
subroutine opaa2(l,m,n,ga,v,d)
c electronic part of field gradient
implicit real*8(a-h,o-z)
dimension v(6),d(3),fnu(9),fd(9),fn(9),dp(5)
data pi /3.14159265359d0/, fn /1.d0,1.d0,2.d0,6.d0,24.d0,120.d0,
1 720.d0,5040.d0,40320.d0/
data fd /1.d0,1.d0,.5d0,.1666666666667d0,.416666666667d-1,
1 .833333333333d-2,.1388888888889d-2,.1984126984d-3,0.248015873d-4/
itot=l+m+n
itoth=itot/2
pre=(8.d0*pi*ga)*fn(l+1)*fn(m+1)*fn(n+1)
if(2*itoth-itot)1,2,1
1 pre=-pre
2 del=.25d0/ga
x=ga*(d(1)**2+d(2)**2+d(3)**2)
xx=2.d0*x
call fmc(8,x,expmx,fmch)
fnu(9)=fmch
fnu(8)=(expmx+xx*fnu(9))/15.d0
fnu(7)=(expmx+xx*fnu(8))/13.d0
fnu(6)=(expmx+xx*fnu(7))/11.d0
fnu(5)=(expmx+xx*fnu(6))/9.d0
fnu(4)=(expmx+xx*fnu(5))/7.d0
fnu(3)=(expmx+xx*fnu(4))/5.d0
fnu(2)=(expmx+xx*fnu(3))/3.d0
fnu(1)=expmx+xx*fnu(2)
dp(1)=1.d0
dp(2)=del
dp(3)=del**2
dp(4)=del*dp(3)
dp(5)=del*dp(4)
v(1)=pre*aainer(2,0,0,l,m,n,d,dp,fnu,fn,fd)
v(2)=pre*aainer(0,2,0,l,m,n,d,dp,fnu,fn,fd)
v(3)=pre*aainer(0,0,2,l,m,n,d,dp,fnu,fn,fd)
v(4)=pre*aainer(1,1,0,l,m,n,d,dp,fnu,fn,fd)
v(5)=pre*aainer(1,0,1,l,m,n,d,dp,fnu,fn,fd)
v(6)=pre*aainer(0,1,1,l,m,n,d,dp,fnu,fn,fd)
call opac3(l,m,n,ga,dp(1),d)
dp(1)=1.333333333333d0*pi*dp(1)
v(1)=v(1)+dp(1)
v(2)=v(2)+dp(1)
v(3)=v(3)+dp(1)
return
end
c
c
subroutine opaa3(l,m,n,ga,v,d)
c electronic part of diamagnetic shielding
implicit real*8(a-h,o-z)
dimension vx(3),d(3),v(7)
call opaa1(l,m,n,ga,vx,d)
v(1)=vx(1)*d(1)
v(2)=vx(2)*d(2)
v(3)=vx(3)*d(3)
v(4)=vx(2)*d(1)
v(5)=vx(3)*d(1)
v(6)=vx(3)*d(2)
call opaa1(l+1,m,n,ga,vx,d)
v(1)=v(1)+vx(1)
v(4)=v(4)+vx(2)
v(5)=v(5)+vx(3)
call opaa1(l,m+1,n,ga,vx,d)
v(2)=v(2)+vx(2)
v(6)=v(6)+vx(3)
call opaa1(l,m,n+1,ga,vx,d)
v(3)=v(3)+vx(3)
v(7)=v(1)+v(2)+v(3)
do 300 i=1,7
v(i)=-v(i)
300 continue
return
end
c
c
subroutine opab1(l,m,n,ga,v,d)
c electronic part of dipole moment
implicit real*8(a-h,o-z)
dimension v(3),d(3),g(4)
g(1)=olap(l,m,n,ga)
g(2)=olap(l+1,m,n,ga)
g(3)=olap(l,m+1,n,ga)
g(4)=olap(l,m,n+1,ga)
v(1)=g(2)+d(1)*g(1)
v(2)=g(3)+d(2)*g(1)
v(3)=g(4)+d(3)*g(1)
do 300 i=1,3
300 v(i)=-v(i)
return
end
c
c
subroutine opab2(l,m,n,ga,v,d)
c electronic part of quadrupole moment
implicit real*8(a-h,o-z)
dimension v(7),d(3),g(10)
g(1)=olap(l,m,n,ga)
g(2)=olap(l+1,m,n,ga)
g(3)=olap(l,m+1,n,ga)
g(4)=olap(l,m,n+1,ga)
g(5)=olap(l+2,m,n,ga)
g(6)=olap(l,m+2,n,ga)
g(7)=olap(l,m,n+2,ga)
g(8)=olap(l+1,m+1,n,ga)
g(9)=olap(l+1,m,n+1,ga)
g(10)=olap(l,m+1,n+1,ga)
v(1)=g(5)+2.d0*d(1)*g(2)+d(1)**2*g(1)
v(2)=g(6)+2.d0*d(2)*g(3)+d(2)**2*g(1)
v(3)=g(7)+2.d0*d(3)*g(4)+d(3)**2*g(1)
v(4)=(g(8)+d(1)*g(3)+d(2)*g(2)+d(1)*d(2)*g(1))/2.d0
v(5)=(g(9)+d(1)*g(4)+ d(3)*g(2)+d(1)*d(3)*g(1))/2.d0
v(6)=(g(10)+d(2)*g(4)+d(3)*g(3)+d(2)*d(3)*g(1))/2.d0
v(7)=v(1)+v(2)+v(3)
v(1)=(3.d0*v(1)-v(7))/2.d0
v(2)=(3.d0*v(2)-v(7))/2.d0
v(3)=(3.d0*v(3)-v(7))/2.d0
v(4)=3.d0*v(4)
v(5)=3.d0*v(5)
v(6)=3.d0*v(6)
do 300 i=1,7
300 v(i)=-v(i)
return
end
c
c
subroutine opab3(l,m,n,ga,v,dd)
c electronic part of third moment
implicit real*8(a-h,o-z)
dimension v(10),dd(3),g(20),d(20)
g(1)=olap( l,m,n,ga)
g(2)=olap(l+1,m,n,ga)
g(3)=olap(l,m+1,n,ga)
g(4)=olap(l,m,n+1,ga)
g(5)=olap(l+2,m,n,ga)
g(6)=olap(l,m+2,n,ga)
g(7)=olap(l,m,n+2,ga)
g(8)=olap(l+1,m+1,n,ga)
g(9)=olap(l+1,m,n+1,ga)
g(10)=olap(l,m+1,n+1,ga)
g(11)=olap(l+3,m,n,ga)
g(12)=olap(l,m+3,n,ga)
g(13)=olap(l,m,n+3,ga)
g(14)=olap(l+2,m+1,n,ga)
g(15)=olap(l+2,m,n+1,ga)
g(16)=olap(l+1,m+2,n,ga)
g(17)=olap(l,m+2,n+1,ga)
g(18)=olap(l+1,m,n+2,ga)
g(19)=olap(l,m+1,n+2,ga)
g(20)=olap(l+1,m+1,n+1,ga)
d(2)=dd(1)
d(3)=dd(2)
d(4)=dd(3)
d(5)=dd(1)**2
d(6)=dd(2)**2
d(7)=dd(3)**2
d(8)=d(2)*d(3)
d(9)=d(2)*d(4)
d(10)=d(3)*d(4)
d(11)=d(5)*d(2)
d(12)=d(6)*d(3)
d(13)=d(7)*d(4)
d(14)=d(5)*d(3)
d(15)=d(5)*d(4)
d(16)=d(6)*d(2)
d(17)=d(6)*d(4)
d(18)=d(7)*d(2)
d(19)=d(7)*d(3)
d(20)=d(8)*d(4)
v(1)=g(11)+3.d0*d(2)*g(5)+3.d0*d(5)*g(2)+d(11)*g(1)
v(2)=g(12)+3.d0*d(3)*g(6)+3.d0*d(6)*g(3)+d(12)*g(1)
v(3)=g(13)+3.d0*d(4)*g(7)+3.d0*d(7)*g(4)+d(13)*g(1)
v(4)=g(14)+2.d0*d(2)*g(8)+d(3)*g(5)+d(5)*g(3)+2.d0*d(8)*g(2)
1 +d(14)*g(1)
v(5)=g(15)+2.d0*d(2)*g(9)+d(4)*g(5)+d(5)*g(4)+2.d0*d(9)*g(2)
1 +d(15)*g(1)
v(6)=g(16)+2.d0*d(3)*g(8)+d(2)*g(6)+d(6)*g(2)+2.d0*d(8)*g(3)
1 +d(16)*g(1)
v(7)=g(17)+2.d0*d(3)*g(10)+d(4)*g(6)+d(6)*g(4)+2.d0*d(10)*g(3)
1 +d(17)*g(1)
v(8)=g(18)+2.d0*d(4)*g(9)+d(2)*g(7)+d(7)*g(2)+2.d0*d(9)*g(4)
1 +d(18)*g(1)
v(9)=g(19)+2.d0*d(4)*g(10)+d(3)*g(7)+d(7)*g(3)+2.d0*d(10)*g(4)
1 +d(19)*g(1)
v(10)=g(20)+d(2)*g(10)+d(3)*g(9)+d(4)*g(8)+d(10)*g(2)+d(9)*g(3)+
1d(8)*g(4)+d(20)*g(1)
do 300 i=1,10
300 v(i)=-v(i)
return
end
c
c
subroutine opab4(l,m,n,ga,v,d)
c electronic part of second moment
implicit real*8(a-h,o-z)
dimension v(6),d(3),g(10)
g(1)=olap(l,m,n,ga)
g(2)=olap(l+1,m,n,ga)
g(3)=olap(l,m+1,n,ga)
g(4)=olap(l,m,n+1,ga)
g(5)=olap(l+2,m,n,ga)
g(6)=olap(l,m+2,n,ga)
g(7)=olap(l,m,n+2,ga)
g(8)=olap(l+1,m+1,n,ga)
g(9)=olap(l+1,m,n+1,ga)
g(10)=olap(l,m+1,n+1,ga)
v(1)=g(5)+2.d0*d(1)*g(2)+d(1)**2*g(1)
v(2)=g(6)+2.d0*d(2)*g(3)+d(2)**2*g(1)
v(3)=g(7)+2.d0*d(3)*g(4)+d(3)**2*g(1)
v(4)=g(8)+d(1)*g(3)+d(2)*g(2)+d(1)*d(2)*g(1)
v(5)=g(9)+d(1)*g(4)+d(3)*g(2)+d(1)*d(3)*g(1)
v(6)=g(10)+d(2)*g(4)+d(3)*g(3)+d(2)*d(3)*g(1)
do 300 i=1,6
300 v(i)=-v(i)
return
end
c
c
subroutine opac1(l,m,n,ga,v,d)
c electronic part of planar density
implicit real*8(a-h,o-z)
dimension v(3),d(3),dd(3),dftr(6)
data pi /3.14159265359d0/, dftr /1.d0,1.d0,3.d0,5.d0,15.d0,105.d0/
do 1 i=1,3
dd(i)=-d(i)
v(i)=0.d0
1 continue
g=.5d0/ga
lh=l/2
mh=m/2
nh=n/2
pre=2.d0*g*pi
if(2*nh-n) 9,3,9
3 if(2*mh-m) 7,4,7
4 v(1)=1.d0
if(l) 39,41,39
39 v(1)=dd(1)**l
41 v(1)=pre*v(1)* exp (-ga*dd(1)**2)*g**(mh+nh)*dftr(mh+1)*dftr(nh
1+1)
if(2*lh-l) 50,5,50
5 v(2)=1.d0
if(m) 49,51,49
49 v(2)=dd(2)**m
51 v(2)=pre*v(2)* exp (-ga*dd(2)**2)*g**(lh+nh)*dftr(lh+1)*dftr(nh
1+1)
6 v(3)=1.d0
if(n) 59,61,59
59 v(3)=dd(3)**n
61 v(3)=pre*v(3)* exp (-ga*dd(3)**2)*g**(lh+mh)*dftr(lh+1)*dftr(mh
1+1)
return
7 if(2*lh-l) 50,8,50
8 v(2)=1.d0
if(m) 79,81,79
79 v(2)=dd(2)**m
81 v(2)=pre*v(2)* exp (-ga*dd(2)**2)*g**(lh+nh)*dftr(lh+1)*dftr(nh
1+1)
return
9 if(2*mh-m) 50,10,50
10 if(2*lh-l) 50,6,50
50 return
end
c
c
subroutine opac2(l,m,n,ga,v,d)
c electronic part of linear density
implicit real*8(a-h,o-z)
dimension v(3),d(3),dd(3),ds(3),dftr(5)
data sqrpi /1.772453850906d0/, dftr /1.d0,1.d0,3.d0,15.d0,105.d0/
do 1 i=1,3
dd(i)=-d(i)
ds(i)=d(i)**2
v(i)=0.d0
1 continue
g=.5d0/ga
pre=sqrpi*sqrt(2.d0*g)
lh=l/2
mh=m/2
nh=n/2
if(2*nh-n) 4,3,4
3 v(1)=1.d0
if(l.le.0.and.dd(1).eq.0.d0) go to 29
28 v(1)=dd(1)**l
29 if(m.le.0.and.dd(2).eq.0.d0) go to 31
30 v(1)=v(1)*dd(2)**m
31 v(1)=pre*g**nh*v(1)*exp(-ga*(ds(1)+ds(2)))*dftr(nh+1)
4 if(2*mh-m) 6,5,6
5 v(2)=1.d0
if(l.le.0.and.dd(1).eq.0.d0) go to 49
48 v(2)=dd(1)**l
49 if(n.le.0.and.dd(1).eq.0.d0) go to 51
50 v(2)=v(2)*dd(1)**n
51 v(2)=pre*g**mh*v(2)*exp(-ga*(ds(1)+ds(3)))*dftr(mh+1)
6 if(2*lh-l) 8,7,8
7 v(3)=1.d0
if(m.le.0.and.dd(2).eq.0.d0) go to 69
68 v(3)=dd(2)**m
69 if(n.le.0.and.dd(3).eq.0.d0) go to 71
70 v(3)=v(3)*dd(3)**n
71 v(3)=pre*g**lh*v(3)*exp(-ga*(ds(2)+ds(3)))*dftr(lh+1 )
8 return
end
c
c
subroutine opac3(l,m,n,ga,v,d)
c electronic part of charge density
implicit real*8(a-h,o-z)
dimension v(1),d(1),dd(3)
ddsq=0.d0
do 1 i=1,3
dd(i)=-d(i)
ddsq=ddsq+d(i)**2
1 continue
v(1) =1.d0
if(l) 2,3,2
2 v(1)=dd(1)**l
3 if(m) 4,5,4
4 v(1)=v(1)*dd(2)**m
5 if(n) 6,7,6
6 v(1)=v(1)*dd(3)**n
7 v(1)=v(1)*exp(-ga*ddsq)
return
end
c
c
subroutine opad1(l,m,n,ga,v,d)
c electronic part of overlap
implicit real*8(a-h,o-z)
dimension v(1),d(1)
v(1)=olap(l,m,n,ga)
return
end
c
c
subroutine opap4(l,m,n,gc,v,rc)
c
c this subroutine calculates the expectation-values of
c -p**2/2 (kinetic energy) and p**4/(8*cl**2) (relativistic
c correction of the kinetic energy)
c
c the program works correct only for s and p and the irreducible
c linear combinations of the primitive d,f,... functions
c
c written by s. brode in april,1984
c
c
implicit real*8 (a-h,o-z)
logical lodd,modd,nodd,leven,meven,neven
dimension v(3),rc(3),rca(3),rcb(3),srcab(3),
&lmni(35),o(25),dftr(7)
data a0/0.0d0/,a1/1.0d0/,a2/2.0d0/,a4/4.0d0/,a8/8.0d0/,
&lmni/0,3*1,6*2,10*3,15*4/,cl/137.03604d0/,pi/3.1415926559d0/,
&dftr/1.0d0,1.0d0,3.0d0,15.0d0,105.0d0,945.0d0,103935.0d0/
common /abfunc/ ra(3),rb(3),ga,gb,ia,ib
c
c define the overlap-integral
c
ola(ll,mm,nn)=gch**(ll/2+mm/2+nn/2)*dftr(ll/2+1)*dftr(mm/2+1)*
&dftr(nn/2+1)
c
c some previous calculations
c
do 10 i=1,25
10 o(i)=a0
gch=a1/(a2*gc)
ropigc=sqrt(pi/gc)*pi/gc
lodd=mod(l,2).eq.1
leven=.not.lodd
modd=mod(m,2).eq.1
meven=.not.modd
nodd=mod(n,2).eq.1
neven=.not.nodd
ga2=ga*a2
gb2=gb*a2
gab4=ga2*gb2
prcaa=a0
prcbb=a0
do 20 i=1,3
rca(i)=rc(i)-ra(i)
rcb(i)=rc(i)-rb(i)
srcab(i)=rca(i)+rcb(i)
prcaa=prcaa+rca(i)*rca(i)
prcbb=prcbb+rcb(i)*rcb(i)
20 continue
zwa=ga2*prcaa-dfloat(2*lmni(ia)+3)
zwb=gb2*prcbb-dfloat(2*lmni(ib)+3)
c
c calculation of the overlap-integrals
c
if(lodd.or.modd.or.nodd) go to 110
o( 1)=ola(l ,m ,n )
o( 5)=ola(l+2,m ,n )
o( 6)=ola(l ,m+2,n )
o( 7)=ola(l ,m ,n+2)
o(11)=ola(l+4,m ,n )
o(12)=ola(l ,m+4,n )
o(13)=ola(l ,m ,n+4)
o(20)=ola(l+2,m+2,n )
o(21)=ola(l+2,m ,n+2)
o(22)=ola(l ,m+2,n+2)
110 continue
c
if(leven.or.modd.or.nodd) go to 120
o( 2)=ola(l+1,m ,n )
o( 8)=ola(l+3,m ,n )
o(14)=ola(l+1,m+2,n )
o(15)=ola(l+1,m ,n+2)
120 continue
c
if(lodd.or.meven.or.nodd) go to 130
o( 3)=ola(l ,m+1,n )
o( 9)=ola(l ,m+3,n )
o(16)=ola(l+2,m+1,n )
o(17)=ola(l ,m+1,n+2)
130 continue
c
if(lodd.or.modd.or.neven) go to 140
o( 4)=ola(l ,m ,n+1)
o(10)=ola(l ,m ,n+3)
o(18)=ola(l+2,m ,n+1)
o(19)=ola(l ,m+2,n+1)
140 continue
c
if(leven.or.meven.or.nodd) go to 150
o(23)=ola(l+1,m+1,n )
150 continue
if(leven.or.modd.or.neven) go to 160
o(24)=ola(l+1,m ,n+1)
160 continue
if(lodd.or.meven.or.neven) go to 170
o(25)=ola(l ,m+1,n+1)
170 continue
c
c calculation of kinetic energy
c
p2=-ga*(zwa*o(1)
& +ga2*(a2*(rca(1)*o(2)+rca(2)*o(3)+rca(3)*o(4))
& +o(5)+o(6)+o(7)))
c
c calculation of relativistic correction
c
p4=(gab4*(o(11)+o(12)+o(13)+a2*(o(20)+o(21)+o(22))
& +a2*(srcab(1)*(o( 8)+o(16)+o(18))
& +srcab(2)*(o(14)+o( 9)+o(19))
& +srcab(3)*(o(15)+o(17)+o(10)))
& +a4*(rca(1)*rcb(1)*o(5)
& +rca(2)*rcb(2)*o(6)
& +rca(3)*rcb(3)*o(7)
& +a2*((rca(1)*rcb(2)+rca(2)+rcb(1))*o(23)
& +(rca(1)*rcb(3)+rca(3)+rcb(1))*o(24)
& +(rca(2)*rcb(3)+rca(3)+rcb(2))*o(25))))
& +(gb2*zwa+ga2*zwb)*(o(5)+o(6)+o(7))
& +a2*(gb2*zwa*(rcb(1)*o(2)+rcb(2)*o(3)+rcb(3)*o(4))
& +ga2*zwb*(rca(1)*o(2)+rca(2)*o(3)+rca(3)*o(4)))
& +zwa*zwb*o(1))
& *(-gab4)/(a8*cl**2)
c
c store p2 and p4 to the correct storage-locations
c
v(1)=p2*ropigc
v(2)=p4*ropigc
v(3)=v(1)+v(2)
return
end
c
c
real*8 function aainer(r,s,t,l,m,n,d,dp,fnu,fn,fd)
implicit real*8(a-h,o-z)
dimension d(3),dp(1),fnu(1),fn(1),fd(1)
integer r,s,t,u,v,w,uvwt,rstt,uvwth
rstt=r+s+t
lmnt=l+m+n
lmnrst=rstt+lmnt
lh=l/2
mh=m/2
nh=n/2
aainer=0.0d0
last1 = lh+1
do 6 ii=1,last1
i = ii-1
il=l-2*i+1
ilr=r+il
ilrh=(ilr-1)/2
fi=fn(ilr)*fd(il)*fd(i+1)
last2 = mh+1
do 5 jj=1,last2
j = jj-1
jm=m-2*j+1
jms=s+jm
jmsh=(jms-1)/2
fij=fn(jms)*fd(jm)*fd(j+1)*fi
last3 = nh+1
do 4 kk=1,last3
k = kk-1
kn=n-2*k+1
knt=t+kn
knth=(knt-1)/2
ijkt=i+j+k
fijk=fn(knt)*fd(kn)*fd(k+1)*dp(ijkt+1)*fij
lmrsij=lmnrst-2*ijkt
last4 = ilrh+1
do 3 iu=1,last4
u = iu-1
ilru=ilr-2*u
fu=fd(u+1)*fd(ilru)
if(abs(d(1))-0.0000001d0)10,10,11
10 if(ilru-1) 12,12, 3
11 fu=fu*d(1)**(ilru-1)
12 last5 = jmsh+1
do 2 iv=1,last5
v = iv-1
jmsv=jms-2*v
fuv=fu*fd(v+1)*fd(jmsv)
if(abs(d(2))-0.0000001d0)20,20,21
20 if(jmsv-1) 22,22,2
21 fuv=fuv*d(2)**(jmsv-1)
22 last6 = knth+1
do 1 iw=1,last6
w = iw-1
kntw=knt-2*w
fuvw=fuv*fd(w+1) *fd(kntw)
if(abs(d(3))-0.0000001d0)30,30,31
30 if(kntw-1) 32,32,1
31 fuvw=fuvw*d(3)**(kntw-1)
32 uvwt=u+v+w
uvwth=uvwt/2
if(2*uvwth-uvwt) 33,34,33
33 fuvw=-fuvw
34 nuindx=lmrsij-uvwt
fuvw=fuvw*fnu(nuindx +1)*dp(uvwt+1)
aainer=fijk*fuvw+aainer
1 continue
2 continue
3 continue
4 continue
5 continue
6 continue
return
end
c
c
subroutine divpt(a,alpha,b,beta,ecoord,eexp,efact)
implicit real*8(a-h,o-z)
c this computes the centre, exponent, and multiplying factor of
c a single gaussian which can replace the product of two gaussia
c centres a and b, and exponents alpha and beta.
dimension a(3), b(3), ecoord(3)
do 1 i=1,3
1 ecoord(i)=(alpha*a(i)+beta*b(i))/(alpha+beta)
eexp=alpha+beta
absqd=0.0d0
do 2 i=1,3
2 absqd=absqd+(b(i)-a(i))*(b(i)-a(i))
efact=exp(-alpha*beta*absqd/(alpha+beta))
return
end
c
c
subroutine elcmom(nt,frocc,dint,nro,norb,tot,cint,nomx)
c total property in mo basis * occupation numbers
implicit real*8(a-h,o-z)
dimension frocc(*),dint(nro,*),tot(*),cint(nomx,*)
do 11 nu=1,nt
tot(nu)=0.0d0
do 12 n=1,norb
tot(nu)=tot(nu) + frocc(n)*cint(n,nu)
dint(2,nu)=tot(nu)
12 continue
11 continue
return
end
c
c
subroutine total(nt,dint,nro)
c nuclear + electronic part of property
implicit real*8(a-h,o-z)
dimension dint(nro,*)
do 20 k=1,nt
20 dint(3,k)=dint(1,k)+dint(2,k)
return
end
c
c
subroutine output(dint,norb,n,nt,nro,frocc,tot,c,ilbl,a,
& title,cint,buff)
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
real*8 c(1), ilbl(1), a(1), title(1)
parameter (mloc=250)
dimension dint(nro,*),frocc(*),tot(nt),cint(nomx,*),buff(lbuff)
c
c dimensions for localization have to be:
c help(ncont,norb,nt), xlv(ncont,norb), op(nnorb,nt), d(norb,norb)
c eig(norb), mon(norb)
c
dimension mon(mloc),xlv(2),repv(2)
logical ok
common /big/ y(nomx*nomx), help(nomx*mloc*3),
& d(mloc*(mloc+1)*3/2),op(mloc*mloc)
common /eig/ eig(mloc)
common /prptyp/ m
common /contrc/ chomo,ncont
equivalence (help(1),xlv(1),repv(1))
c
if(m.eq.15) go to 17
call cntrac(cint,norb,n,nt,nro,buff)
call elcmom(nt,frocc,dint,nro,norb,tot,cint,nomx)
call total(nt,dint,nro)
call prnt(dint,nro,nt,norb,c,ilbl,a,title,cint,nomx)
return
c
17 write(6,6000)
do 10 i=1,norb
10 mon(i)=i
c
read(5,1000) nmo
if(nmo) 300,200,100
100 read(5,1000) (mon(i),i=1,nmo)
c
ok=.true.
ialt=mon(1)
do 220 ip=2,nmo
if(mon(ip).gt.ialt) go to 210
ok=.false.
write(6,2222) ip,mon(ip),ialt
210 ialt=mon(ip)
220 continue
if (ok) go to 250
stop
c
200 read(5,2000) thr
write(6,6002) thr
ii=0
do 20 i=1,norb
if(eig(i).lt.thr) go to 20
ii=ii+1
mon(ii)=i
20 continue
nmo=ii
c
250 ij=0
do 30 i=1,nmo
eig(i)=eig(mon(i))
ist=(mon(i)-1)*ncont+1
ie=ist+ncont-1
do 40 k=ist,ie
ij=ij+1
40 y(ij)=y(k)
30 continue
norb=nmo
c
300 write(6,6001) norb,(mon(i),i=1,norb)
nnorb=norb*(norb+1)/2
call local(nt,norb,ncont,op,nnorb,buff,lbuff,y,help,d,xlv,repv)
return
c
1000 format(5x,5i5)
2000 format(5x,f10.4)
2222 format(' ====> danger : ordering of mos illegal ',i5,5x,2i5)
6000 format(//' boys localization '//)
6001 format(1x,i5,' occupied mo s selected :',5i5/(31x,5i5))
6002 format(6x,' threshold for selection of mo s :',f10.4/)
end
c
c
subroutine local(nt,norb,ncont,op,nnorb,buff,lbuff,y,help,d,xlv,
1 repv)
implicit real*8(a-h,o-z)
integer opn(3)
logical ok
parameter (mloc=250)
dimension y(ncont,norb),help(ncont,norb,nt),buff(lbuff),
& op(nnorb,nt),d(norb,norb),xlv(ncont,norb),repv(2)
common/holl/blabel(19),alabel(19),fmt(4),jl,lomao,iopen,nsym
common/supp/nsupp
common/eig/eig(mloc)
c
c help(i,j), xlv(i,j) and repv(i) are equivalenced in subroutine
c output
c
rewind 2
do 10 m=1,nt
do 10 i=1,norb
do 10 k=1,ncont
10 help(k,i,m)=0.0d0
do 20 j=1,nt
20 opn(j)=j
c
ix=lbuff
do 30 k=1,ncont
do 30 l=1,k
fac=1.0d0
if(k.eq.l) fac=0.5d0
do 50 m=1,nt
ix=ix+1
if(ix.le.lbuff)go to 40
ix=1
read(2) buff
40 continue
temp=-buff(ix)*fac
do 60 i=1,norb
help(k,i,m)=help(k,i,m)+temp*y(l,i)
60 help(l,i,m)=help(l,i,m)+temp*y(k,i)
50 continue
30 continue
c
do 70 m=1,nt
ij=0
do 80 i=1,norb
do 80 j=1,i
ij=ij+1
top=0.0d0
do 90 k=1,ncont
90 top=top+y(k,i)*help(k,j,m)
op(ij,m)=top
80 continue
70 continue
c
c
read(5,5000) nop
if(nop.eq.0) go to 100
read(5,5000) (opn(nn),nn=1,nop)
c
if(nop.eq.1) go to 130
ok=.true.
ialt=opn(1)
do 110 ip=2,nop
if(opn(ip).gt.ialt) go to 120
ok=.false.
write(6,6000) ip,opn(ip),ialt
120 ialt=opn(ip)
110 continue
if (ok) go to 130
stop
c
130 if(nsupp.lt.2) go to 140
write(6,6010)
do 150 i=1,nnorb
150 write(6,6020) (op(i,kk),kk=1,nt)
c
140 ii=0
do 160 n=1,nop
nopn=opn(n)
do 160 l=1,nnorb
160 op(l,n)=op(l,nopn)
nt=nop
c
100 write(6,6030) nt,(opn(nn),nn=1,nt)
thi=1.0d-13
call boys(norb,nt,nnorb,op,thi,d)
c
ij=0
do 300 i=1,norb
do 300 j=1,i
ij=ij+1
repv(ij)=0.d0
do 300 k=1,norb
300 repv(ij)=repv(ij)+d(k,i)*eig(k)*d(k,j)
write(6,6140)
call outpak(repv,norb,1,2)
c
do 170 i=1,norb
do 180 k=1,ncont
xlv(k,i)=y(k,1)*d(1,i)
if(norb.eq.1) go to 180
do 190 j=2,norb
190 xlv(k,i)=xlv(k,i)+y(k,j)*d(j,i)
180 continue
170 continue
nxlv=norb*ncont
c
if(nsupp.lt.2) go to 200
write(6,6040)
do 210 i=1,nnorb
210 write(6,6020) (op(i,kk),kk=1,nt)
c
200 write(6,6050)
write(6,6060) (opn(i),i=1,nt)
ii=0
do 220 i=1,norb
ii=ii+i
220 write(6,6070) i,(op(ii,kk),kk=1,nt)
c
write(6,6080)
do 230 i=1,norb
230 write(6,6090) i,(d(j,i),j=1,norb)
c
if(nsupp.lt.2) go to 240
write(6,6100)
do 250 i=1,norb
250 write(6,6110) i,(xlv(ll,i),ll=1,ncont)
c
240 write(lomao,6120) (alabel(i1),i1=1,19)
write(lomao,6120) (blabel(i1),i1=1,19)
write(lomao,6130) norb,ncont,nxlv
write(lomao,6120) (fmt(i1),i1=1,4)
write(lomao,fmt) ((xlv(ll,i),ll=1,ncont),i=1,norb)
c
return
5000 format(5x,5i5)
6000 format(' ====> danger : ordering of operators illegal ',i5,5x,2i5)
6010 format(/' operators in mo basis '/)
6020 format(4f20.14)
6030 format(/1x,i5,' operators selected :',10i5)
6040 format(/' operators in lmo basis '/)
6050 format(//' diagonalelements of the operators in lmo basis :'/)
6060 format(8x,'lmo',12x,3(i2,12x)/)
6070 format(5x,i5,5x,3f14.8)
6080 format(/' lmo s as linearcombination of mo s ')
6090 format(/' lmo nb.',i5/(1x,5f14.8))
6100 format(/' lmo vectors '/)
6110 format(' lmo nb.',i5/(1x,4f14.8))
6120 format(19a4)
6130 format(20i4)
6140 format(/' fockmatrix in lmo basis',/)
end
c
c
subroutine boys(n,no,nn1,op,thi,d)
c
c subroutine for boys localization r.ahlrichs 2/85
c to determine vectors |i>, i=1,n
c which maximize
c f = sum(i,j=1,n)sum(k=1,no) (-)**2
c equivalent to maximization of
c g = sum(i=1,n)sum(k=1,no) **2 + **2
c equivalent to minimization of
c h = sum(i**2
c stationarity condition
c sum(k) op(ij,k)*(op(ii,k)-op(jj,k)) = 0 all i.ne.j
c
implicit real*8(a-h,o-z)
dimension d(n,n),op(nn1,no)
c
c input
c n = dimension of lin. space
c no = # of operators in f or g
c op(ij,k) matrix representation of k'th operator
c symmetric and stored triangular,nn1=n(n+1)/2
c thi = rotation threshold (1.-6 to 1.-12 sngl or dbl prc)
c result
c d contains the solution vectors as columns
c op the transformed operators
c
a0=0.d0
a1=1.d0
a2=2.d0
a10=10.d0
aqu=0.25d0
accr=1.d-15
th=dmax1(thi,accr)
c
c set d to unit matrix
c
do 20 i=1,n
do 10 j=1,n
10 d(j,i)=a0
20 d(i,i)=a1
if(n.eq.1) return
c
c opn = operator norm needed for cut off threshold
c
opn=a0
do 22 k=1,no
do 21 i=1,nn1
21 opn=opn+op(i,k)**2
22 continue
if(opn.eq.a0) return
opn=sqrt(opn/dfloat(nn1*no))*accr
ths=aqu
it=0
do 200 isw=1,9999
c
c loop over sweeps
c
thsw=a0
ii=1
ij=2
do 110 i=2,n
ii=ii+i
jj=0
im1=i-1
ip1=i+1
li=ii-i
do 100 j=1,im1
c
c loop over i,j rotations
c maximize sum(k) **2 + **2
c like in jacobi
c
jj=jj+j
c
c get ax , b determining the tan of the rotation angle
c
ax=a0
b=a0
do 30 k=1,no
aux1=op(jj,k)-op(ii,k)
aux2=op(ij,k)
ax=ax+aux1*aux2
30 b=b+aqu*aux1**2-aux2**2
c
c rotation angle x0
c
if (abs(ax)+abs(b).lt.opn) go to 100
x0=aqu*datan2(ax,b)
thsw=dmax1(thsw,abs(x0))
if (abs(x0).lt.ths) go to 100
c
c rotation
c
it=it+1
c c=dcos(x0)
s=dsin(x0)
s2=s*s
c2=a1-s2
c=sqrt(c2)
do 40 l=1,n
aux1=d(l,j)
d(l,j)=c*d(l,j)+s*d(l,i)
40 d(l,i)=c*d(l,i)-s*aux1
jm1=j-1
c c2=c*c
c s2=s*s
cs=c*s
c2ms2=c2-s2
lj=jj-j
jp1=j+1
do 95 k=1,no
aux1=op(ii,k)
aux2=op(jj,k)
op(ii,k)=aux1*c2+aux2*s2-a2*op(ij,k)*cs
op(jj,k)=aux1*s2+aux2*c2+a2*op(ij,k)*cs
op(ij,k)=cs*(aux1-aux2)+op(ij,k)*c2ms2
if(jm1.le.0) go to 60
do 50 l=1,jm1
aux1=c*op(li+l,k)-s*op(lj+l,k)
op(lj+l,k)=s*op(li+l,k)+c*op(lj+l,k)
50 op(li+l,k)=aux1
60 if (im1.eq.j) go to 80
jl=jj+j
do 70 l=jp1,im1
aux1=c*op(li+l,k)-s*op(jl,k)
op(jl,k)=c*op(jl,k)+s*op(li+l,k)
op(li+l,k)=aux1
70 jl=jl+l
80 if (i.eq.n) go to 95
jl=ii+j
il=ii+i
do 90 l=ip1,n
aux1=c*op(jl,k)+s*op(il,k)
op(il,k)=c*op(il,k)-s*op(jl,k)
op(jl,k)=aux1
il=il+l
90 jl=jl+l
95 continue
100 ij=ij+1
110 ij=ij+1
c
c check convergence
c
if (thsw.le.th) go to 210
ths=dmin1(thsw**2,ths*aqu)
ths=dmax1(th,ths)
c
c write (6,199) isw,it,thsw,ths
c199 format (' isw,it,thsw,,ths',2i5,2d16.8)
c
200 continue
write (6,300) isw,thsw
return
210 write (6,310) it,isw,thsw
return
300 format (///' boys not converged in',i6,' sweeps thsw =',
*d16.8/)
310 format (/' boys converged after',i6,' pivots, in ',i6
*,' sweeps, thsw = ',d16.8/)
end
c
c
subroutine mmult(a,b,bs,n)
implicit real*8(a-h,o-z)
dimension a(n,1), b(n,1), bs(n,1)
do 6 i=1,n
do 6 l=1,n
bs(i,l) = 0.0d0
do 3 j=1,n
do 3 k=1,n
bs(i,l) = bs(i,l) + a(j,i)*b(j,k)*a(k,l)
3 continue
6 continue
do 9 i=1,n
do 9 j=1,n
9 b(i,j) = bs(i,j)
return
end
c
c
subroutine prnt(dint,nro,nt,norb,c,ilbl,a,title,cint,nomx)
c
c this subroutine transforms into the principal axis system and
c produces the final output
c
implicit real*8(a-h,o-z)
dimension dint(nro,*),c(3),a(13,3),title(15,10),cint(nomx,*)
real*8 ilbl(12)
dimension pr1(3,3), pr2(3,3), u(3,3)
dimension name(3)
data name/2hx*,2hy*,2hz*/
data audeb/2.541770d0/
common/ioind/isl1, isl2
common/prptyp/mm
common/ncnt/ilnmcm
common/supp/nsupp
c file shout short output, nshout=13
nshout=13
mmm=0
if(mm.eq.13) mmm=2
c the titels for the relat. correction are stored at title(15,j)
c not at title(13,j) !
write(6,108) (ilbl(i), i=1,12)
if(nsupp.lt.1) goto 50
write(6,104) (a(mm,i), i=1,3)
write(6,201)
write(6,300) (title(mm+mmm,i), i=1,nt)
write(6,301)
do 1 i=1,norb
write(6,106)i,i,(cint(i,k),k=1,nt)
1 continue
50 write(6,108) (ilbl(i), i=1,12)
write(6,200) (a(mm,i), i=1,3), ilnmcm, (c(j), j=1,3)
write(nshout,1200) (a(mm,i), i=1,3), ilnmcm, (c(j), j=1,3)
if(mm.eq.13) write(6,109)
write(6,201)
write(nshout,1201)
write(6,300) (title(mm+mmm,i), i=1,nt)
write(nshout,1300) (title(mm+mmm,i), i=1,nt)
write(6,301)
if(mm.ne.13) go to 6000
write(6,6101) (dint(1,l), l=1,nt)
write(6,6102) (dint(2,m), m=1,nt)
write(6,6103) (dint(3,n), n=1,nt)
go to 6001
6000 write(6,101) (dint(1,l), l=1,nt)
write(6,102) (dint(2,m), m=1,nt)
write(6,103) (dint(3,n), n=1,nt)
write(nshout,1101) (dint(1,l), l=1,nt)
write(nshout,1102) (dint(2,m), m=1,nt)
write(nshout,1103) (dint(3,n), n=1,nt)
c output of electrostatic potential on file 21
if(mm.eq.1) write(21,20000) c(1),c(2),c(3),dint(3,1)
20000 format(4f10.6)
6001 continue
if(mm.ne.4) goto 61
sum=0.d0
do 60 i=1,3
60 sum=sum+dint(3,i)**2
sum=sqrt(sum)*audeb
write(6,403) sum
write(nshout,1403) sum
c only the following properties are transformed into the principal
c axis system: field gradient, quadrupole moment, second moment,
c diamagnetic shielding
61 if(mm.eq.3) go to 12
if(mm.eq.5) go to 12
if(mm.eq.11) go to 12
if(mm.eq.12)go to 12
return
12 flag =abs(dint(3,4)) +abs(dint(3,5)) +abs(dint(3,6))
if(flag.lt.3.0d-05) return
if(mm.eq.3) ll=12
if(mm.eq.5) ll=13
if(mm.eq.11) ll=14
if(mm.eq.12) ll=12
if(nsupp.lt.1) goto 51
write(6,108) (ilbl(i), i=1,12)
write(6,104) (a(mm,i), i=1,3)
write(6,400)
write(6,300) (title(ll,i), i=1,nt)
write(6,1400)
write(6,1300) (title(ll,i), i=1,nt)
write(6,301)
51 pr1(1,1) = dint(3,1)
pr1(1,2) = dint(3,4)
pr1(1,3) = dint(3,5)
pr1(2,2) = dint(3,2)
pr1(2,3) = dint(3,6)
pr1(3,3) = dint(3,3)
call hdiag(pr1,3,0,u,nr)
c transform electronic, total, and nuclear parts.
do 14 i=1,3
pr2(1,1)=dint(i,1)
pr2(1,2)=dint(i,4)
pr2(1,3)=dint(i,5)
pr2(2,2)=dint(i,2)
pr2(2,3)=dint(i,6)
pr2(3,3)=dint(i,3)
do 18 ii=1,3
do 18 ij=ii,3
18 pr2(ij,ii)=pr2(ii,ij)
call mmult(u,pr2,pr1,3)
dint(i,1)=pr2(1,1)
dint(i,4)=pr2(1,2)
dint(i,5)=pr2(1,3)
dint(i,2)=pr2(2,2)
dint(i,6)=pr2(2,3)
dint(i,3)=pr2(3,3)
14 continue
c transform mo integrals.
do 22 i=1,norb
pr2(1,1)=cint(i,1)
pr2(1,2)=cint(i,4)
pr2(1,3)=cint(i,5)
pr2(2,2)=cint(i,2)
pr2(2,3)=cint(i,6)
pr2(3,3)=cint(i,3)
do 15 ii=1,3
do 15 ij=ii,3
15 pr2(ij,ii) = pr2(ii,ij)
call mmult(u,pr2,pr1,3)
cint(i,1)=pr2(1,1)
cint(i,4)=pr2(1,2)
cint(i,5)=pr2(1,3)
cint(i,2)=pr2(2,2)
cint(i,6)=pr2(2,3)
cint(i,3)=pr2(3,3)
if(nsupp.lt.1) goto 22
write(6,106)i,i,(cint(i,k),k=1,nt)
22 continue
write(6,108) (ilbl(i), i=1,12)
write(6,200) (a(mm,i), i=1,3), ilnmcm, (c(k), k=1,3)
write(6,400)
write(6,304) (title(ll,i), i=1,nt)
write(6,101) (dint(1,l), l=1,6)
write(6,102) (dint(2,l), l=1,6)
write(6,103) (dint(3,l), l=1,6)
37 write(6,303)
write(6,401)
do 24 i=1,3
24 write(6,202) name(i), (u(j,i), j=1,3)
return
200 format( //,1x, 3a6,/,1x,38hcalculated with reference to the poin
1t,5x,a6,/,1x,11hcoordinates,/, 6x,3hx =,f12.6,5x,3hy =,f12.6,5x,
23hz =,f12.6)
1200 format(1x, 3a6,/,1x,38hcalculated with reference to the point,
15x,a6,/,1x,11hcoordinates,/, 6x,3hx =,f12.6,5x,3hy =,f12.6,5x,
23hz =,f12.6)
201 format(/,1x,42hin atomic units and for global coordinates)
1201 format(1x,42hin atomic units and for global coordinates)
202 format(1x,a2,1x,3d15.6)
300 format(//,10x,7(9x,a6),/,10x,3(9x,a6))
1300 format(10x,7(9x,a6),/,10x,3(9x,a6))
301 format(/)
303 format(///)
304 format(//,12x,7(9x,a6),/,12x,3(9x,a))
400 format(/,1x,49hin atomic units and for the principle axis system)
1400 format(1x,49hin atomic units and for the principle axis system)
401 format(1x,67hthe new coordinate system, (x*,y*,z*), is related to
1the old one by,//,16x,1hx,14x,1hy,14x,1hz,//)
403 format(1x,'norm ',8x,d15.7,' debeye')
1403 format(1x,'norm ',8x,d15.7,' debeye')
101 format(/,1x,7hnuclear,5x,7(1x,d15.7),/,13x,3(1x,d15.7))
102 format(1x,10helectronic,2x,7(1x,d15.7),/,13x,3(1x,d15.7))
103 format(/,1x,5htotal,7x,7(1x,d15.7),/,13x,3(1x,d15.7))
1101 format(1x,7hnuclear,5x,7(1x,d15.7),/,13x,3(1x,d15.7))
1102 format(1x,10helectronic,2x,7(1x,d15.7),/,13x,3(1x,d15.7))
1103 format(1x,5htotal,7x,7(1x,d15.7),/,13x,3(1x,d15.7))
104 format( //,1x,23hintegrals over mo s for,5x,3a6)
106 format(1x,2i5,7(1x,d15.7),/,11x,3(1x,d15.7))
108 format(1h0,12a6)
109 format(/,1x,'the sum of the nuclear part means the darwin-term.',
&' the relativisticly corrected '/' kinetic energy is printed as ',
&'the total sum.')
6101 format(/,1x,7hdarwin ,5x,3(1x,f25.6))
6102 format(1x,10helectronic,2x,3(1x,f25.6))
6103 format(/,1x,5htotal,7x,3(1x,f25.6))
end
c
c
subroutine hdiag(h,n,iegen,u,nr)
c diagonalization of a real symmetric matrix by the jacobi method
c where h is the array to be diagonalized.
c n is the order of the matrix, h.
c returns eigval in x
c iegen must be set unequal to zero if only eigenvalues are
c to be computed.
c iegen must be set equal to zero if eigenvalues and eigenvectors
c are to be computed.
c u is the unitary matrix used for formation of the eigenvectors.
c nr is the number of rotations.
c the subroutine operates only on the elements of h that are to the
c right of the main diagonal.
implicit real*8(a-h,o-z)
dimension h(3,3), u(3,3), x(3), iq(3)
9 if (iegen) 15,10,15
10 do 14 i=1,n
do 14 j=i,n
if(i-j)12,11,12
11 u(i,j)=1.0d0
go to 14
12 u(i,j)=0.d0
u(j,i) = 0.d0
14 continue
15 nr = 0
if (n-1) 2001,2001,17
c scan for largest off diagonal element in each row
c x(i) contains largest element in ith row
c iq(i) holds second subscript defining position of element
17 nmi1=n-1
hdtest = 0.0d0
do 30 i=1,nmi1
x(i) = 0.d0
ipl1=i+1
do 30 j=ipl1,n
hdtest = hdtest + h(i,j)**2
if (x(i).gt.abs(h(i,j))) go to 30
20 x(i) =abs(h(i,j))
iq(i)=j
30 continue
hdtest = 2.0d0*hdtest
c set indicator for shut-off.rap=2**-27,nr=no. of rotations
rap=1.d-12
do 35 i=1,n
35 hdtest = hdtest + h(i,i)**2
hdtest =rap*(sqrt(hdtest/dfloat(n)) + 1.0d0)
c rap*(rms eigval + 1)
c find maximum of x(i) s for pivot element and
c test for end of problem
40 do 70 i=1,nmi1
if (i-1) 60,60,45
45 if ( xmax- x(i)) 60,70,70
60 xmax=x(i)
ipiv=i
jpiv=iq(i)
70 continue
c return if max.h(i,j)less than(2**-27)absf(h(k,k)-min)
if (hdtest- xmax) 148,1000,1000
148 nr = nr+1
c compute tangent, sine and cosine,h(i,i),h(j,j)
150 hhdifo=0.5d0*(h(ipiv,ipiv)-h(jpiv,jpiv))
hhdifn=dsign(1.0d0,hhdifo)*sqrt(hhdifo**2+h(ipiv,jpiv)**2)
cosine=sqrt(0.5d0*(hhdifo+hhdifn)/hhdifn)
sine=h(ipiv,jpiv)/hhdifn*0.5d0/cosine
hhsum=0.5d0*(h(ipiv,ipiv)+h(jpiv,jpiv))
h(ipiv,ipiv)=hhsum+hhdifn
h(jpiv,jpiv)=hhsum-hhdifn
h(ipiv,jpiv)=0.0d0
c inspect the iqs between i+1 and n-1 to determine
c whether a new maximum value should be computed since
c the present maximum is in the i or j row.
do 350 i=1,nmi1
if(i-ipiv)210,350,200
200 if(i-jpiv)210,350,210
210 if(iq(i)-ipiv)230,240,230
230 if(iq(i)-jpiv)350,240,350
240 htempi = h(i,ipiv)
htempj = h(i,jpiv)
h(i,ipiv) = 0.0d0
h(i,jpiv) = 0.0d0
ipl1=i+1
x(i) =0.d0
c search in depleted row for new maximum
do 320 j=ipl1,n
if (x(i).ge.abs(h(i,j))) go to 320
300 x(i) =abs(h(i,j))
iq(i)=j
320 continue
h(i,ipiv)=htempi
h(i,jpiv)=htempj
350 continue
x(jpiv) =0.d0
x(ipiv) =0.d0
c change the other elements of h
do 530 i=1,n
if(i-ipiv)370,530,420
370 htemp = h(i,ipiv)
h(i,ipiv) = cosine*htemp + sine*h(i,jpiv)
if (x(i).ge.abs(h(i,ipiv))) go to 390
x(i) =abs(h(i,ipiv))
iq(i) = ipiv
390 h(i,jpiv) = -sine*htemp + cosine*h(i,jpiv)
if (x(i).ge.abs(h(i,jpiv))) go to 530
400 x(i) =abs(h(i,jpiv))
iq(i) = jpiv
go to 530
420 if(i-jpiv)430,530,480
430 htemp = h(ipiv,i)
h(ipiv,i) = cosine*htemp + sine*h(i,jpiv)
if (x(ipiv).ge.abs(h(ipiv,i))) go to 450
440 x(ipiv) =abs(h(ipiv,i))
iq(ipiv) = i
450 h(i,jpiv) = -sine*htemp + cosine*h(i,jpiv)
if (x(i)-abs(h(i,jpiv))) 400,530,530
480 htemp = h(ipiv,i)
h(ipiv,i) = cosine*htemp + sine*h(jpiv,i)
if (x(ipiv).ge.abs(h(ipiv,i))) go to 500
x(ipiv) =abs(h(ipiv,i))
iq(ipiv) = i
500 h(jpiv,i) = -sine*htemp + cosine*h(jpiv,i)
if (x(jpiv).ge.abs(h(jpiv,i))) go to 530
x(jpiv) =abs(h(jpiv,i))
iq(jpiv) = i
530 continue
c test for computation of eigenvectors
if(iegen)40,540,40
540 do 550 i=1,n
htemp=u(i,ipiv)
u(i,ipiv)=cosine*htemp+sine*u(i,jpiv)
550 u(i,jpiv)=-sine*htemp+cosine*u(i,jpiv)
go to 40
1000 continue
call schort(u,n)
2000 return
2001 x(1) = h(1,1)
go to 2000
end
c
c
subroutine schort(u,n)
implicit real*8(a-h,o-z)
dimension u(3,3)
do 605 i=1,n
if (i.eq.1) go to 601
im1 = i-1
do 603 j=1,im1
term = 0.0d0
do 602 k=1,n
602 term = term + u(k,i)*u(k,j)
do 603 k=1,n
603 u(k,i) = u(k,i) - term*u(k,j)
601 term = 0.0d0
do 604 k=1,n
604 term = term + u(k,i)**2
term = 1.0d0/sqrt(term)
do 605 k=1,n
605 u(k,i) = u(k,i)*term
return
end
subroutine inpsym(mcu,msu,mru,mctu,mcsu,icomx,mgcsu)
c
c this subroutine reads the data from the karlsruhe integral input
c program (file ft24)
c
implicit real*8(a-h,o-z)
parameter(laords=18,lconsu=60,lgcsu=18,lru=20,lcsu=24,
& lctu=30,lsfu=200,lgu=9,lsfru=250,lnsfu=6000,
& lpru=18000,lsu=50,lstu=8,lconu=12,
& lcu=8,lccu=182)
common/supp/nsupp
common /ntgr/ kaords, mconsu, mstu, msfu, mgu, msfru, mnsfu, mpru,
1mcxu,ngcs,mdum(45),mccu,mblu,ns,ng,nsf,nst,ncons
common/bl/nf(lsu),nc(lsu),ncon(lconsu),lmnp1(lconsu),
1 ntl(lsfu),ntu(lsfu),nnt(lsfu),mcons(lsfu),ica(lcu,lsu,lgu),
2 eta(lsu,lconsu),zet(lconu,lconsu),x(lcu,lsu),yy(lcu,lsu),
3 z(lcu,lsu),nir(laords),nso(lstu),nd(lstu),nblpr(lstu),
4 la(lru,laords),nct(lsfu),maords(lgcsu),mgcs(lsfu),
5 mtype(lsu),c(lctu,lcsu,lgcsu),chg(lsu),ityp(lstu),iic(lctu,lcsu)
dimension blabel(19)
dimension ipq(256),lfmt(2)
data a0,a1/0.0d0,1.0d0/
itape=24
c file aoinp input for ao basis
c itape=24
open(unit=itape,file='argosin',status='old',
1access='sequential',form='formatted')
ntape=0
inp=itape
inp2=31
c file geomfl
c inp2=31
** open(unit=inp2,file='geomfl',status='unknown',
c** 1access='sequential',form='formatted')
c** rewind inp2
inpn=25
c file inpn is a copy of aoinp where the general
c contractions are resolved into segmented ones
c** open(unit=inpn,file='aoinpn',status='unknown',
c** 1access='sequential',form='formatted')
call inpnew(mcu,msu,mru,mctu,mcsu,icomx,mgcsu,inp,inp2,inpn)
itape=inpn
inp=itape
rewind itape
ipq(1)=0
do 1000 i=1,255
1000 ipq(i+1)=ipq(i)+i
read(itape,890)blabel
c** read(itape,8900) (lfmt(i),i=1,2)
8900 format(19a4)
7900 format(1x,19a4)
read(itape,*)ngen,ns,naords,ncons,ngcs,itol,icut,idummy,idummy,
c & icp, nkoord
1 itgeom
c** if(itgeom.gt.0) read(inp2,999) niter
c** if(itgeom.gt.0) inp=inp2
if(ns.le.msu) goto 2
write(6,970) ns
stop
2 if(naords.le.kaords) goto 4
write(6,971) naords
stop
4 if(ncons.le.mconsu) goto 6
write(6,972) ncons
stop
6 if(ngcs.le.mgcsu) goto 8
write(6,973) ngcs
stop
8 if(nsupp.eq.2) write (6,790) blabel
c if (nkoord .eq. 1) write(6,8770)
c8770 format(/'atomic coordinates were read from file 28'/)
c** if(nsupp.eq.2) write (6,7900) (lfmt(i),i=1,2)
if(nsupp.eq.2) write (6,800) ngen, ns, naords, ncons, ngcs, itol,
1 icut, idummy, nsupp, itgeom
read(itape,901)nst,(nd(ist),ityp(ist),ist=1,nst)
if(nsupp.eq.2) write (6,801) nst, (nd(ist), ityp(ist), ist=1,nst)
if(nst.le.mstu) goto 9
write(6,974) nst
stop
9 read(itape,*) idmx
if(idmx.eq.0) goto 11
do 1346 ixj=1,idmx
1346 read(itape,900)
11 do 10 ist=1,nst
10 nso(ist)=0
do 20 iaords=1,naords
read(itape,*)iru,(la(ir,iaords),ir=1,iru)
if(iru.le.mru) goto 20
write(6,975) iru
stop
20 nir(iaords)=iru
do 30 igcs=1,ngcs
read(itape,*)icsu,ictu,maords(igcs)
if(nsupp.eq.2) write (6,800) icsu, ictu, maords(igcs)
if(icsu.le.mcsu) goto 26
write(6,976) icsu
stop
26 if(ictu.le.mctu) goto 28
write(6,977) ictu
stop
28 do 30 ics=1,icsu
read(itape,*)(iic(ict,ics),ict=1,ictu)
if(nsupp.eq.2) write (6,900) (iic(ict,ics), ict=1,ictu)
do 30 ict=1,ictu
c1=dfloat(iic(ict,ics))
c(ict,ics,igcs)=c1
ccc=abs(c1)
30 if(ccc.ne.a0.and.ccc.ne.a1)c(ict,ics,igcs)=dsign(sqrt(ccc),c1)
c read in exponents and contraction coefficients
do 40 icons=1,ncons
read (itape,'(i4,i3)') iconu,lmnp1(icons)
read(itape,*)(zet(icon,icons), eta(icon,icons), icon=1,iconu)
if(iconu.le.icomx) goto 55
write(6,2000) icons,icomx
2000 format(1x,'too many primitive functions in contraction nr. ',i5,
1 ' icomx = ',i5)
stop
55 continue
do 39 icon=1,iconu
39 if(eta(icon,icons).eq.0.d0.and.iconu.eq.1)
1eta(icon,icons)=1.d0
if(nsupp.eq.2) write (6,803) iconu,lmnp1(icons),(zet(icon,icons),
1 eta(icon,icons), icon=1,iconu)
40 ncon(icons)=iconu
ngenp1=ngen+1
ng=ngenp1
c read in atomic labels, charges, coordinates, and basis sets
isf=0
isfr=0
do 75 is=1,ns
read(inp,904)mtype(is),nf(is),nc(is),chg(is)
if(nsupp.eq.2) write (6,804) mtype(is), nf(is), nc(is), chg(is)
icu=nc(is)
if(icu.le.mcu) goto 46
write(6,979) icu
stop
46 read(inp,905)(x(ic,is),yy(ic,is),z(ic,is),ic=1,icu)
c if (nkoord .eq. 1)
c & read(28,*)(x(ic,is),yy(ic,is),z(ic,is),ic=1,icu)
if(nsupp.eq.2)write(6,805)(x(ic,is),yy(ic,is),z(ic,is),ic=1,icu)
if(icu.eq.1) go to 60
do 50 ig=2,ng
read(itape,*)(ica(ic,is,ig),ic=1,icu)
50 if(nsupp.eq.2) write (6,800) (ica(ic,is,ig), ic=1,icu)
60 ifu=nf(is)
if(ifu.eq.0) go to 75
do 70 if=1,ifu
isf=isf+1
read(itape,*)mcons(isf),igcs
if(nsupp.eq.2) write (6,800) mcons(isf), igcs
iaords=maords(igcs)
iru= nir(iaords)
mgcs(isf)=igcs
ilmnp1=lmnp1(mcons(isf))
nnt(isf)=ipq(ilmnp1+1)
ntu(isf)=(nnt(isf)*(ilmnp1+2))/3
ntl(isf)=ntu(isf)-nnt(isf)+1
nct(isf)=icu*nnt(isf)
do 70 ir=1,iru
isfr=isfr+1
lai=la(ir,iaords)
nso(lai)=nso(lai)+1
70 continue
75 continue
790 format(1x,19a4)
970 format(14h msu too small,i3)
971 format(17h kaords too small,i3)
972 format(17h mconsu too small,i4)
973 format(16h mgcsu too small,i4)
974 format(15h mstu too small,i3)
975 format(14h mru too small,i3)
976 format(15h mcsu too small,i3)
977 format(15h mctu too small,i3)
978 format(16h mconu too small,i3)
979 format(14h mcu too small,i3)
800 format(1x,26i3)
801 format(i4,12(i3,a3))
802 format(1x,26f3.0)
803 format(i4,i3/(1x,2g14.8))
804 format(1x,a5,2i3,f3.0)
805 format(1x,3f14.8)
890 format(19a4)
900 format(26i3)
901 format(i3,12(i3,a3))
902 format(26f3.0)
903 format(2i3/(2g14.8))
904 format(a3,2i3,f3.0)
905 format(3f14.8)
949 format(6(/), /////68h0primitive a
1o integrals neglected if exponential factor below 10**(-,i2,1h)/63
2h contracted ao and so integrals neglected if value below 10**(-,i
32,1h)/43h symmetry orbital integrals written on unit,i3)
951 format(11h degeneracy,16x,12(i4,4x))
952 format(6h label,21x,12(2x,a4,2x))
953 format(1h1,12x,a4,6h atoms//15h0nuclear charge,f7.2//7h0center,12x
1,1hx,15x,1hy,15x,1hz/(i4,7x,3f16.8))
954 format(/9h0operator,6x,19hcenter interchanges/2x,6h1(id.),6x,24i3)
955 format(i3,6h(gen.),5x,24i3)
956 format(i3,11x,24i3)
958 format(//10x,a2,9h orbitals/18h0orbital exponents,7x,7(1pg15.7))
959 format(25h contraction coefficients,7(1pg15.7))
960 format(10h0sym. orb.,12x,15hcenter, ao type/14x,(18(i3,1h,,a2)))
961 format(i3,a4,i1,6x,(18f6.2))
999 format(20i4)
return
end
subroutine inpnew(mcu, msu, mru, mctu, mcsu, icomx, mgcsu,
1 inp,inp2,inpn)
c
c this subroutine reads the data from the karlsruhe integral input
c program (file ft24) and makes a segmented contraction copy on
c file inpn=25
c
c irun=0 first scan through ao-input-file
c irun=1 create new ao-input-file (inpn)
c
implicit real*8(a-h,o-z)
parameter(laords=18,lconsu=60,lgcsu=18,lru=20,lcsu=24,
& lctu=30,lsfu=200,lgu=9,lsfru=250,lnsfu=6000,
& lpru=18000,lsu=50,lstu=8,lconu=12,
& lcu=8,lccu=182,mrcru=8,ione=1,izero=0)
common/supp/nsupp
common /ntgr/ kaords, mconsu, mstu, msfu, mgu, msfru, mnsfu, mpru,
1mcxu,ngcs,mdum(45),mccu,mblu,ns,ng,nsf,nst,ncons
common/bl/nf(lsu),nc(lsu),ncon(lconsu),lmnp1(lconsu),
1 ntl(lsfu),ntu(lsfu),nnt(lsfu),mcons(lsfu),ica(lcu,lsu,lgu),
2 etax(lsu,lconsu),zet(lconu,lconsu),x(lcu,lsu),yy(lcu,lsu),
3 z(lcu,lsu),nir(laords),nso(lstu),nd(lstu),nblpr(lstu),
4 la(lru,laords),nct(lsfu),maords(lgcsu),mgcs(lsfu),
5 mtype(lsu),c(lctu,lcsu,lgcsu),chg(lsu),ityp(lstu),iic(lctu,lcsu)
dimension blabel(19), nrcr(lconsu), icnoff(lconsu)
dimension ipq(256),lfmt(2),eta(mrcru,lsu,lconsu)
dimension nfn(lsu)
data a0,a1/0.0d0,1.0d0/
irun=0
ipq(1)=0
do 1000 i=1,255
1000 ipq(i+1)=ipq(i)+i
itape=inp
1100 continue
read(itape,890)blabel
c** read(itape,8900) (lfmt(i),i=1,2)
8900 format(19a4)
7900 format(1x,19a4)
read(itape,*)ngen,ns,naords,ncons,ngcs,itol,icut,idummy,idummy,
c & icp, nkoord
1 itgeom
c** if(itgeom.gt.0) read(inp2,999) niter
c** if(itgeom.gt.0) inp=inp2
if(ns.le.msu) goto 2
write(6,970) ns
stop
2 if(naords.le.kaords) goto 4
write(6,971) naords
stop
4 if(ncons.le.mconsu) goto 6
write(6,972) ncons
stop
6 if(ngcs.le.mgcsu) goto 8
write(6,973) ngcs
stop
8 if(irun.gt.0)write (inpn,790) blabel
c if (nkoord .eq. 1) write(inpn,8770)
c8770 format(/'atomic coordinates were read from file 28'/)
read(itape,901)nst,(nd(ist),ityp(ist),ist=1,nst)
if(irun.gt.0)then
c** write (inpn,7900) (lfmt(i),i=1,2)
write (inpn,900) ngen, ns, naords, nconsn, ngcs, itol,
1 icut, idummy, idummy, izero
write (inpn,901) nst, (nd(ist), ityp(ist), ist=1,nst)
endif
if(nst.le.mstu) goto 9
write(6,974) nst
stop
9 read(itape,*) idmx
if(irun.gt.0)write(inpn,900) idmx
if(idmx.eq.0) goto 11
do 1346 ixj=1,idmx
if(irun.gt.0) write(inpn,900)
1346 read(itape,900)
11 do 10 ist=1,nst
10 nso(ist)=0
do 20 iaords=1,naords
read(itape,*)iru,(la(ir,iaords),ir=1,iru)
if(irun.gt.0) write(inpn,900)iru,(la(ir,iaords),ir=1,iru)
if(iru.le.mru) goto 20
write(6,975) iru
stop
20 nir(iaords)=iru
do 30 igcs=1,ngcs
read(itape,*)icsu,ictu,maords(igcs)
if(irun.gt.0) write (inpn,900) icsu, ictu, maords(igcs)
if(icsu.le.mcsu) goto 26
write(6,976) icsu
stop
26 if(ictu.le.mctu) goto 28
write(6,977) ictu
stop
28 do 30 ics=1,icsu
read(itape,*)(iic(ict,ics),ict=1,ictu)
if(irun.gt.0) write (inpn,900) (iic(ict,ics), ict=1,ictu)
do 30 ict=1,ictu
c1=dfloat(iic(ict,ics))
c(ict,ics,igcs)=c1
ccc=abs(c1)
30 if(ccc.ne.a0.and.ccc.ne.a1)c(ict,ics,igcs)=dsign(sqrt(ccc),c1)
c read in exponents and contraction coefficients
nconsn=0
do 41 icons=1,ncons
c read (itape,*) iconu, lmnp1(icons), ircru
read (itape,*) iconu, lmnp1(icons), ircru
903 format(3i3)
if(ircru.eq.0) ircru=1
c write (6,900) iconu, lmnp1(icons), ircru
if(ircru.gt.mrcru)then
write (6,983) ircru
stop 'program error'
endif
if(iconu.gt.icomx)then
write (6,982) iconu
stop 'program error'
endif
nrcr(icons)=ircru
ncon(icons)=iconu
c
do 40 icon=1,iconu
read(itape,*)zet(icon,icons),(eta(ircr,icon,icons),ircr=1,ircru)
c write (6,84) zet(icon,icons), (eta(ircr,icon,icons),
c 1 ircr=1,ircru)
40 continue
icnoff(icons)=nconsn
do 100 ircr=1,ircru
nconsn=nconsn+1
if(irun.gt.0) write(inpn,900)iconu,lmnp1(icons),ione
do 39 icon=1,iconu
if(eta(ircr,icon,icons).eq.0.d0.and.ircru.eq.1.and.iconu.eq.1)
1eta(ircr,icon,icons)=1.d0
c write(6,2000)ircr,icon,icons,eta(ircr,icon,icons)
if(irun.gt.0) write(inpn,806)zet(icon,icons),eta(ircr,icon,icons)
39 continue
100 continue
nrcr(icons)=ircru
41 continue
ngenp1=ngen+1
ng=ngenp1
c read in atomic labels, charges, coordinates, and basis sets
isf=0
isfr=0
do 75 is=1,ns
if(irun.eq.0) nfn(is)=0
read(inp,904)mtype(is),nf(is),nc(is),chg(is)
if(irun.gt.0) write (inpn,904) mtype(is), nfn(is), nc(is), chg(is)
icu=nc(is)
if(icu.le.mcu) goto 46
write(6,979) icu
stop
46 read(inp,905)(x(ic,is),yy(ic,is),z(ic,is),ic=1,icu)
c if (nkoord .eq. 1)
c & read(28,905)(x(ic,is),yy(ic,is),z(ic,is),ic=1,icu)
if(irun.gt.0)write(inpn,905)(x(ic,is),yy(ic,is),z(ic,is),ic=1,icu)
if(icu.eq.1) go to 60
do 50 ig=2,ng
read(itape,*)(ica(ic,is,ig),ic=1,icu)
if(irun.gt.0) write (inpn,900) (ica(ic,is,ig), ic=1,icu)
50 continue
60 ifu=nf(is)
if(ifu.eq.0) go to 75
do 70 if=1,ifu
isf=isf+1
read(itape,*)mcons(isf),igcs
c write(6,900)mcons(isf),igcs
ircru=nrcr(mcons(isf))
irst=icnoff(mcons(isf))
do 200 ircr=1,ircru
if(irun.gt.0) write(inpn,900)irst+ircr,igcs
if(irun.eq.0) then
nfn(is)=nfn(is)+1
endif
200 continue
70 continue
75 continue
if(irun.eq.0) then
irun=1
rewind inp
rewind itape
goto 1100
endif
84 format(1x,5g14.8)
790 format(1x,19a4)
970 format(14h msu too small,i3)
971 format(17h kaords too small,i3)
972 format(17h mconsu too small,i4)
973 format(16h mgcsu too small,i4)
974 format(15h mstu too small,i3)
975 format(14h mru too small,i3)
976 format(15h mcsu too small,i3)
977 format(15h mctu too small,i3)
979 format(14h mcu too small,i3)
982 format(24h symnew: icomx too small,i3)
983 format(24h symnew: mrcru too small,i3)
806 format(2g14.8)
890 format(19a4)
900 format(26i3)
901 format(i3,12(i3,a3))
904 format(a3,2i3,f3.0)
905 format(3f14.8)
949 format(6(/), /////68h0primitive a
1o integrals neglected if exponential factor below 10**(-,i2,1h)/63
2h contracted ao and so integrals neglected if value below 10**(-,i
32,1h)/43h symmetry orbital integrals written on unit,i3)
951 format(11h degeneracy,16x,12(i4,4x))
952 format(6h label,21x,12(2x,a4,2x))
953 format(1h1,12x,a4,6h atoms//15h0nuclear charge,f7.2//7h0center,12x
1,1hx,15x,1hy,15x,1hz/(i4,7x,3f16.8))
954 format(/9h0operator,6x,19hcenter interchanges/2x,6h1(id.),6x,24i3)
955 format(i3,6h(gen.),5x,24i3)
958 format(//10x,a2,9h orbitals/18h0orbital exponents,7x,7(1pg15.7))
959 format(25h contraction coefficients,7(1pg15.7))
960 format(10h0sym. orb.,12x,15hcenter, ao type/14x,(18(i3,1h,,a2)))
999 format(20i4)
c2000 format(3i4,f10.4)
return
end
c
c
subroutine getran(nbfao,frocc,norb,itrnao,idxxt)
c
c this subroutine calculates the symmetry transformtion matrix p
c for the transformation from sao in ao basis
c
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
parameter(laords=18,lconsu=60,lgcsu=18,lru=20,lcsu=24,
& lctu=30,lsfu=200,lgu=9,lsfru=250,lnsfu=6000,
& lpru=18000,lsu=50,lstu=8,lconu=12,
& lcu=8,lccu=182)
common /ntgr/ kaords, mconsu, mstu, msfu, mgu, msfru, mnsfu, mpru,
1 mcxu, ngcs, mdum(45), mccu, mblu, ns, ng,nsf,nst
common/bl/nf(lsu),nc(lsu),ncon(lconsu),lmnp1(lconsu),
1 ntl(lsfu),ntu(lsfu),nnt(lsfu),mcons(lsfu),ica(lcu,lsu,lgu),
2 ccoef(lsu,lconsu),zet(lconu,lconsu),x(lcu,lsu),yy(lcu,lsu),
3 z(lcu,lsu),nir(laords),nso(lstu),nd(lstu),nblpr(lstu),
4 la(lru,laords),nct(lsfu),maords(lgcsu),mgcs(lsfu),
5 mtype(lsu),c(lctu,lcsu,lgcsu),chg(lsu),ityp(lstu)
common /big/ y(nomx*nomx),su(nomx*nomx),p(nomx,nomx)
dimension frocc(1)
dimension itrnao(1),nsot(14),idxxt(1)
isfxo=0
isfp=0
ibfao=0
root3=sqrt(3.0d0)
root15=sqrt(15.d0)
do 160 is=1,ns
icu=nc(is)
ifu=nf(is)
do 140 ic=1,icu
isfx=isfxo
isf=isfp
if(ifu.eq.0)go to 140
do 120 if=1,ifu
isf=isf+1
icons=mcons(isf)
jtype=lmnp1(icons)
nbu=(jtype*(jtype+1))/2
if(nbu*icu.ne.nct(isf))go to 920
isft=isfx+(ic-1)*nbu
isfx=isfx+nbu*icu
do 100 nb=1,nbu
ibfao=ibfao+1
isft=isft+1
itrnao(isft)=ibfao
idxxt(ibfao)=0
if(jtype.le.2) goto 100
if(jtype.eq.3.and.nb.le.3) idxxt(ibfao)=1
if(jtype.eq.4.and.nb.gt.3.and.nb.le.9) idxxt(ibfao)=1
if(jtype.eq.4.and.nb.le.3) idxxt(ibfao)=2
100 continue
120 continue
140 continue
isfxo=isfx
isfp=isfp+ifu
160 continue
nsotx=0
do 180 ist=1,nst
nsot(ist)=nsotx
nsotx=nsotx+nso(ist)
180 continue
nbfso=nsotx
if(nsotx.ne.nbfso)go to 920
do 200 i=1,nbfao
do 200 j=1,nbfso
p(i,j)=0.0d0
200 continue
isf=0
isfr=0
isftx=0
do 260 is=1,ns
ifu=nf(is)
if(ifu.eq.0)go to 260
do 255 if=1,ifu
isf=isf+1
igcs=mgcs(isf)
iaords=maords(igcs)
iru=nir(iaords)
ictu=nct(isf)
ics=0
do 250 ir=1,iru
isfr=isfr+1
isft=isftx
lai=la(ir,iaords)
nsot(lai)=nsot(lai)+1
ibfso=nsot(lai)
iau=nd(lai)
if(iau.ne.1)go to 920
do 250 ia=1,iau
ics=ics+1
do 248 ict=1,ictu
isft=isft+1
c1=c(ict,ics,igcs)
ibfao=itrnao(isft)
c
c integral routine (r.pitzer) and property package use different
c normalizations of d(xx),d(yy),d(zz),f(xxy),f(xxz),f(yyx),f(yyz),
c f(zzx),f(zzy) -factor=sqrt(3)- , and for f(xxx),f(yyy),f(zzz)
c -factor=sqrt(15)-
c
if(idxxt(ibfao).eq.1) c1=c1*root3
if(idxxt(ibfao).eq.2) c1=c1*root15
p(ibfao,ibfso)=c1
248 continue
250 continue
isftx=isftx+ictu
255 continue
260 continue
call scfinp(nbfao,frocc,norb)
return
920 print 925
925 format(' nct(isf) is not properly set')
stop
end
c
c
subroutine scfinp(nbfao,frocc,nnorb)
c
c this subroutine reads the data as written out by routine outgrd
c of the scf-program (file ft08)
c
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
parameter (mloc=250,lstu=8,lsfru=250)
common/eig/eig(mloc)
common/supp/nsupp
common /big/ y(nomx*nomx),su(nomx*nomx),p(nomx,nomx)
common/scfinf/cm(2,mloc),norbs(lstu),nc(lstu),nlamda(lstu),
1 no(lstu),ityp(lstu)
common /contrc/ chomo,ncont
dimension frocc(1)
common/holl/blabel(19),alabel(19),fmt(4),jl,lomao,iopen,nsym
data ir/ 8/,ncol/10/, ika/2hc(/, a0 /0.0d0/
c number of ireps
mstu=lstu
c lsfru as in integral program
c total number of functions , sum(norb) , lsfru=nomx
msfru=lsfru
c max number of functions/irep , max(norb)
mxbfpi=lsfru
mxcoef=nomx*nomx
c iopen = -1 : ci or mcscf case
c iopen = 0 : closed shell case
c iopen = 1 : open shell case
ipmax=0
icmax=0
idmax=0
if(nsym.le.mstu)go to 41
print 3300,mstu
stop
41 continue
do 106 l=1,nsym
read (ir,1001) ityp(l)
read (ir,6410) lll,norbs(l),nc(l),no(l)
nlamda(l)=lll
norb=norbs(l)
if(norb.eq.0) goto 107
ipmin = ipmax + 1
ipmax = ipmax + norb
if(ipmax.le.msfru)go to 58
write(6,2800) msfru
stop
58 read (ir,6430) (cm(1,kl), kl=ipmin,ipmax)
if(iopen.le.0) go to 52
read (ir,6430) (cm(2,kl), kl=ipmin,ipmax)
go to 56
52 do 54 kl=ipmin,ipmax
54 cm(2,kl)=a0
56 icl=norbs(l)
jcl=nlamda(l)
icmin=icmax+1
icmax = icmax + icl*jcl
if(icmax.le.mxcoef) goto 63
print 2700, mxcoef
stop
63 continue
237 icx = icmin - 1
do 224 ic=1,icl
icxi = icx + 1
icx = icx + jcl
224 read (ir,fmt) (su(jc), jc=icxi,icx)
66 continue
if(iopen.lt.0) goto 67
read(ir,fmt) (eig(ie),ie=ipmin,ipmax)
67 if(nsupp.eq.2) print 1100
if(nsupp.eq.2) print 2000, ityp(l)
do 105 mk = 1, icl, ncol
kin = mk + ncol - 1
if (kin .gt. icl) kin = icl
if(nsupp.eq.2) print 5200,(ika,i, i=mk,kin)
nlow = icmin + jcl*mk - jcl - 1
nhigh = icmin + kin *jcl - 1
do 510 i1 = 1, jcl
nlow = nlow + 1
if(nsupp.eq.2) print 3500, (su(ic), ic=nlow,nhigh,lll)
510 continue
klmin=ipmin+mk-1
klmax=ipmin+kin-1
if(nsupp.eq.2.and.iopen.gt.-1)print 2500,(cm(1,kl),kl=klmin,klmax)
if(nsupp.eq.2.and.iopen.eq.-1)print 2600,(cm(1,kl),kl=klmin,klmax)
if(nsupp.eq.2.and.iopen.gt.0) print 5000,(cm(2,kl),kl=klmin,klmax)
105 continue
goto 106
107 read(ir,6430) dummy
if(iopen.gt.0) read(ir,6430) dummy
read(ir,fmt) (dummy,ie=1,lll)
read(ir,fmt) dummy
106 continue
273 continue
do 109 i=1,ipmax
109 chomo=chomo-cm(1,i)-cm(2,i)
write(6,6700) chomo
print 6500, alabel, blabel
call comtrn(nsym,p,nbfao,nnorb,frocc)
if(ir.ne.5)rewind ir
return
c format statements
1000 format(19a4)
1001 format(a4)
1100 format(47h1symmetry, basis, and configuration information)
2000 format(/1h0,6x,6hirrep ,a4,19x,20horbital coefficients)
2500 format(30h0number of electrons occupying/
1 24h closed shell orbitals =,f6.1,9f11.1)
2600 format(30h0number of electrons occupying/
1 24h natural orbitals =,f8.5,9f11.5)
2700 format(38h0vector components number greater than,i5)
2800 format(1x,' more than ',i5,' mos (lmos), change dimensions in',
1 ' common eig and scfinf',/, 'for dimensions for localization',
2 ' see subroutine output')
3000 format(44h0number of orbitals in a given block exceeds, i4)
3300 format(40h0maximum value of lambda is greater than,i3)
3500 format(22x,10f11.6)
5000 format(30h0number of electrons occupying/
1 22h open shell orbitals =,f8.1,9f11.1)
5200 format(21x,10(6x,a2,i2,1h)))
6410 format(20i4)
6430 format(6f12.9)
6500 format(//,1x,19a4,/,19a4,//)
6700 format(/,' charge of molecule',f6.2)
end
c
c
subroutine comtrn(nsym,p,nbfao,norb,frocc)
c
c this subroutine transforms the eigenvectors from sao in ao basis
c and calculates occupation numbers
c only occupied mos are transformed
c dimension of y = occupied orbitals * total orbitals
c
implicit real*8(a-h,o-z)
parameter(nocmx=50,nbmx=720,nomx=250,lbuff=31375)
parameter (mloc=250,lstu=8)
common/scfinf/cm(2,mloc),norbs(lstu),nc(lstu),nlamda(lstu),
1 no(lstu),ityp(lstu)
common /big/ y(nomx*nomx),su(nomx*nomx),uv(nomx*nomx)
common/supp/nsupp
dimension p(nomx,1),frocc(1),idummy(100)
data idummy/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
1 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,
2 38,39,40,41,42,43,44,45,46,47,48,49,50,
3 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
5 0,0,0,0,0,0,0,0,0,0/
ipr=0
do 17 i=1,nsym
nn=norbs(i)
17 ipr=ipr+nn*nbfao
maxuv=nomx*nomx
if(ipr.le.maxuv) goto 200
write(6,1000) ipr,maxuv
1000 format(1x,' dimension in comtrn too small, ipr =',i7,' maxuv =',
1 i7)
stop
200 continue
ibfsox=0
max=0
iorb=0
ic=0
delt=1.0d-6
nst=1
if(nsupp.eq.3) write(6,2000)
do 100 lam=1,nsym
nnn=nlamda(lam)
nn=norbs(lam)
if(nn.eq.0) goto 100
do 90 ii=1,nn
iorb=iorb+1
min=max+1
max=max+nnn
do 80 ibfao=1,nbfao
ic=ic+1
ibfso=ibfsox
x=0.0d0
do 70 iq=min,max
ibfso=ibfso+1
x=x+p(ibfao,ibfso)*su(iq)
70 continue
y(ic)=x
80 continue
90 continue
if(nsupp.ne.3) goto 100
write(6,3000) ityp(lam)
call prtblk(y(nst),nbfao,nn,' ao ',' mo ',idummy)
nst=nst+nbfao*nn
100 ibfsox=ibfsox+nnn
c frocc = sum of closed and open shell occupation numbers
norb=iorb
do 140 i=1,norb
140 frocc(i)=cm(1,i)+cm(2,i)
c
2000 format(/,' eigenvectors in ao basis',/)
3000 format(/,' irrep ',a4)
return
end
c
c
subroutine erduw(a,b,na,epslon)
c taken mainly from version 4, aug., 1971, of jacscf, u. of wa.
c matrix diagonalization by the jacobi method.
c a = real symmetric matrix to be diagonalized. it is stored
c by columns with all sub-diagonal elements omitted, so a(i,j) is
c stored as a((j*(j-1))/2+i).
c b = matrix to be multiplied by the matrix of eigenvectors.
c na = dimension of the matrices.
c epslon is the convergence criterion for off-diagonal elements.
c modified nov 82 r.a.
c programm keeps track of non-diagonal norm and adjusts thresh
c dynamically. the eventually quadratic convergence of jacobi is
c exploited to reduce thresh faster at the end.
c
implicit real*8(a-h,o-z)
dimension a(1), b(1)
data a0, a1s2 /0.0d0, 0.5d0/
if(na.eq.1) return
loopc=64
sumnd=a0
sum=a0
ij=1
do 24 i=1,na
do 16 j=1,i
term=a(ij)*a(ij)
sum=sum+term
if(i.eq.j) go to 16
sumnd=sumnd+term
16 ij=ij+1
24 continue
thrshg=sqrt((sum+sumnd)/na)*epslon
small=sumnd*epslon*na*na
32 if (sumnd.lt.small) go to 35
thresh=sqrt(sumnd+sumnd)/na
go to 37
35 thresh=thresh*0.03d0
37 thresh=dmax1(thresh,thrshg)
n=0
ij=2
jj=1
do 112 j=2,na
jj=jj+j
jm1=j-1
ii=0
do 104 i=1,jm1
ii=ii+i
if(abs(a(ij)).lt.thresh) go to 104
n=n+1
sumnd=sumnd-a(ij)*a(ij)
sum=a1s2*(a(jj)+a(ii))
term=a1s2*(a(jj)-a(ii))
amax=dsign(sqrt(term*term+a(ij)*a(ij)),term)
c=sqrt((amax+term)/(amax+amax))
s=a(ij)/(c*(amax+amax))
a(ii)=sum-amax
a(jj)=sum+amax
a(ij)=a0
im1=i-1
if(im1) 40,56,40
40 ki=ii-i
kj=jj-j
do 48 k=1,im1
ki=ki+1
kj=kj+1
term=c*a(ki)-s*a(kj)
a(kj)=s*a(ki)+c*a(kj)
48 a(ki)=term
56 if(jm1.eq.i) go to 72
ip1=i+1
ik=ii+i
kj=ij
do 64 k=ip1,jm1
kj=kj+1
term=c*a(ik)-s*a(kj)
a(kj)=s*a(ik)+c*a(kj)
a(ik)=term
64 ik=ik+k
72 if(j.eq.na) go to 88
jp1=j+1
ik=jj+i
jk=jj+j
do 80 k=jp1,na
term=c*a(ik)-s*a(jk)
a(jk)=s*a(ik)+c*a(jk)
a(ik)=term
ik=ik+k
80 jk=jk+k
88 ki=im1*na
kj=jm1*na
do 96 k=1,na
ki=ki+1
kj=kj+1
term=c*b(ki)-s*b(kj)
b(kj)=s*b(ki)+c*b(kj)
96 b(ki)=term
104 ij=ij+1
112 ij=ij+1
loopc=loopc-1
if(loopc) 120,1024,120
120 if(thresh.le.thrshg.and.n.eq.0) return
go to 32
1024 write (6,2048)
stop
2048 format(12h error erduw)
end
c
c
subroutine outpak (matrix,nrow,nctl,isw)
c...........version = 09/05/73/03
c.......................................................................
c
c outpak prints a real*8 symmetric matrix stored in row-packed lower
c
c triangular form (see diagram below) in formatted form with numbered
c
c rows and columns. the input is as follows:
c
c matrix(*)...........packed matrix
c
c nrow................number of rows to be output
c
c nctl................carriage control flag: 1 for single space,
c 2 for double space,
c 3 for triple space.
c
c the matrix elements are arranged in storage as follows:
c
c
c 2
c 4 5
c 7 8 9
c 11 12 13 14
c 16 17 18 19 20
c 22 23 24 25 26 27
c
c and so on.
c
c outpak is set up to handle 8 columns/page with a 8f15.8 format
c
c for the columns. if a different number of columns is required, change
c
c formats 1000 and 2000, and initialize kcol with the new number of
c
c columns.
c
c author: nelson h.f. beebe, quantum theory project, university of
c florida, gainesville
c
c.......................................................................
real*8 matrix,column,columm
integer begin,asa,blank,ctl
dimension matrix(1),asa(3)
data kcol/7/, column/8h atom nr/, asa/4h , 4h0 , 4h- /,
& blank/4h /, zero/0.d+00/, columm/8h lmo nr/
ctl = blank
if ((nctl.le.3).and.(nctl.gt.0)) ctl = asa(nctl)
c
c last is the last column number in the row currently being printed
c
last = min0(nrow,kcol)
c
c begin is the first column number in the row currently being printed.
c
ncol=1
c.....begin non standard do loop.
begin=1
1050 ncol = 1
if(isw.eq.1) write (6,1000) (column,i,i = begin,last)
if(isw.eq.2) write (6,1000) (columm,i,i = begin,last)
do 40 k = begin,nrow
ktotal = (k*(k-1))/2 + begin - 1
do 10 i = 1,ncol
if (matrix(ktotal+i) .ne. zero) go to 20
10 continue
go to 30
20 iplk=ktotal+ncol
kstart=ktotal+1
if(isw.eq.1) write (6,2000) ctl,k,(matrix(ii),ii=kstart,iplk)
if(isw.eq.2) write (6,3000) ctl,k,(matrix(ii),ii=kstart,iplk)
30 if (k .lt. (begin+kcol-1)) ncol = ncol + 1
40 continue
last = min0(last+kcol,nrow)
begin=begin+ncol
if (begin.le.nrow) go to 1050
1000 format (/14x,6(3x,a8,i4),4x,a6,i4)
2000 format (a1,'atom nr',i4,2x,8f15.8)
3000 format (a1,' lmo nr',i4,2x,8f15.8)
return
end
c
c
subroutine prtblk(c,nbfn,nomx,lrow,lcol,mos)
c....................................................................
c subroutine prtblk prints orbital coefficients by symmetry blocks.
c it accepts as argumemts the coefficient matrix c, the number of
c functions in the symmetry block nbfn, and the number of orbitals
c that have been printed previoulsy nskip.
c.....................................................................
implicit real*8(a-h,o-z)
dimension c(nbfn,nomx),mos(1)
data ncol/8/
jlast=min0(nomx,ncol)
do 400 jstrt=1,nomx,ncol
write(6,100)(lcol,mos(j),j=jstrt,jlast)
100 format(/8x,8(6x,a4,i4,1x))
do 300 i=1,nbfn
c
c check for non-zero element before printing row
c
do 120 j=jstrt,jlast
if(c(i,j).ne.0.d0)go to 150
120 continue
c
c exit from loop means all c's are zero. skip the write statement
c
go to 300
150 continue
write(6,200)lrow,i,(c(i,j),j=jstrt,jlast)
200 format(1x,a4,i4,8f15.6)
300 continue
jlast=min0(jlast+ncol,nomx)
400 continue
return
end
subroutine orbval(eta,nbmx,norbmx,nomx,nstart,nstop,contrk,
1ftype,frocc,c,d,dinx,cin,v,ddsq,kpmax,norbpl,mdens,nocc,y,iplot)
implicit real*8 (a-h,o-z)
character*4 ftype
common/contrc/chomo,ncont
dimension y(2),c(kpmax,3),d(kpmax,3),dinx(kpmax)
dimension cin(kpmax,norbmx),v(kpmax),ddsq(kpmax),a(3),ftype(1)
dimension eta(nbmx,25),frocc(1),
1nstart(1),nstop(1),contrk(nomx,6),nocc(2)
norb1=norbpl+1
do 15 k=1,kpmax
do 15 i=1,norb1
15 cin(k,i)=0.0
do 50 i=1,ncont
istart=nstart(i)
istop=nstop(i)
iprim=0
do 51 k=1,kpmax
51 dinx(k)=0.0
do 40 ii=istart,istop
iprim=iprim+1
do 11 l=1,3
11 a(l)=eta(ii,l)
do 100 k=1,kpmax
ddsq(k)=0.0
do 25 j=1,3
d(k,j)=c(k,j)-a(j)
25 ddsq(k)=ddsq(k)+d(k,j)**2
ddsq(k)=-ddsq(k)*eta(ii,4)
if(ddsq(k).lt.-290.) go to 40
ddsq(k)=exp(ddsq(k))*contrk(i,iprim)
100 v(k)=1.0
if(ftype(ii).eq.'s ') go to 68
if(ftype(ii).eq.'x ') go to 2
if(ftype(ii).eq.'y ') go to 3
if(ftype(ii).eq.'z ') go to 4
if(ftype(ii).eq.'xx ') go to 5
if(ftype(ii).eq.'yy ') go to 6
if(ftype(ii).eq.'zz ') go to 7
if(ftype(ii).eq.'xy ') go to 8
if(ftype(ii).eq.'xz ') go to 9
if(ftype(ii).eq.'yz ') go to 10
2 do 102 k=1,kpmax
102 v(k)=d(k,1)
go to 68
3 do 103 k=1,kpmax
103 v(k)=d(k,2)
go to 68
4 do 104 k=1,kpmax
104 v(k)=d(k,3)
go to 68
5 do 105 k=1,kpmax
105 v(k)=d(k,1)**2
go to 68
6 do 106 k=1,kpmax
106 v(k)=d(k,2)**2
go to 68
7 do 107 k=1,kpmax
107 v(k)=d(k,3)**2
go to 68
8 do 108 k=1,kpmax
108 v(k)=d(k,1)*d(k,2)
go to 68
9 do 109 k=1,kpmax
109 v(k)=d(k,1)*d(k,3)
go to 68
10 do 110 k=1,kpmax
110 v(k)=d(k,2)*d(k,3)
68 do 69 k=1,kpmax
69 dinx(k)=v(k)*ddsq(k)+dinx(k)
40 continue
do 70 nn=1,norbpl
n=nocc(nn)
kk=ncont*(n-1)+i
do 80 k=1,kpmax
80 cin(k,nn)=dinx(k)*y(kk)+cin(k,nn)
70 continue
50 continue
if(mdens.gt.0) go to 150
do 850 n=1,norbpl
c write(iplot) nocc(n)
850 write(iplot,99)(cin(k,n),k=1,kpmax)
99 format(9f8.5)
if(mdens.eq.0) return
150 do 90 n=1,norbpl
do 90 k=1,kpmax
cin(k,n)=cin(k,n)*cin(k,n)
90 cin(k,norb1)=cin(k,norb1)+cin(k,n)*frocc(n)
do 870 n=1,norb1
c write(iplot) nocc(n)
870 write(iplot,99)(cin(k,n),k=1,kpmax)
c do 860 k=1,kpmax
c 860 write(6,861) cin(k,norbpl),(c(k,i),i=1,3)
861 format(2x,4f16.8)
return
end
subroutine plotin(nmaxx,nmaxy,kpmax,plane,norbpl,mdens,
1nocc,norbmx,iplot,iat)
implicit real*8 (a-h,o-z)
dimension plane(2),nocc(2)
common /vec/ vecx(3),vecy(3),center(3)
c
c plane cartesian coordinates for each grid point
c norbpl number of orbitals to be plotted
c mdens =0 orbital values are calculated
c =1 orbital density and sum of densities is calculated
c nocc indices of orbitals to be plotted
c
c vecx,vecy vectors defining plane for which density is
c calculated
c center center of the plane
c dxmax boundary of drawing in x direction
c dymax boundary of drawing in y direction
c nx number of points in x direction
c ny number of points in y direction
c
read(5,100)vecx
100 format(8f10.0)
read(5,100)vecy
read(5,100)center
read(5,105)dxmax,dymax,nx,ny
105 format(2f10.0,2i4)
write(6,200)
200 format('0plot input'//' vectors defining plane of plot'//
1' original'/)
write(6,210)vecx,vecy
210 format(/' x direction: ',3f10.3,' y direction:',3f10.3)
write(6,220)
220 format(' normalized')
sumx=0.
sumy=0.
do 1000 i=1,3
sumx=sumx+vecx(i)**2
sumy=sumy+vecy(i)**2
1000 continue
sumx=sqrt(sumx)
sumy=sqrt(sumy)
do 1010 i=1,3
vecx(i)=vecx(i)/sumx
vecy(i)=vecy(i)/sumy
1010 continue
write(6,210)vecx,vecy
write(6,225)nx,ny
225 format(' number of points: x direction',i4,
1' y direction',i4)
write(6,230)center
230 format(' origin: ',3f10.5)
write(6,240)dxmax,dymax
240 format(/' boundaries: +/- xmax ',f10.5,' +/-ymax ',f10.5/)
if(nx.gt.nmaxx)nx=nmaxx
if(ny.gt.nmaxy)ny=nmaxy
if(mod(nx,2).eq.0)nx=nx-1
if(mod(ny,2).eq.0)ny=ny-1
write(6,250)nx,ny
250 format(' number of grid points: nx ',i4,' ny ',i4)
write(iplot,99) nx,ny
write(iplot,98) dxmax,dymax
99 format(2i4)
98 format(2f10.5)
kpmax=nx*ny
distx=2.*dxmax/(nx-1)
disty=2.*dymax/(ny-1)
call gridxy(plane,nx,ny,distx,disty,vecx,vecy,center,dxmax,dymax)
read(5,260)norbpl,mdens
260 format(20i4)
read(5,260)(nocc(i),i=1,norbpl)
if(mdens.eq.0)write(6,280)norbpl
280 format(1x,i4,' orbitalcontours will be plotted'/
1' orbital numbers:')
if(mdens.eq.1)write(6,285)norbpl
285 format(1x,i4,' orbitaldensities will be plotted'/
1' orbital numbers:')
if(norbpl.le.norbmx)go to 1020
norbpl=norbmx
write(6,270)norbpl
270 format(' number of orbitals to be plotted reduced to',i4)
1020 continue
write(iplot,99) norbpl
write(6,290)(nocc(i),i=1,norbpl)
290 format(1x,30i4)
read(5,260) iat
write(iplot,99) iat
if(iat.eq.0) write(6,300)
300 format(/,' the atoms will be not ploted')
if(iat.eq.1) write(6,301)
301 format(/,' the atoms will be ploted together with the orbitals')
if(iat.eq.2) write(6,302)
302 format(/,' the atoms will be ploted on separat filed')
return
end
subroutine gridxy(plane,nx,ny,distx,disty,vecx,vecy,center)
implicit real*8 (a-h,o-z)
dimension plane(nx,ny,3),vecx(3),vecy(3),center(3),start(3)
nx1=nx/2
ny1=ny/2
do 10 i=1,3
start(i)=center(i)-nx1*distx*vecx(i)-ny1*disty*vecy(i)
10 continue
do 40 k=1,3
do 30 j=1,ny
do 20 i=1,nx
plane(i,j,k)=start(k)+(j-1)*distx*vecx(k)+(i-1)*disty*vecy(k)
20 continue
30 continue
40 continue
return
end
subroutine molcor(iplot)
implicit real*8(a-h,o-z)
parameter(laords=18,lconsu=60,lgcsu=18,lru=20,lcsu=24,
& lctu=30,lsfu=200,lgu=9,lsfru=250,lnsfu=6000,
& lpru=18000,lsu=50,lstu=8,lconu=12,
& lcu=8,lccu=182)
common /ntgr/ kaords, mconsu, mstu, msfu, mgu, msfru, mnsfu, mpru,
1mcxu,ngcs,mdum(45),mccu,mblu,ns,ng,nsf,nst,ncons
common/bl/nf(lsu),nc(lsu),ncon(lconsu),lmnp1(lconsu),
1 ntl(lsfu),ntu(lsfu),nnt(lsfu),mcons(lsfu),ica(lcu,lsu,lgu),
2 eta(lsu,lconsu),zet(lconu,lconsu),x(lcu,lsu),yy(lcu,lsu),
3 z(lcu,lsu),nir(laords),nso(lstu),nd(lstu),nblpr(lstu),
4 la(lru,laords),nct(lsfu),maords(lgcsu),mgcs(lsfu),
5 mtype(lsu),c(lctu,lcsu,lgcsu),chg(lsu),ityp(lstu),iic(lctu,lcsu)
common/vec/ vecx(3),vecy(3),center(3)
parameter(maxatm=100)
dimension xatom(maxatm),yatom(maxatm)
natom=0
do 75 is=1,ns
icu=nc(is)
do 76 ic=1,icu
natom=natom+1
if(natom.gt.maxatm) stop 'maxatm is not eneught'
xatom(natom)=(x(ic,is)-center(1))*vecx(1)
+ +(yy(ic,is)-center(2))*vecx(2)
+ +(z(ic,is)-center(3))*vecx(3)
yatom(natom)=(x(ic,is)-center(1))*vecy(1)
+ +(yy(ic,is)-center(2))*vecy(2)
+ +(z(ic,is)-center(3))*vecy(3)
76 continue
75 continue
write(iplot,99) natom,(xatom(i),yatom(i),i=1,natom)
99 format(i4,/,(9f8.5))
return
end
|