program fixper implicit none integer*4 np0,nc0,i,j,ii,k,nint,nx,ny,nc,il,ixa,ixi,iya,iyi, 1xmin,xmax,ymin,ymax,xstep,ystep,x,y,xper,yper,xk,yk,in parameter (np0=10000,nc0=10) real*4 bu(nc0),rec(np0,nc0),rt(nc0),emin logical lex write(6,*)'Adds extra periodic points in the LIST.TXT' inquire(file='FIXPER.PAR',exist=lex) if(lex)then write(6,*)'FIXPER.PAR found' open(55,file='FIXPER.PAR') read(55,*)xmin,xmax,ymin,ymax,xstep,ystep read(55,*)xper,yper read(55,*)nc close(55) else write(6,*)'Input desired limits, coordinates must be integers' write(6,*) write(6,*)'xmin xmax ymin ymax xstep ystep:' read(5,*)xmin,xmax,ymin,ymax,xstep,ystep write(6,*)'Input periods:' write(6,*)'xper yper:' read(5,*)xper,yper write(6,*)'Number of columns in LIST.TXT:' read(5,*)nc endif nx=(xmax-xmin)/xstep+1 ny=(ymax-ymin)/ystep+1 write(6,6001)nx,ny,nx*ny 6001 format(i4,' x ',i4,' = ',i5) if(nx*ny.gt.np0)call report('too many points') if(nc.gt.nc0)call report('too many columns') open(8,file='LIST.TXT') il=0 1 read(8,*,end=99,err=99)(bu(i),i=1,nc) il=il+1 if(il.gt.np0)call report('too many read points') x=nint(bu(1)) y=nint(bu(2)) c put omega in (-180,180> and energies in kcal/mol: bu(3)=bu(3)+real(360*nint((-180.0+bu(3))/(-360.0))) do 2 i=1,nc 2 rec(il,i)=bu(i) if(il.eq.1)then ixi=x ixa=x iyi=y iya=y emin=bu(nc) else if(x.lt.ixi)ixi=x if(y.lt.iyi)iyi=y if(x.gt.ixa)ixa=x if(y.gt.iya)iya=y if(emin.gt.bu(nc))emin=bu(nc) endif goto 1 99 close(8) write(6,*)il,' lines' write(6,*)' xmin:',ixi write(6,*)' xmax:',ixa write(6,*)' ymin:',iyi write(6,*)' ymax:',iya write(6,*)' emin:',emin open(8,file='LISTF.TXT') do 3 i=1,nx x=xmin+(i-1)*xstep do 3 j=1,ny y=ymin+(j-1)*ystep in=0 do 7 ii=3,nc 7 rt(ii)=0.0 do 4 k=1,il xk=nint(rec(k,1)) yk=nint(rec(k,2)) if((xk .eq.x.and.yk .eq.y).or. 1 (xk-xper.eq.x.and.yk .eq.y).or. 1 (xk+xper.eq.x.and.yk .eq.y).or. 1 (xk .eq.x.and.yk+yper.eq.y).or. 1 (xk .eq.x.and.yk-yper.eq.y).or. 1 (xk+xper.eq.x.and.yk+yper.eq.y).or. 1 (xk+xper.eq.x.and.yk-yper.eq.y).or. 1 (xk-xper.eq.x.and.yk+yper.eq.y).or. 1 (xk-xper.eq.x.and.yk-yper.eq.y))then in=in+1 do 5 ii=3,nc 5 rt(ii)=rt(ii)+rec(k,ii) endif 4 continue if(in.eq.0)then write(6,*)x,y,'point cannot be found' else do 6 ii=3,nc 6 rt(ii)=rt(ii)/real(in) c write(8,6002)x,y,(rt(ii),ii=3,nc) c relative energies in kcal/mol: write(8,6002)x,y,(rt(ii),ii=3,nc-1),(rt(nc)-emin)*627.5 6002 format(2i5,8f15.6) endif 3 continue close(8) stop end subroutine report(s) character*(*) s write(6,*)s stop end