src
|
chk2psi.f,
chk2psi92.f,
chk2psi92.f.txt,
ctplot.f,
gksplot.f,
hpplot.f,
makefile,
preplot.f,
psi1.f,
psi2.f,
psicon.f,
psplot.f
|
|
|
program chk2psi
implicit real*8 (a-h,o-z)
integer getarg
logical exist
integer unpred,junk
character file*80,itype*20,icalc*4,irtcrd*4,alpha*1,ifile*80,
* orbtyp*5,icard*80,clabel(2000)*16,unique*80
c
c Program to retrieve the necessary information from the G90
c checkpoint file for the psi programs. Three input files and one data
c file are generated in the users current directory. vms 5.1
c James M. Briggs
c Purdue University
c chemistry department
c may 1988
c Updated with modifications for UNIX/G90 Jim Blake
C
C Redistribution and use in source and binary forms are permitted
C provided that the above paragraph and this one are duplicated in
C all such forms and that any documentation, C advertising materials,
C and other materials related to such distribution and use acknowledge
C that the software was developed by James Briggs at Purdue University
C The name of the University or James Briggs may not be used to endorse
C or promote products derived from this software without specific prior
C written permission.
C THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
C IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
C WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
C
parameter (idim=200)
dimension eigvct(idim*idim),vct(idim,idim),vtmp(idim),eigval(idim)
common /mol/ natoms,icharg,multip,nae,nbe,ne,nbasis,ian(401),
* atmchg(400),c(3,400)
common /route/ label(20*IDim),ititle(IDim/2),irtcrd(IDim*2)
common /gtbasis/ itype,icard
data ipsi1,ipsi2,ipsi3 / 7,8,9 /
data icalc / 'auto'/
data pinc,ionemo,nocut,ctrfact,mone / 0.2d+00,1,0,1.0d+00,1 /
data molast,nct,iconn,iconz,norb / 1,1,1,0,1 /
data ctr,scale / 0.1d+00,1.0d+0 /
data npast,iuflag / 10,0 /
data conver / 0.529177249d+00 /
c
idim2 = idim*idim
c
c get checkpoint file name and add ".chk" if none supplied. also
c extract the unique file identifier for use with the naming of the
c data files.
c
if (iargc() .ne. 1) then
write (*,*) 'Usage: chk2psi filename[.chk]'
stop
endif
I = getarg (1,ifile)
call limits(ifile,jfbgn,jfend)
if (ifile(jfend-3:jfend) .eq. '.chk') then
kfend=jfend-4
else
kfend=jfend-jfbgn+1
ifile(jfend+1:jfend+4) = '.chk'
jfend = jfend + 4
endif
unique(1:kfend) = ifile(jfbgn:kfend)
c
c open checkpoint file and make sure that it exists before continuing.
c call fileio(11... are used to get the actual lengths of the files
c before retrieval.
c
exist=.false.
inquire(file=ifile,exist=exist)
if(.not.exist)then
write(*,*) 'Checkpoint file not found.'
stop
endif
c
call fopen(1,4,ifile(jfbgn:jfend),0,junk)
c
c retrieve coordinates and other useful info. from the checkpoint file.
c
call fileio(11,-997,lennatoms,natoms,0)
if(lennatoms.eq.0) then
write(*,*) 'Problem with the checkpoint file.'
write(*,*) 'common block /mol/ not found.'
stop
else
call fileio( 2,-997,lennatoms,natoms,0)
endif
c
c retrieve route and other useful info. from the checkpoint file.
c
call fileio(11,-502,lenlabel ,label ,0)
if(lenlabel.eq.0) then
write(*,*) 'Problem with the checkpoint file.'
write(*,*) 'common block /route/ not found.'
stop
else
call fileio( 2,-502,lenlabel ,label ,0)
endif
call stuflabl(clabel,nbasis)
c
c retrieve eigenvalues from the checkpoint file.
c
call fileio(11,-522,leneigval ,eigval(1) ,0)
if(leneigval.eq.0) then
write(*,*)'Problem with the checkpoint file.'
write(*,*)'eigenvalues not found...continuing.'
else
write(*,*) ' number of eigenvalues =',leneigval
call fileio( 2,-522,leneigval ,eigval(1) ,0)
endif
c
c retrieve real alpha eigenvectors from the checkpoint file.
c beta will be retreived later if necessary.
c
call fileio(11,-524,leneigvct,eigvct(1),0)
if(leneigvct.eq.0) then
write(*,*) 'Problem with the checkpoint file.'
write(*,*) 'real alpha eigenvectors not found.'
stop
else
write(*,*) ' number of eigenvectors =',leneigvct
call fileio(2,-524,leneigvct,eigvct(1),0)
endif
c
c determine homo, lumo and other useful info.
c iuflag = 1 if there are unpaired electrons.
c norbs is the total number of orbitals that will be given in the
c psi1 input file.
c npred is the number of paired electrons.
c
nelec = ne
unpred = multip-1
if (unpred.ne.0) iuflag = 1
npred = (nelec-unpred)/2
nhomo = npred+unpred
nlumo = nhomo+1
norbs = nbasis
c
c if(norbs.gt.nbasis)norbs=nbasis
c
nbasis2 = nbasis*nbasis
write (*,'(17a4)') (ititle(i),i=1,17)
10 write (*,190) nhomo,nlumo
write (*,200) nbasis
write (*,'(''-1 for all mos ['',i2,'']:'',$)') nhomo
read (*,'(i3)',err=10) jmo
if (jmo.eq.0) jmo = nhomo
if ((jmo.lt.-1).or.(jmo.gt.nbasis)) go to 10
alpha = 'a'
if (iuflag.eq.1) then
20 write (*,*) 'you have chosen to plot mo # ',jmo
write (*,*) 'molecule has multiplicity: ',multip
write (*,'(''real alpha or beta coefficients (a/b): '',$)')
read (*,'(a1)') alpha
if ((alpha.ne.'a').and.(alpha.ne.'b')) go to 20
endif
c
c open the various files associated with psi.
c
file = unique(1:kfend)//'.psi1'
call limits (file,jflbgn,jflend)
open (unit=ipsi1,file=file(jflbgn:jflend),status='unknown',err=180
* ,iostat=ierror)
c
file = unique(1:kfend)//'.psicon'
call limits (file,jflbgn,jflend)
open (unit=ipsi2,file=file(jflbgn:jflend),status='unknown',err=180
* ,iostat=ierror)
c
file = unique(1:kfend)//'.psi2'
call limits (file,jflbgn,jflend)
open (unit=ipsi3,file=file(jflbgn:jflend),status='unknown',err=180
* ,iostat=ierror)
c
c set up information file from the run of psichk.
c this file contains all of the eigenvectors, eigenvalues, coordinates.
c from a gaussian job. it also contains some other interesting info.
c it could be useful in time of disaster.
c
call getbasis
call limits (icard,jrtbgn,jrtend)
c
c prepare input deck for psi1. lfc=7
c psi2. lfc=8
c psi3. lfc=9
c
write (*,'(''contour level [0.1]:'',$)')
read (*,'(f13.9)') ctr
if (ctr.eq.0.0d+00) ctr = 0.1d+00
if (jmo.lt.0) then
ionemo = 0
mone = nhomo
molast = nhomo
endif
write (ipsi1,'(a20/,a4,i1/,2i2,f10.6)') itype,icalc,ionemo,mone,
* molast,scale
write (ipsi1,'(i2,5x,18a4)') icharg,(ititle(i),i=1,18)
write (ipsi2,'(a20/4i2,1x,a4/,f10.6)') itype,nct,iconn,iconz,norb,
* 'auto',ctr
orbtyp = ' '
c
c having some fun here with orbital labels. ha
c s=second, t=third, f=fourth
c
if(jmo.eq.(nhomo-3))then
orbtyp='FHOMO'
elseif(jmo.eq.(nhomo-2))then
orbtyp='THOMO'
elseif(jmo.eq.(nhomo-1))then
orbtyp='SHOMO'
elseif(jmo.eq.nhomo)then
orbtyp=' HOMO'
elseif(jmo.eq.nlumo)then
orbtyp=' LUMO'
elseif(jmo.eq.(nlumo+1))then
orbtyp='SLUMO'
elseif(jmo.eq.(nlumo+2))then
orbtyp='TLUMO'
elseif(jmo.eq.(nlumo+3))then
orbtyp='FLUMO'
endif
write (ipsi3,'(17a4)') (ititle(i),i=1,17)
c
c do not print energy label if we did not get eigenvalues
c (leneigval.ne.0).
c
if((iuflag.eq.1).and.(alpha.eq.'a').and.(leneigval.ne.0))then
write(ipsi3,'(a5,2x,''Alpha: E = '',f9.5)') orbtyp,eigval(jmo)
elseif((iuflag.eq.1).and.(alpha.eq.'b').and.(leneigval.ne.0)) then
kmo=jmo+nbasis
write(ipsi3,'(a5,2x,''Beta : E = '',f9.5)') orbtyp,eigval(kmo)
elseif((iuflag.eq.0).and.(leneigval.ne.0)) then
write(ipsi3,'(a5,2x,''E = '',f9.4)') orbtyp,eigval(jmo)
else
write (ipsi3,*) ' '
endif
write (ipsi3,'(''010000.000 auto'')')
write (ipsi3,'(''00'')')
write (ipsi3,'(i2,5x,18a4)') icharg,(ititle(i),i=1,18)
c
c write the coordinates to the command files.
c
do 40 i = 1, natoms
do 30 j = 1, 3
c(j,i) = c(j,i)*conver
30 continue
40 continue
do 50 i = 1, natoms
write (ipsi1,'(i2,8x,3f10.6)') ian(i),(c(j,i),j=1,3)
write (ipsi3,'(i2,8x,3f10.6)') ian(i),(c(j,i),j=1,3)
50 continue
write (ipsi1,'(''99'')')
write (ipsi3,'(''99'')')
c
60 write (*,'(''theta(z) [0.0]:'',$)')
read (*,'(f10.4)',err=60) the
if ((the.eq.0.0d+00).or.(the.eq.90.0d+00).or.(the.eq.180.0d+00)
* .or.(the.eq.270.0d+00)) the = the+0.1d+00
c
70 write (*,'(''gamma(x) [0.0]:'',$)')
read (*,'(f10.4)',err=70) gam
if ((gam.eq.0.0d+00).or.(gam.eq.90.0d+00).or.(gam.eq.180.0d+00)
* .or.(gam.eq.270.0d+00)) gam = gam+0.1d+00
c
80 write (*,'(''phi(y) [0.0]:'',$)')
read (*,'(f10.4)',err=80) phi
if ((phi.eq.0.0d+00).or.(phi.eq.90.0d+00).or.(phi.eq.180.0d+00)
* .or.(phi.eq.270.0d+00)) phi = phi+0.1d+00
c
90 write (*,'(''scale factor [0.9]:'',$)')
read (*,'(f10.4)',err=90) scale
if (scale.eq.0.0d+00) scale = 0.9d+00
write (ipsi3,'(4f10.4)') the,gam,phi,scale
write (ipsi3,'(''02'')')
c
icnt = 1
do 110 i = 1, nbasis
do 100 j = 1, nbasis
vct(j,i) = eigvct(icnt)
icnt = icnt+1
100 continue
110 continue
c
nrow = nbasis
ncol = norbs
kite = 0
120 low = kite+1
kite = kite+5
if (kite.gt.ncol) kite = ncol
c
if (kite.lt.ncol) go to 120
if (iuflag.eq.1) then
if (jmo.gt.0) then
do 130 i = 1, nbasis
vtmp(i) = vct(i,jmo)
130 continue
endif
if ((jmo.lt.0).and.(alpha.eq.'a')) then
write (*,*) ' nbasis = ',nbasis
write (ipsi1,'(8f10.6)') ((vct(i,j),i=1,nbasis),j=1,nbasis)
endif
c
c get real beta mo coeffs. for the checkpoint file.
c
call fileio (11,-526,leneigvct,eigvct(1),0)
if (leneigvct.eq.0) then
write (*,*) 'problem with the checkpoint file.'
write (*,*) 'real beta eigenvectors not found.'
stop
else
call fileio (2,-526,leneigvct,eigvct(1),0)
endif
icnt = 1
do 150 i = 1, nbasis
do 140 j = 1, nbasis
vct(j,i) = eigvct(icnt)
icnt = icnt+1
140 continue
150 continue
nrow = nbasis
ncol = norbs
kite = 0
160 low = kite+1
kite = kite+5
if (kite.gt.ncol) kite = ncol
c
if (kite.lt.ncol) go to 160
if (jmo.gt.0) then
if (alpha.eq.'a') write (ipsi1,'(8f10.6)') (vtmp(i),i=1,
* nbasis)
if (alpha.eq.'b') write (ipsi1,'(8f10.6)') (vct(i,jmo),i=1,
* nbasis)
elseif ((jmo.lt.0).and.(alpha.eq.'b')) then
do 170 i = 1, nbasis
write (ipsi1,'(8f10.6)') (vct(i,j),j=1,nbasis)
170 continue
endif
else
if (jmo.gt.0) then
write (ipsi1,'(8f10.6)') (vct(i,jmo),i=1,nbasis)
else
write (ipsi1,210) ((vct(i,j),i=1,nbasis),j=1,nbasis)
endif
endif
call fclose (1,0)
stop
180 write (*,*) 'iostat = ',ierror
stop
190 format ('note: homo =',i3,1x,'lumo =',i3)
200 format ('mo to be plotted (1 to ',i3,')')
210 format (8f10.6)
end
c
c
subroutine getbasis
implicit integer (a-z)
parameter (idim=200)
common /route/ label(20*idim),ititle(idim/2) ,irtcrd(2*idim)
common /gtbasis/ itype,icard
character itype*20,icard*80,irtcrd*4
c
c subroutine to parse the route card to determine the basis set used.
c
itype = ' '
do 10 i = 1, 80
icard(i:i) = ' '
10 continue
j = 0
l = 0
do 20 i = 1, 17
j = l+1
l = j+3
icard(j:l) = irtcrd(i)
20 continue
j = 0
kend = 0
lend = 0
do 50 i = 1, 63
kend = i+1
if ((icard(i:kend).eq.'ST').or.(icard(i:kend).eq.'3-').or.
* (icard(i:kend).eq.'6-').or.(icard(i:kend).eq.'4-')) then
kbgn = i
kinc = 0
do 30 j = (kbgn+1), (kbgn+20)
if (icard(j:j).eq.' ') go to 40
kinc = kinc+1
30 continue
40 kend = kbgn+kinc
itype(1:(kinc+1)) = icard(kbgn:kend)
return
endif
50 continue
return
end
c
subroutine stuflabl(clabel,nbasis)
implicit integer (a-z)
Parameter (IDim=200)
character*16 clabel(*)
character*1 blabel(80*Idim),bslash
common /route/ label(20*IDim),ititle(IDim/2),irtcrd(IDim*2)
equivalence (label,blabel)
bslash = char(92)
k = 0
icnt = 1
do 30 i = 1, nbasis
k = k+1
clabel(i)(1:16) = ' '
10 if (blabel(k).ne.bslash) then
if (icnt.le.16) then
clabel(i)(icnt:icnt) = blabel(k)
endif
k = k+1
icnt = icnt+1
if (k.gt.16000) then
do 20 j = (i-1), nbasis
clabel(j)(1:16) = ' '
20 continue
return
endif
go to 10
endif
icnt = 1
30 continue
return
end
c
c
subroutine limits (str,first,last)
c
c this subroutine finds the "first" and the "last" non-blank
c characters in the string "str". the length of the string is not
c numerically limited, but its length is determined when called.
c "i" and "ib" are the forward and backward counters.
c
character str*(*)
integer first,last,i,ib
c
first = 0
last = 0
do 10 i = 1, len(str)
if (first.eq.0) then
if (str(i:i).ne.' ') first = i
endif
c
if (last.eq.0) then
ib = (len(str)-i)+1
if (str(ib:ib).ne.' ') last = ib
endif
10 continue
return
end
|