PROGRAM SPHEREAVE IMPLICIT none integer*4 n,i,j,ns,nf,it,ifi,ict,istart,iend,np,ip real*8 pi,dt,th,cc(3),df,fi,x,y,z, 1c1,s1,xx,yy,zz,c2,s2,s3,c3,dp,hi,a(3,3) real*8,allocatable:: r(:,:),rn(:,:) integer*4,allocatable:: at(:) character*80 s10 c pi=4.0d0*atan(1.0d0) write(6,6001) 6001 format(' Generating geometries over space angle',/,/, 1 ' Input: FILE.X',/, 2 ' Output: N.x',/,/) open(9,file='FILE.X') read(9,*) read(9,*)n allocate(r(n,3),rn(n,3),at(n)) do 1 i=1,n 1 read(9,*)at(i),(r(i,j),j=1,3) close(9) write(6,6003)n 6003 format(i5,' atoms in FILE.X') write(6,6002) 6002 format(' Input number of theta points:') read(5,*)ns nf =ns np =ns df=2.0d0*pi/dble(nf) dp=2.0d0*pi/dble(np) dt=2.0d0*pi/dble(ns) write(6,6004)dt*180.0d0/pi 6004 format('delta theta = ',f10.3,' deg') do 2 j=1,3 cc(j)=0.0d0 do 3 i=1,n 3 cc(j)=cc(j)+r(i,j) 2 cc(j)=cc(j)/dble(n) write(6,6005)(cc(j),j=1,3) 6005 format(' molecular center ',3f12.3,' A') ict=0 th=-dt/2.0d0 do 14 it=1,ns th=th+dt c1=cos(th) s1=sin(th) fi=-df/2.0d0 do 14 ifi=1,nf fi=fi+df c2=cos(fi) s2=sin(fi) hi=-dp/2.0d0 do 14 ip=1,np ict=ict+1 hi=hi+dp c3=cos(hi) s3=sin(hi) write(6,3000)th*180.0d0/pi,fi*180.0d0/pi,hi*180.0d0/pi 3000 format(3f12.2) c rotational matrix a(1,1)=c2 a(1,2)=-c3*s2 a(1,3)=s2*s3 a(2,1)=c1*s2 a(2,2)=c1*c2*c3-s1*s3 a(2,3)=-c3*s1-c1*c2*s3 a(3,1)=s1*s2 a(3,2)=c1*s3+c2*c3*s1 a(3,3)=c1*c3-c2*s1*s3 c loop over atoms: do 4 i=1,n x=r(i,1)-cc(1) y=r(i,2)-cc(2) z=r(i,3)-cc(3) xx=a(1,1)*x+a(1,2)*y+a(1,3)*z yy=a(2,1)*x+a(2,2)*y+a(2,3)*z zz=a(3,1)*x+a(3,2)*y+a(3,3)*z rn(i,1)=cc(1)+xx rn(i,2)=cc(2)+yy 4 rn(i,3)=cc(3)+zz write(s10,400)ict 400 format(i10) do 5 istart=1,len(s10) 5 if(s10(istart:istart).ne.' ')goto 8 8 do 9 iend=len(s10),1,-1 9 if(s10(iend:iend).ne.' ')goto 6 6 open(10,file=s10(istart:iend)//'.x') write(10,100)ict,it,ifi,ip,th*180.0d0/pi,fi*180.0d0/pi, 1hi*180.0d0/pi 100 format(4i5,3f10.3) write(10,*)n do 7 i=1,n 7 write(10,600)at(i),(rn(i,j),j=1,3) 600 format(i4,3f12.6,' 0 0 0 0 0 0 0 0.0') 14 close(10) write(6,900)ict 900 format(i10,' geometries') end