Log In | Get Help   
Home My Page Projects Code Snippets Project Openings transition state search using dynamics
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files Wiki
[tsscds] View of /trunk/src/rotate.f90
[tsscds] / trunk / src / rotate.f90 Repository:
ViewVC logotype

View of /trunk/src/rotate.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 279 - (download) (annotate)
Wed Jun 27 20:30:08 2018 UTC (5 years, 11 months ago) by baaden
File size: 5110 byte(s)
move to trunk 1
module rancom
implicit none
save
real(kind=8) :: RANLST(100)
integer(kind=8) :: ISEED3(8),IBFCTR
contains

SUBROUTINE RANDST(ISEED)
real :: diff
integer(kind=8) :: is,iseed
integer :: i
IBFCTR = 256
IS=ISEED
DO I=1,8
   ISEED3(I)=MOD(IS,IBFCTR)
   IS=IS/IBFCTR
enddo
DO I=1,8
   ISEED3(I) = ISEED3(I) + ISEED3(I)
enddo
DO I=1,8
   diff=ISEED3(I)-IBFCTR
   do while(diff>=0) 
      ISEED3(I) = ISEED3(I) - IBFCTR
      ISEED3(I+1) = ISEED3(I+1) + 1
      diff=ISEED3(I)-IBFCTR
   enddo
enddo
ISEED3(1) = ISEED3(1) + 1
DO I=1,8
   diff=ISEED3(I)-IBFCTR
   do while(diff>=0)
      ISEED3(I) = ISEED3(I) - IBFCTR
      ISEED3(I+1) = ISEED3(I+1) + 1
      diff=ISEED3(I)-IBFCTR
   enddo
enddo
DO I=1,100
   RANLST(I)=RAND1(ISEED3)
enddo
end SUBROUTINE RANDST

FUNCTION RAND0(IDUM) 
integer :: idum,j
real(kind=8) :: rand0
J=INT(99E0*RANLST(100))+1
RAND0 = RANLST(100)
RANLST(100)=RANLST(J)
RANLST(J)=RAND1(ISEED3)
END FUNCTION RAND0

FUNCTION RAND1(ISEED)
integer(kind=8) :: ip
integer :: i,j,k
real :: bi,rand1
integer(kind=8) :: iseed(8),IA(8),IC(8),ID(8)
DATA IA/45,127,149,76,45,244,81,88/
DATA BI/3.90625D-3/

ID=0
IC=0
big: DO J=1,8
   middle: DO I=1,9-J
      K=J+I-1
      IP=IA(J)*ISEED(I)
      do while(k<=8)
         IP=IP+ID(K)
         ID(K)=MOD(IP,IBFCTR)
         IP=IP/IBFCTR
         IF (IP==0) cycle middle
         k=k+1
       enddo
   enddo middle
enddo big
iseed=id

RAND1=FLOAT(ISEED(1))
DO I=2,8
   RAND1=FLOAT(ISEED(I))+RAND1*BI
enddo
RAND1=RAND1*BI
END FUNCTION RAND1

end module rancom

program rotate
use constants 
use atsymb
use rancom
implicit none
! program to rotate a molecule about its euler angles
real(kind=8) :: rand
integer(kind=8) :: iclock
real, dimension(:), allocatable :: rr
real :: twopi,rnd,phi,csthta,chi,thta,snthta,csphi,snchi,cschi,snphi
real :: rxx, rxy,rxz,ryx,ryy,ryz,rzx,rzy,rzz,xcm1,ycm1,zcm1,xcm2,ycm2,zcm2,wt,x,y,z
real :: dist,distm,xdum,ydum,zdum,rmin
integer :: i,n1,n,j,iii,nc,ijk,at1,at2

real,dimension(:),allocatable :: q,qq,w
real, dimension(3) :: vcm,qcm
character*2,dimension(:),allocatable :: fasymb
read(*,*) n,n1,dist,distm
read(*,*) at1,at2
allocate(q(3*n),qq(3*n),fasymb(n),w(n),rr(n1*(n-n1)))
do i=1,n
   read(*,*) fasymb(i),q(3*i-2),q(3*i-1),q(3*i)
   do j = 1 , natom
      if(fasymb(i)==asymb(j)) w(i)=ams(j)
   enddo
enddo
! com of second monomer
xcm2=0
ycm2=0
zcm2=0
wt=0
do i=n1+1,n
   xcm2=xcm2+w(i)*q(3*i-2) 
   ycm2=ycm2+w(i)*q(3*i-1) 
   zcm2=zcm2+w(i)*q(3*i  ) 
   wt=wt+w(i)
enddo
xcm2=xcm2/wt
ycm2=ycm2/wt
zcm2=zcm2/wt
do i=n1+1,n
   if(at2==-1) then
      qq(3*i-2)=q(3*i-2)-xcm2
      qq(3*i-1)=q(3*i-1)-ycm2
      qq(3*i  )=q(3*i  )-zcm2
   else
      qq(3*i-2)=q(3*i-2)-q(3*at2-2)
      qq(3*i-1)=q(3*i-1)-q(3*at2-1)
      qq(3*i  )=q(3*i  )-q(3*at2  )
   endif
enddo

! com of first monomer
xcm1=0
ycm1=0
zcm1=0
wt=0
do i=1,n1
   xcm1=xcm1+w(i)*q(3*i-2) 
   ycm1=ycm1+w(i)*q(3*i-1) 
   zcm1=zcm1+w(i)*q(3*i  ) 
   wt=wt+w(i)
enddo
xcm1=xcm1/wt
ycm1=ycm1/wt
zcm1=zcm1/wt
do i=1,n1
   if(at1==-1) then
      qq(3*i-2)=q(3*i-2)-xcm1
      qq(3*i-1)=q(3*i-1)-ycm1
      qq(3*i  )=q(3*i  )-zcm1 
   else
      qq(3*i-2)=q(3*i-2)-q(3*at1-2)
      qq(3*i-1)=q(3*i-1)-q(3*at1-1)
      qq(3*i  )=q(3*i  )-q(3*at1  )
   endif
enddo

twopi=2*pi

CALL SYSTEM_CLOCK(COUNT=iclock)
CALL RANDST(iclock)


do iii=1,10000000
!
   rand=rand0(0)
   PHI=TWOPI*RAND
   rand=rand0(0)
   CSTHTA=2.0D0*RAND-1.0D0
   rand=rand0(0)
   CHI=TWOPI*RAND
   THTA=ACOS(CSTHTA)
   SNTHTA=SIN(THTA)
   SNPHI=SIN(PHI)
   CSPHI=COS(PHI)
   SNCHI=SIN(CHI)
   CSCHI=COS(CHI)
   RXX=CSTHTA*CSPHI*CSCHI-SNPHI*SNCHI
   RXY=-CSTHTA*CSPHI*SNCHI-SNPHI*CSCHI
   RXZ=SNTHTA*CSPHI
   RYX=CSTHTA*SNPHI*CSCHI+CSPHI*SNCHI
   RYY=-CSTHTA*SNPHI*SNCHI+CSPHI*CSCHI
   RYZ=SNTHTA*SNPHI
   RZX=-SNTHTA*CSCHI
   RZY=SNTHTA*SNCHI
   RZZ=CSTHTA
!print*, n
!print*,
   DO I=N1+1,N
      x=QQ(3*i-2)*RXX+QQ(3*i-1)*RXY+QQ(3*i)*RXZ
      y=QQ(3*i-2)*RYX+QQ(3*i-1)*RYY+QQ(3*i)*RYZ
      z=QQ(3*i-2)*RZX+QQ(3*i-1)*RZY+QQ(3*i)*RZZ
      q(3*i-2)=x
      q(3*i-1)=y
      q(3*i  )=z
   ENDDO

   rand=rand0(0)
   PHI=TWOPI*RAND
   rand=rand0(0)
   CSTHTA=2.0D0*RAND-1.0D0
   rand=rand0(0)
   CHI=TWOPI*RAND
   THTA=ACOS(CSTHTA)
   SNTHTA=SIN(THTA)
   SNPHI=SIN(PHI)
   CSPHI=COS(PHI)
   SNCHI=SIN(CHI)
   CSCHI=COS(CHI)
   RXX=CSTHTA*CSPHI*CSCHI-SNPHI*SNCHI
   RXY=-CSTHTA*CSPHI*SNCHI-SNPHI*CSCHI
   RXZ=SNTHTA*CSPHI
   RYX=CSTHTA*SNPHI*CSCHI+CSPHI*SNCHI
   RYY=-CSTHTA*SNPHI*SNCHI+CSPHI*CSCHI
   RYZ=SNTHTA*SNPHI
   RZX=-SNTHTA*CSCHI
   RZY=SNTHTA*SNCHI
   RZZ=CSTHTA
   nc=0
   DO I=1,N1
      x=QQ(3*i-2)*RXX+QQ(3*i-1)*RXY+QQ(3*i)*RXZ
      y=QQ(3*i-2)*RYX+QQ(3*i-1)*RYY+QQ(3*i)*RYZ
      z=QQ(3*i-2)*RZX+QQ(3*i-1)*RZY+QQ(3*i)*RZZ
      q(3*i-2)=x+dist
      q(3*i-1)=y
      q(3*i  )=z
      do ijk=n1+1,n
         nc=nc+1
         xdum= q(3*i-2) - q(3*ijk-2)
         ydum= q(3*i-1) - q(3*ijk-1)
         zdum= q(3*i  ) - q(3*ijk  )
         rr(nc)=sqrt(xdum*xdum + ydum*ydum + zdum*zdum)
!         print*, nc,rr(nc)
      enddo
   ENDDO
   rmin=minval(rr)
!   print*, rmin
   if(rmin>distm) exit 
enddo
do i=1,n
   print*, fasymb(i),q(3*i-2),q(3*i-1),q(3*i)
enddo

end program rotate 

root@forge.cesga.es
ViewVC Help
Powered by ViewVC 1.0.0  

Powered By FusionForge